lrama 0.6.1 → 0.6.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.github/workflows/test.yaml +7 -2
- data/NEWS.md +43 -0
- data/README.md +23 -0
- data/Steepfile +2 -0
- data/lib/lrama/command.rb +10 -2
- data/lib/lrama/context.rb +6 -6
- data/lib/lrama/counterexamples/example.rb +2 -2
- data/lib/lrama/grammar/code/initial_action_code.rb +6 -0
- data/lib/lrama/grammar/code/no_reference_code.rb +4 -0
- data/lib/lrama/grammar/code/printer_code.rb +6 -0
- data/lib/lrama/grammar/code/rule_action.rb +11 -1
- data/lib/lrama/grammar/code.rb +1 -1
- data/lib/lrama/grammar/parameterizing_rule/resolver.rb +17 -9
- data/lib/lrama/grammar/reference.rb +4 -3
- data/lib/lrama/grammar/rule.rb +2 -2
- data/lib/lrama/grammar/rule_builder.rb +38 -36
- data/lib/lrama/grammar/stdlib.y +80 -0
- data/lib/lrama/grammar/symbol.rb +1 -1
- data/lib/lrama/grammar/symbols/resolver.rb +276 -0
- data/lib/lrama/grammar/symbols.rb +1 -0
- data/lib/lrama/grammar.rb +36 -246
- data/lib/lrama/lexer/token/user_code.rb +13 -2
- data/lib/lrama/lexer.rb +7 -0
- data/lib/lrama/output.rb +56 -2
- data/lib/lrama/parser.rb +571 -485
- data/lib/lrama/state.rb +4 -4
- data/lib/lrama/states/item.rb +19 -17
- data/lib/lrama/states_reporter.rb +10 -12
- data/lib/lrama/version.rb +1 -1
- data/lrama.gemspec +7 -0
- data/parser.y +24 -5
- data/sig/lrama/grammar/parameterizing_rule/resolver.rbs +1 -0
- data/sig/lrama/grammar/reference.rbs +2 -1
- data/sig/lrama/grammar/symbol.rbs +4 -4
- data/sig/lrama/grammar/symbols/resolver.rbs +41 -0
- data/sig/lrama/grammar/type.rbs +11 -0
- data/template/bison/yacc.c +6 -0
- metadata +13 -17
- data/lib/lrama/grammar/parameterizing_rules/builder/base.rb +0 -36
- data/lib/lrama/grammar/parameterizing_rules/builder/list.rb +0 -28
- data/lib/lrama/grammar/parameterizing_rules/builder/nonempty_list.rb +0 -28
- data/lib/lrama/grammar/parameterizing_rules/builder/option.rb +0 -28
- data/lib/lrama/grammar/parameterizing_rules/builder/separated_list.rb +0 -39
- data/lib/lrama/grammar/parameterizing_rules/builder/separated_nonempty_list.rb +0 -34
- data/lib/lrama/grammar/parameterizing_rules/builder.rb +0 -60
- data/sig/lrama/grammar/parameterizing_rules/builder/base.rbs +0 -28
- data/sig/lrama/grammar/parameterizing_rules/builder/list.rbs +0 -10
- data/sig/lrama/grammar/parameterizing_rules/builder/nonempty_list.rbs +0 -10
- data/sig/lrama/grammar/parameterizing_rules/builder/option.rbs +0 -10
- data/sig/lrama/grammar/parameterizing_rules/builder/separated_list.rbs +0 -13
- data/sig/lrama/grammar/parameterizing_rules/builder/separated_nonempty_list.rbs +0 -13
- data/sig/lrama/grammar/parameterizing_rules/builder.rbs +0 -24
@@ -38,7 +38,7 @@ module Lrama
|
|
38
38
|
return Lrama::Grammar::Reference.new(type: :dollar, name: "$", ex_tag: tag, first_column: start, last_column: scanner.pos)
|
39
39
|
when scanner.scan(/\$(<[a-zA-Z0-9_]+>)?(\d+)/) # $1, $2, $<long>1
|
40
40
|
tag = scanner[1] ? Lrama::Lexer::Token::Tag.new(s_value: scanner[1]) : nil
|
41
|
-
return Lrama::Grammar::Reference.new(type: :dollar, index: Integer(scanner[2]), ex_tag: tag, first_column: start, last_column: scanner.pos)
|
41
|
+
return Lrama::Grammar::Reference.new(type: :dollar, number: Integer(scanner[2]), index: Integer(scanner[2]), ex_tag: tag, first_column: start, last_column: scanner.pos)
|
42
42
|
when scanner.scan(/\$(<[a-zA-Z0-9_]+>)?([a-zA-Z_][a-zA-Z0-9_]*)/) # $foo, $expr, $<long>program (named reference without brackets)
|
43
43
|
tag = scanner[1] ? Lrama::Lexer::Token::Tag.new(s_value: scanner[1]) : nil
|
44
44
|
return Lrama::Grammar::Reference.new(type: :dollar, name: scanner[2], ex_tag: tag, first_column: start, last_column: scanner.pos)
|
@@ -51,11 +51,22 @@ module Lrama
|
|
51
51
|
when scanner.scan(/@\$/) # @$
|
52
52
|
return Lrama::Grammar::Reference.new(type: :at, name: "$", first_column: start, last_column: scanner.pos)
|
53
53
|
when scanner.scan(/@(\d+)/) # @1
|
54
|
-
return Lrama::Grammar::Reference.new(type: :at, index: Integer(scanner[1]), first_column: start, last_column: scanner.pos)
|
54
|
+
return Lrama::Grammar::Reference.new(type: :at, number: Integer(scanner[1]), index: Integer(scanner[1]), first_column: start, last_column: scanner.pos)
|
55
55
|
when scanner.scan(/@([a-zA-Z][a-zA-Z0-9_]*)/) # @foo, @expr (named reference without brackets)
|
56
56
|
return Lrama::Grammar::Reference.new(type: :at, name: scanner[1], first_column: start, last_column: scanner.pos)
|
57
57
|
when scanner.scan(/@\[([a-zA-Z_.][-a-zA-Z0-9_.]*)\]/) # @[expr.right], @[expr-right] (named reference with brackets)
|
58
58
|
return Lrama::Grammar::Reference.new(type: :at, name: scanner[1], first_column: start, last_column: scanner.pos)
|
59
|
+
|
60
|
+
# $: references
|
61
|
+
when scanner.scan(/\$:\$/) # $:$
|
62
|
+
return Lrama::Grammar::Reference.new(type: :index, name: "$", first_column: start, last_column: scanner.pos)
|
63
|
+
when scanner.scan(/\$:(\d+)/) # $:1
|
64
|
+
return Lrama::Grammar::Reference.new(type: :index, number: Integer(scanner[1]), first_column: start, last_column: scanner.pos)
|
65
|
+
when scanner.scan(/\$:([a-zA-Z_][a-zA-Z0-9_]*)/) # $:foo, $:expr (named reference without brackets)
|
66
|
+
return Lrama::Grammar::Reference.new(type: :index, name: scanner[1], first_column: start, last_column: scanner.pos)
|
67
|
+
when scanner.scan(/\$:\[([a-zA-Z_.][-a-zA-Z0-9_.]*)\]/) # $:[expr.right], $:[expr-right] (named reference with brackets)
|
68
|
+
return Lrama::Grammar::Reference.new(type: :index, name: scanner[1], first_column: start, last_column: scanner.pos)
|
69
|
+
|
59
70
|
end
|
60
71
|
end
|
61
72
|
end
|
data/lib/lrama/lexer.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
require "strscan"
|
2
|
+
|
2
3
|
require "lrama/lexer/grammar_file"
|
3
4
|
require "lrama/lexer/location"
|
4
5
|
require "lrama/lexer/token"
|
@@ -26,9 +27,15 @@ module Lrama
|
|
26
27
|
%precedence
|
27
28
|
%prec
|
28
29
|
%error-token
|
30
|
+
%before-reduce
|
31
|
+
%after-reduce
|
32
|
+
%after-shift-error-token
|
33
|
+
%after-shift
|
34
|
+
%after-pop-stack
|
29
35
|
%empty
|
30
36
|
%code
|
31
37
|
%rule
|
38
|
+
%no-stdlib
|
32
39
|
)
|
33
40
|
|
34
41
|
def initialize(grammar_file)
|
data/lib/lrama/output.rb
CHANGED
@@ -16,8 +16,7 @@ module Lrama
|
|
16
16
|
|
17
17
|
def initialize(
|
18
18
|
out:, output_file_path:, template_name:, grammar_file_path:,
|
19
|
-
header_out: nil, header_file_path: nil,
|
20
|
-
context:, grammar:, error_recovery: false
|
19
|
+
context:, grammar:, header_out: nil, header_file_path: nil, error_recovery: false
|
21
20
|
)
|
22
21
|
@out = out
|
23
22
|
@output_file_path = output_file_path
|
@@ -162,6 +161,61 @@ module Lrama
|
|
162
161
|
STR
|
163
162
|
end
|
164
163
|
|
164
|
+
def after_shift_function(comment = "")
|
165
|
+
return "" unless @grammar.after_shift
|
166
|
+
|
167
|
+
<<-STR
|
168
|
+
#{comment}
|
169
|
+
#line #{@grammar.after_shift.line} "#{@grammar_file_path}"
|
170
|
+
{#{@grammar.after_shift.s_value}(#{parse_param_name});}
|
171
|
+
#line [@oline@] [@ofile@]
|
172
|
+
STR
|
173
|
+
end
|
174
|
+
|
175
|
+
def before_reduce_function(comment = "")
|
176
|
+
return "" unless @grammar.before_reduce
|
177
|
+
|
178
|
+
<<-STR
|
179
|
+
#{comment}
|
180
|
+
#line #{@grammar.before_reduce.line} "#{@grammar_file_path}"
|
181
|
+
{#{@grammar.before_reduce.s_value}(yylen#{user_args});}
|
182
|
+
#line [@oline@] [@ofile@]
|
183
|
+
STR
|
184
|
+
end
|
185
|
+
|
186
|
+
def after_reduce_function(comment = "")
|
187
|
+
return "" unless @grammar.after_reduce
|
188
|
+
|
189
|
+
<<-STR
|
190
|
+
#{comment}
|
191
|
+
#line #{@grammar.after_reduce.line} "#{@grammar_file_path}"
|
192
|
+
{#{@grammar.after_reduce.s_value}(yylen#{user_args});}
|
193
|
+
#line [@oline@] [@ofile@]
|
194
|
+
STR
|
195
|
+
end
|
196
|
+
|
197
|
+
def after_shift_error_token_function(comment = "")
|
198
|
+
return "" unless @grammar.after_shift_error_token
|
199
|
+
|
200
|
+
<<-STR
|
201
|
+
#{comment}
|
202
|
+
#line #{@grammar.after_shift_error_token.line} "#{@grammar_file_path}"
|
203
|
+
{#{@grammar.after_shift_error_token.s_value}(#{parse_param_name});}
|
204
|
+
#line [@oline@] [@ofile@]
|
205
|
+
STR
|
206
|
+
end
|
207
|
+
|
208
|
+
def after_pop_stack_function(len, comment = "")
|
209
|
+
return "" unless @grammar.after_pop_stack
|
210
|
+
|
211
|
+
<<-STR
|
212
|
+
#{comment}
|
213
|
+
#line #{@grammar.after_pop_stack.line} "#{@grammar_file_path}"
|
214
|
+
{#{@grammar.after_pop_stack.s_value}(#{len}#{user_args});}
|
215
|
+
#line [@oline@] [@ofile@]
|
216
|
+
STR
|
217
|
+
end
|
218
|
+
|
165
219
|
def symbol_actions_for_error_token
|
166
220
|
str = ""
|
167
221
|
|