Class: Lrama::Output
- Inherits:
-
Object
- Object
- Lrama::Output
- Extended by:
- Forwardable
- Includes:
- Report::Duration
- Defined in:
- lib/lrama/output.rb
Instance Attribute Summary collapse
-
#context ⇒ Object
readonly
Returns the value of attribute context.
-
#grammar ⇒ Object
readonly
Returns the value of attribute grammar.
-
#grammar_file_path ⇒ Object
readonly
Returns the value of attribute grammar_file_path.
Instance Method Summary collapse
- #aux ⇒ Object
- #b4_cpp_guard__b4_spec_mapped_header_file ⇒ Object
- #extract_param_name(param) ⇒ Object
-
#initialize(out:, output_file_path:, template_name:, grammar_file_path:, header_out: nil, header_file_path: nil, context:, grammar:) ⇒ Output
constructor
A new instance of Output.
- #int_array_to_string(ary) ⇒ Object
-
#int_type_for(ary) ⇒ Object
b4_int_type_for.
- #lex_param ⇒ Object
- #lex_param_name ⇒ Object
- #omit_braces_and_blanks(param) ⇒ Object
-
#parse_param ⇒ Object
b4_parse_param.
- #parse_param_name ⇒ Object
-
#parse_param_use(val, loc) ⇒ Object
b4_parse_param_use.
- #render ⇒ Object
- #spec_mapped_header_file ⇒ Object
- #symbol_actions_for_printer ⇒ Object
-
#symbol_enum ⇒ Object
b4_symbol_enum.
-
#table_value_equals(table, value, literal, symbol) ⇒ Object
b4_table_value_equals.
- #template_basename ⇒ Object
-
#token_enums ⇒ Object
A part of b4_token_enums.
-
#user_actions ⇒ Object
b4_user_actions.
-
#user_args ⇒ Object
b4_user_args.
-
#user_formals ⇒ Object
b4_user_formals.
-
#user_initial_action(comment = "") ⇒ Object
b4_user_initial_action.
-
#yyerror_args ⇒ Object
b4_yyerror_args.
-
#yylex_formals ⇒ Object
b4_yylex_formals.
- #yyrline ⇒ Object
- #yytname ⇒ Object
- #yytranslate ⇒ Object
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
#context ⇒ Object (readonly)
Returns the value of attribute context.
10 11 12 |
# File 'lib/lrama/output.rb', line 10 def context @context end |
#grammar ⇒ Object (readonly)
Returns the value of attribute grammar.
10 11 12 |
# File 'lib/lrama/output.rb', line 10 def grammar @grammar end |
#grammar_file_path ⇒ Object (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
#aux ⇒ Object
286 287 288 |
# File 'lib/lrama/output.rb', line 286 def aux @grammar.aux end |
#b4_cpp_guard__b4_spec_mapped_header_file ⇒ Object
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_param ⇒ Object
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_name ⇒ Object
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_param ⇒ Object
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_name ⇒ Object
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" |
#render ⇒ Object
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_file ⇒ Object
306 307 308 |
# File 'lib/lrama/output.rb', line 306 def spec_mapped_header_file @header_file_path end |
#symbol_actions_for_printer ⇒ Object
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_enum ⇒ Object
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_basename ⇒ Object
282 283 284 |
# File 'lib/lrama/output.rb', line 282 def template_basename File.basename(template_file) end |
#token_enums ⇒ Object
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_actions ⇒ Object
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 user_actions 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_args ⇒ Object
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_formals ⇒ Object
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_args ⇒ Object
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_formals ⇒ Object
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 |
#yyrline ⇒ Object
92 93 94 |
# File 'lib/lrama/output.rb', line 92 def yyrline int_array_to_string(@context.yyrline) end |
#yytname ⇒ Object
96 97 98 |
# File 'lib/lrama/output.rb', line 96 def yytname string_array_to_string(@context.yytname) + " YY_NULLPTR" end |
#yytranslate ⇒ Object
88 89 90 |
# File 'lib/lrama/output.rb', line 88 def yytranslate int_array_to_string(@context.yytranslate) end |