lrama 0.6.2 → 0.6.4
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 +2 -3
- data/Gemfile +1 -1
- data/NEWS.md +101 -1
- data/README.md +23 -0
- data/Steepfile +5 -0
- data/lib/lrama/context.rb +4 -4
- data/lib/lrama/grammar/code/destructor_code.rb +40 -0
- 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/code.rb +1 -0
- data/lib/lrama/grammar/destructor.rb +9 -0
- data/lib/lrama/grammar/reference.rb +4 -3
- data/lib/lrama/grammar/rule_builder.rb +10 -3
- data/lib/lrama/grammar/stdlib.y +42 -0
- data/lib/lrama/grammar/symbol.rb +4 -2
- data/lib/lrama/grammar/symbols/resolver.rb +293 -0
- data/lib/lrama/grammar/symbols.rb +1 -0
- data/lib/lrama/grammar.rb +32 -244
- data/lib/lrama/lexer/token/user_code.rb +13 -2
- data/lib/lrama/lexer/token.rb +1 -1
- data/lib/lrama/lexer.rb +7 -0
- data/lib/lrama/option_parser.rb +25 -12
- data/lib/lrama/options.rb +1 -0
- data/lib/lrama/output.rb +75 -2
- data/lib/lrama/parser.rb +537 -464
- 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 +27 -0
- data/sig/lrama/grammar/binding.rbs +0 -1
- data/sig/lrama/grammar/code/destructor_code.rbs +15 -0
- data/sig/lrama/grammar/destructor.rbs +11 -0
- data/sig/lrama/grammar/parameterizing_rule/resolver.rbs +0 -1
- data/sig/lrama/grammar/reference.rbs +2 -2
- data/sig/lrama/grammar/symbol.rbs +5 -4
- data/sig/lrama/grammar/symbols/resolver.rbs +41 -0
- data/sig/lrama/grammar/type.rbs +11 -0
- data/sig/lrama/options.rbs +17 -0
- data/template/bison/yacc.c +12 -1
- metadata +17 -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
@@ -97,6 +97,13 @@ rule
|
|
97
97
|
end_c_declaration
|
98
98
|
}
|
99
99
|
"}" generic_symlist
|
100
|
+
{
|
101
|
+
@grammar.add_destructor(
|
102
|
+
ident_or_tags: val[6],
|
103
|
+
token_code: val[3],
|
104
|
+
lineno: val[3].line
|
105
|
+
)
|
106
|
+
}
|
100
107
|
| "%printer" "{"
|
101
108
|
{
|
102
109
|
begin_c_declaration("}")
|
@@ -129,6 +136,26 @@ rule
|
|
129
136
|
lineno: val[3].line
|
130
137
|
)
|
131
138
|
}
|
139
|
+
| "%after-shift" IDENTIFIER
|
140
|
+
{
|
141
|
+
@grammar.after_shift = val[1]
|
142
|
+
}
|
143
|
+
| "%before-reduce" IDENTIFIER
|
144
|
+
{
|
145
|
+
@grammar.before_reduce = val[1]
|
146
|
+
}
|
147
|
+
| "%after-reduce" IDENTIFIER
|
148
|
+
{
|
149
|
+
@grammar.after_reduce = val[1]
|
150
|
+
}
|
151
|
+
| "%after-shift-error-token" IDENTIFIER
|
152
|
+
{
|
153
|
+
@grammar.after_shift_error_token = val[1]
|
154
|
+
}
|
155
|
+
| "%after-pop-stack" IDENTIFIER
|
156
|
+
{
|
157
|
+
@grammar.after_pop_stack = val[1]
|
158
|
+
}
|
132
159
|
|
133
160
|
symbol_declaration: "%token" token_declarations
|
134
161
|
| "%type" symbol_declarations
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module Lrama
|
2
|
+
class Grammar
|
3
|
+
class Code
|
4
|
+
class DestructorCode < Code
|
5
|
+
@tag: untyped
|
6
|
+
def initialize: (type: untyped, token_code: untyped, tag: untyped) -> void
|
7
|
+
|
8
|
+
private
|
9
|
+
|
10
|
+
# ref: Lrama::Grammar::Code.token_code.references
|
11
|
+
def reference_to_c: (untyped ref) -> untyped
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
module Lrama
|
2
|
+
class Grammar
|
3
|
+
class Destructor
|
4
|
+
attr_accessor ident_or_tags: Array[Lexer::Token::Ident|Lexer::Token::Tag]
|
5
|
+
attr_accessor token_code: Grammar::Code
|
6
|
+
attr_accessor lineno: Integer
|
7
|
+
|
8
|
+
def translated_code: (Lexer::Token member) -> String
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
@@ -8,7 +8,6 @@ module Lrama
|
|
8
8
|
|
9
9
|
def initialize: () -> void
|
10
10
|
def add_parameterizing_rule: (Grammar::ParameterizingRule::Rule rule) -> void
|
11
|
-
def defined?: (Lexer::Token::InstantiateRule token) -> bool
|
12
11
|
def find: (Lexer::Token::InstantiateRule token) -> Grammar::ParameterizingRule::Rule?
|
13
12
|
def created_lhs: (String lhs_s_value) -> Lexer::Token?
|
14
13
|
|
@@ -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,13 +11,12 @@ 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
|
17
18
|
|
18
19
|
def value: () -> (String|Integer)
|
19
|
-
def tag: () -> untyped
|
20
20
|
end
|
21
21
|
end
|
22
22
|
end
|
@@ -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
|
@@ -10,6 +10,7 @@ module Lrama
|
|
10
10
|
attr_accessor nullable: bool
|
11
11
|
attr_accessor precedence: Precedence?
|
12
12
|
attr_accessor printer: Printer?
|
13
|
+
attr_accessor destructor: Destructor?
|
13
14
|
attr_accessor error_token: ErrorToken
|
14
15
|
|
15
16
|
attr_accessor first_set: Set[Array[Symbol]]
|
@@ -20,8 +21,8 @@ module Lrama
|
|
20
21
|
attr_writer accept_symbol: Symbol
|
21
22
|
|
22
23
|
def initialize: (
|
23
|
-
id: Lexer::Token, alias_name: String?, number: Integer?, tag: Lexer::Token?,
|
24
|
-
|
24
|
+
id: Lexer::Token, term: bool, ?alias_name: String?, ?number: Integer?, ?tag: Lexer::Token?,
|
25
|
+
?token_id: Integer?, ?nullable: bool?, ?precedence: Precedence?, ?printer: Printer?) -> void
|
25
26
|
|
26
27
|
def term?: () -> bool
|
27
28
|
def nterm?: () -> bool
|
@@ -31,7 +32,7 @@ module Lrama
|
|
31
32
|
def accept_symbol?: () -> bool
|
32
33
|
def display_name: () -> String
|
33
34
|
def enum_name: () -> String
|
34
|
-
def comment: () -> String
|
35
|
+
def comment: () -> String?
|
35
36
|
end
|
36
37
|
end
|
37
38
|
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
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module Lrama
|
2
|
+
class Options
|
3
|
+
attr_accessor skeleton: String
|
4
|
+
attr_accessor header: bool
|
5
|
+
attr_accessor header_file: String?
|
6
|
+
attr_accessor report_file: String?
|
7
|
+
attr_accessor outfile: String
|
8
|
+
attr_accessor error_recovery: bool
|
9
|
+
attr_accessor grammar_file: String?
|
10
|
+
attr_accessor trace_opts: Hash[Symbol, bool]?
|
11
|
+
attr_accessor report_opts: Hash[Symbol, bool]?
|
12
|
+
attr_accessor y: IO
|
13
|
+
attr_accessor debug: bool
|
14
|
+
|
15
|
+
def initialize: () -> void
|
16
|
+
end
|
17
|
+
end
|
data/template/bison/yacc.c
CHANGED
@@ -1145,7 +1145,12 @@ yydestruct (const char *yymsg,
|
|
1145
1145
|
YY_SYMBOL_PRINT (yymsg, yykind, yyvaluep, yylocationp<%= output.user_args %>);
|
1146
1146
|
|
1147
1147
|
YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
|
1148
|
-
|
1148
|
+
switch (yykind)
|
1149
|
+
{
|
1150
|
+
<%= output.symbol_actions_for_destructor -%>
|
1151
|
+
default:
|
1152
|
+
break;
|
1153
|
+
}
|
1149
1154
|
YY_IGNORE_MAYBE_UNINITIALIZED_END
|
1150
1155
|
}
|
1151
1156
|
|
@@ -1752,6 +1757,7 @@ yybackup:
|
|
1752
1757
|
*++yyvsp = yylval;
|
1753
1758
|
YY_IGNORE_MAYBE_UNINITIALIZED_END
|
1754
1759
|
*++yylsp = yylloc;
|
1760
|
+
<%= output.after_shift_function("/* %after-shift code. */") %>
|
1755
1761
|
|
1756
1762
|
/* Discard the shifted token. */
|
1757
1763
|
yychar = YYEMPTY;
|
@@ -1784,6 +1790,7 @@ yyreduce:
|
|
1784
1790
|
unconditionally makes the parser a bit smaller, and it avoids a
|
1785
1791
|
GCC warning that YYVAL may be used uninitialized. */
|
1786
1792
|
yyval = yyvsp[1-yylen];
|
1793
|
+
<%= output.before_reduce_function("/* %before-reduce function. */") %>
|
1787
1794
|
|
1788
1795
|
/* Default location. */
|
1789
1796
|
YYLLOC_DEFAULT (yyloc, (yylsp - yylen), yylen);
|
@@ -1809,6 +1816,7 @@ yyreduce:
|
|
1809
1816
|
YY_SYMBOL_PRINT ("-> $$ =", YY_CAST (yysymbol_kind_t, yyr1[yyn]), &yyval, &yyloc<%= output.user_args %>);
|
1810
1817
|
|
1811
1818
|
YYPOPSTACK (yylen);
|
1819
|
+
<%= output.after_reduce_function("/* %after-reduce function. */") %>
|
1812
1820
|
yylen = 0;
|
1813
1821
|
|
1814
1822
|
*++yyvsp = yyval;
|
@@ -1910,6 +1918,7 @@ yyerrorlab:
|
|
1910
1918
|
/* Do not reclaim the symbols of the rule whose action triggered
|
1911
1919
|
this YYERROR. */
|
1912
1920
|
YYPOPSTACK (yylen);
|
1921
|
+
<%= output.after_pop_stack_function("yylen", "/* %after-pop-stack function. */") %>
|
1913
1922
|
yylen = 0;
|
1914
1923
|
YY_STACK_PRINT (yyss, yyssp<%= output.user_args %>);
|
1915
1924
|
yystate = *yyssp;
|
@@ -1969,6 +1978,7 @@ yyerrlab1:
|
|
1969
1978
|
yydestruct ("Error: popping",
|
1970
1979
|
YY_ACCESSING_SYMBOL (yystate), yyvsp, yylsp<%= output.user_args %>);
|
1971
1980
|
YYPOPSTACK (1);
|
1981
|
+
<%= output.after_pop_stack_function(1, "/* %after-pop-stack function. */") %>
|
1972
1982
|
yystate = *yyssp;
|
1973
1983
|
YY_STACK_PRINT (yyss, yyssp<%= output.user_args %>);
|
1974
1984
|
}
|
@@ -1983,6 +1993,7 @@ yyerrlab1:
|
|
1983
1993
|
|
1984
1994
|
/* Shift the error token. */
|
1985
1995
|
YY_SYMBOL_PRINT ("Shifting", YY_ACCESSING_SYMBOL (yyn), yyvsp, yylsp<%= output.user_args %>);
|
1996
|
+
<%= output.after_shift_error_token_function("/* %after-shift-error-token code. */") %>
|
1986
1997
|
|
1987
1998
|
yystate = yyn;
|
1988
1999
|
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.4
|
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-03-22 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: LALR (1) parser generator written by Ruby
|
14
14
|
email:
|
@@ -50,11 +50,13 @@ files:
|
|
50
50
|
- lib/lrama/grammar/auxiliary.rb
|
51
51
|
- lib/lrama/grammar/binding.rb
|
52
52
|
- lib/lrama/grammar/code.rb
|
53
|
+
- lib/lrama/grammar/code/destructor_code.rb
|
53
54
|
- lib/lrama/grammar/code/initial_action_code.rb
|
54
55
|
- lib/lrama/grammar/code/no_reference_code.rb
|
55
56
|
- lib/lrama/grammar/code/printer_code.rb
|
56
57
|
- lib/lrama/grammar/code/rule_action.rb
|
57
58
|
- lib/lrama/grammar/counter.rb
|
59
|
+
- lib/lrama/grammar/destructor.rb
|
58
60
|
- lib/lrama/grammar/error_token.rb
|
59
61
|
- lib/lrama/grammar/parameterizing_rule.rb
|
60
62
|
- lib/lrama/grammar/parameterizing_rule/resolver.rb
|
@@ -68,6 +70,8 @@ files:
|
|
68
70
|
- lib/lrama/grammar/rule_builder.rb
|
69
71
|
- lib/lrama/grammar/stdlib.y
|
70
72
|
- lib/lrama/grammar/symbol.rb
|
73
|
+
- lib/lrama/grammar/symbols.rb
|
74
|
+
- lib/lrama/grammar/symbols/resolver.rb
|
71
75
|
- lib/lrama/grammar/type.rb
|
72
76
|
- lib/lrama/grammar/union.rb
|
73
77
|
- lib/lrama/lexer.rb
|
@@ -109,8 +113,10 @@ files:
|
|
109
113
|
- sig/lrama/grammar.rbs
|
110
114
|
- sig/lrama/grammar/binding.rbs
|
111
115
|
- sig/lrama/grammar/code.rbs
|
116
|
+
- sig/lrama/grammar/code/destructor_code.rbs
|
112
117
|
- sig/lrama/grammar/code/printer_code.rbs
|
113
118
|
- sig/lrama/grammar/counter.rbs
|
119
|
+
- sig/lrama/grammar/destructor.rbs
|
114
120
|
- sig/lrama/grammar/error_token.rbs
|
115
121
|
- sig/lrama/grammar/parameterizing_rule.rbs
|
116
122
|
- sig/lrama/grammar/parameterizing_rule/resolver.rbs
|
@@ -123,6 +129,8 @@ files:
|
|
123
129
|
- sig/lrama/grammar/rule.rbs
|
124
130
|
- sig/lrama/grammar/rule_builder.rbs
|
125
131
|
- sig/lrama/grammar/symbol.rbs
|
132
|
+
- sig/lrama/grammar/symbols/resolver.rbs
|
133
|
+
- sig/lrama/grammar/type.rbs
|
126
134
|
- sig/lrama/lexer/grammar_file.rbs
|
127
135
|
- sig/lrama/lexer/location.rbs
|
128
136
|
- sig/lrama/lexer/token.rbs
|
@@ -131,6 +139,7 @@ files:
|
|
131
139
|
- sig/lrama/lexer/token/instantiate_rule.rbs
|
132
140
|
- sig/lrama/lexer/token/tag.rbs
|
133
141
|
- sig/lrama/lexer/token/user_code.rbs
|
142
|
+
- sig/lrama/options.rbs
|
134
143
|
- sig/lrama/report/duration.rbs
|
135
144
|
- sig/lrama/report/profile.rbs
|
136
145
|
- sig/lrama/warning.rbs
|
@@ -141,7 +150,12 @@ files:
|
|
141
150
|
homepage: https://github.com/ruby/lrama
|
142
151
|
licenses:
|
143
152
|
- GPL-3.0-or-later
|
144
|
-
metadata:
|
153
|
+
metadata:
|
154
|
+
homepage_uri: https://github.com/ruby/lrama
|
155
|
+
source_code_uri: https://github.com/ruby/lrama
|
156
|
+
documentation_uri: https://github.com/ruby/lrama
|
157
|
+
changelog_uri: https://github.com/ruby/lrama/releases
|
158
|
+
bug_tracker_uri: https://github.com/ruby/lrama/issues
|
145
159
|
post_install_message:
|
146
160
|
rdoc_options: []
|
147
161
|
require_paths:
|