lrama 0.6.1 → 0.6.2
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 +9 -0
- data/lib/lrama/command.rb +10 -2
- data/lib/lrama/context.rb +2 -2
- data/lib/lrama/counterexamples/example.rb +2 -2
- data/lib/lrama/grammar/code.rb +1 -1
- data/lib/lrama/grammar/parameterizing_rule/resolver.rb +17 -9
- data/lib/lrama/grammar/rule.rb +2 -2
- data/lib/lrama/grammar/rule_builder.rb +31 -36
- data/lib/lrama/grammar/stdlib.y +80 -0
- data/lib/lrama/grammar.rb +11 -2
- data/lib/lrama/lexer.rb +1 -0
- data/lib/lrama/parser.rb +474 -451
- data/lib/lrama/states/item.rb +17 -13
- data/lib/lrama/states_reporter.rb +8 -10
- data/lib/lrama/version.rb +1 -1
- data/parser.y +4 -5
- data/sig/lrama/grammar/parameterizing_rule/resolver.rbs +1 -0
- metadata +3 -16
- 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
data/lib/lrama/states/item.rb
CHANGED
@@ -5,7 +5,7 @@ module Lrama
|
|
5
5
|
class Item < Struct.new(:rule, :position, keyword_init: true)
|
6
6
|
# Optimization for States#setup_state
|
7
7
|
def hash
|
8
|
-
[
|
8
|
+
[rule_id, position].hash
|
9
9
|
end
|
10
10
|
|
11
11
|
def rule_id
|
@@ -17,27 +17,31 @@ module Lrama
|
|
17
17
|
end
|
18
18
|
|
19
19
|
def number_of_rest_symbols
|
20
|
-
|
20
|
+
rhs.count - position
|
21
21
|
end
|
22
22
|
|
23
23
|
def lhs
|
24
24
|
rule.lhs
|
25
25
|
end
|
26
26
|
|
27
|
+
def rhs
|
28
|
+
rule.rhs
|
29
|
+
end
|
30
|
+
|
27
31
|
def next_sym
|
28
|
-
|
32
|
+
rhs[position]
|
29
33
|
end
|
30
34
|
|
31
35
|
def next_next_sym
|
32
|
-
|
36
|
+
rhs[position + 1]
|
33
37
|
end
|
34
38
|
|
35
39
|
def previous_sym
|
36
|
-
|
40
|
+
rhs[position - 1]
|
37
41
|
end
|
38
42
|
|
39
43
|
def end_of_rule?
|
40
|
-
|
44
|
+
rhs.count == position
|
41
45
|
end
|
42
46
|
|
43
47
|
def beginning_of_rule?
|
@@ -45,7 +49,7 @@ module Lrama
|
|
45
49
|
end
|
46
50
|
|
47
51
|
def start_item?
|
48
|
-
rule.
|
52
|
+
rule.initial_rule? && beginning_of_rule?
|
49
53
|
end
|
50
54
|
|
51
55
|
def new_by_next_position
|
@@ -53,11 +57,11 @@ module Lrama
|
|
53
57
|
end
|
54
58
|
|
55
59
|
def symbols_before_dot
|
56
|
-
|
60
|
+
rhs[0...position]
|
57
61
|
end
|
58
62
|
|
59
63
|
def symbols_after_dot
|
60
|
-
|
64
|
+
rhs[position..-1]
|
61
65
|
end
|
62
66
|
|
63
67
|
def to_s
|
@@ -65,14 +69,14 @@ module Lrama
|
|
65
69
|
end
|
66
70
|
|
67
71
|
def display_name
|
68
|
-
r =
|
69
|
-
"#{r} (rule #{
|
72
|
+
r = rhs.map(&:display_name).insert(position, "•").join(" ")
|
73
|
+
"#{r} (rule #{rule_id})"
|
70
74
|
end
|
71
75
|
|
72
76
|
# Right after position
|
73
77
|
def display_rest
|
74
|
-
r =
|
75
|
-
". #{r} (rule #{
|
78
|
+
r = rhs[position..-1].map(&:display_name).join(" ")
|
79
|
+
". #{r} (rule #{rule_id})"
|
76
80
|
end
|
77
81
|
end
|
78
82
|
end
|
@@ -53,7 +53,7 @@ module Lrama
|
|
53
53
|
last_lhs = nil
|
54
54
|
|
55
55
|
@states.rules.each do |rule|
|
56
|
-
if rule.
|
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
|
-
|
88
|
-
position = item.position
|
89
|
-
if rule.rhs.empty?
|
87
|
+
if item.empty_rule?
|
90
88
|
r = "ε •"
|
91
89
|
else
|
92
|
-
r =
|
90
|
+
r = item.rhs.map(&:display_name).insert(item.position, "•").join(" ")
|
93
91
|
end
|
94
|
-
if
|
95
|
-
l = " " *
|
92
|
+
if item.lhs == last_lhs
|
93
|
+
l = " " * item.lhs.id.s_value.length + "|"
|
96
94
|
else
|
97
|
-
l =
|
95
|
+
l = item.lhs.id.s_value + ":"
|
98
96
|
end
|
99
97
|
la = ""
|
100
98
|
if lookaheads && item.end_of_rule?
|
@@ -104,9 +102,9 @@ module Lrama
|
|
104
102
|
la = " [#{look_ahead.map(&:display_name).join(", ")}]"
|
105
103
|
end
|
106
104
|
end
|
107
|
-
last_lhs =
|
105
|
+
last_lhs = item.lhs
|
108
106
|
|
109
|
-
io << sprintf("%5i %s %s%s\n",
|
107
|
+
io << sprintf("%5i %s %s%s\n", item.rule_id, l, r, la)
|
110
108
|
end
|
111
109
|
io << "\n"
|
112
110
|
|
data/lib/lrama/version.rb
CHANGED
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" "{"
|
@@ -451,9 +452,9 @@ rule
|
|
451
452
|
result = builder
|
452
453
|
}
|
453
454
|
|
454
|
-
parameterizing_suffix: "?"
|
455
|
-
| "+"
|
456
|
-
| "*"
|
455
|
+
parameterizing_suffix: "?" { result = "option" }
|
456
|
+
| "+" { result = "nonempty_list" }
|
457
|
+
| "*" { result = "list" }
|
457
458
|
|
458
459
|
parameterizing_args: symbol { result = [val[0]] }
|
459
460
|
| parameterizing_args ',' symbol { result = val[0].append(val[2]) }
|
@@ -514,8 +515,6 @@ def parse
|
|
514
515
|
@precedence_number = 0
|
515
516
|
reset_precs
|
516
517
|
do_parse
|
517
|
-
@grammar.prepare
|
518
|
-
@grammar.validate!
|
519
518
|
@grammar
|
520
519
|
end
|
521
520
|
end
|
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.
|
4
|
+
version: 0.6.2
|
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-
|
11
|
+
date: 2024-01-27 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: LALR (1) parser generator written by Ruby
|
14
14
|
email:
|
@@ -60,19 +60,13 @@ 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
|
77
71
|
- lib/lrama/grammar/type.rb
|
78
72
|
- lib/lrama/grammar/union.rb
|
@@ -122,13 +116,6 @@ files:
|
|
122
116
|
- sig/lrama/grammar/parameterizing_rule/resolver.rbs
|
123
117
|
- sig/lrama/grammar/parameterizing_rule/rhs.rbs
|
124
118
|
- 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
119
|
- sig/lrama/grammar/percent_code.rbs
|
133
120
|
- sig/lrama/grammar/precedence.rbs
|
134
121
|
- sig/lrama/grammar/printer.rbs
|
@@ -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
|
@@ -1,34 +0,0 @@
|
|
1
|
-
module Lrama
|
2
|
-
class Grammar
|
3
|
-
class ParameterizingRules
|
4
|
-
class Builder
|
5
|
-
# Builder for separated nonempty list of general parameterizing rules
|
6
|
-
class SeparatedNonemptyList < 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_nonempty_list(',', number)
|
15
|
-
#
|
16
|
-
# =>
|
17
|
-
#
|
18
|
-
# program: separated_nonempty_list_number
|
19
|
-
# separated_nonempty_list_number: number
|
20
|
-
# separated_nonempty_list_number: separated_nonempty_list_number ',' number
|
21
|
-
def build
|
22
|
-
validate_argument_number!
|
23
|
-
|
24
|
-
rules = []
|
25
|
-
@build_token = Lrama::Lexer::Token::Ident.new(s_value: "separated_nonempty_list_#{@token.s_value}")
|
26
|
-
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)
|
27
|
-
rules << Rule.new(id: @rule_counter.increment, _lhs: @build_token, _rhs: [@build_token, @separator, @token], lhs_tag: @lhs_tag, token_code: @user_code, precedence_sym: @precedence_sym, lineno: @line)
|
28
|
-
rules
|
29
|
-
end
|
30
|
-
end
|
31
|
-
end
|
32
|
-
end
|
33
|
-
end
|
34
|
-
end
|
@@ -1,60 +0,0 @@
|
|
1
|
-
require 'lrama/grammar/parameterizing_rules/builder/base'
|
2
|
-
require 'lrama/grammar/parameterizing_rules/builder/list'
|
3
|
-
require 'lrama/grammar/parameterizing_rules/builder/nonempty_list'
|
4
|
-
require 'lrama/grammar/parameterizing_rules/builder/option'
|
5
|
-
require 'lrama/grammar/parameterizing_rules/builder/separated_nonempty_list'
|
6
|
-
require 'lrama/grammar/parameterizing_rules/builder/separated_list'
|
7
|
-
|
8
|
-
module Lrama
|
9
|
-
class Grammar
|
10
|
-
class ParameterizingRules
|
11
|
-
# Builder for parameterizing rules
|
12
|
-
class Builder
|
13
|
-
RULES = {
|
14
|
-
option: Lrama::Grammar::ParameterizingRules::Builder::Option,
|
15
|
-
"?": Lrama::Grammar::ParameterizingRules::Builder::Option,
|
16
|
-
nonempty_list: Lrama::Grammar::ParameterizingRules::Builder::NonemptyList,
|
17
|
-
"+": Lrama::Grammar::ParameterizingRules::Builder::NonemptyList,
|
18
|
-
list: Lrama::Grammar::ParameterizingRules::Builder::List,
|
19
|
-
"*": Lrama::Grammar::ParameterizingRules::Builder::List,
|
20
|
-
separated_nonempty_list: Lrama::Grammar::ParameterizingRules::Builder::SeparatedNonemptyList,
|
21
|
-
separated_list: Lrama::Grammar::ParameterizingRules::Builder::SeparatedList,
|
22
|
-
}
|
23
|
-
|
24
|
-
def initialize(token, rule_counter, lhs_tag, user_code, precedence_sym, line)
|
25
|
-
@token = token
|
26
|
-
@key = token.s_value.to_sym
|
27
|
-
@rule_counter = rule_counter
|
28
|
-
@lhs_tag = lhs_tag
|
29
|
-
@user_code = user_code
|
30
|
-
@precedence_sym = precedence_sym
|
31
|
-
@line = line
|
32
|
-
@builder = nil
|
33
|
-
end
|
34
|
-
|
35
|
-
def build
|
36
|
-
create_builder
|
37
|
-
@builder.build
|
38
|
-
end
|
39
|
-
|
40
|
-
def build_token
|
41
|
-
create_builder
|
42
|
-
@builder.build_token
|
43
|
-
end
|
44
|
-
|
45
|
-
private
|
46
|
-
|
47
|
-
def create_builder
|
48
|
-
unless @builder
|
49
|
-
validate_key!
|
50
|
-
@builder = RULES[@key].new(@token, @rule_counter, @lhs_tag, @user_code, @precedence_sym, @line)
|
51
|
-
end
|
52
|
-
end
|
53
|
-
|
54
|
-
def validate_key!
|
55
|
-
raise "Parameterizing rule does not exist. `#{@key}`" unless RULES.key?(@key)
|
56
|
-
end
|
57
|
-
end
|
58
|
-
end
|
59
|
-
end
|
60
|
-
end
|
@@ -1,28 +0,0 @@
|
|
1
|
-
module Lrama
|
2
|
-
class Grammar
|
3
|
-
class ParameterizingRules
|
4
|
-
class Builder
|
5
|
-
class Base
|
6
|
-
attr_reader build_token: Lexer::Token::Ident
|
7
|
-
|
8
|
-
def initialize: (Lexer::Token::InstantiateRule token, Counter rule_counter, untyped lhs_tag, Lexer::Token::UserCode? user_code, Lexer::Token? precedence_sym, Integer? line) -> void
|
9
|
-
def build: () -> Array[Rule]
|
10
|
-
|
11
|
-
@args: Array[Lexer::Token]
|
12
|
-
@token: Lexer::Token::InstantiateRule
|
13
|
-
@key: Symbol
|
14
|
-
@rule_counter: Counter
|
15
|
-
@lhs_tag: untyped
|
16
|
-
@user_code: Lexer::Token::UserCode?
|
17
|
-
@precedence_sym: Lexer::Token?
|
18
|
-
@line: Integer?
|
19
|
-
@expected_argument_num: Integer
|
20
|
-
|
21
|
-
private
|
22
|
-
|
23
|
-
def validate_argument_number!: () -> void
|
24
|
-
end
|
25
|
-
end
|
26
|
-
end
|
27
|
-
end
|
28
|
-
end
|
@@ -1,13 +0,0 @@
|
|
1
|
-
module Lrama
|
2
|
-
class Grammar
|
3
|
-
class ParameterizingRules
|
4
|
-
class Builder
|
5
|
-
class SeparatedList < Base
|
6
|
-
@separator: Lexer::Token
|
7
|
-
|
8
|
-
def initialize: (Lexer::Token token, Counter rule_counter, untyped lhs_tag, Lexer::Token::UserCode? user_code, Lexer::Token? precedence_sym, Integer? line) -> void
|
9
|
-
end
|
10
|
-
end
|
11
|
-
end
|
12
|
-
end
|
13
|
-
end
|
@@ -1,13 +0,0 @@
|
|
1
|
-
module Lrama
|
2
|
-
class Grammar
|
3
|
-
class ParameterizingRules
|
4
|
-
class Builder
|
5
|
-
class SeparatedNonemptyList < Base
|
6
|
-
@separator: Lexer::Token
|
7
|
-
|
8
|
-
def initialize: (Lexer::Token token, Counter rule_counter, untyped lhs_tag, Lexer::Token::UserCode? user_code, Lexer::Token? precedence_sym, Integer? line) -> void
|
9
|
-
end
|
10
|
-
end
|
11
|
-
end
|
12
|
-
end
|
13
|
-
end
|
@@ -1,24 +0,0 @@
|
|
1
|
-
module Lrama
|
2
|
-
class Grammar
|
3
|
-
class ParameterizingRules
|
4
|
-
class Builder
|
5
|
-
RULES: Hash[Symbol, singleton(Base)]
|
6
|
-
|
7
|
-
@token: Lexer::Token::InstantiateRule
|
8
|
-
@key: Symbol
|
9
|
-
@rule_counter: Counter
|
10
|
-
@lhs_tag: untyped
|
11
|
-
@user_code: Lexer::Token::UserCode?
|
12
|
-
@precedence_sym: Lexer::Token?
|
13
|
-
@line: Integer?
|
14
|
-
@builder: Grammar::ParameterizingRules::Builder::Base
|
15
|
-
|
16
|
-
def initialize: (Lexer::Token token, Counter rule_counter, untyped lhs_tag, Lexer::Token::UserCode? user_code, Lexer::Token? precedence_sym, Integer? line) -> void
|
17
|
-
def build: () -> Array[Rule]
|
18
|
-
def build_token: () -> Lexer::Token
|
19
|
-
def create_builder: () -> void
|
20
|
-
def validate_key!: () -> void
|
21
|
-
end
|
22
|
-
end
|
23
|
-
end
|
24
|
-
end
|