lrama 0.6.1 → 0.6.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (53) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/test.yaml +7 -2
  3. data/NEWS.md +43 -0
  4. data/README.md +23 -0
  5. data/Steepfile +2 -0
  6. data/lib/lrama/command.rb +10 -2
  7. data/lib/lrama/context.rb +6 -6
  8. data/lib/lrama/counterexamples/example.rb +2 -2
  9. data/lib/lrama/grammar/code/initial_action_code.rb +6 -0
  10. data/lib/lrama/grammar/code/no_reference_code.rb +4 -0
  11. data/lib/lrama/grammar/code/printer_code.rb +6 -0
  12. data/lib/lrama/grammar/code/rule_action.rb +11 -1
  13. data/lib/lrama/grammar/code.rb +1 -1
  14. data/lib/lrama/grammar/parameterizing_rule/resolver.rb +17 -9
  15. data/lib/lrama/grammar/reference.rb +4 -3
  16. data/lib/lrama/grammar/rule.rb +2 -2
  17. data/lib/lrama/grammar/rule_builder.rb +38 -36
  18. data/lib/lrama/grammar/stdlib.y +80 -0
  19. data/lib/lrama/grammar/symbol.rb +1 -1
  20. data/lib/lrama/grammar/symbols/resolver.rb +276 -0
  21. data/lib/lrama/grammar/symbols.rb +1 -0
  22. data/lib/lrama/grammar.rb +36 -246
  23. data/lib/lrama/lexer/token/user_code.rb +13 -2
  24. data/lib/lrama/lexer.rb +7 -0
  25. data/lib/lrama/output.rb +56 -2
  26. data/lib/lrama/parser.rb +571 -485
  27. data/lib/lrama/state.rb +4 -4
  28. data/lib/lrama/states/item.rb +19 -17
  29. data/lib/lrama/states_reporter.rb +10 -12
  30. data/lib/lrama/version.rb +1 -1
  31. data/lrama.gemspec +7 -0
  32. data/parser.y +24 -5
  33. data/sig/lrama/grammar/parameterizing_rule/resolver.rbs +1 -0
  34. data/sig/lrama/grammar/reference.rbs +2 -1
  35. data/sig/lrama/grammar/symbol.rbs +4 -4
  36. data/sig/lrama/grammar/symbols/resolver.rbs +41 -0
  37. data/sig/lrama/grammar/type.rbs +11 -0
  38. data/template/bison/yacc.c +6 -0
  39. metadata +13 -17
  40. data/lib/lrama/grammar/parameterizing_rules/builder/base.rb +0 -36
  41. data/lib/lrama/grammar/parameterizing_rules/builder/list.rb +0 -28
  42. data/lib/lrama/grammar/parameterizing_rules/builder/nonempty_list.rb +0 -28
  43. data/lib/lrama/grammar/parameterizing_rules/builder/option.rb +0 -28
  44. data/lib/lrama/grammar/parameterizing_rules/builder/separated_list.rb +0 -39
  45. data/lib/lrama/grammar/parameterizing_rules/builder/separated_nonempty_list.rb +0 -34
  46. data/lib/lrama/grammar/parameterizing_rules/builder.rb +0 -60
  47. data/sig/lrama/grammar/parameterizing_rules/builder/base.rbs +0 -28
  48. data/sig/lrama/grammar/parameterizing_rules/builder/list.rbs +0 -10
  49. data/sig/lrama/grammar/parameterizing_rules/builder/nonempty_list.rbs +0 -10
  50. data/sig/lrama/grammar/parameterizing_rules/builder/option.rbs +0 -10
  51. data/sig/lrama/grammar/parameterizing_rules/builder/separated_list.rbs +0 -13
  52. data/sig/lrama/grammar/parameterizing_rules/builder/separated_nonempty_list.rbs +0 -13
  53. 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