Skip to content

Commit 12580af

Browse files
committed
Change only support for postfix if format
``` %rule defined_rule(X, condition): X { $$ = $1; } %if(condition) ; ```
1 parent 11ef2d0 commit 12580af

12 files changed

Lines changed: 457 additions & 540 deletions

File tree

lib/lrama/grammar.rb

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ class Grammar
3232
:after_shift, :before_reduce, :after_reduce, :after_shift_error_token, :after_pop_stack,
3333
:symbols_resolver, :types,
3434
:rules, :rule_builders,
35-
:sym_to_rules, :no_stdlib, :if_count
35+
:sym_to_rules, :no_stdlib
3636

3737
def_delegators "@symbols_resolver", :symbols, :nterms, :terms, :add_nterm, :add_term,
3838
:find_symbol_by_number!, :find_symbol_by_id!, :token_to_symbol,
@@ -60,7 +60,6 @@ def initialize(rule_counter)
6060
@accept_symbol = nil
6161
@aux = Auxiliary.new
6262
@no_stdlib = false
63-
@if_count = 0
6463

6564
append_special_symbols
6665
end
@@ -174,10 +173,6 @@ def find_rules_by_symbol(sym)
174173
@sym_to_rules[sym.number]
175174
end
176175

177-
def initialize_if_count
178-
@if_count = 0
179-
end
180-
181176
private
182177

183178
def compute_nullable

lib/lrama/grammar/parameterizing_rule/rhs.rb

Lines changed: 0 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -18,25 +18,6 @@ def skip?(bindings)
1818
last_sym.is_a?(Lexer::Token::ControlSyntax) && last_sym.if? && last_sym.false?
1919
end
2020

21-
def resolve_symbols(bindings)
22-
is_skip = []
23-
@symbols.map do |sym|
24-
resolved = bindings.resolve_symbol(sym)
25-
if resolved.is_a?(Lexer::Token::ControlSyntax)
26-
if resolved.if?
27-
is_skip.push(resolved.false?)
28-
elsif resolved.endif?
29-
is_skip.pop
30-
else
31-
raise "Unexpected control syntax: #{resolved.condition_value}"
32-
end
33-
nil
34-
else
35-
resolved unless is_skip.last
36-
end
37-
end.compact
38-
end
39-
4021
def resolve_user_code(bindings)
4122
return unless user_code
4223

lib/lrama/grammar/rule_builder.rb

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -152,9 +152,7 @@ def process_rhs
152152
rule_builder = RuleBuilder.new(@rule_counter, @midrule_action_counter, @parameterizing_rule_resolver, lhs_tag: token.lhs_tag || parameterizing_rule.tag)
153153
rule_builder.lhs = lhs_token
154154
next if r.skip?(bindings)
155-
r.resolve_symbols(bindings).each do |sym|
156-
rule_builder.add_rhs(sym)
157-
end
155+
r.symbols.each { |sym| rule_builder.add_rhs(bindings.resolve_symbol(sym)) }
158156
rule_builder.line = line
159157
rule_builder.precedence_sym = r.precedence_sym
160158
rule_builder.user_code = r.resolve_user_code(bindings)
@@ -176,6 +174,8 @@ def process_rhs
176174
rule_builder.setup_rules
177175

178176
@rule_builders_for_derived_rules << rule_builder
177+
when Lrama::Lexer::Token::ControlSyntax
178+
# NOP
179179
else
180180
raise "Unexpected token. #{token}"
181181
end

lib/lrama/lexer.rb

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,6 @@ class Lexer
4141
%no-stdlib
4242
%inline
4343
%if
44-
%endif
4544
%true
4645
%false
4746
)

lib/lrama/lexer/token.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
# frozen_string_literal: true
22

33
require_relative 'token/char'
4+
require_relative 'token/control_syntax'
45
require_relative 'token/ident'
56
require_relative 'token/instantiate_rule'
67
require_relative 'token/tag'

lib/lrama/lexer/token/control_syntax.rb

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,6 @@ def if?
1313
s_value == '%if'
1414
end
1515

16-
def endif?
17-
s_value == '%endif'
18-
end
19-
2016
def true?
2117
!!@condition&.s_value
2218
end

lib/lrama/parser.rb

Lines changed: 443 additions & 462 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

parser.y

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -243,7 +243,6 @@ rule
243243
{
244244
rule = Grammar::ParameterizingRule::Rule.new(val[2].s_value, [], val[4], is_inline: true)
245245
@grammar.add_parameterizing_rule(rule)
246-
@grammar.initialize_if_count
247246
}
248247
| "%rule" "%inline" IDENTIFIER "(" rule_args ")" ":" rule_rhs_list
249248
{
@@ -327,15 +326,6 @@ rule
327326
{
328327
builder = val[0]
329328
builder.symbols << Lrama::Lexer::Token::ControlSyntax.new(s_value: val[1], location: @lexer.location, condition: val[3])
330-
@grammar.if_count += 1
331-
result = builder
332-
}
333-
| rule_rhs "%endif"
334-
{
335-
on_action_error("no %if before %endif", val[0]) if @grammar.if_count == 0
336-
builder = val[0]
337-
builder.symbols << Lrama::Lexer::Token::ControlSyntax.new(s_value: val[1], location: @lexer.location)
338-
@grammar.if_count -= 1
339329
result = builder
340330
}
341331

sig/lrama/grammar/parameterizing_rule/rhs.rbs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ module Lrama
88

99
def initialize: () -> void
1010
def skip?: (Grammar::Binding bindings) -> bool
11-
def resolve_symbols: (Grammar::Binding bindings) -> Array[untyped]
1211
def resolve_user_code: (Grammar::Binding bindings) -> Lexer::Token::UserCode?
1312
end
1413
end

sig/lrama/lexer/token/control_syntax.rbs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ module Lrama
66

77
def initialize: (s_value: String, location: Location, ?condition: Lexer::Token::Ident?) -> void
88
def if?: () -> bool
9-
def endif?: () -> bool
109
def true?: () -> bool
1110
def false?: () -> bool
1211
def condition_value: () -> String?

0 commit comments

Comments
 (0)