lrama 0.6.0 → 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 +27 -7
- data/Gemfile +1 -1
- data/NEWS.md +55 -0
- data/Steepfile +2 -3
- data/lib/lrama/command.rb +25 -3
- data/lib/lrama/context.rb +3 -23
- data/lib/lrama/counterexamples/example.rb +2 -2
- data/lib/lrama/grammar/binding.rb +24 -0
- data/lib/lrama/grammar/code/rule_action.rb +1 -1
- data/lib/lrama/grammar/code.rb +1 -1
- data/lib/lrama/grammar/parameterizing_rule/resolver.rb +47 -0
- data/lib/lrama/grammar/parameterizing_rule/rhs.rb +15 -0
- data/lib/lrama/grammar/parameterizing_rule/rule.rb +16 -0
- data/lib/lrama/grammar/parameterizing_rule.rb +3 -6
- data/lib/lrama/grammar/percent_code.rb +3 -3
- data/lib/lrama/grammar/rule.rb +2 -2
- data/lib/lrama/grammar/rule_builder.rb +60 -31
- data/lib/lrama/grammar/stdlib.y +80 -0
- data/lib/lrama/grammar/type.rb +13 -1
- data/lib/lrama/grammar.rb +18 -11
- data/lib/lrama/lexer/grammar_file.rb +1 -1
- data/lib/lrama/lexer/token/instantiate_rule.rb +7 -2
- data/lib/lrama/lexer/token.rb +5 -0
- data/lib/lrama/lexer.rb +3 -7
- data/lib/lrama/output.rb +2 -2
- data/lib/lrama/parser.rb +508 -467
- 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 +12 -13
- data/sig/lrama/grammar/binding.rbs +16 -0
- data/sig/lrama/grammar/parameterizing_rule/resolver.rbs +22 -0
- data/sig/lrama/grammar/parameterizing_rule/rhs.rbs +13 -0
- data/sig/lrama/grammar/parameterizing_rule/rule.rbs +14 -0
- data/sig/lrama/grammar/parameterizing_rule.rbs +0 -4
- data/sig/lrama/grammar/percent_code.rbs +3 -3
- data/sig/lrama/grammar/rule_builder.rbs +9 -6
- data/sig/lrama/lexer/token/instantiate_rule.rbs +4 -2
- data/sig/lrama/lexer/token.rbs +1 -0
- metadata +12 -23
- data/lib/lrama/grammar/parameterizing_rule_builder.rb +0 -34
- data/lib/lrama/grammar/parameterizing_rule_resolver.rb +0 -30
- data/lib/lrama/grammar/parameterizing_rule_rhs_builder.rb +0 -53
- 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_rule_builder.rbs +0 -19
- data/sig/lrama/grammar/parameterizing_rule_resolver.rbs +0 -16
- data/sig/lrama/grammar/parameterizing_rule_rhs_builder.rbs +0 -18
- 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" "{"
|
@@ -205,8 +206,8 @@ rule
|
|
205
206
|
|
206
207
|
rule_declaration: "%rule" IDENTIFIER "(" rule_args ")" ":" rule_rhs_list
|
207
208
|
{
|
208
|
-
|
209
|
-
@grammar.
|
209
|
+
rule = Grammar::ParameterizingRule::Rule.new(val[1].s_value, val[3], val[6])
|
210
|
+
@grammar.add_parameterizing_rule(rule)
|
210
211
|
}
|
211
212
|
|
212
213
|
rule_args: IDENTIFIER { result = [val[0]] }
|
@@ -226,12 +227,12 @@ rule
|
|
226
227
|
rule_rhs: /* empty */
|
227
228
|
{
|
228
229
|
reset_precs
|
229
|
-
result = Grammar::
|
230
|
+
result = Grammar::ParameterizingRule::Rhs.new
|
230
231
|
}
|
231
232
|
| "%empty"
|
232
233
|
{
|
233
234
|
reset_precs
|
234
|
-
result = Grammar::
|
235
|
+
result = Grammar::ParameterizingRule::Rhs.new
|
235
236
|
}
|
236
237
|
| rule_rhs symbol named_ref_opt
|
237
238
|
{
|
@@ -408,19 +409,17 @@ rule
|
|
408
409
|
}
|
409
410
|
| rhs symbol parameterizing_suffix tag_opt
|
410
411
|
{
|
411
|
-
token = Lrama::Lexer::Token::InstantiateRule.new(s_value: val[2], location: @lexer.location, args: [val[1]])
|
412
|
+
token = Lrama::Lexer::Token::InstantiateRule.new(s_value: val[2], location: @lexer.location, args: [val[1]], lhs_tag: val[3])
|
412
413
|
builder = val[0]
|
413
414
|
builder.add_rhs(token)
|
414
|
-
builder.lhs_tag = val[3]
|
415
415
|
builder.line = val[1].first_line
|
416
416
|
result = builder
|
417
417
|
}
|
418
418
|
| rhs IDENTIFIER "(" parameterizing_args ")" tag_opt
|
419
419
|
{
|
420
|
-
token = Lrama::Lexer::Token::InstantiateRule.new(s_value: val[1].s_value, location: @lexer.location, args: val[3])
|
420
|
+
token = Lrama::Lexer::Token::InstantiateRule.new(s_value: val[1].s_value, location: @lexer.location, args: val[3], lhs_tag: val[5])
|
421
421
|
builder = val[0]
|
422
422
|
builder.add_rhs(token)
|
423
|
-
builder.lhs_tag = val[5]
|
424
423
|
builder.line = val[1].first_line
|
425
424
|
result = builder
|
426
425
|
}
|
@@ -453,12 +452,14 @@ rule
|
|
453
452
|
result = builder
|
454
453
|
}
|
455
454
|
|
456
|
-
parameterizing_suffix: "?"
|
457
|
-
| "+"
|
458
|
-
| "*"
|
455
|
+
parameterizing_suffix: "?" { result = "option" }
|
456
|
+
| "+" { result = "nonempty_list" }
|
457
|
+
| "*" { result = "list" }
|
459
458
|
|
460
459
|
parameterizing_args: symbol { result = [val[0]] }
|
461
460
|
| parameterizing_args ',' symbol { result = val[0].append(val[2]) }
|
461
|
+
| symbol parameterizing_suffix { result = [Lrama::Lexer::Token::InstantiateRule.new(s_value: val[1].s_value, location: @lexer.location, args: val[0])] }
|
462
|
+
| IDENTIFIER "(" parameterizing_args ")" { result = [Lrama::Lexer::Token::InstantiateRule.new(s_value: val[0].s_value, location: @lexer.location, args: val[2])] }
|
462
463
|
|
463
464
|
named_ref_opt: # empty
|
464
465
|
| '[' IDENTIFIER ']' { result = val[1].s_value }
|
@@ -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
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module Lrama
|
2
|
+
class Grammar
|
3
|
+
class Binding
|
4
|
+
attr_reader actual_args: Array[Lexer::Token]
|
5
|
+
attr_reader count: Integer
|
6
|
+
|
7
|
+
@rule_name: String
|
8
|
+
@required_parameters_count: Integer
|
9
|
+
@parameters: Array[Lexer::Token]
|
10
|
+
@parameter_to_arg: untyped
|
11
|
+
|
12
|
+
def initialize: (Grammar::ParameterizingRule::Rule parameterizing_rule, Array[Lexer::Token] actual_args) -> void
|
13
|
+
def resolve_symbol: (Lexer::Token symbol) -> Lexer::Token
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module Lrama
|
2
|
+
class Grammar
|
3
|
+
class ParameterizingRule
|
4
|
+
class Resolver
|
5
|
+
attr_accessor created_lhs_list: Array[Lexer::Token]
|
6
|
+
|
7
|
+
@rules: Array[Grammar::ParameterizingRule::Rule]
|
8
|
+
|
9
|
+
def initialize: () -> void
|
10
|
+
def add_parameterizing_rule: (Grammar::ParameterizingRule::Rule rule) -> void
|
11
|
+
def defined?: (Lexer::Token::InstantiateRule token) -> bool
|
12
|
+
def find: (Lexer::Token::InstantiateRule token) -> Grammar::ParameterizingRule::Rule?
|
13
|
+
def created_lhs: (String lhs_s_value) -> Lexer::Token?
|
14
|
+
|
15
|
+
private
|
16
|
+
|
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]
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
module Lrama
|
2
|
+
class Grammar
|
3
|
+
class ParameterizingRule
|
4
|
+
class Rhs
|
5
|
+
attr_reader symbols: Array[untyped]
|
6
|
+
attr_reader user_code: Lexer::Token::UserCode?
|
7
|
+
attr_reader precedence_sym: Lexer::Token?
|
8
|
+
|
9
|
+
def initialize: () -> void
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
module Lrama
|
2
|
+
class Grammar
|
3
|
+
class ParameterizingRule
|
4
|
+
class Rule
|
5
|
+
attr_reader name: String
|
6
|
+
attr_reader parameters: Array[Lexer::Token]
|
7
|
+
attr_reader rhs_list: Array[Grammar::ParameterizingRule::Rhs]
|
8
|
+
attr_reader required_parameters_count: Integer
|
9
|
+
|
10
|
+
def initialize: (String name, Array[Lexer::Token] parameters, Array[Grammar::ParameterizingRule::Rhs] rhs_list) -> void
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -1,10 +1,10 @@
|
|
1
1
|
module Lrama
|
2
2
|
class Grammar
|
3
3
|
class PercentCode
|
4
|
-
attr_reader
|
5
|
-
attr_reader code:
|
4
|
+
attr_reader name: String
|
5
|
+
attr_reader code: String
|
6
6
|
|
7
|
-
def initialize: (
|
7
|
+
def initialize: (String name, String code) -> void
|
8
8
|
end
|
9
9
|
end
|
10
10
|
end
|
@@ -2,8 +2,8 @@ module Lrama
|
|
2
2
|
class Grammar
|
3
3
|
class RuleBuilder
|
4
4
|
attr_accessor lhs: Lexer::Token
|
5
|
-
attr_accessor lhs_tag: untyped
|
6
5
|
attr_accessor line: Integer?
|
6
|
+
attr_reader lhs_tag: Lexer::Token::Tag?
|
7
7
|
attr_reader rhs: Array[Lexer::Token]
|
8
8
|
attr_reader user_code: Lexer::Token::UserCode?
|
9
9
|
attr_reader precedence_sym: Lexer::Token?
|
@@ -13,18 +13,20 @@ module Lrama
|
|
13
13
|
@position_in_original_rule_rhs: Integer?
|
14
14
|
@skip_preprocess_references: bool
|
15
15
|
@user_code: Lexer::Token::UserCode?
|
16
|
+
@rule_builders_for_parameterizing_rules: Array[RuleBuilder]
|
16
17
|
@rule_builders_for_derived_rules: Array[RuleBuilder]
|
17
18
|
@rules: Array[Rule]
|
18
19
|
@replaced_rhs: Array[Lexer::Token]
|
19
20
|
@parameterizing_rules: Array[Rule]
|
21
|
+
@old_parameterizing_rules: Array[Rule]
|
20
22
|
@midrule_action_rules: Array[Rule]
|
21
23
|
|
22
|
-
def initialize: (Counter rule_counter, Counter midrule_action_counter, ?Integer position_in_original_rule_rhs, ?skip_preprocess_references: bool) -> void
|
24
|
+
def initialize: (Counter rule_counter, Counter midrule_action_counter, ?Integer position_in_original_rule_rhs, ?lhs_tag: Lexer::Token::Tag?, ?skip_preprocess_references: bool) -> void
|
23
25
|
def add_rhs: (Lexer::Token rhs) -> void
|
24
|
-
def user_code=: (Lexer::Token::UserCode user_code) -> void
|
25
|
-
def precedence_sym=: (Lexer::Token
|
26
|
+
def user_code=: (Lexer::Token::UserCode? user_code) -> void
|
27
|
+
def precedence_sym=: (Lexer::Token? precedence_sym) -> void
|
26
28
|
def complete_input: () -> void
|
27
|
-
def setup_rules: (Grammar::
|
29
|
+
def setup_rules: (Grammar::ParameterizingRule::Resolver parameterizing_rule_resolver) -> void
|
28
30
|
def rules: () -> Array[Rule]
|
29
31
|
|
30
32
|
private
|
@@ -32,7 +34,8 @@ module Lrama
|
|
32
34
|
def freeze_rhs: () -> void
|
33
35
|
def preprocess_references: () -> void
|
34
36
|
def build_rules: () -> void
|
35
|
-
def process_rhs: (Grammar::
|
37
|
+
def process_rhs: (Grammar::ParameterizingRule::Resolver parameterizing_rule_resolver) -> void
|
38
|
+
def lhs_s_value: (Lexer::Token::InstantiateRule token, Grammar::Binding bindings) -> String
|
36
39
|
def numberize_references: () -> void
|
37
40
|
def flush_user_code: () -> void
|
38
41
|
end
|
@@ -2,10 +2,12 @@ module Lrama
|
|
2
2
|
class Lexer
|
3
3
|
class Token
|
4
4
|
class InstantiateRule < Token
|
5
|
-
|
5
|
+
attr_reader args: Array[Lexer::Token]
|
6
|
+
attr_reader lhs_tag: Lexer::Token::Tag?
|
6
7
|
|
7
|
-
def initialize: (s_value: String, ?alias_name: String, ?location: Location, ?args: Array[Lexer::Token]) -> void
|
8
|
+
def initialize: (s_value: String, ?alias_name: String, ?location: Location, ?args: Array[Lexer::Token], ?lhs_tag: Lexer::Token::Tag?) -> void
|
8
9
|
def rule_name: () -> String
|
10
|
+
def args_count: () -> Integer
|
9
11
|
end
|
10
12
|
end
|
11
13
|
end
|
data/sig/lrama/lexer/token.rbs
CHANGED
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:
|
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:
|
@@ -48,6 +48,7 @@ files:
|
|
48
48
|
- lib/lrama/digraph.rb
|
49
49
|
- lib/lrama/grammar.rb
|
50
50
|
- lib/lrama/grammar/auxiliary.rb
|
51
|
+
- lib/lrama/grammar/binding.rb
|
51
52
|
- lib/lrama/grammar/code.rb
|
52
53
|
- lib/lrama/grammar/code/initial_action_code.rb
|
53
54
|
- lib/lrama/grammar/code/no_reference_code.rb
|
@@ -56,22 +57,16 @@ files:
|
|
56
57
|
- lib/lrama/grammar/counter.rb
|
57
58
|
- lib/lrama/grammar/error_token.rb
|
58
59
|
- lib/lrama/grammar/parameterizing_rule.rb
|
59
|
-
- lib/lrama/grammar/
|
60
|
-
- lib/lrama/grammar/
|
61
|
-
- lib/lrama/grammar/
|
62
|
-
- lib/lrama/grammar/parameterizing_rules/builder.rb
|
63
|
-
- lib/lrama/grammar/parameterizing_rules/builder/base.rb
|
64
|
-
- lib/lrama/grammar/parameterizing_rules/builder/list.rb
|
65
|
-
- lib/lrama/grammar/parameterizing_rules/builder/nonempty_list.rb
|
66
|
-
- lib/lrama/grammar/parameterizing_rules/builder/option.rb
|
67
|
-
- lib/lrama/grammar/parameterizing_rules/builder/separated_list.rb
|
68
|
-
- lib/lrama/grammar/parameterizing_rules/builder/separated_nonempty_list.rb
|
60
|
+
- lib/lrama/grammar/parameterizing_rule/resolver.rb
|
61
|
+
- lib/lrama/grammar/parameterizing_rule/rhs.rb
|
62
|
+
- lib/lrama/grammar/parameterizing_rule/rule.rb
|
69
63
|
- lib/lrama/grammar/percent_code.rb
|
70
64
|
- lib/lrama/grammar/precedence.rb
|
71
65
|
- lib/lrama/grammar/printer.rb
|
72
66
|
- lib/lrama/grammar/reference.rb
|
73
67
|
- lib/lrama/grammar/rule.rb
|
74
68
|
- lib/lrama/grammar/rule_builder.rb
|
69
|
+
- lib/lrama/grammar/stdlib.y
|
75
70
|
- lib/lrama/grammar/symbol.rb
|
76
71
|
- lib/lrama/grammar/type.rb
|
77
72
|
- lib/lrama/grammar/union.rb
|
@@ -112,21 +107,15 @@ files:
|
|
112
107
|
- sig/lrama/bitmap.rbs
|
113
108
|
- sig/lrama/digraph.rbs
|
114
109
|
- sig/lrama/grammar.rbs
|
110
|
+
- sig/lrama/grammar/binding.rbs
|
115
111
|
- sig/lrama/grammar/code.rbs
|
116
112
|
- sig/lrama/grammar/code/printer_code.rbs
|
117
113
|
- sig/lrama/grammar/counter.rbs
|
118
114
|
- sig/lrama/grammar/error_token.rbs
|
119
115
|
- sig/lrama/grammar/parameterizing_rule.rbs
|
120
|
-
- sig/lrama/grammar/
|
121
|
-
- sig/lrama/grammar/
|
122
|
-
- sig/lrama/grammar/
|
123
|
-
- sig/lrama/grammar/parameterizing_rules/builder.rbs
|
124
|
-
- sig/lrama/grammar/parameterizing_rules/builder/base.rbs
|
125
|
-
- sig/lrama/grammar/parameterizing_rules/builder/list.rbs
|
126
|
-
- sig/lrama/grammar/parameterizing_rules/builder/nonempty_list.rbs
|
127
|
-
- sig/lrama/grammar/parameterizing_rules/builder/option.rbs
|
128
|
-
- sig/lrama/grammar/parameterizing_rules/builder/separated_list.rbs
|
129
|
-
- sig/lrama/grammar/parameterizing_rules/builder/separated_nonempty_list.rbs
|
116
|
+
- sig/lrama/grammar/parameterizing_rule/resolver.rbs
|
117
|
+
- sig/lrama/grammar/parameterizing_rule/rhs.rbs
|
118
|
+
- sig/lrama/grammar/parameterizing_rule/rule.rbs
|
130
119
|
- sig/lrama/grammar/percent_code.rbs
|
131
120
|
- sig/lrama/grammar/precedence.rbs
|
132
121
|
- sig/lrama/grammar/printer.rbs
|
@@ -168,7 +157,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
168
157
|
- !ruby/object:Gem::Version
|
169
158
|
version: '0'
|
170
159
|
requirements: []
|
171
|
-
rubygems_version: 3.5.
|
160
|
+
rubygems_version: 3.5.3
|
172
161
|
signing_key:
|
173
162
|
specification_version: 4
|
174
163
|
summary: LALR (1) parser generator written by Ruby
|
@@ -1,34 +0,0 @@
|
|
1
|
-
module Lrama
|
2
|
-
class Grammar
|
3
|
-
class ParameterizingRuleBuilder
|
4
|
-
attr_reader :name, :parameters, :rhs
|
5
|
-
|
6
|
-
def initialize(name, parameters, rhs)
|
7
|
-
@name = name
|
8
|
-
@parameters = parameters
|
9
|
-
@rhs = rhs
|
10
|
-
@required_parameters_count = parameters.count
|
11
|
-
end
|
12
|
-
|
13
|
-
def build_rules(token, actual_args, rule_counter, lhs_tag, line, rule_builders)
|
14
|
-
validate_argument_number!(token)
|
15
|
-
lhs = lhs(actual_args)
|
16
|
-
@rhs.map do |rhs|
|
17
|
-
rhs.build_rules(token, actual_args, parameters, rule_counter, lhs, lhs_tag, line, rule_builders)
|
18
|
-
end.flatten
|
19
|
-
end
|
20
|
-
|
21
|
-
private
|
22
|
-
|
23
|
-
def validate_argument_number!(token)
|
24
|
-
unless @required_parameters_count == token.args.count
|
25
|
-
raise "Invalid number of arguments. expect: #{@required_parameters_count} actual: #{token.args.count}"
|
26
|
-
end
|
27
|
-
end
|
28
|
-
|
29
|
-
def lhs(actual_args)
|
30
|
-
Lrama::Lexer::Token::Ident.new(s_value: "#{name}_#{actual_args.map(&:s_value).join('_')}")
|
31
|
-
end
|
32
|
-
end
|
33
|
-
end
|
34
|
-
end
|
@@ -1,30 +0,0 @@
|
|
1
|
-
module Lrama
|
2
|
-
class Grammar
|
3
|
-
class ParameterizingRuleResolver
|
4
|
-
def initialize
|
5
|
-
@parameterizing_rule_builders = []
|
6
|
-
end
|
7
|
-
|
8
|
-
def add_parameterizing_rule_builder(builder)
|
9
|
-
@parameterizing_rule_builders << builder
|
10
|
-
end
|
11
|
-
|
12
|
-
def defined?(name)
|
13
|
-
!rule_builders(name).empty?
|
14
|
-
end
|
15
|
-
|
16
|
-
def build_rules(token, rule_counter, lhs_tag, line)
|
17
|
-
builder = rule_builders(token.s_value).last
|
18
|
-
raise "Unknown parameterizing rule #{token.s_value} at line #{token.line}" unless builder
|
19
|
-
|
20
|
-
builder.build_rules(token, token.args, rule_counter, lhs_tag, line, @parameterizing_rule_builders)
|
21
|
-
end
|
22
|
-
|
23
|
-
private
|
24
|
-
|
25
|
-
def rule_builders(name)
|
26
|
-
@parameterizing_rule_builders.select { |builder| builder.name == name }
|
27
|
-
end
|
28
|
-
end
|
29
|
-
end
|
30
|
-
end
|
@@ -1,53 +0,0 @@
|
|
1
|
-
module Lrama
|
2
|
-
class Grammar
|
3
|
-
class ParameterizingRuleRhsBuilder
|
4
|
-
attr_accessor :symbols, :user_code, :precedence_sym
|
5
|
-
|
6
|
-
def initialize
|
7
|
-
@symbols = []
|
8
|
-
@user_code = nil
|
9
|
-
@precedence_sym = nil
|
10
|
-
end
|
11
|
-
|
12
|
-
def build_rules(token, actual_args, parameters, rule_counter, lhs, lhs_tag, line, rule_builders)
|
13
|
-
nested_rules = build_nested_rules(token, actual_args, parameters, rule_counter, lhs_tag, line, rule_builders)
|
14
|
-
rule = Rule.new(id: rule_counter.increment, _lhs: lhs, _rhs: rhs(token, actual_args, parameters, nested_rules.last), lhs_tag: lhs_tag, token_code: user_code, precedence_sym: precedence_sym, lineno: line)
|
15
|
-
ParameterizingRule.new(rules: nested_rules.map(&:rules) + [rule], token: lhs)
|
16
|
-
end
|
17
|
-
|
18
|
-
private
|
19
|
-
|
20
|
-
def build_nested_rules(token, actual_args, parameters, rule_counter, lhs_tag, line, rule_builders)
|
21
|
-
symbols.each_with_index.map do |sym, i|
|
22
|
-
next unless sym.is_a?(Lexer::Token::InstantiateRule)
|
23
|
-
|
24
|
-
builder = rule_builders.select { |builder| builder.name == sym.s_value }.last
|
25
|
-
raise "Unknown parameterizing rule #{token.s_value} at line #{token.line}" unless builder
|
26
|
-
|
27
|
-
builder.build_rules(sym, nested_actual_args(actual_args, parameters, i), rule_counter, lhs_tag, line, rule_builders)
|
28
|
-
end.flatten.compact
|
29
|
-
end
|
30
|
-
|
31
|
-
def nested_actual_args(actual_args, parameters, idx)
|
32
|
-
symbols[idx].args.map do |arg|
|
33
|
-
i = parameters.index { |parameter| parameter.s_value == arg.s_value }
|
34
|
-
i.nil? ? arg : actual_args[i]
|
35
|
-
end
|
36
|
-
end
|
37
|
-
|
38
|
-
def rhs(token, actual_args, parameters, nested_rule)
|
39
|
-
symbols.map do |sym|
|
40
|
-
if sym.is_a?(Lexer::Token::InstantiateRule)
|
41
|
-
sym.args.map do |arg|
|
42
|
-
idx = parameters.index { |parameter| parameter.s_value == arg.s_value }
|
43
|
-
idx.nil? ? sym : nested_rule&.token
|
44
|
-
end
|
45
|
-
else
|
46
|
-
idx = parameters.index { |parameter| parameter.s_value == sym.s_value }
|
47
|
-
idx.nil? ? sym : actual_args[idx]
|
48
|
-
end
|
49
|
-
end.flatten
|
50
|
-
end
|
51
|
-
end
|
52
|
-
end
|
53
|
-
end
|
@@ -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
|