lrama 0.6.0 → 0.6.2
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 +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
@@ -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,19 +0,0 @@
|
|
1
|
-
module Lrama
|
2
|
-
class Grammar
|
3
|
-
class ParameterizingRuleBuilder
|
4
|
-
attr_reader name: String
|
5
|
-
attr_reader parameters: Array[Lexer::Token]
|
6
|
-
attr_reader rhs: Array[Grammar::ParameterizingRuleRhsBuilder]
|
7
|
-
|
8
|
-
@required_parameters_count: Integer
|
9
|
-
|
10
|
-
def initialize: (String name, Array[Lexer::Token] parameters, Array[Grammar::ParameterizingRuleRhsBuilder] rhs) -> void
|
11
|
-
def build_rules: (Lexer::Token::InstantiateRule token, Array[Lexer::Token] actual_args, Counter rule_counter, untyped lhs_tag, Integer? line, Array[ParameterizingRuleBuilder] rule_builders) -> Array[Grammar::ParameterizingRule]
|
12
|
-
|
13
|
-
private
|
14
|
-
|
15
|
-
def validate_argument_number!: (Lexer::Token::InstantiateRule token) -> void
|
16
|
-
def lhs: (Array[Lexer::Token] actual_args) -> Lexer::Token
|
17
|
-
end
|
18
|
-
end
|
19
|
-
end
|
@@ -1,16 +0,0 @@
|
|
1
|
-
module Lrama
|
2
|
-
class Grammar
|
3
|
-
class ParameterizingRuleResolver
|
4
|
-
@parameterizing_rule_builders: Array[Grammar::ParameterizingRuleBuilder]
|
5
|
-
|
6
|
-
def initialize: () -> void
|
7
|
-
def add_parameterizing_rule_builder: (Grammar::ParameterizingRuleBuilder builder) -> void
|
8
|
-
def defined?: (String) -> bool
|
9
|
-
def build_rules: (Lexer::Token::InstantiateRule token, Counter rule_counter, untyped lhs_tag, Integer? line) -> Array[Grammar::ParameterizingRule]
|
10
|
-
|
11
|
-
private
|
12
|
-
|
13
|
-
def rule_builders: (String) -> Array[Grammar::ParameterizingRuleBuilder]
|
14
|
-
end
|
15
|
-
end
|
16
|
-
end
|
@@ -1,18 +0,0 @@
|
|
1
|
-
module Lrama
|
2
|
-
class Grammar
|
3
|
-
class ParameterizingRuleRhsBuilder
|
4
|
-
attr_reader symbols: Array[untyped]
|
5
|
-
attr_reader user_code: Lexer::Token::UserCode?
|
6
|
-
attr_reader precedence_sym: Lexer::Token?
|
7
|
-
|
8
|
-
def initialize: () -> void
|
9
|
-
def build_rules: (Lexer::Token::InstantiateRule token, Array[Lexer::Token] actual_args, Array[Lexer::Token] parameters, Counter rule_counter, Lexer::Token lhs, untyped lhs_tag, Integer? line, Array[ParameterizingRuleBuilder] rule_builders) -> Grammar::ParameterizingRule
|
10
|
-
|
11
|
-
private
|
12
|
-
|
13
|
-
def build_nested_rules: (Lexer::Token::InstantiateRule token, Array[Lexer::Token] actual_args, Array[Lexer::Token] parameters, Counter rule_counter, untyped lhs_tag, Integer? line, Array[ParameterizingRuleBuilder] rule_builders) -> Array[Grammar::ParameterizingRule]
|
14
|
-
def nested_actual_args: (Array[Lexer::Token] actual_args, Array[Lexer::Token] parameters, Integer idx) -> Array[Lexer::Token]
|
15
|
-
def rhs: (Lexer::Token token, Array[Lexer::Token] actual_args, Array[Lexer::Token] parameters, ParameterizingRule? nested_rule) -> Array[Lexer::Token]
|
16
|
-
end
|
17
|
-
end
|
18
|
-
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
|