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.
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
data/lib/lrama/state.rb CHANGED
@@ -29,8 +29,8 @@ module Lrama
29
29
  end
30
30
 
31
31
  def non_default_reduces
32
- reduces.select do |reduce|
33
- reduce.rule != @default_reduction_rule
32
+ reduces.reject do |reduce|
33
+ reduce.rule == @default_reduction_rule
34
34
  end
35
35
  end
36
36
 
@@ -105,8 +105,8 @@ module Lrama
105
105
  end
106
106
 
107
107
  def selected_term_transitions
108
- term_transitions.select do |shift, next_state|
109
- !shift.not_selected
108
+ term_transitions.reject do |shift, next_state|
109
+ shift.not_selected
110
110
  end
111
111
  end
112
112
 
@@ -1,11 +1,17 @@
1
1
  # TODO: Validate position is not over rule rhs
2
2
 
3
+ require "forwardable"
4
+
3
5
  module Lrama
4
6
  class States
5
7
  class Item < Struct.new(:rule, :position, keyword_init: true)
8
+ extend Forwardable
9
+
10
+ def_delegators "rule", :lhs, :rhs
11
+
6
12
  # Optimization for States#setup_state
7
13
  def hash
8
- [rule.id, position].hash
14
+ [rule_id, position].hash
9
15
  end
10
16
 
11
17
  def rule_id
@@ -17,27 +23,23 @@ module Lrama
17
23
  end
18
24
 
19
25
  def number_of_rest_symbols
20
- rule.rhs.count - position
21
- end
22
-
23
- def lhs
24
- rule.lhs
26
+ rhs.count - position
25
27
  end
26
28
 
27
29
  def next_sym
28
- rule.rhs[position]
30
+ rhs[position]
29
31
  end
30
32
 
31
33
  def next_next_sym
32
- rule.rhs[position + 1]
34
+ rhs[position + 1]
33
35
  end
34
36
 
35
37
  def previous_sym
36
- rule.rhs[position - 1]
38
+ rhs[position - 1]
37
39
  end
38
40
 
39
41
  def end_of_rule?
40
- rule.rhs.count == position
42
+ rhs.count == position
41
43
  end
42
44
 
43
45
  def beginning_of_rule?
@@ -45,7 +47,7 @@ module Lrama
45
47
  end
46
48
 
47
49
  def start_item?
48
- rule.id == 0 && position == 0
50
+ rule.initial_rule? && beginning_of_rule?
49
51
  end
50
52
 
51
53
  def new_by_next_position
@@ -53,11 +55,11 @@ module Lrama
53
55
  end
54
56
 
55
57
  def symbols_before_dot
56
- rule.rhs[0...position]
58
+ rhs[0...position]
57
59
  end
58
60
 
59
61
  def symbols_after_dot
60
- rule.rhs[position..-1]
62
+ rhs[position..-1]
61
63
  end
62
64
 
63
65
  def to_s
@@ -65,14 +67,14 @@ module Lrama
65
67
  end
66
68
 
67
69
  def display_name
68
- r = rule.rhs.map(&:display_name).insert(position, "•").join(" ")
69
- "#{r} (rule #{rule.id})"
70
+ r = rhs.map(&:display_name).insert(position, "•").join(" ")
71
+ "#{r} (rule #{rule_id})"
70
72
  end
71
73
 
72
74
  # Right after position
73
75
  def display_rest
74
- r = rule.rhs[position..-1].map(&:display_name).join(" ")
75
- ". #{r} (rule #{rule.id})"
76
+ r = rhs[position..-1].map(&:display_name).join(" ")
77
+ ". #{r} (rule #{rule_id})"
76
78
  end
77
79
  end
78
80
  end
@@ -53,7 +53,7 @@ module Lrama
53
53
  last_lhs = nil
54
54
 
55
55
  @states.rules.each do |rule|
56
- if rule.rhs.empty?
56
+ if rule.empty_rule?
57
57
  r = "ε"
58
58
  else
59
59
  r = rule.rhs.map(&:display_name).join(" ")
@@ -84,17 +84,15 @@ module Lrama
84
84
  last_lhs = nil
85
85
  list = itemsets ? state.items : state.kernels
86
86
  list.sort_by {|i| [i.rule_id, i.position] }.each do |item|
87
- rule = item.rule
88
- position = item.position
89
- if rule.rhs.empty?
87
+ if item.empty_rule?
90
88
  r = "ε •"
91
89
  else
92
- r = rule.rhs.map(&:display_name).insert(position, "•").join(" ")
90
+ r = item.rhs.map(&:display_name).insert(item.position, "•").join(" ")
93
91
  end
94
- if rule.lhs == last_lhs
95
- l = " " * rule.lhs.id.s_value.length + "|"
92
+ if item.lhs == last_lhs
93
+ l = " " * item.lhs.id.s_value.length + "|"
96
94
  else
97
- l = rule.lhs.id.s_value + ":"
95
+ l = item.lhs.id.s_value + ":"
98
96
  end
99
97
  la = ""
100
98
  if lookaheads && item.end_of_rule?
@@ -104,15 +102,15 @@ module Lrama
104
102
  la = " [#{look_ahead.map(&:display_name).join(", ")}]"
105
103
  end
106
104
  end
107
- last_lhs = rule.lhs
105
+ last_lhs = item.lhs
108
106
 
109
- io << sprintf("%5i %s %s%s\n", rule.id, l, r, la)
107
+ io << sprintf("%5i %s %s%s\n", item.rule_id, l, r, la)
110
108
  end
111
109
  io << "\n"
112
110
 
113
111
  # Report shifts
114
- tmp = state.term_transitions.select do |shift, _|
115
- !shift.not_selected
112
+ tmp = state.term_transitions.reject do |shift, _|
113
+ shift.not_selected
116
114
  end.map do |shift, next_state|
117
115
  [shift.next_sym, next_state.id]
118
116
  end
data/lib/lrama/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Lrama
2
- VERSION = "0.6.1".freeze
2
+ VERSION = "0.6.3".freeze
3
3
  end
data/lrama.gemspec CHANGED
@@ -16,6 +16,13 @@ Gem::Specification.new do |spec|
16
16
  spec.files = Dir.chdir(File.expand_path(__dir__)) do
17
17
  `git ls-files -z`.split("\x0").reject { |f| f.match(%r{\A(?:test|spec|features)/}) }
18
18
  end
19
+
20
+ spec.metadata["homepage_uri"] = spec.homepage
21
+ spec.metadata["source_code_uri"] = spec.homepage
22
+ spec.metadata["documentation_uri"] = spec.homepage
23
+ spec.metadata["changelog_uri"] = "#{spec.homepage}/releases"
24
+ spec.metadata["bug_tracker_uri"] = "#{spec.homepage}/issues"
25
+
19
26
  spec.bindir = "exe"
20
27
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
21
28
  spec.require_paths = ["lib"]
data/parser.y CHANGED
@@ -69,6 +69,7 @@ rule
69
69
  {
70
70
  @grammar.initial_action = Grammar::Code::InitialActionCode.new(type: :initial_action, token_code: val[3])
71
71
  }
72
+ | "%no-stdlib" { @grammar.no_stdlib = true }
72
73
  | ";"
73
74
 
74
75
  grammar_declaration: "%union" "{"
@@ -128,6 +129,26 @@ rule
128
129
  lineno: val[3].line
129
130
  )
130
131
  }
132
+ | "%after-shift" IDENTIFIER
133
+ {
134
+ @grammar.after_shift = val[1]
135
+ }
136
+ | "%before-reduce" IDENTIFIER
137
+ {
138
+ @grammar.before_reduce = val[1]
139
+ }
140
+ | "%after-reduce" IDENTIFIER
141
+ {
142
+ @grammar.after_reduce = val[1]
143
+ }
144
+ | "%after-shift-error-token" IDENTIFIER
145
+ {
146
+ @grammar.after_shift_error_token = val[1]
147
+ }
148
+ | "%after-pop-stack" IDENTIFIER
149
+ {
150
+ @grammar.after_pop_stack = val[1]
151
+ }
131
152
 
132
153
  symbol_declaration: "%token" token_declarations
133
154
  | "%type" symbol_declarations
@@ -451,9 +472,9 @@ rule
451
472
  result = builder
452
473
  }
453
474
 
454
- parameterizing_suffix: "?"
455
- | "+"
456
- | "*"
475
+ parameterizing_suffix: "?" { result = "option" }
476
+ | "+" { result = "nonempty_list" }
477
+ | "*" { result = "list" }
457
478
 
458
479
  parameterizing_args: symbol { result = [val[0]] }
459
480
  | parameterizing_args ',' symbol { result = val[0].append(val[2]) }
@@ -514,8 +535,6 @@ def parse
514
535
  @precedence_number = 0
515
536
  reset_precs
516
537
  do_parse
517
- @grammar.prepare
518
- @grammar.validate!
519
538
  @grammar
520
539
  end
521
540
  end
@@ -15,6 +15,7 @@ module Lrama
15
15
  private
16
16
 
17
17
  def select_rules: (Lexer::Token::InstantiateRule token) -> Array[Grammar::ParameterizingRule::Rule]
18
+ def select_rules_by_name: (String rule_name) -> Array[Grammar::ParameterizingRule::Rule]
18
19
  end
19
20
  end
20
21
  end
@@ -3,6 +3,7 @@ module Lrama
3
3
  class Reference
4
4
  attr_accessor type: ::Symbol
5
5
  attr_accessor name: String
6
+ attr_accessor number: Integer
6
7
  attr_accessor index: Integer
7
8
  attr_accessor ex_tag: Lexer::Token?
8
9
  attr_accessor first_column: Integer
@@ -10,7 +11,7 @@ module Lrama
10
11
  attr_accessor position_in_rhs: Integer?
11
12
 
12
13
  def initialize: (
13
- type: ::Symbol, ?name: String, ?index: Integer, ?ex_tag: Lexer::Token?,
14
+ type: ::Symbol, ?name: String, ?number: Integer, ?index: Integer, ?ex_tag: Lexer::Token?,
14
15
  first_column: Integer, last_column: Integer,
15
16
  ?position_in_rhs: Integer?
16
17
  ) -> void
@@ -2,7 +2,7 @@ module Lrama
2
2
  class Grammar
3
3
  class Symbol
4
4
  attr_accessor id: Lexer::Token
5
- attr_accessor alias_name: String
5
+ attr_accessor alias_name: String?
6
6
  attr_accessor number: Integer
7
7
  attr_accessor tag: Lexer::Token?
8
8
  attr_accessor term: bool
@@ -20,8 +20,8 @@ module Lrama
20
20
  attr_writer accept_symbol: Symbol
21
21
 
22
22
  def initialize: (
23
- id: Lexer::Token, alias_name: String?, number: Integer?, tag: Lexer::Token?,
24
- term: bool, token_id: Integer?, nullable: bool?, precedence: Precedence?, printer: Printer?) -> void
23
+ id: Lexer::Token, term: bool, ?alias_name: String?, ?number: Integer?, ?tag: Lexer::Token?,
24
+ ?token_id: Integer?, ?nullable: bool?, ?precedence: Precedence?, ?printer: Printer?) -> void
25
25
 
26
26
  def term?: () -> bool
27
27
  def nterm?: () -> bool
@@ -31,7 +31,7 @@ module Lrama
31
31
  def accept_symbol?: () -> bool
32
32
  def display_name: () -> String
33
33
  def enum_name: () -> String
34
- def comment: () -> String
34
+ def comment: () -> String?
35
35
  end
36
36
  end
37
37
  end
@@ -0,0 +1,41 @@
1
+ module Lrama
2
+ class Grammar
3
+ class Symbols
4
+ class Resolver
5
+ attr_reader terms: Array[Grammar::Symbol]
6
+ attr_reader nterms: Array[Grammar::Symbol]
7
+
8
+ @symbols: Array[Grammar::Symbol]?
9
+ @number: Integer
10
+ @used_numbers: Hash[Integer, bool]
11
+
12
+ def initialize: () -> void
13
+ def symbols: () -> Array[Grammar::Symbol]
14
+ def sort_by_number!: () -> void
15
+ def add_term: (id: Lexer::Token, ?alias_name: String?, ?tag: Lexer::Token?, ?token_id: Integer?, ?replace: bool) -> Grammar::Symbol
16
+ def add_nterm: (id: Lexer::Token, ?alias_name: String?, ?tag: Lexer::Token?) -> Grammar::Symbol?
17
+ def find_symbol_by_s_value: (Grammar::Symbol s_value) -> Grammar::Symbol?
18
+ def find_symbol_by_s_value!: (Grammar::Symbol s_value) -> Grammar::Symbol
19
+ def find_symbol_by_id: (Lexer::Token id) -> Grammar::Symbol?
20
+ def find_symbol_by_id!: (Lexer::Token id) -> Grammar::Symbol
21
+ def find_symbol_by_token_id: (Integer token_id) -> Grammar::Symbol?
22
+ def find_symbol_by_number!: (Integer number) -> Grammar::Symbol
23
+ def fill_symbol_number: () -> void
24
+ def fill_nterm_type: (Array[Grammar::Type] types) -> void
25
+ def fill_printer: (Array[Grammar::Printer] printers) -> void
26
+ def fill_error_token: (Array[Grammar::ErrorToken] error_tokens) -> void
27
+ def token_to_symbol: (Lexer::Token token) -> Grammar::Symbol
28
+ def validate!: () -> void
29
+
30
+ private
31
+
32
+ def find_nterm_by_id!: (Lexer::Token id) -> Grammar::Symbol
33
+ def fill_terms_number: () -> void
34
+ def fill_nterms_number: () -> void
35
+ def used_numbers: () -> Hash[Integer, bool]
36
+ def validate_number_uniqueness!: () -> void
37
+ def validate_alias_name_uniqueness!: () -> void
38
+ end
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,11 @@
1
+ module Lrama
2
+ class Grammar
3
+ class Type
4
+ attr_reader id: Lexer::Token
5
+ attr_reader tag: Lexer::Token
6
+
7
+ def initialize: (id: Lexer::Token, tag: Lexer::Token) -> void
8
+ def ==: (Grammar::Type other) -> bool
9
+ end
10
+ end
11
+ end
@@ -1752,6 +1752,7 @@ yybackup:
1752
1752
  *++yyvsp = yylval;
1753
1753
  YY_IGNORE_MAYBE_UNINITIALIZED_END
1754
1754
  *++yylsp = yylloc;
1755
+ <%= output.after_shift_function("/* %after-shift code. */") %>
1755
1756
 
1756
1757
  /* Discard the shifted token. */
1757
1758
  yychar = YYEMPTY;
@@ -1784,6 +1785,7 @@ yyreduce:
1784
1785
  unconditionally makes the parser a bit smaller, and it avoids a
1785
1786
  GCC warning that YYVAL may be used uninitialized. */
1786
1787
  yyval = yyvsp[1-yylen];
1788
+ <%= output.before_reduce_function("/* %before-reduce function. */") %>
1787
1789
 
1788
1790
  /* Default location. */
1789
1791
  YYLLOC_DEFAULT (yyloc, (yylsp - yylen), yylen);
@@ -1809,6 +1811,7 @@ yyreduce:
1809
1811
  YY_SYMBOL_PRINT ("-> $$ =", YY_CAST (yysymbol_kind_t, yyr1[yyn]), &yyval, &yyloc<%= output.user_args %>);
1810
1812
 
1811
1813
  YYPOPSTACK (yylen);
1814
+ <%= output.after_reduce_function("/* %after-reduce function. */") %>
1812
1815
  yylen = 0;
1813
1816
 
1814
1817
  *++yyvsp = yyval;
@@ -1910,6 +1913,7 @@ yyerrorlab:
1910
1913
  /* Do not reclaim the symbols of the rule whose action triggered
1911
1914
  this YYERROR. */
1912
1915
  YYPOPSTACK (yylen);
1916
+ <%= output.after_pop_stack_function("yylen", "/* %after-pop-stack function. */") %>
1913
1917
  yylen = 0;
1914
1918
  YY_STACK_PRINT (yyss, yyssp<%= output.user_args %>);
1915
1919
  yystate = *yyssp;
@@ -1969,6 +1973,7 @@ yyerrlab1:
1969
1973
  yydestruct ("Error: popping",
1970
1974
  YY_ACCESSING_SYMBOL (yystate), yyvsp, yylsp<%= output.user_args %>);
1971
1975
  YYPOPSTACK (1);
1976
+ <%= output.after_pop_stack_function(1, "/* %after-pop-stack function. */") %>
1972
1977
  yystate = *yyssp;
1973
1978
  YY_STACK_PRINT (yyss, yyssp<%= output.user_args %>);
1974
1979
  }
@@ -1983,6 +1988,7 @@ yyerrlab1:
1983
1988
 
1984
1989
  /* Shift the error token. */
1985
1990
  YY_SYMBOL_PRINT ("Shifting", YY_ACCESSING_SYMBOL (yyn), yyvsp, yylsp<%= output.user_args %>);
1991
+ <%= output.after_shift_error_token_function("/* %after-shift-error-token code. */") %>
1986
1992
 
1987
1993
  yystate = yyn;
1988
1994
  goto yynewstate;
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: lrama
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.1
4
+ version: 0.6.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Yuichiro Kaneko
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2024-01-13 00:00:00.000000000 Z
11
+ date: 2024-02-14 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: LALR (1) parser generator written by Ruby
14
14
  email:
@@ -60,20 +60,16 @@ files:
60
60
  - lib/lrama/grammar/parameterizing_rule/resolver.rb
61
61
  - lib/lrama/grammar/parameterizing_rule/rhs.rb
62
62
  - lib/lrama/grammar/parameterizing_rule/rule.rb
63
- - lib/lrama/grammar/parameterizing_rules/builder.rb
64
- - lib/lrama/grammar/parameterizing_rules/builder/base.rb
65
- - lib/lrama/grammar/parameterizing_rules/builder/list.rb
66
- - lib/lrama/grammar/parameterizing_rules/builder/nonempty_list.rb
67
- - lib/lrama/grammar/parameterizing_rules/builder/option.rb
68
- - lib/lrama/grammar/parameterizing_rules/builder/separated_list.rb
69
- - lib/lrama/grammar/parameterizing_rules/builder/separated_nonempty_list.rb
70
63
  - lib/lrama/grammar/percent_code.rb
71
64
  - lib/lrama/grammar/precedence.rb
72
65
  - lib/lrama/grammar/printer.rb
73
66
  - lib/lrama/grammar/reference.rb
74
67
  - lib/lrama/grammar/rule.rb
75
68
  - lib/lrama/grammar/rule_builder.rb
69
+ - lib/lrama/grammar/stdlib.y
76
70
  - lib/lrama/grammar/symbol.rb
71
+ - lib/lrama/grammar/symbols.rb
72
+ - lib/lrama/grammar/symbols/resolver.rb
77
73
  - lib/lrama/grammar/type.rb
78
74
  - lib/lrama/grammar/union.rb
79
75
  - lib/lrama/lexer.rb
@@ -122,13 +118,6 @@ files:
122
118
  - sig/lrama/grammar/parameterizing_rule/resolver.rbs
123
119
  - sig/lrama/grammar/parameterizing_rule/rhs.rbs
124
120
  - sig/lrama/grammar/parameterizing_rule/rule.rbs
125
- - sig/lrama/grammar/parameterizing_rules/builder.rbs
126
- - sig/lrama/grammar/parameterizing_rules/builder/base.rbs
127
- - sig/lrama/grammar/parameterizing_rules/builder/list.rbs
128
- - sig/lrama/grammar/parameterizing_rules/builder/nonempty_list.rbs
129
- - sig/lrama/grammar/parameterizing_rules/builder/option.rbs
130
- - sig/lrama/grammar/parameterizing_rules/builder/separated_list.rbs
131
- - sig/lrama/grammar/parameterizing_rules/builder/separated_nonempty_list.rbs
132
121
  - sig/lrama/grammar/percent_code.rbs
133
122
  - sig/lrama/grammar/precedence.rbs
134
123
  - sig/lrama/grammar/printer.rbs
@@ -136,6 +125,8 @@ files:
136
125
  - sig/lrama/grammar/rule.rbs
137
126
  - sig/lrama/grammar/rule_builder.rbs
138
127
  - sig/lrama/grammar/symbol.rbs
128
+ - sig/lrama/grammar/symbols/resolver.rbs
129
+ - sig/lrama/grammar/type.rbs
139
130
  - sig/lrama/lexer/grammar_file.rbs
140
131
  - sig/lrama/lexer/location.rbs
141
132
  - sig/lrama/lexer/token.rbs
@@ -154,7 +145,12 @@ files:
154
145
  homepage: https://github.com/ruby/lrama
155
146
  licenses:
156
147
  - GPL-3.0-or-later
157
- metadata: {}
148
+ metadata:
149
+ homepage_uri: https://github.com/ruby/lrama
150
+ source_code_uri: https://github.com/ruby/lrama
151
+ documentation_uri: https://github.com/ruby/lrama
152
+ changelog_uri: https://github.com/ruby/lrama/releases
153
+ bug_tracker_uri: https://github.com/ruby/lrama/issues
158
154
  post_install_message:
159
155
  rdoc_options: []
160
156
  require_paths:
@@ -1,36 +0,0 @@
1
- module Lrama
2
- class Grammar
3
- class ParameterizingRules
4
- class Builder
5
- # Base class for parameterizing rules builder
6
- class Base
7
- attr_reader :build_token
8
-
9
- def initialize(token, rule_counter, lhs_tag, user_code, precedence_sym, line)
10
- @args = token.args
11
- @token = @args.first
12
- @rule_counter = rule_counter
13
- @lhs_tag = lhs_tag
14
- @user_code = user_code
15
- @precedence_sym = precedence_sym
16
- @line = line
17
- @expected_argument_num = 1
18
- @build_token = nil
19
- end
20
-
21
- def build
22
- raise NotImplementedError
23
- end
24
-
25
- private
26
-
27
- def validate_argument_number!
28
- unless @args.count == @expected_argument_num
29
- raise "Invalid number of arguments. expect: #{@expected_argument_num} actual: #{@args.count}"
30
- end
31
- end
32
- end
33
- end
34
- end
35
- end
36
- end
@@ -1,28 +0,0 @@
1
- module Lrama
2
- class Grammar
3
- class ParameterizingRules
4
- class Builder
5
- # Builder for list of general parameterizing rules
6
- class List < Base
7
-
8
- # program: list(number)
9
- #
10
- # =>
11
- #
12
- # program: list_number
13
- # list_number: ε
14
- # list_number: list_number number
15
- def build
16
- validate_argument_number!
17
-
18
- rules = []
19
- @build_token = Lrama::Lexer::Token::Ident.new(s_value: "list_#{@token.s_value}")
20
- rules << Rule.new(id: @rule_counter.increment, _lhs: @build_token, _rhs: [], lhs_tag: @lhs_tag, token_code: @user_code, precedence_sym: @precedence_sym, lineno: @line)
21
- rules << Rule.new(id: @rule_counter.increment, _lhs: @build_token, _rhs: [@build_token, @token], lhs_tag: @lhs_tag, token_code: @user_code, precedence_sym: @precedence_sym, lineno: @line)
22
- rules
23
- end
24
- end
25
- end
26
- end
27
- end
28
- end
@@ -1,28 +0,0 @@
1
- module Lrama
2
- class Grammar
3
- class ParameterizingRules
4
- class Builder
5
- # Builder for nonempty list of general parameterizing rules
6
- class NonemptyList < Base
7
-
8
- # program: nonempty_list(number)
9
- #
10
- # =>
11
- #
12
- # program: nonempty_list_number
13
- # nonempty_list_number: number
14
- # nonempty_list_number: nonempty_list_number number
15
- def build
16
- validate_argument_number!
17
-
18
- rules = []
19
- @build_token = Lrama::Lexer::Token::Ident.new(s_value: "nonempty_list_#{@token.s_value}")
20
- rules << Rule.new(id: @rule_counter.increment, _lhs: @build_token, _rhs: [@token], lhs_tag: @lhs_tag, token_code: @user_code, precedence_sym: @precedence_sym, lineno: @line)
21
- rules << Rule.new(id: @rule_counter.increment, _lhs: @build_token, _rhs: [@build_token, @token], lhs_tag: @lhs_tag, token_code: @user_code, precedence_sym: @precedence_sym, lineno: @line)
22
- rules
23
- end
24
- end
25
- end
26
- end
27
- end
28
- end
@@ -1,28 +0,0 @@
1
- module Lrama
2
- class Grammar
3
- class ParameterizingRules
4
- class Builder
5
- # Builder for option of general parameterizing rules
6
- class Option < Base
7
-
8
- # program: option(number)
9
- #
10
- # =>
11
- #
12
- # program: option_number
13
- # option_number: ε
14
- # option_number: number
15
- def build
16
- validate_argument_number!
17
-
18
- rules = []
19
- @build_token = Lrama::Lexer::Token::Ident.new(s_value: "option_#{@token.s_value}")
20
- rules << Rule.new(id: @rule_counter.increment, _lhs: @build_token, _rhs: [], lhs_tag: @lhs_tag, token_code: @user_code, precedence_sym: @precedence_sym, lineno: @line)
21
- rules << Rule.new(id: @rule_counter.increment, _lhs: @build_token, _rhs: [@token], lhs_tag: @lhs_tag, token_code: @user_code, precedence_sym: @precedence_sym, lineno: @line)
22
- rules
23
- end
24
- end
25
- end
26
- end
27
- end
28
- end
@@ -1,39 +0,0 @@
1
- module Lrama
2
- class Grammar
3
- class ParameterizingRules
4
- class Builder
5
- # Builder for separated list of general parameterizing rules
6
- class SeparatedList < Base
7
- def initialize(token, rule_counter, lhs_tag, user_code, precedence_sym, line)
8
- super
9
- @separator = @args[0]
10
- @token = @args[1]
11
- @expected_argument_num = 2
12
- end
13
-
14
- # program: separated_list(',', number)
15
- #
16
- # =>
17
- #
18
- # program: separated_list_number
19
- # separated_list_number: ε
20
- # separated_list_number: separated_nonempty_list_number
21
- # separated_nonempty_list_number: number
22
- # separated_nonempty_list_number: separated_nonempty_list_number ',' number
23
- def build
24
- validate_argument_number!
25
-
26
- rules = []
27
- @build_token = Lrama::Lexer::Token::Ident.new(s_value: "separated_list_#{@token.s_value}")
28
- separated_nonempty_list_token = Lrama::Lexer::Token::Ident.new(s_value: "separated_nonempty_list_#{@token.s_value}")
29
- rules << Rule.new(id: @rule_counter.increment, _lhs: @build_token, _rhs: [], lhs_tag: @lhs_tag, token_code: @user_code, precedence_sym: @precedence_sym, lineno: @line)
30
- rules << Rule.new(id: @rule_counter.increment, _lhs: @build_token, _rhs: [separated_nonempty_list_token], lhs_tag: @lhs_tag, token_code: @user_code, precedence_sym: @precedence_sym, lineno: @line)
31
- rules << Rule.new(id: @rule_counter.increment, _lhs: separated_nonempty_list_token, _rhs: [@token], lhs_tag: @lhs_tag, token_code: @user_code, precedence_sym: @precedence_sym, lineno: @line)
32
- rules << Rule.new(id: @rule_counter.increment, _lhs: separated_nonempty_list_token, _rhs: [separated_nonempty_list_token, @separator, @token], lhs_tag: @lhs_tag, token_code: @user_code, precedence_sym: @precedence_sym, lineno: @line)
33
- rules
34
- end
35
- end
36
- end
37
- end
38
- end
39
- end