lrama 0.6.4 → 0.6.6
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/NEWS.md +40 -0
- data/lib/lrama/command.rb +5 -0
- data/lib/lrama/grammar/parameterizing_rule/resolver.rb +15 -6
- data/lib/lrama/grammar/parameterizing_rule/rule.rb +3 -2
- data/lib/lrama/grammar/rule.rb +5 -1
- data/lib/lrama/grammar/rule_builder.rb +69 -18
- data/lib/lrama/lexer/grammar_file.rb +11 -1
- data/lib/lrama/lexer/token/user_code.rb +2 -0
- data/lib/lrama/lexer.rb +1 -0
- data/lib/lrama/option_parser.rb +3 -2
- data/lib/lrama/parser.rb +539 -518
- data/lib/lrama/state.rb +3 -25
- data/lib/lrama/version.rb +1 -1
- data/parser.y +9 -1
- data/sample/calc.y +7 -4
- data/sig/lrama/grammar/parameterizing_rule/resolver.rbs +5 -3
- data/sig/lrama/grammar/parameterizing_rule/rule.rbs +2 -1
- data/sig/lrama/grammar/rule_builder.rbs +5 -1
- data/sig/lrama/lexer/grammar_file.rbs +2 -0
- data/sig/lrama/lexer/token/user_code.rbs +1 -0
- metadata +2 -2
data/lib/lrama/state.rb
CHANGED
@@ -70,38 +70,16 @@ module Lrama
|
|
70
70
|
reduce.look_ahead = look_ahead
|
71
71
|
end
|
72
72
|
|
73
|
-
# Returns array of [Shift, next_state]
|
74
73
|
def nterm_transitions
|
75
|
-
|
76
|
-
|
77
|
-
@nterm_transitions = []
|
78
|
-
|
79
|
-
shifts.each do |shift|
|
80
|
-
next if shift.next_sym.term?
|
81
|
-
|
82
|
-
@nterm_transitions << [shift, @items_to_state[shift.next_items]]
|
83
|
-
end
|
84
|
-
|
85
|
-
@nterm_transitions
|
74
|
+
@nterm_transitions ||= transitions.select {|shift, _| shift.next_sym.nterm? }
|
86
75
|
end
|
87
76
|
|
88
|
-
# Returns array of [Shift, next_state]
|
89
77
|
def term_transitions
|
90
|
-
|
91
|
-
|
92
|
-
@term_transitions = []
|
93
|
-
|
94
|
-
shifts.each do |shift|
|
95
|
-
next if shift.next_sym.nterm?
|
96
|
-
|
97
|
-
@term_transitions << [shift, @items_to_state[shift.next_items]]
|
98
|
-
end
|
99
|
-
|
100
|
-
@term_transitions
|
78
|
+
@term_transitions ||= transitions.select {|shift, _| shift.next_sym.term? }
|
101
79
|
end
|
102
80
|
|
103
81
|
def transitions
|
104
|
-
|
82
|
+
@transitions ||= shifts.map {|shift| [shift, @items_to_state[shift.next_items]] }
|
105
83
|
end
|
106
84
|
|
107
85
|
def selected_term_transitions
|
data/lib/lrama/version.rb
CHANGED
data/parser.y
CHANGED
@@ -30,6 +30,7 @@ rule
|
|
30
30
|
|
31
31
|
bison_declaration: grammar_declaration
|
32
32
|
| rule_declaration
|
33
|
+
| inline_declaration
|
33
34
|
| "%expect" INTEGER { @grammar.expect = val[1] }
|
34
35
|
| "%define" variable value
|
35
36
|
| "%param" params
|
@@ -237,6 +238,12 @@ rule
|
|
237
238
|
@grammar.add_parameterizing_rule(rule)
|
238
239
|
}
|
239
240
|
|
241
|
+
inline_declaration: "%rule" "%inline" id_colon ":" rule_rhs_list
|
242
|
+
{
|
243
|
+
rule = Grammar::ParameterizingRule::Rule.new(val[2].s_value, [], val[4], is_inline: true)
|
244
|
+
@grammar.add_parameterizing_rule(rule)
|
245
|
+
}
|
246
|
+
|
240
247
|
rule_args: IDENTIFIER { result = [val[0]] }
|
241
248
|
| rule_args "," IDENTIFIER { result = val[0].append(val[2]) }
|
242
249
|
|
@@ -462,10 +469,11 @@ rule
|
|
462
469
|
{
|
463
470
|
end_c_declaration
|
464
471
|
}
|
465
|
-
"}" named_ref_opt
|
472
|
+
"}" named_ref_opt tag_opt
|
466
473
|
{
|
467
474
|
user_code = val[3]
|
468
475
|
user_code.alias_name = val[6]
|
476
|
+
user_code.tag = val[7]
|
469
477
|
builder = val[0]
|
470
478
|
builder.user_code = user_code
|
471
479
|
result = builder
|
data/sample/calc.y
CHANGED
@@ -31,6 +31,12 @@ static int yyerror(YYLTYPE *loc, const char *str);
|
|
31
31
|
%left '+' '-'
|
32
32
|
%left '*' '/'
|
33
33
|
|
34
|
+
%rule %inline op : '+' { + }
|
35
|
+
| '-' { - }
|
36
|
+
| '*' { * }
|
37
|
+
| '/' { / }
|
38
|
+
;
|
39
|
+
|
34
40
|
%%
|
35
41
|
|
36
42
|
list : /* empty */
|
@@ -38,10 +44,7 @@ list : /* empty */
|
|
38
44
|
| list expr LF { printf("=> %d\n", $2); }
|
39
45
|
;
|
40
46
|
expr : NUM
|
41
|
-
| expr
|
42
|
-
| expr '-' expr { $$ = $1 - $3; }
|
43
|
-
| expr '*' expr { $$ = $1 * $3; }
|
44
|
-
| expr '/' expr { $$ = $1 / $3; }
|
47
|
+
| expr op expr { $$ = $1 $2 $3; }
|
45
48
|
| '(' expr ')' { $$ = $2; }
|
46
49
|
;
|
47
50
|
|
@@ -8,13 +8,15 @@ module Lrama
|
|
8
8
|
|
9
9
|
def initialize: () -> void
|
10
10
|
def add_parameterizing_rule: (Grammar::ParameterizingRule::Rule rule) -> void
|
11
|
-
def
|
11
|
+
def find_rule: (Lexer::Token::InstantiateRule token) -> Grammar::ParameterizingRule::Rule?
|
12
|
+
def find_inline: (Lexer::Token token) -> Grammar::ParameterizingRule::Rule?
|
12
13
|
def created_lhs: (String lhs_s_value) -> Lexer::Token?
|
13
14
|
|
14
15
|
private
|
15
16
|
|
16
|
-
def select_rules: (Lexer::Token::InstantiateRule token) -> Array[Grammar::ParameterizingRule::Rule]
|
17
|
-
def
|
17
|
+
def select_rules: (Array[Grammar::ParameterizingRule::Rule] rules, Lexer::Token::InstantiateRule token) -> Array[Grammar::ParameterizingRule::Rule]
|
18
|
+
def select_not_inline_rules: (Array[Grammar::ParameterizingRule::Rule] rules) -> Array[Grammar::ParameterizingRule::Rule]
|
19
|
+
def select_rules_by_name: (Array[Grammar::ParameterizingRule::Rule] rules, String rule_name) -> Array[Grammar::ParameterizingRule::Rule]
|
18
20
|
end
|
19
21
|
end
|
20
22
|
end
|
@@ -6,8 +6,9 @@ module Lrama
|
|
6
6
|
attr_reader parameters: Array[Lexer::Token]
|
7
7
|
attr_reader rhs_list: Array[Grammar::ParameterizingRule::Rhs]
|
8
8
|
attr_reader required_parameters_count: Integer
|
9
|
+
attr_reader is_inline: bool
|
9
10
|
|
10
|
-
def initialize: (String name, Array[Lexer::Token] parameters, Array[Grammar::ParameterizingRule::Rhs] rhs_list) -> void
|
11
|
+
def initialize: (String name, Array[Lexer::Token] parameters, Array[Grammar::ParameterizingRule::Rhs] rhs_list, ?is_inline: bool) -> void
|
11
12
|
end
|
12
13
|
end
|
13
14
|
end
|
@@ -15,10 +15,11 @@ module Lrama
|
|
15
15
|
@user_code: Lexer::Token::UserCode?
|
16
16
|
@rule_builders_for_parameterizing_rules: Array[RuleBuilder]
|
17
17
|
@rule_builders_for_derived_rules: Array[RuleBuilder]
|
18
|
+
@rule_builders_for_inline_rules: Array[RuleBuilder]
|
18
19
|
@rules: Array[Rule]
|
19
20
|
@replaced_rhs: Array[Lexer::Token]
|
20
21
|
@parameterizing_rules: Array[Rule]
|
21
|
-
@
|
22
|
+
@inline_rules: Array[Rule]
|
22
23
|
@midrule_action_rules: Array[Rule]
|
23
24
|
|
24
25
|
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
|
@@ -36,6 +37,9 @@ module Lrama
|
|
36
37
|
def build_rules: () -> void
|
37
38
|
def process_rhs: (Grammar::ParameterizingRule::Resolver parameterizing_rule_resolver) -> void
|
38
39
|
def lhs_s_value: (Lexer::Token::InstantiateRule token, Grammar::Binding bindings) -> String
|
40
|
+
def resolve_inline: (Grammar::ParameterizingRule::Resolver parameterizing_rule_resolver) -> void
|
41
|
+
def resolve_inline_rhs: (RuleBuilder rule_builder, Grammar::ParameterizingRule::Rhs inline_rhs, Integer index) -> void
|
42
|
+
def replace_inline_user_code: (Grammar::ParameterizingRule::Rhs inline_rhs, Integer index) -> Lexer::Token::UserCode?
|
39
43
|
def numberize_references: () -> void
|
40
44
|
def flush_user_code: () -> void
|
41
45
|
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.6
|
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-
|
11
|
+
date: 2024-04-27 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: LALR (1) parser generator written by Ruby
|
14
14
|
email:
|