lrama 0.5.10 → 0.5.11
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 +21 -1
- data/Steepfile +8 -12
- data/lib/lrama/grammar/code/rule_action.rb +1 -1
- data/lib/lrama/grammar/parameterizing_rules/builder/base.rb +10 -2
- data/lib/lrama/grammar/parameterizing_rules/builder/list.rb +12 -4
- data/lib/lrama/grammar/parameterizing_rules/builder/nonempty_list.rb +12 -4
- data/lib/lrama/grammar/parameterizing_rules/builder/option.rb +12 -4
- data/lib/lrama/grammar/parameterizing_rules/builder/separated_list.rb +17 -6
- data/lib/lrama/grammar/parameterizing_rules/builder/separated_nonempty_list.rb +12 -5
- data/lib/lrama/grammar/parameterizing_rules/builder.rb +23 -6
- data/lib/lrama/grammar/rule.rb +2 -1
- data/lib/lrama/grammar/rule_builder.rb +17 -19
- data/lib/lrama/grammar/symbol.rb +16 -2
- data/lib/lrama/grammar/type.rb +6 -0
- data/lib/lrama/grammar.rb +8 -3
- data/lib/lrama/lexer/token/parameterizing.rb +1 -1
- data/lib/lrama/lexer/token.rb +16 -9
- data/lib/lrama/lexer.rb +1 -2
- data/lib/lrama/parser.rb +359 -346
- data/lib/lrama/version.rb +1 -1
- data/lib/lrama.rb +0 -1
- data/parser.y +17 -15
- data/rbs_collection.lock.yaml +2 -8
- data/sig/lrama/grammar/error_token.rbs +11 -0
- data/sig/lrama/grammar/parameterizing_rules/builder/base.rbs +26 -0
- data/sig/lrama/grammar/parameterizing_rules/builder/list.rbs +10 -0
- data/sig/lrama/grammar/parameterizing_rules/builder/nonempty_list.rbs +10 -0
- data/sig/lrama/grammar/parameterizing_rules/builder/option.rbs +10 -0
- data/sig/lrama/grammar/parameterizing_rules/builder/separated_list.rbs +11 -0
- data/sig/lrama/grammar/parameterizing_rules/builder/separated_nonempty_list.rbs +11 -0
- data/sig/lrama/grammar/parameterizing_rules/builder.rbs +14 -1
- data/sig/lrama/grammar/reference.rbs +2 -2
- data/sig/lrama/grammar/rule.rbs +1 -1
- data/sig/lrama/grammar/rule_builder.rbs +1 -0
- data/sig/lrama/grammar/symbol.rbs +37 -0
- data/sig/lrama/lexer/token/parameterizing.rbs +2 -0
- data/sig/lrama/lexer/token.rbs +3 -3
- data/template/bison/yacc.c +0 -2
- metadata +11 -3
- data/lib/lrama/type.rb +0 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 634093bc73fd1504910364bffa6827a66fa7479f1f5b5238fdf577f0bb6d3d9d
|
4
|
+
data.tar.gz: 96db570d049f47f20bf619535ee91e7f0f846a492404a54f7fe41a6addcce484
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6b09e84cd16cd162f263e68abf7ada808418212ca449fab0f4a380c42c0193f479cad3d0d1afcc1d5f17d81b890e3754642d1a9433f7be5f6fc71fdcb2df3f97
|
7
|
+
data.tar.gz: 1994a670f1033e737f2193e2e71ccaa0818e4144ac7f4424ebf24046ece23efc3f67eeb0927c5336663a244f270b321247b39dbbdbe76cfacc13b94da6289a8b
|
data/.github/workflows/test.yaml
CHANGED
@@ -35,10 +35,30 @@ jobs:
|
|
35
35
|
with:
|
36
36
|
ruby-version: ${{ matrix.ruby }}
|
37
37
|
bundler-cache: true
|
38
|
-
- run: choco install winflexbison
|
38
|
+
- run: choco install winflexbison || choco install winflexbison
|
39
39
|
- run: win_flex --help
|
40
40
|
- run: bundle install
|
41
41
|
- run: bundle exec rspec
|
42
|
+
test-memory:
|
43
|
+
runs-on: ubuntu-20.04
|
44
|
+
strategy:
|
45
|
+
fail-fast: false
|
46
|
+
matrix:
|
47
|
+
ruby: ['head']
|
48
|
+
steps:
|
49
|
+
- uses: actions/checkout@v4
|
50
|
+
- uses: ruby/setup-ruby@v1
|
51
|
+
with:
|
52
|
+
ruby-version: ${{ matrix.ruby }}
|
53
|
+
bundler-cache: true
|
54
|
+
- run: |
|
55
|
+
sudo apt-get update -q
|
56
|
+
sudo apt-get install --no-install-recommends -q -y valgrind
|
57
|
+
- run: valgrind --version
|
58
|
+
- run: bundle install
|
59
|
+
- run: bundle exec rspec spec/lrama/integration_spec.rb
|
60
|
+
env:
|
61
|
+
ENABEL_VALGRIND: 'true'
|
42
62
|
check-misc:
|
43
63
|
runs-on: ubuntu-20.04
|
44
64
|
strategy:
|
data/Steepfile
CHANGED
@@ -4,24 +4,20 @@ target :lib do
|
|
4
4
|
repo_path '.gem_rbs_collection/'
|
5
5
|
signature "sig"
|
6
6
|
|
7
|
-
check "lib/lrama/bitmap.rb"
|
8
|
-
check "lib/lrama/digraph.rb"
|
9
|
-
check "lib/lrama/grammar/code.rb"
|
10
7
|
check "lib/lrama/grammar/code/printer_code.rb"
|
8
|
+
check "lib/lrama/grammar/code.rb"
|
11
9
|
check "lib/lrama/grammar/counter.rb"
|
10
|
+
check "lib/lrama/grammar/error_token.rb"
|
11
|
+
check "lib/lrama/grammar/parameterizing_rules"
|
12
12
|
check "lib/lrama/grammar/percent_code.rb"
|
13
13
|
check "lib/lrama/grammar/precedence.rb"
|
14
14
|
check "lib/lrama/grammar/printer.rb"
|
15
15
|
check "lib/lrama/grammar/reference.rb"
|
16
16
|
check "lib/lrama/grammar/rule_builder.rb"
|
17
|
-
check "lib/lrama/
|
18
|
-
check "lib/lrama/lexer
|
19
|
-
check "lib/lrama/
|
20
|
-
check "lib/lrama/
|
21
|
-
check "lib/lrama/
|
22
|
-
check "lib/lrama/lexer/location.rb"
|
23
|
-
check "lib/lrama/lexer/token.rb"
|
24
|
-
check "lib/lrama/report/duration.rb"
|
25
|
-
check "lib/lrama/report/profile.rb"
|
17
|
+
check "lib/lrama/grammar/symbol.rb"
|
18
|
+
check "lib/lrama/lexer"
|
19
|
+
check "lib/lrama/report"
|
20
|
+
check "lib/lrama/bitmap.rb"
|
21
|
+
check "lib/lrama/digraph.rb"
|
26
22
|
check "lib/lrama/warning.rb"
|
27
23
|
end
|
@@ -2,16 +2,24 @@ module Lrama
|
|
2
2
|
class Grammar
|
3
3
|
class ParameterizingRules
|
4
4
|
class Builder
|
5
|
+
# Base class for parameterizing rules builder
|
5
6
|
class Base
|
6
|
-
|
7
|
+
attr_reader :build_token
|
8
|
+
|
9
|
+
def initialize(token, rule_counter, lhs_tag, user_code, precedence_sym, line)
|
7
10
|
@args = token.args
|
8
11
|
@token = @args.first
|
9
12
|
@rule_counter = rule_counter
|
10
|
-
@
|
13
|
+
@lhs_tag = lhs_tag
|
11
14
|
@user_code = user_code
|
12
15
|
@precedence_sym = precedence_sym
|
13
16
|
@line = line
|
14
17
|
@expected_argument_num = 1
|
18
|
+
@build_token = nil
|
19
|
+
end
|
20
|
+
|
21
|
+
def build
|
22
|
+
raise NotImplementedError
|
15
23
|
end
|
16
24
|
|
17
25
|
private
|
@@ -2,15 +2,23 @@ module Lrama
|
|
2
2
|
class Grammar
|
3
3
|
class ParameterizingRules
|
4
4
|
class Builder
|
5
|
+
# Builder for list of general parameterizing rules
|
5
6
|
class List < Base
|
7
|
+
|
8
|
+
# program: list(number)
|
9
|
+
#
|
10
|
+
# =>
|
11
|
+
#
|
12
|
+
# program: list_number
|
13
|
+
# list_number: ε
|
14
|
+
# list_number: list_number number
|
6
15
|
def build
|
7
16
|
validate_argument_number!
|
8
17
|
|
9
18
|
rules = []
|
10
|
-
|
11
|
-
rules << Rule.new(id: @rule_counter.increment, _lhs: @
|
12
|
-
rules << Rule.new(id: @rule_counter.increment, _lhs:
|
13
|
-
rules << Rule.new(id: @rule_counter.increment, _lhs: list_token, _rhs: [list_token, @token], token_code: @user_code, precedence_sym: @precedence_sym, lineno: @line)
|
19
|
+
@build_token = Lrama::Lexer::Token::Ident.new(s_value: "list_#{@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: [@build_token, @token], lhs_tag: @lhs_tag, token_code: @user_code, precedence_sym: @precedence_sym, lineno: @line)
|
14
22
|
rules
|
15
23
|
end
|
16
24
|
end
|
@@ -2,15 +2,23 @@ module Lrama
|
|
2
2
|
class Grammar
|
3
3
|
class ParameterizingRules
|
4
4
|
class Builder
|
5
|
+
# Builder for nonempty list of general parameterizing rules
|
5
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
|
6
15
|
def build
|
7
16
|
validate_argument_number!
|
8
17
|
|
9
18
|
rules = []
|
10
|
-
|
11
|
-
rules << Rule.new(id: @rule_counter.increment, _lhs: @
|
12
|
-
rules << Rule.new(id: @rule_counter.increment, _lhs:
|
13
|
-
rules << Rule.new(id: @rule_counter.increment, _lhs: nonempty_list_token, _rhs: [nonempty_list_token, @token], token_code: @user_code, precedence_sym: @precedence_sym, lineno: @line)
|
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)
|
14
22
|
rules
|
15
23
|
end
|
16
24
|
end
|
@@ -2,15 +2,23 @@ module Lrama
|
|
2
2
|
class Grammar
|
3
3
|
class ParameterizingRules
|
4
4
|
class Builder
|
5
|
+
# Builder for option of general parameterizing rules
|
5
6
|
class Option < Base
|
7
|
+
|
8
|
+
# program: option(number)
|
9
|
+
#
|
10
|
+
# =>
|
11
|
+
#
|
12
|
+
# program: option_number
|
13
|
+
# option_number: ε
|
14
|
+
# option_number: number
|
6
15
|
def build
|
7
16
|
validate_argument_number!
|
8
17
|
|
9
18
|
rules = []
|
10
|
-
|
11
|
-
rules << Rule.new(id: @rule_counter.increment, _lhs: @
|
12
|
-
rules << Rule.new(id: @rule_counter.increment, _lhs:
|
13
|
-
rules << Rule.new(id: @rule_counter.increment, _lhs: option_token, _rhs: [@token], token_code: @ser_code, precedence_sym: @precedence_sym, lineno: @line)
|
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)
|
14
22
|
rules
|
15
23
|
end
|
16
24
|
end
|
@@ -2,23 +2,34 @@ module Lrama
|
|
2
2
|
class Grammar
|
3
3
|
class ParameterizingRules
|
4
4
|
class Builder
|
5
|
+
# Builder for separated list of general parameterizing rules
|
5
6
|
class SeparatedList < Base
|
6
|
-
def initialize(token, rule_counter,
|
7
|
+
def initialize(token, rule_counter, lhs_tag, user_code, precedence_sym, line)
|
7
8
|
super
|
8
9
|
@separator = @args[0]
|
9
10
|
@token = @args[1]
|
10
11
|
@expected_argument_num = 2
|
11
12
|
end
|
12
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
|
13
23
|
def build
|
14
24
|
validate_argument_number!
|
15
25
|
|
16
26
|
rules = []
|
17
|
-
|
18
|
-
|
19
|
-
rules << Rule.new(id: @rule_counter.increment, _lhs:
|
20
|
-
rules << Rule.new(id: @rule_counter.increment, _lhs:
|
21
|
-
rules << Rule.new(id: @rule_counter.increment, _lhs:
|
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)
|
22
33
|
rules
|
23
34
|
end
|
24
35
|
end
|
@@ -2,22 +2,29 @@ module Lrama
|
|
2
2
|
class Grammar
|
3
3
|
class ParameterizingRules
|
4
4
|
class Builder
|
5
|
+
# Builder for separated nonempty list of general parameterizing rules
|
5
6
|
class SeparatedNonemptyList < Base
|
6
|
-
def initialize(token, rule_counter,
|
7
|
+
def initialize(token, rule_counter, lhs_tag, user_code, precedence_sym, line)
|
7
8
|
super
|
8
9
|
@separator = @args[0]
|
9
10
|
@token = @args[1]
|
10
11
|
@expected_argument_num = 2
|
11
12
|
end
|
12
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
|
13
21
|
def build
|
14
22
|
validate_argument_number!
|
15
23
|
|
16
24
|
rules = []
|
17
|
-
|
18
|
-
rules << Rule.new(id: @rule_counter.increment, _lhs: @
|
19
|
-
rules << Rule.new(id: @rule_counter.increment, _lhs:
|
20
|
-
rules << Rule.new(id: @rule_counter.increment, _lhs: separated_list_token, _rhs: [separated_list_token, @separator, @token], token_code: @user_code, precedence_sym: @precedence_sym, lineno: @line)
|
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)
|
21
28
|
rules
|
22
29
|
end
|
23
30
|
end
|
@@ -8,6 +8,7 @@ require 'lrama/grammar/parameterizing_rules/builder/separated_list'
|
|
8
8
|
module Lrama
|
9
9
|
class Grammar
|
10
10
|
class ParameterizingRules
|
11
|
+
# Builder for parameterizing rules
|
11
12
|
class Builder
|
12
13
|
RULES = {
|
13
14
|
option: Lrama::Grammar::ParameterizingRules::Builder::Option,
|
@@ -20,23 +21,39 @@ module Lrama
|
|
20
21
|
separated_list: Lrama::Grammar::ParameterizingRules::Builder::SeparatedList,
|
21
22
|
}
|
22
23
|
|
23
|
-
def initialize(token, rule_counter,
|
24
|
+
def initialize(token, rule_counter, lhs_tag, user_code, precedence_sym, line)
|
24
25
|
@token = token
|
25
26
|
@key = token.s_value.to_sym
|
26
27
|
@rule_counter = rule_counter
|
27
|
-
@
|
28
|
+
@lhs_tag = lhs_tag
|
28
29
|
@user_code = user_code
|
29
30
|
@precedence_sym = precedence_sym
|
30
31
|
@line = line
|
32
|
+
@builder = nil
|
31
33
|
end
|
32
34
|
|
33
35
|
def build
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
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)
|
38
51
|
end
|
39
52
|
end
|
53
|
+
|
54
|
+
def validate_key!
|
55
|
+
raise "Parameterizing rule does not exist. `#{@key}`" unless RULES.key?(@key)
|
56
|
+
end
|
40
57
|
end
|
41
58
|
end
|
42
59
|
end
|
data/lib/lrama/grammar/rule.rb
CHANGED
@@ -1,12 +1,13 @@
|
|
1
1
|
module Lrama
|
2
2
|
class Grammar
|
3
3
|
# _rhs holds original RHS element. Use rhs to refer to Symbol.
|
4
|
-
class Rule < Struct.new(:id, :_lhs, :lhs, :_rhs, :rhs, :token_code, :position_in_original_rule_rhs, :nullable, :precedence_sym, :lineno, keyword_init: true)
|
4
|
+
class Rule < Struct.new(:id, :_lhs, :lhs, :lhs_tag, :_rhs, :rhs, :token_code, :position_in_original_rule_rhs, :nullable, :precedence_sym, :lineno, keyword_init: true)
|
5
5
|
attr_accessor :original_rule
|
6
6
|
|
7
7
|
def ==(other)
|
8
8
|
self.class == other.class &&
|
9
9
|
self.lhs == other.lhs &&
|
10
|
+
self.lhs_tag == other.lhs_tag &&
|
10
11
|
self.rhs == other.rhs &&
|
11
12
|
self.token_code == other.token_code &&
|
12
13
|
self.position_in_original_rule_rhs == other.position_in_original_rule_rhs &&
|
@@ -3,7 +3,7 @@ require 'lrama/grammar/parameterizing_rules/builder'
|
|
3
3
|
module Lrama
|
4
4
|
class Grammar
|
5
5
|
class RuleBuilder
|
6
|
-
attr_accessor :lhs, :line
|
6
|
+
attr_accessor :lhs, :lhs_tag, :line
|
7
7
|
attr_reader :rhs, :user_code, :precedence_sym
|
8
8
|
|
9
9
|
def initialize(rule_counter, midrule_action_counter, position_in_original_rule_rhs = nil, skip_preprocess_references: false)
|
@@ -14,6 +14,7 @@ module Lrama
|
|
14
14
|
|
15
15
|
@lhs = nil
|
16
16
|
@rhs = []
|
17
|
+
@lhs_tag = nil
|
17
18
|
@user_code = nil
|
18
19
|
@precedence_sym = nil
|
19
20
|
@line = nil
|
@@ -81,22 +82,16 @@ module Lrama
|
|
81
82
|
def build_rules
|
82
83
|
tokens = @replaced_rhs
|
83
84
|
|
84
|
-
|
85
|
-
|
86
|
-
@
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
@midrule_action_rules = @rule_builders_for_derived_rules.map do |rule_builder|
|
95
|
-
rule_builder.rules
|
96
|
-
end.flatten
|
97
|
-
@midrule_action_rules.each do |r|
|
98
|
-
r.original_rule = rule
|
99
|
-
end
|
85
|
+
rule = Rule.new(
|
86
|
+
id: @rule_counter.increment, _lhs: lhs, _rhs: tokens, token_code: user_code,
|
87
|
+
position_in_original_rule_rhs: @position_in_original_rule_rhs, precedence_sym: precedence_sym, lineno: line
|
88
|
+
)
|
89
|
+
@rules = [rule]
|
90
|
+
@midrule_action_rules = @rule_builders_for_derived_rules.map do |rule_builder|
|
91
|
+
rule_builder.rules
|
92
|
+
end.flatten
|
93
|
+
@midrule_action_rules.each do |r|
|
94
|
+
r.original_rule = rule
|
100
95
|
end
|
101
96
|
end
|
102
97
|
|
@@ -115,8 +110,11 @@ module Lrama
|
|
115
110
|
when Lrama::Lexer::Token::Ident
|
116
111
|
@replaced_rhs << token
|
117
112
|
when Lrama::Lexer::Token::Parameterizing
|
118
|
-
|
119
|
-
|
113
|
+
parameterizing = ParameterizingRules::Builder.new(token, @rule_counter, @lhs_tag, user_code, precedence_sym, line)
|
114
|
+
parameterizing.build.each do |r|
|
115
|
+
@parameterizing_rules << r
|
116
|
+
end
|
117
|
+
@replaced_rhs << parameterizing.build_token
|
120
118
|
when Lrama::Lexer::Token::UserCode
|
121
119
|
prefix = token.referred ? "@" : "$@"
|
122
120
|
new_token = Lrama::Lexer::Token::Ident.new(s_value: prefix + @midrule_action_counter.increment.to_s)
|
data/lib/lrama/grammar/symbol.rb
CHANGED
@@ -6,10 +6,23 @@
|
|
6
6
|
|
7
7
|
module Lrama
|
8
8
|
class Grammar
|
9
|
-
class Symbol
|
10
|
-
attr_accessor :first_set, :first_set_bitmap
|
9
|
+
class Symbol
|
10
|
+
attr_accessor :id, :alias_name, :tag, :number, :token_id, :nullable, :precedence, :printer, :error_token, :first_set, :first_set_bitmap
|
11
|
+
attr_reader :term
|
11
12
|
attr_writer :eof_symbol, :error_symbol, :undef_symbol, :accept_symbol
|
12
13
|
|
14
|
+
def initialize(id:, alias_name: nil, number: nil, tag: nil, term:, token_id: nil, nullable: nil, precedence: nil, printer: nil)
|
15
|
+
@id = id
|
16
|
+
@alias_name = alias_name
|
17
|
+
@number = number
|
18
|
+
@tag = tag
|
19
|
+
@term = term
|
20
|
+
@token_id = token_id
|
21
|
+
@nullable = nullable
|
22
|
+
@precedence = precedence
|
23
|
+
@printer = printer
|
24
|
+
end
|
25
|
+
|
13
26
|
def term?
|
14
27
|
term
|
15
28
|
end
|
@@ -41,6 +54,7 @@ module Lrama
|
|
41
54
|
# name for yysymbol_kind_t
|
42
55
|
#
|
43
56
|
# See: b4_symbol_kind_base
|
57
|
+
# @type var name: String
|
44
58
|
def enum_name
|
45
59
|
case
|
46
60
|
when accept_symbol?
|
data/lib/lrama/grammar.rb
CHANGED
@@ -9,9 +9,9 @@ require "lrama/grammar/reference"
|
|
9
9
|
require "lrama/grammar/rule"
|
10
10
|
require "lrama/grammar/rule_builder"
|
11
11
|
require "lrama/grammar/symbol"
|
12
|
+
require "lrama/grammar/type"
|
12
13
|
require "lrama/grammar/union"
|
13
14
|
require "lrama/lexer"
|
14
|
-
require "lrama/type"
|
15
15
|
|
16
16
|
module Lrama
|
17
17
|
# Grammar is the result of parsing an input grammar file
|
@@ -148,7 +148,7 @@ module Lrama
|
|
148
148
|
def prepare
|
149
149
|
normalize_rules
|
150
150
|
collect_symbols
|
151
|
-
|
151
|
+
set_lhs_and_rhs
|
152
152
|
fill_symbol_number
|
153
153
|
fill_default_precedence
|
154
154
|
fill_sym_to_rules
|
@@ -391,6 +391,11 @@ module Lrama
|
|
391
391
|
@rules << rule
|
392
392
|
end
|
393
393
|
|
394
|
+
builder.parameterizing_rules.each do |rule|
|
395
|
+
add_nterm(id: rule._lhs, tag: rule.lhs_tag)
|
396
|
+
@rules << rule
|
397
|
+
end
|
398
|
+
|
394
399
|
builder.midrule_action_rules.each do |rule|
|
395
400
|
add_nterm(id: rule._lhs)
|
396
401
|
end
|
@@ -484,7 +489,7 @@ module Lrama
|
|
484
489
|
end
|
485
490
|
end
|
486
491
|
|
487
|
-
def
|
492
|
+
def set_lhs_and_rhs
|
488
493
|
@rules.each do |rule|
|
489
494
|
rule.lhs = token_to_symbol(rule._lhs) if rule._lhs
|
490
495
|
|
@@ -4,7 +4,7 @@ module Lrama
|
|
4
4
|
class Parameterizing < Token
|
5
5
|
attr_accessor :args
|
6
6
|
|
7
|
-
def initialize(s_value
|
7
|
+
def initialize(s_value:, alias_name: nil, location: nil, args: [])
|
8
8
|
super s_value: s_value, alias_name: alias_name, location: location
|
9
9
|
@args = args
|
10
10
|
end
|
data/lib/lrama/lexer/token.rb
CHANGED
@@ -1,8 +1,21 @@
|
|
1
|
+
require 'lrama/lexer/token/char'
|
2
|
+
require 'lrama/lexer/token/ident'
|
3
|
+
require 'lrama/lexer/token/parameterizing'
|
4
|
+
require 'lrama/lexer/token/tag'
|
5
|
+
require 'lrama/lexer/token/user_code'
|
6
|
+
|
1
7
|
module Lrama
|
2
8
|
class Lexer
|
3
|
-
class Token
|
4
|
-
|
5
|
-
attr_accessor :referred
|
9
|
+
class Token
|
10
|
+
attr_reader :s_value, :location
|
11
|
+
attr_accessor :alias_name, :referred
|
12
|
+
|
13
|
+
def initialize(s_value:, alias_name: nil, location: nil)
|
14
|
+
s_value.freeze
|
15
|
+
@s_value = s_value
|
16
|
+
@alias_name = alias_name
|
17
|
+
@location = location
|
18
|
+
end
|
6
19
|
|
7
20
|
def to_s
|
8
21
|
"#{super} location: #{location}"
|
@@ -36,9 +49,3 @@ module Lrama
|
|
36
49
|
end
|
37
50
|
end
|
38
51
|
end
|
39
|
-
|
40
|
-
require 'lrama/lexer/token/char'
|
41
|
-
require 'lrama/lexer/token/ident'
|
42
|
-
require 'lrama/lexer/token/parameterizing'
|
43
|
-
require 'lrama/lexer/token/tag'
|
44
|
-
require 'lrama/lexer/token/user_code'
|