lrama 0.5.12 → 0.6.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (39) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/test.yaml +1 -1
  3. data/Gemfile +1 -1
  4. data/NEWS.md +20 -0
  5. data/README.md +14 -3
  6. data/Steepfile +3 -0
  7. data/lib/lrama/grammar/code/printer_code.rb +1 -1
  8. data/lib/lrama/grammar/code/rule_action.rb +1 -1
  9. data/lib/lrama/grammar/code.rb +19 -7
  10. data/lib/lrama/grammar/parameterizing_rule.rb +6 -0
  11. data/lib/lrama/grammar/parameterizing_rule_builder.rb +34 -0
  12. data/lib/lrama/grammar/parameterizing_rule_resolver.rb +30 -0
  13. data/lib/lrama/grammar/parameterizing_rule_rhs_builder.rb +53 -0
  14. data/lib/lrama/grammar/rule_builder.rb +26 -22
  15. data/lib/lrama/grammar.rb +15 -41
  16. data/lib/lrama/lexer/grammar_file.rb +21 -0
  17. data/lib/lrama/lexer/location.rb +77 -2
  18. data/lib/lrama/lexer/token/instantiate_rule.rb +18 -0
  19. data/lib/lrama/lexer/token/user_code.rb +10 -10
  20. data/lib/lrama/lexer/token.rb +1 -1
  21. data/lib/lrama/lexer.rb +21 -11
  22. data/lib/lrama/parser.rb +619 -454
  23. data/lib/lrama/states_reporter.rb +1 -1
  24. data/lib/lrama/version.rb +1 -1
  25. data/parser.y +95 -30
  26. data/sig/lrama/grammar/code/printer_code.rbs +1 -1
  27. data/sig/lrama/grammar/code.rbs +5 -5
  28. data/sig/lrama/grammar/parameterizing_rule.rbs +10 -0
  29. data/sig/lrama/grammar/parameterizing_rule_builder.rbs +19 -0
  30. data/sig/lrama/grammar/parameterizing_rule_resolver.rbs +16 -0
  31. data/sig/lrama/grammar/parameterizing_rule_rhs_builder.rbs +18 -0
  32. data/sig/lrama/grammar/parameterizing_rules/builder/base.rbs +2 -2
  33. data/sig/lrama/grammar/parameterizing_rules/builder.rbs +1 -1
  34. data/sig/lrama/grammar/rule_builder.rbs +2 -4
  35. data/sig/lrama/lexer/grammar_file.rbs +15 -0
  36. data/sig/lrama/lexer/location.rbs +13 -1
  37. data/sig/lrama/lexer/token/{parameterizing.rbs → instantiate_rule.rbs} +2 -7
  38. metadata +15 -5
  39. data/lib/lrama/lexer/token/parameterizing.rb +0 -34
@@ -35,27 +35,27 @@ module Lrama
35
35
  # It need to wrap an identifier with brackets to use ".-" for identifiers
36
36
  when scanner.scan(/\$(<[a-zA-Z0-9_]+>)?\$/) # $$, $<long>$
37
37
  tag = scanner[1] ? Lrama::Lexer::Token::Tag.new(s_value: scanner[1]) : nil
38
- return Lrama::Grammar::Reference.new(type: :dollar, name: "$", ex_tag: tag, first_column: start, last_column: scanner.pos - 1)
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 - 1)
41
+ return Lrama::Grammar::Reference.new(type: :dollar, 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
- return Lrama::Grammar::Reference.new(type: :dollar, name: scanner[2], ex_tag: tag, first_column: start, last_column: scanner.pos - 1)
45
- when scanner.scan(/\$(<[a-zA-Z0-9_]+>)?\[([a-zA-Z_.][-a-zA-Z0-9_.]*)\]/) # $expr.right, $expr-right, $<long>program (named reference with brackets)
44
+ return Lrama::Grammar::Reference.new(type: :dollar, name: scanner[2], ex_tag: tag, first_column: start, last_column: scanner.pos)
45
+ when scanner.scan(/\$(<[a-zA-Z0-9_]+>)?\[([a-zA-Z_.][-a-zA-Z0-9_.]*)\]/) # $[expr.right], $[expr-right], $<long>[expr.right] (named reference with brackets)
46
46
  tag = scanner[1] ? Lrama::Lexer::Token::Tag.new(s_value: scanner[1]) : nil
47
- return Lrama::Grammar::Reference.new(type: :dollar, name: scanner[2], ex_tag: tag, first_column: start, last_column: scanner.pos - 1)
47
+ return Lrama::Grammar::Reference.new(type: :dollar, name: scanner[2], ex_tag: tag, first_column: start, last_column: scanner.pos)
48
48
 
49
49
  # @ references
50
50
  # It need to wrap an identifier with brackets to use ".-" for identifiers
51
51
  when scanner.scan(/@\$/) # @$
52
- return Lrama::Grammar::Reference.new(type: :at, name: "$", first_column: start, last_column: scanner.pos - 1)
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 - 1)
54
+ return Lrama::Grammar::Reference.new(type: :at, 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
- return Lrama::Grammar::Reference.new(type: :at, name: scanner[1], first_column: start, last_column: scanner.pos - 1)
57
- when scanner.scan(/@\[([a-zA-Z_.][-a-zA-Z0-9_.]*)\]/) # @expr.right, @expr-right (named reference with brackets)
58
- return Lrama::Grammar::Reference.new(type: :at, name: scanner[1], first_column: start, last_column: scanner.pos - 1)
56
+ return Lrama::Grammar::Reference.new(type: :at, name: scanner[1], first_column: start, last_column: scanner.pos)
57
+ when scanner.scan(/@\[([a-zA-Z_.][-a-zA-Z0-9_.]*)\]/) # @[expr.right], @[expr-right] (named reference with brackets)
58
+ return Lrama::Grammar::Reference.new(type: :at, name: scanner[1], first_column: start, last_column: scanner.pos)
59
59
  end
60
60
  end
61
61
  end
@@ -1,6 +1,6 @@
1
1
  require 'lrama/lexer/token/char'
2
2
  require 'lrama/lexer/token/ident'
3
- require 'lrama/lexer/token/parameterizing'
3
+ require 'lrama/lexer/token/instantiate_rule'
4
4
  require 'lrama/lexer/token/tag'
5
5
  require 'lrama/lexer/token/user_code'
6
6
 
data/lib/lrama/lexer.rb CHANGED
@@ -1,4 +1,5 @@
1
1
  require "strscan"
2
+ require "lrama/lexer/grammar_file"
2
3
  require "lrama/lexer/location"
3
4
  require "lrama/lexer/token"
4
5
 
@@ -28,10 +29,12 @@ module Lrama
28
29
  %error-token
29
30
  %empty
30
31
  %code
32
+ %rule
31
33
  )
32
34
 
33
- def initialize(text)
34
- @scanner = StringScanner.new(text)
35
+ def initialize(grammar_file)
36
+ @grammar_file = grammar_file
37
+ @scanner = StringScanner.new(grammar_file.text)
35
38
  @head_column = @head = @scanner.pos
36
39
  @head_line = @line = 1
37
40
  @status = :initial
@@ -57,8 +60,9 @@ module Lrama
57
60
 
58
61
  def location
59
62
  Location.new(
63
+ grammar_file: @grammar_file,
60
64
  first_line: @head_line, first_column: @head_column,
61
- last_line: @line, last_column: column
65
+ last_line: line, last_column: column
62
66
  )
63
67
  end
64
68
 
@@ -78,8 +82,7 @@ module Lrama
78
82
  end
79
83
  end
80
84
 
81
- @head_line = line
82
- @head_column = column
85
+ reset_first_position
83
86
 
84
87
  case
85
88
  when @scanner.eos?
@@ -117,6 +120,8 @@ module Lrama
117
120
  def lex_c_code
118
121
  nested = 0
119
122
  code = ''
123
+ reset_first_position
124
+
120
125
  while !@scanner.eos? do
121
126
  case
122
127
  when @scanner.scan(/{/)
@@ -140,12 +145,12 @@ module Lrama
140
145
  @line += @scanner.matched.count("\n")
141
146
  when @scanner.scan(/'.*?'/)
142
147
  code += %Q(#{@scanner.matched})
148
+ when @scanner.scan(/[^\"'\{\}\n]+/)
149
+ code += @scanner.matched
150
+ when @scanner.scan(/#{Regexp.escape(@end_symbol)}/)
151
+ code += @scanner.matched
143
152
  else
144
- if @scanner.scan(/[^\"'\{\}\n#{@end_symbol}]+/)
145
- code += @scanner.matched
146
- else
147
- code += @scanner.getch
148
- end
153
+ code += @scanner.getch
149
154
  end
150
155
  end
151
156
  raise ParseError, "Unexpected code: #{code}."
@@ -166,9 +171,14 @@ module Lrama
166
171
  end
167
172
  end
168
173
 
174
+ def reset_first_position
175
+ @head_line = line
176
+ @head_column = column
177
+ end
178
+
169
179
  def newline
170
180
  @line += 1
171
- @head = @scanner.pos + 1
181
+ @head = @scanner.pos
172
182
  end
173
183
  end
174
184
  end