lrama 0.6.1 → 0.6.2
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 +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
|