lrama 0.6.2 → 0.6.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/NEWS.md +34 -0
- data/README.md +23 -0
- data/Steepfile +2 -0
- data/lib/lrama/context.rb +4 -4
- data/lib/lrama/grammar/code/initial_action_code.rb +6 -0
- data/lib/lrama/grammar/code/no_reference_code.rb +4 -0
- data/lib/lrama/grammar/code/printer_code.rb +6 -0
- data/lib/lrama/grammar/code/rule_action.rb +11 -1
- data/lib/lrama/grammar/reference.rb +4 -3
- data/lib/lrama/grammar/rule_builder.rb +8 -1
- data/lib/lrama/grammar/symbol.rb +1 -1
- data/lib/lrama/grammar/symbols/resolver.rb +276 -0
- data/lib/lrama/grammar/symbols.rb +1 -0
- data/lib/lrama/grammar.rb +25 -244
- data/lib/lrama/lexer/token/user_code.rb +13 -2
- data/lib/lrama/lexer.rb +6 -0
- data/lib/lrama/output.rb +56 -2
- data/lib/lrama/parser.rb +520 -457
- data/lib/lrama/state.rb +4 -4
- data/lib/lrama/states/item.rb +6 -8
- data/lib/lrama/states_reporter.rb +2 -2
- data/lib/lrama/version.rb +1 -1
- data/lrama.gemspec +7 -0
- data/parser.y +20 -0
- data/sig/lrama/grammar/reference.rbs +2 -1
- data/sig/lrama/grammar/symbol.rbs +4 -4
- data/sig/lrama/grammar/symbols/resolver.rbs +41 -0
- data/sig/lrama/grammar/type.rbs +11 -0
- data/template/bison/yacc.c +6 -0
- metadata +12 -3
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.
|
33
|
-
reduce.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.
|
109
|
-
|
108
|
+
term_transitions.reject do |shift, next_state|
|
109
|
+
shift.not_selected
|
110
110
|
end
|
111
111
|
end
|
112
112
|
|
data/lib/lrama/states/item.rb
CHANGED
@@ -1,8 +1,14 @@
|
|
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
14
|
[rule_id, position].hash
|
@@ -20,14 +26,6 @@ module Lrama
|
|
20
26
|
rhs.count - position
|
21
27
|
end
|
22
28
|
|
23
|
-
def lhs
|
24
|
-
rule.lhs
|
25
|
-
end
|
26
|
-
|
27
|
-
def rhs
|
28
|
-
rule.rhs
|
29
|
-
end
|
30
|
-
|
31
29
|
def next_sym
|
32
30
|
rhs[position]
|
33
31
|
end
|
@@ -109,8 +109,8 @@ module Lrama
|
|
109
109
|
io << "\n"
|
110
110
|
|
111
111
|
# Report shifts
|
112
|
-
tmp = state.term_transitions.
|
113
|
-
|
112
|
+
tmp = state.term_transitions.reject do |shift, _|
|
113
|
+
shift.not_selected
|
114
114
|
end.map do |shift, next_state|
|
115
115
|
[shift.next_sym, next_state.id]
|
116
116
|
end
|
data/lib/lrama/version.rb
CHANGED
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
@@ -129,6 +129,26 @@ rule
|
|
129
129
|
lineno: val[3].line
|
130
130
|
)
|
131
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
|
+
}
|
132
152
|
|
133
153
|
symbol_declaration: "%token" token_declarations
|
134
154
|
| "%type" symbol_declarations
|
@@ -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
|
-
|
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
|
data/template/bison/yacc.c
CHANGED
@@ -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.
|
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-
|
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:
|
@@ -68,6 +68,8 @@ files:
|
|
68
68
|
- lib/lrama/grammar/rule_builder.rb
|
69
69
|
- lib/lrama/grammar/stdlib.y
|
70
70
|
- lib/lrama/grammar/symbol.rb
|
71
|
+
- lib/lrama/grammar/symbols.rb
|
72
|
+
- lib/lrama/grammar/symbols/resolver.rb
|
71
73
|
- lib/lrama/grammar/type.rb
|
72
74
|
- lib/lrama/grammar/union.rb
|
73
75
|
- lib/lrama/lexer.rb
|
@@ -123,6 +125,8 @@ files:
|
|
123
125
|
- sig/lrama/grammar/rule.rbs
|
124
126
|
- sig/lrama/grammar/rule_builder.rbs
|
125
127
|
- sig/lrama/grammar/symbol.rbs
|
128
|
+
- sig/lrama/grammar/symbols/resolver.rbs
|
129
|
+
- sig/lrama/grammar/type.rbs
|
126
130
|
- sig/lrama/lexer/grammar_file.rbs
|
127
131
|
- sig/lrama/lexer/location.rbs
|
128
132
|
- sig/lrama/lexer/token.rbs
|
@@ -141,7 +145,12 @@ files:
|
|
141
145
|
homepage: https://github.com/ruby/lrama
|
142
146
|
licenses:
|
143
147
|
- GPL-3.0-or-later
|
144
|
-
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
|
145
154
|
post_install_message:
|
146
155
|
rdoc_options: []
|
147
156
|
require_paths:
|