lrama 0.6.1 → 0.6.3

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 (53) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/test.yaml +7 -2
  3. data/NEWS.md +43 -0
  4. data/README.md +23 -0
  5. data/Steepfile +2 -0
  6. data/lib/lrama/command.rb +10 -2
  7. data/lib/lrama/context.rb +6 -6
  8. data/lib/lrama/counterexamples/example.rb +2 -2
  9. data/lib/lrama/grammar/code/initial_action_code.rb +6 -0
  10. data/lib/lrama/grammar/code/no_reference_code.rb +4 -0
  11. data/lib/lrama/grammar/code/printer_code.rb +6 -0
  12. data/lib/lrama/grammar/code/rule_action.rb +11 -1
  13. data/lib/lrama/grammar/code.rb +1 -1
  14. data/lib/lrama/grammar/parameterizing_rule/resolver.rb +17 -9
  15. data/lib/lrama/grammar/reference.rb +4 -3
  16. data/lib/lrama/grammar/rule.rb +2 -2
  17. data/lib/lrama/grammar/rule_builder.rb +38 -36
  18. data/lib/lrama/grammar/stdlib.y +80 -0
  19. data/lib/lrama/grammar/symbol.rb +1 -1
  20. data/lib/lrama/grammar/symbols/resolver.rb +276 -0
  21. data/lib/lrama/grammar/symbols.rb +1 -0
  22. data/lib/lrama/grammar.rb +36 -246
  23. data/lib/lrama/lexer/token/user_code.rb +13 -2
  24. data/lib/lrama/lexer.rb +7 -0
  25. data/lib/lrama/output.rb +56 -2
  26. data/lib/lrama/parser.rb +571 -485
  27. data/lib/lrama/state.rb +4 -4
  28. data/lib/lrama/states/item.rb +19 -17
  29. data/lib/lrama/states_reporter.rb +10 -12
  30. data/lib/lrama/version.rb +1 -1
  31. data/lrama.gemspec +7 -0
  32. data/parser.y +24 -5
  33. data/sig/lrama/grammar/parameterizing_rule/resolver.rbs +1 -0
  34. data/sig/lrama/grammar/reference.rbs +2 -1
  35. data/sig/lrama/grammar/symbol.rbs +4 -4
  36. data/sig/lrama/grammar/symbols/resolver.rbs +41 -0
  37. data/sig/lrama/grammar/type.rbs +11 -0
  38. data/template/bison/yacc.c +6 -0
  39. metadata +13 -17
  40. data/lib/lrama/grammar/parameterizing_rules/builder/base.rb +0 -36
  41. data/lib/lrama/grammar/parameterizing_rules/builder/list.rb +0 -28
  42. data/lib/lrama/grammar/parameterizing_rules/builder/nonempty_list.rb +0 -28
  43. data/lib/lrama/grammar/parameterizing_rules/builder/option.rb +0 -28
  44. data/lib/lrama/grammar/parameterizing_rules/builder/separated_list.rb +0 -39
  45. data/lib/lrama/grammar/parameterizing_rules/builder/separated_nonempty_list.rb +0 -34
  46. data/lib/lrama/grammar/parameterizing_rules/builder.rb +0 -60
  47. data/sig/lrama/grammar/parameterizing_rules/builder/base.rbs +0 -28
  48. data/sig/lrama/grammar/parameterizing_rules/builder/list.rbs +0 -10
  49. data/sig/lrama/grammar/parameterizing_rules/builder/nonempty_list.rbs +0 -10
  50. data/sig/lrama/grammar/parameterizing_rules/builder/option.rbs +0 -10
  51. data/sig/lrama/grammar/parameterizing_rules/builder/separated_list.rbs +0 -13
  52. data/sig/lrama/grammar/parameterizing_rules/builder/separated_nonempty_list.rbs +0 -13
  53. data/sig/lrama/grammar/parameterizing_rules/builder.rbs +0 -24
@@ -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,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