lrama 0.6.1 → 0.6.3
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
|