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.
Files changed (61) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/test.yaml +27 -7
  3. data/Gemfile +1 -1
  4. data/NEWS.md +55 -0
  5. data/Steepfile +2 -3
  6. data/lib/lrama/command.rb +25 -3
  7. data/lib/lrama/context.rb +3 -23
  8. data/lib/lrama/counterexamples/example.rb +2 -2
  9. data/lib/lrama/grammar/binding.rb +24 -0
  10. data/lib/lrama/grammar/code/rule_action.rb +1 -1
  11. data/lib/lrama/grammar/code.rb +1 -1
  12. data/lib/lrama/grammar/parameterizing_rule/resolver.rb +47 -0
  13. data/lib/lrama/grammar/parameterizing_rule/rhs.rb +15 -0
  14. data/lib/lrama/grammar/parameterizing_rule/rule.rb +16 -0
  15. data/lib/lrama/grammar/parameterizing_rule.rb +3 -6
  16. data/lib/lrama/grammar/percent_code.rb +3 -3
  17. data/lib/lrama/grammar/rule.rb +2 -2
  18. data/lib/lrama/grammar/rule_builder.rb +60 -31
  19. data/lib/lrama/grammar/stdlib.y +80 -0
  20. data/lib/lrama/grammar/type.rb +13 -1
  21. data/lib/lrama/grammar.rb +18 -11
  22. data/lib/lrama/lexer/grammar_file.rb +1 -1
  23. data/lib/lrama/lexer/token/instantiate_rule.rb +7 -2
  24. data/lib/lrama/lexer/token.rb +5 -0
  25. data/lib/lrama/lexer.rb +3 -7
  26. data/lib/lrama/output.rb +2 -2
  27. data/lib/lrama/parser.rb +508 -467
  28. data/lib/lrama/states/item.rb +17 -13
  29. data/lib/lrama/states_reporter.rb +8 -10
  30. data/lib/lrama/version.rb +1 -1
  31. data/parser.y +12 -13
  32. data/sig/lrama/grammar/binding.rbs +16 -0
  33. data/sig/lrama/grammar/parameterizing_rule/resolver.rbs +22 -0
  34. data/sig/lrama/grammar/parameterizing_rule/rhs.rbs +13 -0
  35. data/sig/lrama/grammar/parameterizing_rule/rule.rbs +14 -0
  36. data/sig/lrama/grammar/parameterizing_rule.rbs +0 -4
  37. data/sig/lrama/grammar/percent_code.rbs +3 -3
  38. data/sig/lrama/grammar/rule_builder.rbs +9 -6
  39. data/sig/lrama/lexer/token/instantiate_rule.rbs +4 -2
  40. data/sig/lrama/lexer/token.rbs +1 -0
  41. metadata +12 -23
  42. data/lib/lrama/grammar/parameterizing_rule_builder.rb +0 -34
  43. data/lib/lrama/grammar/parameterizing_rule_resolver.rb +0 -30
  44. data/lib/lrama/grammar/parameterizing_rule_rhs_builder.rb +0 -53
  45. data/lib/lrama/grammar/parameterizing_rules/builder/base.rb +0 -36
  46. data/lib/lrama/grammar/parameterizing_rules/builder/list.rb +0 -28
  47. data/lib/lrama/grammar/parameterizing_rules/builder/nonempty_list.rb +0 -28
  48. data/lib/lrama/grammar/parameterizing_rules/builder/option.rb +0 -28
  49. data/lib/lrama/grammar/parameterizing_rules/builder/separated_list.rb +0 -39
  50. data/lib/lrama/grammar/parameterizing_rules/builder/separated_nonempty_list.rb +0 -34
  51. data/lib/lrama/grammar/parameterizing_rules/builder.rb +0 -60
  52. data/sig/lrama/grammar/parameterizing_rule_builder.rbs +0 -19
  53. data/sig/lrama/grammar/parameterizing_rule_resolver.rbs +0 -16
  54. data/sig/lrama/grammar/parameterizing_rule_rhs_builder.rbs +0 -18
  55. data/sig/lrama/grammar/parameterizing_rules/builder/base.rbs +0 -28
  56. data/sig/lrama/grammar/parameterizing_rules/builder/list.rbs +0 -10
  57. data/sig/lrama/grammar/parameterizing_rules/builder/nonempty_list.rbs +0 -10
  58. data/sig/lrama/grammar/parameterizing_rules/builder/option.rbs +0 -10
  59. data/sig/lrama/grammar/parameterizing_rules/builder/separated_list.rbs +0 -13
  60. data/sig/lrama/grammar/parameterizing_rules/builder/separated_nonempty_list.rbs +0 -13
  61. 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,10 +0,0 @@
1
- module Lrama
2
- class Grammar
3
- class ParameterizingRules
4
- class Builder
5
- class List < Base
6
- end
7
- end
8
- end
9
- end
10
- end
@@ -1,10 +0,0 @@
1
- module Lrama
2
- class Grammar
3
- class ParameterizingRules
4
- class Builder
5
- class NonemptyList < Base
6
- end
7
- end
8
- end
9
- end
10
- end
@@ -1,10 +0,0 @@
1
- module Lrama
2
- class Grammar
3
- class ParameterizingRules
4
- class Builder
5
- class Option < Base
6
- end
7
- end
8
- end
9
- end
10
- 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