|
242 | 242 | { |
243 | 243 | rule = Grammar::ParameterizingRule::Rule.new(val[2].s_value, [], val[4], is_inline: true) |
244 | 244 | @grammar.add_parameterizing_rule(rule) |
| 245 | + @grammar.initialize_if_count |
245 | 246 | } |
246 | 247 |
|
247 | 248 | rule_args: IDENTIFIER { result = [val[0]] } |
|
282 | 283 | builder.symbols << Lrama::Lexer::Token::InstantiateRule.new(s_value: val[2], location: @lexer.location, args: [val[1]]) |
283 | 284 | result = builder |
284 | 285 | } |
285 | | - | rule_rhs IDENTIFIER "(" parameterizing_args ")" tag_opt |
| 286 | + | rule_rhs IDENTIFIER "(" parameterizing_rule_args ")" tag_opt |
286 | 287 | { |
287 | 288 | builder = val[0] |
288 | 289 | builder.symbols << Lrama::Lexer::Token::InstantiateRule.new(s_value: val[1].s_value, location: @lexer.location, args: val[3], lhs_tag: val[5]) |
@@ -316,6 +317,21 @@ rule |
316 | 317 | builder.precedence_sym = sym |
317 | 318 | result = builder |
318 | 319 | } |
| 320 | + | rule_rhs "%if" "(" IDENTIFIER ")" |
| 321 | + { |
| 322 | + builder = val[0] |
| 323 | + builder.symbols << Lrama::Lexer::Token::ControlSyntax.new(s_value: val[1], location: @lexer.location, condition: val[3]) |
| 324 | + @grammar.if_count += 1 |
| 325 | + result = builder |
| 326 | + } |
| 327 | + | rule_rhs "%endif" |
| 328 | + { |
| 329 | + on_action_error("no %if before %endif", val[0]) if @grammar.if_count == 0 |
| 330 | + builder = val[0] |
| 331 | + builder.symbols << Lrama::Lexer::Token::ControlSyntax.new(s_value: val[1], location: @lexer.location) |
| 332 | + @grammar.if_count -= 1 |
| 333 | + result = builder |
| 334 | + } |
319 | 335 |
|
320 | 336 | int_opt: # empty |
321 | 337 | | INTEGER |
@@ -491,11 +507,22 @@ rule |
491 | 507 | | "+" { result = "nonempty_list" } |
492 | 508 | | "*" { result = "list" } |
493 | 509 |
|
494 | | - parameterizing_args: symbol { result = [val[0]] } |
495 | | - | parameterizing_args ',' symbol { result = val[0].append(val[2]) } |
| 510 | + parameterizing_rule_args: symbol { result = [val[0]] } |
| 511 | + | parameterizing_args ',' symbol { result = val[0].append(val[2]) } |
| 512 | + | symbol parameterizing_suffix { result = [Lrama::Lexer::Token::InstantiateRule.new(s_value: val[1].s_value, location: @lexer.location, args: val[0])] } |
| 513 | + | IDENTIFIER "(" parameterizing_args ")" { result = [Lrama::Lexer::Token::InstantiateRule.new(s_value: val[0].s_value, location: @lexer.location, args: val[2])] } |
| 514 | + |
| 515 | + parameterizing_args: symbol_or_bool { result = [val[0]] } |
| 516 | + | parameterizing_args ',' symbol_or_bool { result = val[0].append(val[2]) } |
496 | 517 | | symbol parameterizing_suffix { result = [Lrama::Lexer::Token::InstantiateRule.new(s_value: val[1].s_value, location: @lexer.location, args: val[0])] } |
497 | 518 | | IDENTIFIER "(" parameterizing_args ")" { result = [Lrama::Lexer::Token::InstantiateRule.new(s_value: val[0].s_value, location: @lexer.location, args: val[2])] } |
498 | 519 |
|
| 520 | + symbol_or_bool: symbol |
| 521 | + | bool |
| 522 | + |
| 523 | + bool: "%true" { result = Lrama::Lexer::Token::Ident.new(s_value: true) } |
| 524 | + | "%false" { result = Lrama::Lexer::Token::Ident.new(s_value: false) } |
| 525 | + |
499 | 526 | named_ref_opt: # empty |
500 | 527 | | '[' IDENTIFIER ']' { result = val[1].s_value } |
501 | 528 |
|
|
0 commit comments