Class: Lrama::Output

Inherits:
Object
  • Object
show all
Extended by:
Forwardable
Includes:
Report::Duration
Defined in:
lib/lrama/output.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods included from Report::Duration

enable, enabled?, #report_duration

Constructor Details

#initialize(out:, output_file_path:, template_name:, grammar_file_path:, header_out: nil, header_file_path: nil, context:, grammar:) ⇒ Output



17
18
19
20
21
22
23
24
25
26
# File 'lib/lrama/output.rb', line 17

def initialize(out:, output_file_path:, template_name:, grammar_file_path:, header_out: nil, header_file_path: nil, context:, grammar:)
  @out = out
  @output_file_path = output_file_path
  @template_name = template_name
  @grammar_file_path = grammar_file_path
  @header_out = header_out
  @header_file_path = header_file_path
  @context = context
  @grammar = grammar
end

Instance Attribute Details

#contextObject (readonly)

Returns the value of attribute context.



10
11
12
# File 'lib/lrama/output.rb', line 10

def context
  @context
end

#grammarObject (readonly)

Returns the value of attribute grammar.



10
11
12
# File 'lib/lrama/output.rb', line 10

def grammar
  @grammar
end

#grammar_file_pathObject (readonly)

Returns the value of attribute grammar_file_path.



10
11
12
# File 'lib/lrama/output.rb', line 10

def grammar_file_path
  @grammar_file_path
end

Instance Method Details

#auxObject



286
287
288
# File 'lib/lrama/output.rb', line 286

def aux
  @grammar.aux
end

#b4_cpp_guard__b4_spec_mapped_header_fileObject



310
311
312
313
314
315
316
# File 'lib/lrama/output.rb', line 310

def b4_cpp_guard__b4_spec_mapped_header_file
  if @header_file_path
    "YY_YY_" + @header_file_path.gsub(/[^a-zA-Z_0-9]+/, "_").upcase + "_INCLUDED"
  else
    ""
  end
end

#extract_param_name(param) ⇒ Object



217
218
219
# File 'lib/lrama/output.rb', line 217

def extract_param_name(param)
  /\A(.)+([a-zA-Z0-9_]+)\z/.match(param)[2]
end

#int_array_to_string(ary) ⇒ Object



290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
# File 'lib/lrama/output.rb', line 290

def int_array_to_string(ary)
  last = ary.count - 1

  s = ary.each_with_index.each_slice(10).map do |slice|
    str = "  "

    slice.each do |e, i|
      str << sprintf("%6d%s", e, (i == last) ? "" : ",")
    end

    str
  end

  s.join("\n")
end

#int_type_for(ary) ⇒ Object

b4_int_type_for



101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
# File 'lib/lrama/output.rb', line 101

def int_type_for(ary)
  min = ary.min
  max = ary.max

  case
  when (-127 <= min && min <= 127) && (-127 <= max && max <= 127)
    "yytype_int8"
  when (0 <= min && min <= 255) && (0 <= max && max <= 255)
    "yytype_uint8"
  when (-32767 <= min && min <= 32767) && (-32767 <= max && max <= 32767)
    "yytype_int16"
  when (0 <= min && min <= 65535) && (0 <= max && max <= 65535)
    "yytype_uint16"
  else
    "int"
  end
end

#lex_paramObject



191
192
193
194
195
196
197
# File 'lib/lrama/output.rb', line 191

def lex_param
  if @grammar.lex_param
    omit_braces_and_blanks(@grammar.lex_param)
  else
    ""
  end
end

#lex_param_nameObject



229
230
231
232
233
234
235
# File 'lib/lrama/output.rb', line 229

def lex_param_name
  if @grammar.lex_param
    extract_param_name(lex_param)
  else
    ""
  end
end

#omit_braces_and_blanks(param) ⇒ Object



178
179
180
# File 'lib/lrama/output.rb', line 178

def omit_braces_and_blanks(param)
  param[1..-2].strip
end

#parse_paramObject

b4_parse_param



183
184
185
186
187
188
189
# File 'lib/lrama/output.rb', line 183

def parse_param
  if @grammar.parse_param
    omit_braces_and_blanks(@grammar.parse_param)
  else
    ""
  end
end

#parse_param_nameObject



221
222
223
224
225
226
227
# File 'lib/lrama/output.rb', line 221

def parse_param_name
  if @grammar.parse_param
    extract_param_name(parse_param)
  else
    ""
  end
end

#parse_param_use(val, loc) ⇒ Object

b4_parse_param_use



238
239
240
241
242
243
244
245
246
247
248
249
# File 'lib/lrama/output.rb', line 238

def parse_param_use(val, loc)
  str = "  YY_USE (\#{val});\n  YY_USE (\#{loc});\n  STR\n\n  if @grammar.parse_param\n    str << \"  YY_USE (\#{parse_param_name});\"\n  end\n\n  str\nend\n"

#renderObject



28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
# File 'lib/lrama/output.rb', line 28

def render
  report_duration(:render) do
    erb = ERB.new(File.read(template_file), trim_mode: '-')
    erb.filename = template_file
    tmp = erb.result_with_hash(context: @context, output: self)
    tmp = replace_special_variables(tmp, @output_file_path)
    @out << tmp

    if @header_file_path
      erb = ERB.new(File.read(header_template_file), trim_mode: '-')
      erb.filename = header_template_file
      tmp = erb.result_with_hash(context: @context, output: self)
      tmp = replace_special_variables(tmp, @header_file_path)

      if @header_out
        @header_out << tmp
      else
        File.open(@header_file_path, "w+") do |f|
          f << tmp
        end
      end
    end
  end
end

#spec_mapped_header_fileObject



306
307
308
# File 'lib/lrama/output.rb', line 306

def spec_mapped_header_file
  @header_file_path
end

#symbol_actions_for_printerObject



119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
# File 'lib/lrama/output.rb', line 119

def symbol_actions_for_printer
  str = ""

  @grammar.symbols.each do |sym|
    next unless sym.printer

    str << "case \#{sym.enum_name}: /* \#{sym.comment}  */\n#line \#{sym.printer.lineno} \"\#{@grammar_file_path}\"\n     \#{sym.printer.translated_code(sym.tag)}\n#line [@oline@] [@ofile@]\n    break;\n\n    STR\n  end\n\n  str\nend\n"

#symbol_enumObject

b4_symbol_enum



71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
# File 'lib/lrama/output.rb', line 71

def symbol_enum
  str = ""

  last_sym_number = @context.yysymbol_kind_t.last[1]
  @context.yysymbol_kind_t.each do |s_value, sym_number, display_name|
    s = sprintf("%s = %d%s", s_value, sym_number, (sym_number == last_sym_number) ? "" : ",")

    if display_name
      str << sprintf("  %-40s /* %s  */\n", s, display_name)
    else
      str << sprintf("  %s\n", s)
    end
  end

  str
end

#table_value_equals(table, value, literal, symbol) ⇒ Object

b4_table_value_equals



263
264
265
266
267
268
269
# File 'lib/lrama/output.rb', line 263

def table_value_equals(table, value, literal, symbol)
  if literal < table.min || table.max < literal
    "0"
  else
    "((#{value}) == #{symbol})"
  end
end

#template_basenameObject



282
283
284
# File 'lib/lrama/output.rb', line 282

def template_basename
  File.basename(template_file)
end

#token_enumsObject

A part of b4_token_enums



54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
# File 'lib/lrama/output.rb', line 54

def token_enums
  str = ""

  @context.yytokentype.each do |s_value, token_id, display_name|
    s = sprintf("%s = %d%s", s_value, token_id, token_id == yymaxutok ? "" : ",")

    if display_name
      str << sprintf("    %-30s /* %s  */\n", s, display_name)
    else
      str << sprintf("    %s\n", s)
    end
  end

  str
end

#user_actionsObject

b4_user_actions



150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
# File 'lib/lrama/output.rb', line 150

def 
  str = ""

  @context.states.rules.each do |rule|
    next unless rule.code

    rule = rule
    code = rule.code
    spaces = " " * (code.column - 1)

    str << "  case \#{rule.id + 1}: /* \#{rule.as_comment}  */\n#line \#{code.line} \"\#{@grammar_file_path}\"\n\#{spaces}\#{rule.translated_code}\n#line [@oline@] [@ofile@]\nbreak;\n\n    STR\n  end\n\n  str << <<-STR\n\n#line [@oline@] [@ofile@]\n  STR\n\n  str\nend\n"

#user_argsObject

b4_user_args



209
210
211
212
213
214
215
# File 'lib/lrama/output.rb', line 209

def user_args
  if @grammar.parse_param
    ", #{parse_param_name}"
  else
    ""
  end
end

#user_formalsObject

b4_user_formals



200
201
202
203
204
205
206
# File 'lib/lrama/output.rb', line 200

def user_formals
  if @grammar.parse_param
    ", #{parse_param}"
  else
    ""
  end
end

#user_initial_action(comment = "") ⇒ Object

b4_user_initial_action



139
140
141
142
143
144
145
146
147
# File 'lib/lrama/output.rb', line 139

def user_initial_action(comment = "")
  return "" unless @grammar.initial_action

  "    \#{comment}\n    #line \#{@grammar.initial_action.line} \"\#{@grammar_file_path}\"\n    \#{@grammar.initial_action.translated_code}\n  STR\nend\n"

#yyerror_argsObject

b4_yyerror_args



272
273
274
275
276
277
278
279
280
# File 'lib/lrama/output.rb', line 272

def yyerror_args
  ary = ["&yylloc"]

  if @grammar.parse_param
    ary << parse_param_name
  end

  "#{ary.join(', ')}"
end

#yylex_formalsObject

b4_yylex_formals



252
253
254
255
256
257
258
259
260
# File 'lib/lrama/output.rb', line 252

def yylex_formals
  ary = ["&yylval", "&yylloc"]

  if @grammar.lex_param
    ary << lex_param_name
  end

  "(#{ary.join(', ')})"
end

#yyrlineObject



92
93
94
# File 'lib/lrama/output.rb', line 92

def yyrline
  int_array_to_string(@context.yyrline)
end

#yytnameObject



96
97
98
# File 'lib/lrama/output.rb', line 96

def yytname
  string_array_to_string(@context.yytname) + " YY_NULLPTR"
end

#yytranslateObject



88
89
90
# File 'lib/lrama/output.rb', line 88

def yytranslate
  int_array_to_string(@context.yytranslate)
end