summaryrefslogtreecommitdiff
path: root/tool/lrama
diff options
context:
space:
mode:
authoryui-knk <spiketeika@gmail.com>2023-12-25 18:40:50 +0900
committerYuichiro Kaneko <spiketeika@gmail.com>2023-12-25 20:33:22 +0900
commit12b69bf515111ecf4b550fe1e2c5ec81a6fcf43a (patch)
treecce4de07fc128f05a9d08a7883cb0769992401ca /tool/lrama
parent9cf1c2bb0cc723d91021efb37b89ff1e5d11565b (diff)
Lrama v0.6.0
Diffstat (limited to 'tool/lrama')
-rw-r--r--tool/lrama/NEWS.md20
-rw-r--r--tool/lrama/lib/lrama/grammar.rb56
-rw-r--r--tool/lrama/lib/lrama/grammar/code.rb26
-rw-r--r--tool/lrama/lib/lrama/grammar/code/printer_code.rb2
-rw-r--r--tool/lrama/lib/lrama/grammar/code/rule_action.rb2
-rw-r--r--tool/lrama/lib/lrama/grammar/parameterizing_rule.rb6
-rw-r--r--tool/lrama/lib/lrama/grammar/parameterizing_rule_builder.rb34
-rw-r--r--tool/lrama/lib/lrama/grammar/parameterizing_rule_resolver.rb30
-rw-r--r--tool/lrama/lib/lrama/grammar/parameterizing_rule_rhs_builder.rb53
-rw-r--r--tool/lrama/lib/lrama/grammar/rule_builder.rb48
-rw-r--r--tool/lrama/lib/lrama/lexer.rb32
-rw-r--r--tool/lrama/lib/lrama/lexer/grammar_file.rb21
-rw-r--r--tool/lrama/lib/lrama/lexer/location.rb79
-rw-r--r--tool/lrama/lib/lrama/lexer/token.rb2
-rw-r--r--tool/lrama/lib/lrama/lexer/token/instantiate_rule.rb18
-rw-r--r--tool/lrama/lib/lrama/lexer/token/parameterizing.rb34
-rw-r--r--tool/lrama/lib/lrama/lexer/token/user_code.rb20
-rw-r--r--tool/lrama/lib/lrama/parser.rb1073
-rw-r--r--tool/lrama/lib/lrama/states_reporter.rb2
-rw-r--r--tool/lrama/lib/lrama/version.rb2
20 files changed, 974 insertions, 586 deletions
diff --git a/tool/lrama/NEWS.md b/tool/lrama/NEWS.md
index de4c3bbf12..0af278fc06 100644
--- a/tool/lrama/NEWS.md
+++ b/tool/lrama/NEWS.md
@@ -1,5 +1,25 @@
# NEWS for Lrama
+## Lrama 0.6.0 (2023-12-25)
+
+### User defined parameterizing rules
+
+Allow to define parameterizing rule by `%rule` directive.
+
+```
+%rule pair(X, Y): X Y { $$ = $1 + $2; }
+ ;
+
+%%
+
+program: stmt
+ ;
+
+stmt: pair(ODD, EVEN) <num>
+ | pair(EVEN, ODD) <num>
+ ;
+```
+
## Lrama 0.5.11 (2023-12-02)
### Type specification of parameterizing rules
diff --git a/tool/lrama/lib/lrama/grammar.rb b/tool/lrama/lib/lrama/grammar.rb
index c6bdc8a644..8fed581f6b 100644
--- a/tool/lrama/lib/lrama/grammar.rb
+++ b/tool/lrama/lib/lrama/grammar.rb
@@ -8,6 +8,10 @@ require "lrama/grammar/printer"
require "lrama/grammar/reference"
require "lrama/grammar/rule"
require "lrama/grammar/rule_builder"
+require "lrama/grammar/parameterizing_rule_builder"
+require "lrama/grammar/parameterizing_rule_resolver"
+require "lrama/grammar/parameterizing_rule_rhs_builder"
+require "lrama/grammar/parameterizing_rule"
require "lrama/grammar/symbol"
require "lrama/grammar/type"
require "lrama/grammar/union"
@@ -36,6 +40,7 @@ module Lrama
@rule_builders = []
@rules = []
@sym_to_rules = {}
+ @parameterizing_resolver = ParameterizingRuleResolver.new
@empty_symbol = nil
@eof_symbol = nil
@error_symbol = nil
@@ -69,7 +74,7 @@ module Lrama
return sym
end
- if sym = @symbols.find {|s| s.id == id }
+ if (sym = @symbols.find {|s| s.id == id })
return sym
end
@@ -129,6 +134,10 @@ module Lrama
@rule_builders << builder
end
+ def add_parameterizing_rule_builder(builder)
+ @parameterizing_resolver.add_parameterizing_rule_builder(builder)
+ end
+
def prologue_first_lineno=(prologue_first_lineno)
@aux.prologue_first_lineno = prologue_first_lineno
end
@@ -310,7 +319,7 @@ module Lrama
def setup_rules
@rule_builders.each do |builder|
- builder.setup_rules
+ builder.setup_rules(@parameterizing_resolver)
end
end
@@ -350,56 +359,21 @@ module Lrama
@accept_symbol = term
end
- # 1. Add $accept rule to the top of rules
- # 2. Extract action in the middle of RHS into new Empty rule
- # 3. Append id and extract action then create Rule
- #
- # Bison 3.8.2 uses different orders for symbol number and rule number
- # when a rule has actions in the middle of a rule.
- #
- # For example,
- #
- # `program: $@1 top_compstmt`
- #
- # Rules are ordered like below,
- #
- # 1 $@1: ε
- # 2 program: $@1 top_compstmt
- #
- # Symbols are ordered like below,
- #
- # 164 program
- # 165 $@1
- #
def normalize_rules
- # 1. Add $accept rule to the top of rules
- accept = @accept_symbol
- eof = @eof_symbol
+ # Add $accept rule to the top of rules
lineno = @rule_builders.first ? @rule_builders.first.line : 0
- @rules << Rule.new(id: @rule_counter.increment, _lhs: accept.id, _rhs: [@rule_builders.first.lhs, eof.id], token_code: nil, lineno: lineno)
+ @rules << Rule.new(id: @rule_counter.increment, _lhs: @accept_symbol.id, _rhs: [@rule_builders.first.lhs, @eof_symbol.id], token_code: nil, lineno: lineno)
setup_rules
@rule_builders.each do |builder|
- # Extract actions in the middle of RHS into new rules.
- builder.midrule_action_rules.each do |rule|
- @rules << rule
- end
-
builder.rules.each do |rule|
- add_nterm(id: rule._lhs)
- @rules << rule
- end
-
- builder.parameterizing_rules.each do |rule|
add_nterm(id: rule._lhs, tag: rule.lhs_tag)
@rules << rule
end
-
- builder.midrule_action_rules.each do |rule|
- add_nterm(id: rule._lhs)
- end
end
+
+ @rules.sort_by!(&:id)
end
# Collect symbols from rules
diff --git a/tool/lrama/lib/lrama/grammar/code.rb b/tool/lrama/lib/lrama/grammar/code.rb
index f5c9d0f701..d0bef75ef1 100644
--- a/tool/lrama/lib/lrama/grammar/code.rb
+++ b/tool/lrama/lib/lrama/grammar/code.rb
@@ -1,12 +1,29 @@
require "forwardable"
+require "lrama/grammar/code/initial_action_code"
+require "lrama/grammar/code/no_reference_code"
+require "lrama/grammar/code/printer_code"
+require "lrama/grammar/code/rule_action"
module Lrama
class Grammar
- class Code < Struct.new(:type, :token_code, keyword_init: true)
+ class Code
extend Forwardable
def_delegators "token_code", :s_value, :line, :column, :references
+ attr_reader :type, :token_code
+
+ def initialize(type:, token_code:)
+ @type = type
+ @token_code = token_code
+ end
+
+ def ==(other)
+ self.class == other.class &&
+ self.type == other.type &&
+ self.token_code == other.token_code
+ end
+
# $$, $n, @$, @n are translated to C code
def translated_code
t_code = s_value.dup
@@ -17,7 +34,7 @@ module Lrama
str = reference_to_c(ref)
- t_code[first_column..last_column] = str
+ t_code[first_column...last_column] = str
end
return t_code
@@ -31,8 +48,3 @@ module Lrama
end
end
end
-
-require "lrama/grammar/code/initial_action_code"
-require "lrama/grammar/code/no_reference_code"
-require "lrama/grammar/code/printer_code"
-require "lrama/grammar/code/rule_action"
diff --git a/tool/lrama/lib/lrama/grammar/code/printer_code.rb b/tool/lrama/lib/lrama/grammar/code/printer_code.rb
index a19646adda..2b1f127f41 100644
--- a/tool/lrama/lib/lrama/grammar/code/printer_code.rb
+++ b/tool/lrama/lib/lrama/grammar/code/printer_code.rb
@@ -2,7 +2,7 @@ module Lrama
class Grammar
class Code
class PrinterCode < Code
- def initialize(type: nil, token_code: nil, tag: nil)
+ def initialize(type:, token_code:, tag:)
super(type: type, token_code: token_code)
@tag = tag
end
diff --git a/tool/lrama/lib/lrama/grammar/code/rule_action.rb b/tool/lrama/lib/lrama/grammar/code/rule_action.rb
index 984c350b25..8a67b732e6 100644
--- a/tool/lrama/lib/lrama/grammar/code/rule_action.rb
+++ b/tool/lrama/lib/lrama/grammar/code/rule_action.rb
@@ -2,7 +2,7 @@ module Lrama
class Grammar
class Code
class RuleAction < Code
- def initialize(type: nil, token_code: nil, rule: nil)
+ def initialize(type:, token_code:, rule:)
super(type: type, token_code: token_code)
@rule = rule
end
diff --git a/tool/lrama/lib/lrama/grammar/parameterizing_rule.rb b/tool/lrama/lib/lrama/grammar/parameterizing_rule.rb
new file mode 100644
index 0000000000..aa8865d53d
--- /dev/null
+++ b/tool/lrama/lib/lrama/grammar/parameterizing_rule.rb
@@ -0,0 +1,6 @@
+module Lrama
+ class Grammar
+ class ParameterizingRule < Struct.new(:rules, :token, keyword_init: true)
+ end
+ end
+end
diff --git a/tool/lrama/lib/lrama/grammar/parameterizing_rule_builder.rb b/tool/lrama/lib/lrama/grammar/parameterizing_rule_builder.rb
new file mode 100644
index 0000000000..94566a80e1
--- /dev/null
+++ b/tool/lrama/lib/lrama/grammar/parameterizing_rule_builder.rb
@@ -0,0 +1,34 @@
+module Lrama
+ class Grammar
+ class ParameterizingRuleBuilder
+ attr_reader :name, :parameters, :rhs
+
+ def initialize(name, parameters, rhs)
+ @name = name
+ @parameters = parameters
+ @rhs = rhs
+ @required_parameters_count = parameters.count
+ end
+
+ def build_rules(token, actual_args, rule_counter, lhs_tag, line, rule_builders)
+ validate_argument_number!(token)
+ lhs = lhs(actual_args)
+ @rhs.map do |rhs|
+ rhs.build_rules(token, actual_args, parameters, rule_counter, lhs, lhs_tag, line, rule_builders)
+ end.flatten
+ end
+
+ private
+
+ def validate_argument_number!(token)
+ unless @required_parameters_count == token.args.count
+ raise "Invalid number of arguments. expect: #{@required_parameters_count} actual: #{token.args.count}"
+ end
+ end
+
+ def lhs(actual_args)
+ Lrama::Lexer::Token::Ident.new(s_value: "#{name}_#{actual_args.map(&:s_value).join('_')}")
+ end
+ end
+ end
+end
diff --git a/tool/lrama/lib/lrama/grammar/parameterizing_rule_resolver.rb b/tool/lrama/lib/lrama/grammar/parameterizing_rule_resolver.rb
new file mode 100644
index 0000000000..9d92a412ef
--- /dev/null
+++ b/tool/lrama/lib/lrama/grammar/parameterizing_rule_resolver.rb
@@ -0,0 +1,30 @@
+module Lrama
+ class Grammar
+ class ParameterizingRuleResolver
+ def initialize
+ @parameterizing_rule_builders = []
+ end
+
+ def add_parameterizing_rule_builder(builder)
+ @parameterizing_rule_builders << builder
+ end
+
+ def defined?(name)
+ !rule_builders(name).empty?
+ end
+
+ def build_rules(token, rule_counter, lhs_tag, line)
+ builder = rule_builders(token.s_value).last
+ raise "Unknown parameterizing rule #{token.s_value} at line #{token.line}" unless builder
+
+ builder.build_rules(token, token.args, rule_counter, lhs_tag, line, @parameterizing_rule_builders)
+ end
+
+ private
+
+ def rule_builders(name)
+ @parameterizing_rule_builders.select { |builder| builder.name == name }
+ end
+ end
+ end
+end
diff --git a/tool/lrama/lib/lrama/grammar/parameterizing_rule_rhs_builder.rb b/tool/lrama/lib/lrama/grammar/parameterizing_rule_rhs_builder.rb
new file mode 100644
index 0000000000..9d15fb1880
--- /dev/null
+++ b/tool/lrama/lib/lrama/grammar/parameterizing_rule_rhs_builder.rb
@@ -0,0 +1,53 @@
+module Lrama
+ class Grammar
+ class ParameterizingRuleRhsBuilder
+ attr_accessor :symbols, :user_code, :precedence_sym
+
+ def initialize
+ @symbols = []
+ @user_code = nil
+ @precedence_sym = nil
+ end
+
+ def build_rules(token, actual_args, parameters, rule_counter, lhs, lhs_tag, line, rule_builders)
+ nested_rules = build_nested_rules(token, actual_args, parameters, rule_counter, lhs_tag, line, rule_builders)
+ rule = Rule.new(id: rule_counter.increment, _lhs: lhs, _rhs: rhs(token, actual_args, parameters, nested_rules.last), lhs_tag: lhs_tag, token_code: user_code, precedence_sym: precedence_sym, lineno: line)
+ ParameterizingRule.new(rules: nested_rules.map(&:rules) + [rule], token: lhs)
+ end
+
+ private
+
+ def build_nested_rules(token, actual_args, parameters, rule_counter, lhs_tag, line, rule_builders)
+ symbols.each_with_index.map do |sym, i|
+ next unless sym.is_a?(Lexer::Token::InstantiateRule)
+
+ builder = rule_builders.select { |builder| builder.name == sym.s_value }.last
+ raise "Unknown parameterizing rule #{token.s_value} at line #{token.line}" unless builder
+
+ builder.build_rules(sym, nested_actual_args(actual_args, parameters, i), rule_counter, lhs_tag, line, rule_builders)
+ end.flatten.compact
+ end
+
+ def nested_actual_args(actual_args, parameters, idx)
+ symbols[idx].args.map do |arg|
+ i = parameters.index { |parameter| parameter.s_value == arg.s_value }
+ i.nil? ? arg : actual_args[i]
+ end
+ end
+
+ def rhs(token, actual_args, parameters, nested_rule)
+ symbols.map do |sym|
+ if sym.is_a?(Lexer::Token::InstantiateRule)
+ sym.args.map do |arg|
+ idx = parameters.index { |parameter| parameter.s_value == arg.s_value }
+ idx.nil? ? sym : nested_rule&.token
+ end
+ else
+ idx = parameters.index { |parameter| parameter.s_value == sym.s_value }
+ idx.nil? ? sym : actual_args[idx]
+ end
+ end.flatten
+ end
+ end
+ end
+end
diff --git a/tool/lrama/lib/lrama/grammar/rule_builder.rb b/tool/lrama/lib/lrama/grammar/rule_builder.rb
index 94a744dca0..c17a4048d8 100644
--- a/tool/lrama/lib/lrama/grammar/rule_builder.rb
+++ b/tool/lrama/lib/lrama/grammar/rule_builder.rb
@@ -51,22 +51,14 @@ module Lrama
freeze_rhs
end
- def setup_rules
+ def setup_rules(parameterizing_resolver)
preprocess_references unless @skip_preprocess_references
- process_rhs
+ process_rhs(parameterizing_resolver)
build_rules
end
- def parameterizing_rules
- @parameterizing_rules
- end
-
- def midrule_action_rules
- @midrule_action_rules
- end
-
def rules
- @rules
+ @parameterizing_rules + @midrule_action_rules + @rules
end
private
@@ -95,9 +87,9 @@ module Lrama
end
end
- # rhs is a mixture of variety type of tokens like `Ident`, `Parameterizing`, `UserCode` and so on.
+ # rhs is a mixture of variety type of tokens like `Ident`, `InstantiateRule`, `UserCode` and so on.
# `#process_rhs` replaces some kind of tokens to `Ident` so that all `@replaced_rhs` are `Ident` or `Char`.
- def process_rhs
+ def process_rhs(parameterizing_resolver)
return if @replaced_rhs
@replaced_rhs = []
@@ -109,12 +101,17 @@ module Lrama
@replaced_rhs << token
when Lrama::Lexer::Token::Ident
@replaced_rhs << token
- when Lrama::Lexer::Token::Parameterizing
- parameterizing = ParameterizingRules::Builder.new(token, @rule_counter, @lhs_tag, user_code, precedence_sym, line)
- parameterizing.build.each do |r|
- @parameterizing_rules << r
+ when Lrama::Lexer::Token::InstantiateRule
+ if parameterizing_resolver.defined?(token.rule_name)
+ parameterizing = parameterizing_resolver.build_rules(token, @rule_counter, @lhs_tag, line)
+ @parameterizing_rules = @parameterizing_rules + parameterizing.map(&:rules).flatten
+ @replaced_rhs = @replaced_rhs + parameterizing.map(&:token).flatten.uniq
+ else
+ # TODO: Delete when the standard library will defined as a grammar file.
+ parameterizing = ParameterizingRules::Builder.new(token, @rule_counter, @lhs_tag, user_code, precedence_sym, line)
+ @parameterizing_rules = @parameterizing_rules + parameterizing.build
+ @replaced_rhs << parameterizing.build_token
end
- @replaced_rhs << parameterizing.build_token
when Lrama::Lexer::Token::UserCode
prefix = token.referred ? "@" : "$@"
new_token = Lrama::Lexer::Token::Ident.new(s_value: prefix + @midrule_action_counter.increment.to_s)
@@ -124,7 +121,7 @@ module Lrama
rule_builder.lhs = new_token
rule_builder.user_code = token
rule_builder.complete_input
- rule_builder.setup_rules
+ rule_builder.setup_rules(parameterizing_resolver)
@rule_builders_for_derived_rules << rule_builder
else
@@ -146,8 +143,15 @@ module Lrama
else
candidates = rhs.each_with_index.select {|token, i| token.referred_by?(ref_name) }
- raise "Referring symbol `#{ref_name}` is duplicated. #{token}" if candidates.size >= 2
- raise "Referring symbol `#{ref_name}` is not found. #{token}" unless referring_symbol = candidates.first
+ if candidates.size >= 2
+ location = token.location.partial_location(ref.first_column, ref.last_column)
+ raise location.generate_error_message("Referring symbol `#{ref_name}` is duplicated.")
+ end
+
+ unless (referring_symbol = candidates.first)
+ location = token.location.partial_location(ref.first_column, ref.last_column)
+ raise location.generate_error_message("Referring symbol `#{ref_name}` is not found.")
+ end
ref.index = referring_symbol[1] + 1
end
@@ -167,7 +171,7 @@ module Lrama
end
def flush_user_code
- if c = @user_code
+ if (c = @user_code)
@rhs << c
@user_code = nil
end
diff --git a/tool/lrama/lib/lrama/lexer.rb b/tool/lrama/lib/lrama/lexer.rb
index 8aab19be5c..4f394a9815 100644
--- a/tool/lrama/lib/lrama/lexer.rb
+++ b/tool/lrama/lib/lrama/lexer.rb
@@ -1,4 +1,5 @@
require "strscan"
+require "lrama/lexer/grammar_file"
require "lrama/lexer/location"
require "lrama/lexer/token"
@@ -28,10 +29,12 @@ module Lrama
%error-token
%empty
%code
+ %rule
)
- def initialize(text)
- @scanner = StringScanner.new(text)
+ def initialize(grammar_file)
+ @grammar_file = grammar_file
+ @scanner = StringScanner.new(grammar_file.text)
@head_column = @head = @scanner.pos
@head_line = @line = 1
@status = :initial
@@ -57,8 +60,9 @@ module Lrama
def location
Location.new(
+ grammar_file: @grammar_file,
first_line: @head_line, first_column: @head_column,
- last_line: @line, last_column: column
+ last_line: line, last_column: column
)
end
@@ -78,8 +82,7 @@ module Lrama
end
end
- @head_line = line
- @head_column = column
+ reset_first_position
case
when @scanner.eos?
@@ -117,6 +120,8 @@ module Lrama
def lex_c_code
nested = 0
code = ''
+ reset_first_position
+
while !@scanner.eos? do
case
when @scanner.scan(/{/)
@@ -140,12 +145,12 @@ module Lrama
@line += @scanner.matched.count("\n")
when @scanner.scan(/'.*?'/)
code += %Q(#{@scanner.matched})
+ when @scanner.scan(/[^\"'\{\}\n]+/)
+ code += @scanner.matched
+ when @scanner.scan(/#{Regexp.escape(@end_symbol)}/)
+ code += @scanner.matched
else
- if @scanner.scan(/[^\"'\{\}\n#{@end_symbol}]+/)
- code += @scanner.matched
- else
- code += @scanner.getch
- end
+ code += @scanner.getch
end
end
raise ParseError, "Unexpected code: #{code}."
@@ -166,9 +171,14 @@ module Lrama
end
end
+ def reset_first_position
+ @head_line = line
+ @head_column = column
+ end
+
def newline
@line += 1
- @head = @scanner.pos + 1
+ @head = @scanner.pos
end
end
end
diff --git a/tool/lrama/lib/lrama/lexer/grammar_file.rb b/tool/lrama/lib/lrama/lexer/grammar_file.rb
new file mode 100644
index 0000000000..2200bcbf28
--- /dev/null
+++ b/tool/lrama/lib/lrama/lexer/grammar_file.rb
@@ -0,0 +1,21 @@
+module Lrama
+ class Lexer
+ class GrammarFile
+ attr_reader :path, :text
+
+ def initialize(path, text)
+ @path = path
+ @text = text
+ end
+
+ def ==(other)
+ self.class == other.class &&
+ self.path == other.path
+ end
+
+ def lines
+ @lines ||= text.split("\n")
+ end
+ end
+ end
+end
diff --git a/tool/lrama/lib/lrama/lexer/location.rb b/tool/lrama/lib/lrama/lexer/location.rb
index d247c7d4cf..aefce3e16b 100644
--- a/tool/lrama/lib/lrama/lexer/location.rb
+++ b/tool/lrama/lib/lrama/lexer/location.rb
@@ -1,9 +1,10 @@
module Lrama
class Lexer
class Location
- attr_reader :first_line, :first_column, :last_line, :last_column
+ attr_reader :grammar_file, :first_line, :first_column, :last_line, :last_column
- def initialize(first_line:, first_column:, last_line:, last_column:)
+ def initialize(grammar_file:, first_line:, first_column:, last_line:, last_column:)
+ @grammar_file = grammar_file
@first_line = first_line
@first_column = first_column
@last_line = last_line
@@ -12,11 +13,85 @@ module Lrama
def ==(other)
self.class == other.class &&
+ self.grammar_file == other.grammar_file &&
self.first_line == other.first_line &&
self.first_column == other.first_column &&
self.last_line == other.last_line &&
self.last_column == other.last_column
end
+
+ def partial_location(left, right)
+ offset = -first_column
+ new_first_line = -1
+ new_first_column = -1
+ new_last_line = -1
+ new_last_column = -1
+
+ _text.each.with_index do |line, index|
+ new_offset = offset + line.length + 1
+
+ if offset <= left && left <= new_offset
+ new_first_line = first_line + index
+ new_first_column = left - offset
+ end
+
+ if offset <= right && right <= new_offset
+ new_last_line = first_line + index
+ new_last_column = right - offset
+ end
+
+ offset = new_offset
+ end
+
+ Location.new(
+ grammar_file: grammar_file,
+ first_line: new_first_line, first_column: new_first_column,
+ last_line: new_last_line, last_column: new_last_column
+ )
+ end
+
+ def to_s
+ "#{path} (#{first_line},#{first_column})-(#{last_line},#{last_column})"
+ end
+
+ def generate_error_message(error_message)
+ <<~ERROR.chomp
+ #{path}:#{first_line}:#{first_column}: #{error_message}
+ #{line_with_carets}
+ ERROR
+ end
+
+ def line_with_carets
+ <<~TEXT
+ #{text}
+ #{carets}
+ TEXT
+ end
+
+ private
+
+ def path
+ grammar_file.path
+ end
+
+ def blanks
+ (text[0...first_column] or raise "#{first_column} is invalid").gsub(/[^\t]/, ' ')
+ end
+
+ def carets
+ blanks + '^' * (last_column - first_column)
+ end
+
+ def text
+ @text ||= _text.join("\n")
+ end
+
+ def _text
+ @_text ||=begin
+ range = (first_line - 1)...last_line
+ grammar_file.lines[range] or raise "#{range} is invalid"
+ end
+ end
end
end
end
diff --git a/tool/lrama/lib/lrama/lexer/token.rb b/tool/lrama/lib/lrama/lexer/token.rb
index b82f86bb05..22b798376a 100644
--- a/tool/lrama/lib/lrama/lexer/token.rb
+++ b/tool/lrama/lib/lrama/lexer/token.rb
@@ -1,6 +1,6 @@
require 'lrama/lexer/token/char'
require 'lrama/lexer/token/ident'
-require 'lrama/lexer/token/parameterizing'
+require 'lrama/lexer/token/instantiate_rule'
require 'lrama/lexer/token/tag'
require 'lrama/lexer/token/user_code'
diff --git a/tool/lrama/lib/lrama/lexer/token/instantiate_rule.rb b/tool/lrama/lib/lrama/lexer/token/instantiate_rule.rb
new file mode 100644
index 0000000000..9b703dd9d2
--- /dev/null
+++ b/tool/lrama/lib/lrama/lexer/token/instantiate_rule.rb
@@ -0,0 +1,18 @@
+module Lrama
+ class Lexer
+ class Token
+ class InstantiateRule < Token
+ attr_accessor :args
+
+ def initialize(s_value:, alias_name: nil, location: nil, args: [])
+ super s_value: s_value, alias_name: alias_name, location: location
+ @args = args
+ end
+
+ def rule_name
+ s_value
+ end
+ end
+ end
+ end
+end
diff --git a/tool/lrama/lib/lrama/lexer/token/parameterizing.rb b/tool/lrama/lib/lrama/lexer/token/parameterizing.rb
deleted file mode 100644
index f2eed3cf4a..0000000000
--- a/tool/lrama/lib/lrama/lexer/token/parameterizing.rb
+++ /dev/null
@@ -1,34 +0,0 @@
-module Lrama
- class Lexer
- class Token
- class Parameterizing < Token
- attr_accessor :args
-
- def initialize(s_value:, alias_name: nil, location: nil, args: [])
- super s_value: s_value, alias_name: alias_name, location: location
- @args = args
- end
-
- def option?
- %w(option ?).include?(self.s_value)
- end
-
- def nonempty_list?
- %w(nonempty_list +).include?(self.s_value)
- end
-
- def list?
- %w(list *).include?(self.s_value)
- end
-
- def separated_nonempty_list?
- %w(separated_nonempty_list).include?(self.s_value)
- end
-
- def separated_list?
- %w(separated_list).include?(self.s_value)
- end
- end
- end
- end
-end
diff --git a/tool/lrama/lib/lrama/lexer/token/user_code.rb b/tool/lrama/lib/lrama/lexer/token/user_code.rb
index abe6fba2b3..765ca2fb46 100644
--- a/tool/lrama/lib/lrama/lexer/token/user_code.rb
+++ b/tool/lrama/lib/lrama/lexer/token/user_code.rb
@@ -35,27 +35,27 @@ module Lrama
# It need to wrap an identifier with brackets to use ".-" for identifiers
when scanner.scan(/\$(<[a-zA-Z0-9_]+>)?\$/) # $$, $<long>$
tag = scanner[1] ? Lrama::Lexer::Token::Tag.new(s_value: scanner[1]) : nil
- return Lrama::Grammar::Reference.new(type: :dollar, name: "$", ex_tag: tag, first_column: start, last_column: scanner.pos - 1)
+ return Lrama::Grammar::Reference.new(type: :dollar, name: "$", ex_tag: tag, first_column: start, last_column: scanner.pos)
when scanner.scan(/\$(<[a-zA-Z0-9_]+>)?(\d+)/) # $1, $2, $<long>1
tag = scanner[1] ? Lrama::Lexer::Token::Tag.new(s_value: scanner[1]) : nil
- return Lrama::Grammar::Reference.new(type: :dollar, index: Integer(scanner[2]), ex_tag: tag, first_column: start, last_column: scanner.pos - 1)
+ return Lrama::Grammar::Reference.new(type: :dollar, index: Integer(scanner[2]), ex_tag: tag, first_column: start, last_column: scanner.pos)
when scanner.scan(/\$(<[a-zA-Z0-9_]+>)?([a-zA-Z_][a-zA-Z0-9_]*)/) # $foo, $expr, $<long>program (named reference without brackets)
tag = scanner[1] ? Lrama::Lexer::Token::Tag.new(s_value: scanner[1]) : nil
- return Lrama::Grammar::Reference.new(type: :dollar, name: scanner[2], ex_tag: tag, first_column: start, last_column: scanner.pos - 1)
- when scanner.scan(/\$(<[a-zA-Z0-9_]+>)?\[([a-zA-Z_.][-a-zA-Z0-9_.]*)\]/) # $expr.right, $expr-right, $<long>program (named reference with brackets)
+ return Lrama::Grammar::Reference.new(type: :dollar, name: scanner[2], ex_tag: tag, first_column: start, last_column: scanner.pos)
+ when scanner.scan(/\$(<[a-zA-Z0-9_]+>)?\[([a-zA-Z_.][-a-zA-Z0-9_.]*)\]/) # $[expr.right], $[expr-right], $<long>[expr.right] (named reference with brackets)
tag = scanner[1] ? Lrama::Lexer::Token::Tag.new(s_value: scanner[1]) : nil
- return Lrama::Grammar::Reference.new(type: :dollar, name: scanner[2], ex_tag: tag, first_column: start, last_column: scanner.pos - 1)
+ return Lrama::Grammar::Reference.new(type: :dollar, name: scanner[2], ex_tag: tag, first_column: start, last_column: scanner.pos)
# @ references
# It need to wrap an identifier with brackets to use ".-" for identifiers
when scanner.scan(/@\$/) # @$
- return Lrama::Grammar::Reference.new(type: :at, name: "$", first_column: start, last_column: scanner.pos - 1)
+ return Lrama::Grammar::Reference.new(type: :at, name: "$", first_column: start, last_column: scanner.pos)
when scanner.scan(/@(\d+)/) # @1
- return Lrama::Grammar::Reference.new(type: :at, index: Integer(scanner[1]), first_column: start, last_column: scanner.pos - 1)
+ return Lrama::Grammar::Reference.new(type: :at, index: Integer(scanner[1]), first_column: start, last_column: scanner.pos)
when scanner.scan(/@([a-zA-Z][a-zA-Z0-9_]*)/) # @foo, @expr (named reference without brackets)
- return Lrama::Grammar::Reference.new(type: :at, name: scanner[1], first_column: start, last_column: scanner.pos - 1)
- when scanner.scan(/@\[([a-zA-Z_.][-a-zA-Z0-9_.]*)\]/) # @expr.right, @expr-right (named reference with brackets)
- return Lrama::Grammar::Reference.new(type: :at, name: scanner[1], first_column: start, last_column: scanner.pos - 1)
+ return Lrama::Grammar::Reference.new(type: :at, name: scanner[1], first_column: start, last_column: scanner.pos)
+ when scanner.scan(/@\[([a-zA-Z_.][-a-zA-Z0-9_.]*)\]/) # @[expr.right], @[expr-right] (named reference with brackets)
+ return Lrama::Grammar::Reference.new(type: :at, name: scanner[1], first_column: start, last_column: scanner.pos)
end
end
end
diff --git a/tool/lrama/lib/lrama/parser.rb b/tool/lrama/lib/lrama/parser.rb
index bde7179ad0..797851e881 100644
--- a/tool/lrama/lib/lrama/parser.rb
+++ b/tool/lrama/lib/lrama/parser.rb
@@ -658,13 +658,12 @@ end
module Lrama
class Parser < Racc::Parser
-module_eval(<<'...end parser.y/module_eval...', 'parser.y', 420)
+module_eval(<<'...end parser.y/module_eval...', 'parser.y', 500)
include Lrama::Report::Duration
def initialize(text, path, debug = false)
- @text = text
- @path = path
+ @grammar_file = Lrama::Lexer::GrammarFile.new(path, text)
@yydebug = debug
@rule_counter = Lrama::Grammar::Counter.new(0)
@midrule_action_counter = Lrama::Grammar::Counter.new(1)
@@ -672,7 +671,7 @@ end
def parse
report_duration(:parse) do
- @lexer = Lrama::Lexer.new(@text)
+ @lexer = Lrama::Lexer.new(@grammar_file)
@grammar = Lrama::Grammar.new(@rule_counter)
@precedence_number = 0
reset_precs
@@ -689,40 +688,26 @@ end
def on_error(error_token_id, error_value, value_stack)
if error_value.is_a?(Lrama::Lexer::Token)
- line = error_value.first_line
- first_column = error_value.first_column
- last_column = error_value.last_column
+ location = error_value.location
value = "'#{error_value.s_value}'"
else
- line = @lexer.line
- first_column = @lexer.head_column
- last_column = @lexer.column
+ location = @lexer.location
value = error_value.inspect
end
- raise ParseError, <<~ERROR
- #{@path}:#{line}:#{first_column}: parse error on value #{value} (#{token_to_str(error_token_id) || '?'})
- #{@text.split("\n")[line - 1]}
- #{carrets(first_column, last_column)}
- ERROR
+ error_message = "parse error on value #{value} (#{token_to_str(error_token_id) || '?'})"
+
+ raise_parse_error(error_message, location)
end
def on_action_error(error_message, error_value)
if error_value.is_a?(Lrama::Lexer::Token)
- line = error_value.first_line
- first_column = error_value.first_column
- last_column = error_value.last_column
+ location = error_value.location
else
- line = @lexer.line
- first_column = @lexer.head_column
- last_column = @lexer.column
+ location = @lexer.location
end
- raise ParseError, <<~ERROR
- #{@path}:#{line}: #{error_message}
- #{@text.split("\n")[line - 1]}
- #{carrets(first_column, last_column)}
- ERROR
+ raise_parse_error(error_message, location)
end
private
@@ -742,268 +727,303 @@ def end_c_declaration
@lexer.end_symbol = nil
end
-def carrets(first_column, last_column)
- ' ' * (first_column + 1) + '^' * (last_column - first_column)
+def raise_parse_error(error_message, location)
+ raise ParseError, location.generate_error_message(error_message)
end
...end parser.y/module_eval...
##### State transition tables begin ###
racc_action_table = [
- 82, 42, 83, 137, 42, 65, 137, 38, 65, 136,
- 42, 6, 41, 7, 42, 56, 41, 139, 65, 61,
- 139, 135, 42, 42, 41, 41, 20, 22, 23, 24,
- 25, 26, 27, 28, 29, 30, 140, 38, 3, 140,
- 84, 42, 77, 41, 8, 42, 68, 41, 172, 42,
- 68, 41, 32, 173, 68, 39, 20, 22, 23, 24,
- 25, 26, 27, 28, 29, 30, 9, 42, 45, 41,
- 12, 13, 14, 15, 16, 17, 45, 45, 18, 19,
- 20, 22, 23, 24, 25, 26, 27, 28, 29, 30,
- 42, 48, 41, 151, 49, 68, 152, 153, 154, 42,
- 42, 41, 41, 65, 163, 42, 42, 41, 41, 65,
- 163, 42, 42, 41, 41, 65, 163, 42, 42, 41,
- 41, 65, 163, 42, 42, 41, 41, 65, 163, 42,
- 42, 41, 41, 65, 163, 42, 42, 41, 41, 65,
- 65, 42, 42, 41, 41, 65, 65, 42, 42, 41,
- 41, 65, 65, 42, 42, 41, 41, 65, 65, 42,
- 42, 41, 41, 50, 51, 52, 53, 74, 78, 80,
- 85, 85, 85, 87, 93, 97, 98, 101, 101, 101,
- 101, 106, 107, 109, 111, 112, 113, 114, 115, 118,
- 121, 122, 125, 126, 127, 129, 142, 144, 145, 146,
- 147, 148, 125, 80, 158, 159, 167, 170, 167, 177,
- 80 ]
+ 85, 44, 86, 145, 144, 67, 44, 44, 145, 187,
+ 67, 67, 44, 6, 187, 7, 67, 147, 196, 44,
+ 143, 43, 147, 188, 58, 163, 164, 165, 188, 3,
+ 44, 40, 43, 8, 67, 63, 34, 44, 148, 43,
+ 41, 87, 40, 148, 189, 47, 44, 80, 43, 189,
+ 21, 23, 24, 25, 26, 27, 28, 29, 30, 31,
+ 47, 21, 23, 24, 25, 26, 27, 28, 29, 30,
+ 31, 9, 44, 47, 43, 13, 14, 15, 16, 17,
+ 18, 50, 51, 19, 20, 21, 23, 24, 25, 26,
+ 27, 28, 29, 30, 31, 32, 44, 44, 43, 43,
+ 52, 70, 70, 44, 44, 43, 43, 53, 70, 70,
+ 44, 44, 43, 43, 67, 173, 44, 44, 43, 43,
+ 67, 173, 44, 44, 43, 43, 67, 173, 44, 44,
+ 43, 43, 67, 173, 44, 44, 43, 43, 67, 173,
+ 44, 44, 43, 43, 67, 173, 44, 44, 43, 43,
+ 67, 67, 44, 44, 43, 43, 67, 67, 44, 44,
+ 43, 43, 67, 67, 44, 44, 43, 43, 67, 67,
+ 44, 44, 43, 43, 67, 67, 163, 164, 165, 83,
+ 44, 44, 43, 43, 141, 190, 142, 191, 205, 54,
+ 191, 55, 76, 77, 81, 83, 88, 88, 88, 90,
+ 96, 100, 101, 104, 104, 104, 104, 107, 110, 111,
+ 113, 115, 116, 117, 118, 119, 122, 126, 127, 128,
+ 131, 132, 133, 135, 150, 152, 153, 154, 155, 156,
+ 157, 158, 131, 160, 168, 169, 178, 182, 183, 185,
+ 178, 83, 182, 201, 203, 83, 207, 83 ]
racc_action_check = [
- 40, 124, 40, 124, 149, 124, 149, 9, 149, 123,
- 25, 2, 25, 2, 26, 25, 26, 124, 26, 26,
- 149, 123, 13, 55, 13, 55, 9, 9, 9, 9,
- 9, 9, 9, 9, 9, 9, 124, 33, 1, 149,
- 40, 27, 33, 27, 3, 28, 27, 28, 168, 29,
- 28, 29, 7, 168, 29, 12, 33, 33, 33, 33,
- 33, 33, 33, 33, 33, 33, 4, 56, 14, 56,
- 4, 4, 4, 4, 4, 4, 15, 16, 4, 4,
- 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
- 30, 17, 30, 137, 18, 30, 137, 137, 137, 146,
- 67, 146, 67, 146, 146, 147, 68, 147, 68, 147,
- 147, 148, 93, 148, 93, 148, 148, 160, 95, 160,
- 95, 160, 160, 164, 101, 164, 101, 164, 164, 165,
- 103, 165, 103, 165, 165, 60, 61, 60, 61, 60,
- 61, 98, 100, 98, 100, 98, 100, 119, 140, 119,
- 140, 119, 140, 151, 173, 151, 173, 151, 173, 116,
- 120, 116, 120, 20, 22, 23, 24, 31, 36, 37,
- 44, 46, 47, 48, 54, 58, 59, 66, 71, 72,
- 73, 79, 80, 86, 88, 89, 90, 91, 92, 96,
- 104, 105, 106, 107, 108, 110, 128, 130, 131, 132,
- 133, 134, 135, 138, 141, 143, 150, 156, 172, 174,
- 177 ]
+ 42, 130, 42, 130, 129, 130, 159, 177, 159, 177,
+ 159, 177, 193, 2, 193, 2, 193, 130, 187, 26,
+ 129, 26, 159, 177, 26, 187, 187, 187, 193, 1,
+ 27, 9, 27, 3, 27, 27, 7, 14, 130, 14,
+ 13, 42, 35, 159, 177, 15, 57, 35, 57, 193,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 16, 35, 35, 35, 35, 35, 35, 35, 35, 35,
+ 35, 4, 58, 17, 58, 4, 4, 4, 4, 4,
+ 4, 18, 19, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 28, 29, 28, 29,
+ 21, 28, 29, 30, 31, 30, 31, 23, 30, 31,
+ 154, 69, 154, 69, 154, 154, 155, 70, 155, 70,
+ 155, 155, 156, 96, 156, 96, 156, 156, 170, 98,
+ 170, 98, 170, 170, 174, 104, 174, 104, 174, 174,
+ 175, 106, 175, 106, 175, 175, 62, 63, 62, 63,
+ 62, 63, 101, 103, 101, 103, 101, 103, 123, 148,
+ 123, 148, 123, 148, 160, 189, 160, 189, 160, 189,
+ 191, 196, 191, 196, 191, 196, 146, 146, 146, 146,
+ 120, 124, 120, 124, 125, 179, 125, 179, 202, 24,
+ 202, 25, 32, 33, 38, 39, 46, 48, 49, 50,
+ 56, 60, 61, 68, 73, 74, 75, 76, 82, 83,
+ 89, 91, 92, 93, 94, 95, 99, 107, 108, 109,
+ 110, 111, 112, 114, 134, 136, 137, 138, 139, 140,
+ 141, 142, 143, 145, 149, 151, 157, 162, 166, 176,
+ 185, 186, 190, 192, 197, 201, 206, 207 ]
racc_action_pointer = [
- nil, 38, 1, 44, 57, nil, nil, 45, nil, 3,
- nil, nil, 49, 19, 49, 57, 58, 86, 75, nil,
- 144, nil, 145, 146, 147, 7, 11, 38, 42, 46,
- 87, 165, nil, 33, nil, nil, 146, 126, nil, nil,
- -5, nil, nil, nil, 151, nil, 152, 153, 154, nil,
- nil, nil, nil, nil, 166, 20, 64, nil, 169, 168,
- 132, 133, nil, nil, nil, nil, 169, 97, 103, nil,
- nil, 170, 171, 172, nil, nil, nil, nil, nil, 148,
- 177, nil, nil, nil, nil, nil, 181, nil, 182, 183,
- 184, 185, 186, 109, nil, 115, 182, nil, 138, nil,
- 139, 121, nil, 127, 179, 189, 157, 149, 192, nil,
- 193, nil, nil, nil, nil, nil, 156, nil, nil, 144,
- 157, nil, nil, -13, -2, nil, nil, nil, 176, nil,
- 177, 178, 179, 180, 181, 167, nil, 57, 160, nil,
- 145, 184, nil, 185, nil, nil, 96, 102, 108, 1,
- 198, 150, nil, nil, nil, nil, 205, nil, nil, nil,
- 114, nil, nil, nil, 120, 126, nil, nil, 11, nil,
- nil, nil, 200, 151, 189, nil, nil, 167, nil ]
+ nil, 29, 3, 33, 62, nil, nil, 29, nil, 27,
+ nil, nil, nil, 34, 34, 26, 41, 54, 76, 63,
+ nil, 81, nil, 88, 170, 172, 16, 27, 93, 94,
+ 100, 101, 187, 191, nil, 38, nil, nil, 172, 151,
+ nil, nil, -5, nil, nil, nil, 177, nil, 178, 179,
+ 180, nil, nil, nil, nil, nil, 192, 43, 69, nil,
+ 195, 194, 143, 144, nil, nil, nil, nil, 195, 108,
+ 114, nil, nil, 196, 197, 198, 173, nil, nil, nil,
+ nil, nil, 172, 204, nil, nil, nil, nil, nil, 208,
+ nil, 209, 210, 211, 212, 213, 120, nil, 126, 209,
+ nil, 149, nil, 150, 132, nil, 138, 212, 207, 217,
+ 181, 176, 220, nil, 221, nil, nil, nil, nil, nil,
+ 177, nil, nil, 155, 178, 149, nil, nil, nil, -18,
+ -2, nil, nil, nil, 204, nil, 205, 206, 207, 208,
+ 209, 194, 226, 193, nil, 199, 135, nil, 156, 214,
+ nil, 215, nil, nil, 107, 113, 119, 197, nil, 3,
+ 161, nil, 229, nil, nil, nil, 236, nil, nil, nil,
+ 125, nil, nil, nil, 131, 137, 201, 4, nil, 150,
+ nil, nil, nil, nil, nil, 201, 197, -16, nil, 162,
+ 234, 167, 223, 9, nil, nil, 168, 242, nil, nil,
+ nil, 201, 153, nil, nil, nil, 226, 203, nil ]
racc_action_default = [
- -2, -113, -8, -113, -113, -3, -4, -113, 179, -113,
- -9, -10, -113, -113, -113, -113, -113, -113, -113, -22,
- -113, -26, -113, -113, -113, -113, -113, -113, -113, -113,
- -113, -113, -7, -98, -73, -75, -113, -95, -97, -11,
- -102, -71, -72, -101, -13, -62, -14, -15, -113, -19,
- -23, -27, -30, -33, -36, -42, -113, -45, -48, -37,
- -52, -113, -55, -57, -58, -110, -38, -65, -113, -68,
- -70, -39, -40, -41, -5, -1, -74, -99, -76, -113,
- -113, -12, -103, -104, -105, -59, -113, -16, -113, -113,
- -113, -113, -113, -113, -46, -43, -50, -49, -113, -56,
- -53, -113, -69, -66, -113, -113, -81, -113, -113, -63,
- -113, -20, -24, -28, -31, -34, -44, -47, -51, -54,
- -67, -6, -100, -77, -78, -82, -96, -60, -113, -17,
- -113, -113, -113, -113, -113, -81, -80, -71, -95, -86,
- -113, -113, -64, -113, -21, -25, -113, -113, -113, -79,
- -111, -113, -90, -91, -92, -83, -113, -89, -61, -18,
- -29, -106, -108, -109, -32, -35, -84, -112, -113, -93,
- -87, -107, -111, -113, -113, -85, -94, -95, -88 ]
+ -2, -128, -8, -128, -128, -3, -4, -128, 209, -128,
+ -9, -10, -11, -128, -128, -128, -128, -128, -128, -128,
+ -23, -128, -27, -128, -128, -128, -128, -128, -128, -128,
+ -128, -128, -128, -128, -7, -113, -88, -90, -128, -110,
+ -112, -12, -117, -86, -87, -116, -14, -77, -15, -16,
+ -128, -20, -24, -28, -31, -34, -37, -43, -128, -46,
+ -63, -38, -67, -128, -70, -72, -73, -125, -39, -80,
+ -128, -83, -85, -40, -41, -42, -128, -5, -1, -89,
+ -114, -91, -128, -128, -13, -118, -119, -120, -74, -128,
+ -17, -128, -128, -128, -128, -128, -128, -47, -44, -65,
+ -64, -128, -71, -68, -128, -84, -81, -128, -128, -128,
+ -96, -128, -128, -78, -128, -21, -25, -29, -32, -35,
+ -45, -48, -66, -69, -82, -128, -50, -6, -115, -92,
+ -93, -97, -111, -75, -128, -18, -128, -128, -128, -128,
+ -128, -128, -128, -96, -95, -86, -110, -101, -128, -128,
+ -79, -128, -22, -26, -128, -128, -128, -54, -51, -94,
+ -128, -98, -126, -105, -106, -107, -128, -104, -76, -19,
+ -30, -121, -123, -124, -33, -36, -49, -52, -55, -128,
+ -108, -99, -127, -102, -122, -54, -110, -86, -59, -128,
+ -126, -128, -128, -53, -56, -57, -128, -128, -62, -100,
+ -109, -110, -128, -60, -103, -58, -128, -110, -61 ]
racc_goto_table = [
- 62, 79, 43, 60, 103, 55, 94, 102, 34, 166,
- 124, 44, 46, 47, 58, 1, 70, 70, 70, 70,
- 171, 160, 164, 165, 171, 171, 66, 71, 72, 73,
- 2, 175, 76, 4, 99, 62, 95, 120, 100, 149,
- 33, 75, 5, 102, 58, 58, 94, 31, 104, 10,
- 11, 40, 81, 110, 143, 88, 70, 70, 130, 89,
- 102, 131, 90, 132, 91, 133, 92, 94, 134, 54,
- 59, 96, 62, 116, 99, 119, 117, 108, 141, 86,
- 128, 123, 58, 150, 58, 168, 156, 174, 105, nil,
- 70, nil, 70, 99, nil, nil, nil, nil, 138, nil,
- nil, nil, 155, nil, nil, 58, nil, nil, nil, 70,
- nil, nil, nil, nil, 157, nil, nil, nil, nil, nil,
- nil, nil, nil, 138, nil, 169, nil, nil, nil, nil,
+ 64, 45, 57, 62, 105, 82, 97, 162, 106, 177,
+ 179, 1, 181, 60, 2, 72, 72, 72, 72, 130,
+ 184, 4, 35, 36, 184, 184, 68, 73, 74, 75,
+ 46, 48, 49, 78, 98, 102, 64, 193, 5, 103,
+ 199, 105, 124, 33, 60, 60, 202, 97, 195, 79,
+ 108, 10, 159, 170, 174, 175, 72, 72, 11, 105,
+ 12, 42, 84, 114, 151, 91, 136, 92, 137, 97,
+ 93, 138, 120, 94, 64, 139, 102, 123, 95, 140,
+ 56, 61, 99, 60, 121, 60, 125, 176, 197, 206,
+ 112, 72, 149, 72, 89, 134, 102, 129, 166, 192,
+ 109, nil, nil, 146, nil, nil, nil, 60, nil, nil,
+ nil, 72, 161, nil, nil, nil, nil, nil, nil, nil,
+ nil, 167, nil, nil, nil, nil, nil, nil, nil, nil,
+ nil, nil, 146, 180, nil, nil, nil, nil, nil, nil,
nil, nil, nil, nil, nil, nil, nil, nil, nil, nil,
- nil, 178, nil, nil, nil, nil, nil, 176 ]
+ 186, nil, 194, nil, nil, nil, nil, nil, nil, nil,
+ nil, nil, 198, nil, 200, nil, 186, 204, nil, 180,
+ nil, nil, nil, 208 ]
racc_goto_check = [
- 37, 48, 33, 36, 43, 31, 32, 44, 45, 52,
- 50, 13, 13, 13, 33, 1, 33, 33, 33, 33,
- 57, 19, 19, 19, 57, 57, 30, 30, 30, 30,
- 2, 52, 45, 3, 37, 37, 31, 43, 36, 50,
- 4, 5, 6, 44, 33, 33, 32, 7, 8, 9,
- 10, 11, 12, 14, 15, 16, 33, 33, 17, 20,
- 44, 21, 22, 23, 24, 25, 26, 32, 27, 28,
- 29, 34, 37, 31, 37, 36, 35, 39, 40, 41,
- 42, 49, 33, 51, 33, 53, 54, 55, 56, nil,
- 33, nil, 33, 37, nil, nil, nil, nil, 37, nil,
- nil, nil, 48, nil, nil, 33, nil, nil, nil, 33,
- nil, nil, nil, nil, 37, nil, nil, nil, nil, nil,
- nil, nil, nil, 37, nil, 37, nil, nil, nil, nil,
+ 40, 34, 32, 46, 53, 41, 33, 42, 52, 39,
+ 43, 1, 59, 34, 2, 34, 34, 34, 34, 58,
+ 63, 3, 4, 54, 63, 63, 31, 31, 31, 31,
+ 14, 14, 14, 5, 32, 40, 40, 39, 6, 46,
+ 59, 53, 52, 7, 34, 34, 43, 33, 42, 54,
+ 8, 9, 58, 20, 20, 20, 34, 34, 10, 53,
+ 11, 12, 13, 15, 16, 17, 18, 21, 22, 33,
+ 23, 24, 32, 25, 40, 26, 40, 46, 27, 28,
+ 29, 30, 35, 34, 36, 34, 37, 38, 44, 45,
+ 48, 34, 49, 34, 50, 51, 40, 57, 60, 61,
+ 62, nil, nil, 40, nil, nil, nil, 34, nil, nil,
+ nil, 34, 41, nil, nil, nil, nil, nil, nil, nil,
+ nil, 40, nil, nil, nil, nil, nil, nil, nil, nil,
+ nil, nil, 40, 40, nil, nil, nil, nil, nil, nil,
nil, nil, nil, nil, nil, nil, nil, nil, nil, nil,
- nil, 48, nil, nil, nil, nil, nil, 37 ]
+ 40, nil, 41, nil, nil, nil, nil, nil, nil, nil,
+ nil, nil, 40, nil, 40, nil, 40, 41, nil, 40,
+ nil, nil, nil, 41 ]
racc_goto_pointer = [
- nil, 15, 30, 31, 31, 8, 40, 41, -26, 45,
- 46, 38, 12, -3, -34, -75, 6, -53, nil, -125,
- 9, -51, 11, -50, 12, -49, 13, -47, 44, 44,
- -1, -20, -49, -11, 13, -20, -23, -26, nil, -8,
- -49, 34, -29, -64, -60, -1, nil, nil, -36, -25,
- -96, -54, -141, -66, -53, -83, 11, -140 ]
+ nil, 11, 14, 19, 13, -2, 36, 37, -27, 47,
+ 54, 56, 47, 20, 15, -27, -71, 14, -49, nil,
+ -101, 15, -48, 17, -46, 19, -43, 23, -40, 54,
+ 54, -2, -24, -51, -13, 22, -15, -21, -70, -148,
+ -27, -34, -139, -150, -100, -114, -24, nil, 2, -41,
+ 47, -18, -62, -65, 14, nil, nil, -13, -91, -150,
+ -49, -84, 20, -150 ]
racc_goto_default = [
nil, nil, nil, nil, nil, nil, nil, nil, nil, nil,
- 36, nil, nil, nil, nil, nil, nil, nil, 21, nil,
+ 38, nil, nil, nil, nil, nil, nil, nil, nil, 22,
nil, nil, nil, nil, nil, nil, nil, nil, nil, nil,
- nil, nil, 57, 63, nil, nil, nil, 162, 64, nil,
- nil, nil, nil, 67, 69, nil, 35, 37, nil, nil,
- nil, nil, nil, nil, nil, nil, nil, 161 ]
+ nil, nil, nil, 59, 65, nil, nil, nil, nil, nil,
+ 172, nil, nil, nil, nil, nil, nil, 66, nil, nil,
+ nil, nil, 69, 71, nil, 37, 39, nil, nil, nil,
+ nil, nil, nil, 171 ]
racc_reduce_table = [
0, 0, :racc_error,
- 5, 47, :_reduce_none,
- 0, 48, :_reduce_none,
- 2, 48, :_reduce_none,
- 0, 53, :_reduce_4,
- 0, 54, :_reduce_5,
- 5, 52, :_reduce_6,
- 2, 52, :_reduce_none,
- 0, 49, :_reduce_8,
+ 5, 48, :_reduce_none,
+ 0, 49, :_reduce_none,
2, 49, :_reduce_none,
- 1, 55, :_reduce_none,
- 2, 55, :_reduce_11,
- 3, 55, :_reduce_none,
- 2, 55, :_reduce_none,
- 2, 55, :_reduce_14,
- 2, 55, :_reduce_15,
- 0, 60, :_reduce_16,
- 0, 61, :_reduce_17,
- 7, 55, :_reduce_18,
- 0, 62, :_reduce_19,
- 0, 63, :_reduce_20,
- 6, 55, :_reduce_21,
- 1, 55, :_reduce_none,
- 0, 66, :_reduce_23,
- 0, 67, :_reduce_24,
- 6, 56, :_reduce_25,
- 1, 56, :_reduce_none,
- 0, 68, :_reduce_27,
- 0, 69, :_reduce_28,
- 7, 56, :_reduce_none,
- 0, 70, :_reduce_30,
- 0, 71, :_reduce_31,
- 7, 56, :_reduce_32,
- 0, 72, :_reduce_33,
- 0, 73, :_reduce_34,
- 7, 56, :_reduce_35,
- 2, 64, :_reduce_none,
- 2, 64, :_reduce_37,
- 2, 64, :_reduce_38,
- 2, 64, :_reduce_39,
- 2, 64, :_reduce_40,
- 2, 64, :_reduce_41,
- 1, 74, :_reduce_42,
- 2, 74, :_reduce_43,
- 3, 74, :_reduce_44,
- 1, 77, :_reduce_45,
- 2, 77, :_reduce_46,
- 3, 78, :_reduce_47,
- 0, 80, :_reduce_none,
- 1, 80, :_reduce_none,
- 0, 81, :_reduce_none,
- 1, 81, :_reduce_none,
- 1, 75, :_reduce_52,
- 2, 75, :_reduce_53,
- 3, 75, :_reduce_54,
- 1, 82, :_reduce_55,
- 2, 82, :_reduce_56,
- 1, 83, :_reduce_none,
- 1, 83, :_reduce_none,
- 0, 85, :_reduce_59,
- 0, 86, :_reduce_60,
- 6, 59, :_reduce_61,
- 0, 87, :_reduce_62,
- 0, 88, :_reduce_63,
- 5, 59, :_reduce_64,
- 1, 76, :_reduce_65,
- 2, 76, :_reduce_66,
- 3, 76, :_reduce_67,
- 1, 89, :_reduce_68,
- 2, 89, :_reduce_69,
- 1, 90, :_reduce_none,
- 1, 79, :_reduce_71,
- 1, 79, :_reduce_72,
- 1, 50, :_reduce_none,
+ 0, 54, :_reduce_4,
+ 0, 55, :_reduce_5,
+ 5, 53, :_reduce_6,
+ 2, 53, :_reduce_none,
+ 0, 50, :_reduce_8,
2, 50, :_reduce_none,
- 1, 91, :_reduce_none,
- 2, 91, :_reduce_none,
- 4, 92, :_reduce_77,
- 1, 95, :_reduce_78,
- 3, 95, :_reduce_79,
- 2, 95, :_reduce_none,
- 0, 96, :_reduce_81,
- 1, 96, :_reduce_82,
- 3, 96, :_reduce_83,
- 4, 96, :_reduce_84,
- 6, 96, :_reduce_85,
- 0, 100, :_reduce_86,
- 0, 101, :_reduce_87,
- 7, 96, :_reduce_88,
- 3, 96, :_reduce_89,
- 1, 97, :_reduce_none,
- 1, 97, :_reduce_none,
- 1, 97, :_reduce_none,
- 1, 99, :_reduce_93,
- 3, 99, :_reduce_94,
- 0, 94, :_reduce_none,
- 3, 94, :_reduce_96,
- 1, 93, :_reduce_none,
- 0, 51, :_reduce_none,
- 0, 102, :_reduce_99,
- 3, 51, :_reduce_100,
+ 1, 56, :_reduce_none,
+ 1, 56, :_reduce_none,
+ 2, 56, :_reduce_12,
+ 3, 56, :_reduce_none,
+ 2, 56, :_reduce_none,
+ 2, 56, :_reduce_15,
+ 2, 56, :_reduce_16,
+ 0, 62, :_reduce_17,
+ 0, 63, :_reduce_18,
+ 7, 56, :_reduce_19,
+ 0, 64, :_reduce_20,
+ 0, 65, :_reduce_21,
+ 6, 56, :_reduce_22,
+ 1, 56, :_reduce_none,
+ 0, 68, :_reduce_24,
+ 0, 69, :_reduce_25,
+ 6, 57, :_reduce_26,
1, 57, :_reduce_none,
- 0, 58, :_reduce_none,
- 1, 58, :_reduce_none,
- 1, 58, :_reduce_none,
- 1, 58, :_reduce_none,
- 1, 65, :_reduce_106,
- 2, 65, :_reduce_107,
- 1, 103, :_reduce_none,
+ 0, 70, :_reduce_28,
+ 0, 71, :_reduce_29,
+ 7, 57, :_reduce_none,
+ 0, 72, :_reduce_31,
+ 0, 73, :_reduce_32,
+ 7, 57, :_reduce_33,
+ 0, 74, :_reduce_34,
+ 0, 75, :_reduce_35,
+ 7, 57, :_reduce_36,
+ 2, 66, :_reduce_none,
+ 2, 66, :_reduce_38,
+ 2, 66, :_reduce_39,
+ 2, 66, :_reduce_40,
+ 2, 66, :_reduce_41,
+ 2, 66, :_reduce_42,
+ 1, 76, :_reduce_43,
+ 2, 76, :_reduce_44,
+ 3, 76, :_reduce_45,
+ 1, 79, :_reduce_46,
+ 2, 79, :_reduce_47,
+ 3, 80, :_reduce_48,
+ 7, 58, :_reduce_49,
+ 1, 84, :_reduce_50,
+ 3, 84, :_reduce_51,
+ 1, 85, :_reduce_52,
+ 3, 85, :_reduce_53,
+ 0, 86, :_reduce_54,
+ 1, 86, :_reduce_55,
+ 3, 86, :_reduce_56,
+ 3, 86, :_reduce_57,
+ 5, 86, :_reduce_58,
+ 0, 91, :_reduce_59,
+ 0, 92, :_reduce_60,
+ 7, 86, :_reduce_61,
+ 3, 86, :_reduce_62,
+ 0, 82, :_reduce_none,
+ 1, 82, :_reduce_none,
+ 0, 83, :_reduce_none,
+ 1, 83, :_reduce_none,
+ 1, 77, :_reduce_67,
+ 2, 77, :_reduce_68,
+ 3, 77, :_reduce_69,
+ 1, 93, :_reduce_70,
+ 2, 93, :_reduce_71,
+ 1, 87, :_reduce_none,
+ 1, 87, :_reduce_none,
+ 0, 95, :_reduce_74,
+ 0, 96, :_reduce_75,
+ 6, 61, :_reduce_76,
+ 0, 97, :_reduce_77,
+ 0, 98, :_reduce_78,
+ 5, 61, :_reduce_79,
+ 1, 78, :_reduce_80,
+ 2, 78, :_reduce_81,
+ 3, 78, :_reduce_82,
+ 1, 99, :_reduce_83,
+ 2, 99, :_reduce_84,
+ 1, 100, :_reduce_none,
+ 1, 81, :_reduce_86,
+ 1, 81, :_reduce_87,
+ 1, 51, :_reduce_none,
+ 2, 51, :_reduce_none,
+ 1, 101, :_reduce_none,
+ 2, 101, :_reduce_none,
+ 4, 102, :_reduce_92,
+ 1, 104, :_reduce_93,
+ 3, 104, :_reduce_94,
+ 2, 104, :_reduce_none,
+ 0, 105, :_reduce_96,
+ 1, 105, :_reduce_97,
+ 3, 105, :_reduce_98,
+ 4, 105, :_reduce_99,
+ 6, 105, :_reduce_100,
+ 0, 107, :_reduce_101,
+ 0, 108, :_reduce_102,
+ 7, 105, :_reduce_103,
+ 3, 105, :_reduce_104,
+ 1, 89, :_reduce_none,
+ 1, 89, :_reduce_none,
+ 1, 89, :_reduce_none,
+ 1, 90, :_reduce_108,
+ 3, 90, :_reduce_109,
+ 0, 88, :_reduce_none,
+ 3, 88, :_reduce_111,
1, 103, :_reduce_none,
- 1, 84, :_reduce_110,
- 0, 98, :_reduce_none,
- 1, 98, :_reduce_none ]
-
-racc_reduce_n = 113
-
-racc_shift_n = 179
+ 0, 52, :_reduce_none,
+ 0, 109, :_reduce_114,
+ 3, 52, :_reduce_115,
+ 1, 59, :_reduce_none,
+ 0, 60, :_reduce_none,
+ 1, 60, :_reduce_none,
+ 1, 60, :_reduce_none,
+ 1, 60, :_reduce_none,
+ 1, 67, :_reduce_121,
+ 2, 67, :_reduce_122,
+ 1, 110, :_reduce_none,
+ 1, 110, :_reduce_none,
+ 1, 94, :_reduce_125,
+ 0, 106, :_reduce_none,
+ 1, 106, :_reduce_none ]
+
+racc_reduce_n = 128
+
+racc_shift_n = 209
racc_token_table = {
false => 0,
@@ -1039,21 +1059,22 @@ racc_token_table = {
"%right" => 30,
"%precedence" => 31,
"%nonassoc" => 32,
- ":" => 33,
- "|" => 34,
- "%empty" => 35,
- "(" => 36,
- ")" => 37,
- "%prec" => 38,
- "?" => 39,
- "+" => 40,
- "*" => 41,
- "," => 42,
- "[" => 43,
- "]" => 44,
- "{...}" => 45 }
-
-racc_nt_base = 46
+ "%rule" => 33,
+ "(" => 34,
+ ")" => 35,
+ ":" => 36,
+ "," => 37,
+ "|" => 38,
+ "%empty" => 39,
+ "%prec" => 40,
+ "?" => 41,
+ "+" => 42,
+ "*" => 43,
+ "[" => 44,
+ "]" => 45,
+ "{...}" => 46 }
+
+racc_nt_base = 47
racc_use_result_var = true
@@ -1108,16 +1129,17 @@ Racc_token_to_s_table = [
"\"%right\"",
"\"%precedence\"",
"\"%nonassoc\"",
+ "\"%rule\"",
+ "\"(\"",
+ "\")\"",
"\":\"",
+ "\",\"",
"\"|\"",
"\"%empty\"",
- "\"(\"",
- "\")\"",
"\"%prec\"",
"\"?\"",
"\"+\"",
"\"*\"",
- "\",\"",
"\"[\"",
"\"]\"",
"\"{...}\"",
@@ -1132,6 +1154,7 @@ Racc_token_to_s_table = [
"@2",
"bison_declaration",
"grammar_declaration",
+ "rule_declaration",
"variable",
"value",
"params",
@@ -1157,27 +1180,32 @@ Racc_token_to_s_table = [
"id",
"int_opt",
"alias",
- "symbol_declaration_list",
+ "rule_args",
+ "rule_rhs_list",
+ "rule_rhs",
"symbol",
- "string_as_id",
+ "named_ref_opt",
+ "parameterizing_suffix",
+ "parameterizing_args",
"@15",
"@16",
+ "symbol_declaration_list",
+ "string_as_id",
"@17",
"@18",
+ "@19",
+ "@20",
"token_declaration_list_for_precedence",
"token_declaration_for_precedence",
"rules_or_grammar_declaration",
"rules",
"id_colon",
- "named_ref_opt",
"rhs_list",
"rhs",
- "parameterizing_suffix",
"tag_opt",
- "parameterizing_args",
- "@19",
- "@20",
"@21",
+ "@22",
+ "@23",
"generic_symlist_item" ]
Ractor.make_shareable(Racc_token_to_s_table) if defined?(Ractor)
@@ -1231,19 +1259,21 @@ module_eval(<<'.,.,', 'parser.y', 27)
# reduce 10 omitted
-module_eval(<<'.,.,', 'parser.y', 31)
- def _reduce_11(val, _values, result)
+# reduce 11 omitted
+
+module_eval(<<'.,.,', 'parser.y', 32)
+ def _reduce_12(val, _values, result)
@grammar.expect = val[1]
result
end
.,.,
-# reduce 12 omitted
-
# reduce 13 omitted
-module_eval(<<'.,.,', 'parser.y', 36)
- def _reduce_14(val, _values, result)
+# reduce 14 omitted
+
+module_eval(<<'.,.,', 'parser.y', 37)
+ def _reduce_15(val, _values, result)
val[1].each {|token|
@grammar.lex_param = Grammar::Code::NoReferenceCode.new(type: :lex_param, token_code: token).token_code.s_value
}
@@ -1252,8 +1282,8 @@ module_eval(<<'.,.,', 'parser.y', 36)
end
.,.,
-module_eval(<<'.,.,', 'parser.y', 42)
- def _reduce_15(val, _values, result)
+module_eval(<<'.,.,', 'parser.y', 43)
+ def _reduce_16(val, _values, result)
val[1].each {|token|
@grammar.parse_param = Grammar::Code::NoReferenceCode.new(type: :parse_param, token_code: token).token_code.s_value
}
@@ -1262,74 +1292,74 @@ module_eval(<<'.,.,', 'parser.y', 42)
end
.,.,
-module_eval(<<'.,.,', 'parser.y', 48)
- def _reduce_16(val, _values, result)
+module_eval(<<'.,.,', 'parser.y', 49)
+ def _reduce_17(val, _values, result)
begin_c_declaration("}")
result
end
.,.,
-module_eval(<<'.,.,', 'parser.y', 52)
- def _reduce_17(val, _values, result)
+module_eval(<<'.,.,', 'parser.y', 53)
+ def _reduce_18(val, _values, result)
end_c_declaration
result
end
.,.,
-module_eval(<<'.,.,', 'parser.y', 56)
- def _reduce_18(val, _values, result)
+module_eval(<<'.,.,', 'parser.y', 57)
+ def _reduce_19(val, _values, result)
@grammar.add_percent_code(id: val[1], code: val[4])
result
end
.,.,
-module_eval(<<'.,.,', 'parser.y', 60)
- def _reduce_19(val, _values, result)
+module_eval(<<'.,.,', 'parser.y', 61)
+ def _reduce_20(val, _values, result)
begin_c_declaration("}")
result
end
.,.,
-module_eval(<<'.,.,', 'parser.y', 64)
- def _reduce_20(val, _values, result)
+module_eval(<<'.,.,', 'parser.y', 65)
+ def _reduce_21(val, _values, result)
end_c_declaration
result
end
.,.,
-module_eval(<<'.,.,', 'parser.y', 68)
- def _reduce_21(val, _values, result)
+module_eval(<<'.,.,', 'parser.y', 69)
+ def _reduce_22(val, _values, result)
@grammar.initial_action = Grammar::Code::InitialActionCode.new(type: :initial_action, token_code: val[3])
result
end
.,.,
-# reduce 22 omitted
+# reduce 23 omitted
-module_eval(<<'.,.,', 'parser.y', 74)
- def _reduce_23(val, _values, result)
+module_eval(<<'.,.,', 'parser.y', 75)
+ def _reduce_24(val, _values, result)
begin_c_declaration("}")
result
end
.,.,
-module_eval(<<'.,.,', 'parser.y', 78)
- def _reduce_24(val, _values, result)
+module_eval(<<'.,.,', 'parser.y', 79)
+ def _reduce_25(val, _values, result)
end_c_declaration
result
end
.,.,
-module_eval(<<'.,.,', 'parser.y', 82)
- def _reduce_25(val, _values, result)
+module_eval(<<'.,.,', 'parser.y', 83)
+ def _reduce_26(val, _values, result)
@grammar.set_union(
Grammar::Code::NoReferenceCode.new(type: :union, token_code: val[3]),
val[3].line
@@ -1339,44 +1369,44 @@ module_eval(<<'.,.,', 'parser.y', 82)
end
.,.,
-# reduce 26 omitted
+# reduce 27 omitted
-module_eval(<<'.,.,', 'parser.y', 90)
- def _reduce_27(val, _values, result)
+module_eval(<<'.,.,', 'parser.y', 91)
+ def _reduce_28(val, _values, result)
begin_c_declaration("}")
result
end
.,.,
-module_eval(<<'.,.,', 'parser.y', 94)
- def _reduce_28(val, _values, result)
+module_eval(<<'.,.,', 'parser.y', 95)
+ def _reduce_29(val, _values, result)
end_c_declaration
result
end
.,.,
-# reduce 29 omitted
+# reduce 30 omitted
-module_eval(<<'.,.,', 'parser.y', 99)
- def _reduce_30(val, _values, result)
+module_eval(<<'.,.,', 'parser.y', 100)
+ def _reduce_31(val, _values, result)
begin_c_declaration("}")
result
end
.,.,
-module_eval(<<'.,.,', 'parser.y', 103)
- def _reduce_31(val, _values, result)
+module_eval(<<'.,.,', 'parser.y', 104)
+ def _reduce_32(val, _values, result)
end_c_declaration
result
end
.,.,
-module_eval(<<'.,.,', 'parser.y', 107)
- def _reduce_32(val, _values, result)
+module_eval(<<'.,.,', 'parser.y', 108)
+ def _reduce_33(val, _values, result)
@grammar.add_printer(
ident_or_tags: val[6],
token_code: val[3],
@@ -1387,24 +1417,24 @@ module_eval(<<'.,.,', 'parser.y', 107)
end
.,.,
-module_eval(<<'.,.,', 'parser.y', 115)
- def _reduce_33(val, _values, result)
+module_eval(<<'.,.,', 'parser.y', 116)
+ def _reduce_34(val, _values, result)
begin_c_declaration("}")
result
end
.,.,
-module_eval(<<'.,.,', 'parser.y', 119)
- def _reduce_34(val, _values, result)
+module_eval(<<'.,.,', 'parser.y', 120)
+ def _reduce_35(val, _values, result)
end_c_declaration
result
end
.,.,
-module_eval(<<'.,.,', 'parser.y', 123)
- def _reduce_35(val, _values, result)
+module_eval(<<'.,.,', 'parser.y', 124)
+ def _reduce_36(val, _values, result)
@grammar.add_error_token(
ident_or_tags: val[6],
token_code: val[3],
@@ -1415,10 +1445,10 @@ module_eval(<<'.,.,', 'parser.y', 123)
end
.,.,
-# reduce 36 omitted
+# reduce 37 omitted
-module_eval(<<'.,.,', 'parser.y', 133)
- def _reduce_37(val, _values, result)
+module_eval(<<'.,.,', 'parser.y', 134)
+ def _reduce_38(val, _values, result)
val[1].each {|hash|
hash[:tokens].each {|id|
@grammar.add_type(id: id, tag: hash[:tag])
@@ -1429,8 +1459,8 @@ module_eval(<<'.,.,', 'parser.y', 133)
end
.,.,
-module_eval(<<'.,.,', 'parser.y', 141)
- def _reduce_38(val, _values, result)
+module_eval(<<'.,.,', 'parser.y', 142)
+ def _reduce_39(val, _values, result)
val[1].each {|hash|
hash[:tokens].each {|id|
sym = @grammar.add_term(id: id)
@@ -1443,8 +1473,8 @@ module_eval(<<'.,.,', 'parser.y', 141)
end
.,.,
-module_eval(<<'.,.,', 'parser.y', 151)
- def _reduce_39(val, _values, result)
+module_eval(<<'.,.,', 'parser.y', 152)
+ def _reduce_40(val, _values, result)
val[1].each {|hash|
hash[:tokens].each {|id|
sym = @grammar.add_term(id: id)
@@ -1457,8 +1487,8 @@ module_eval(<<'.,.,', 'parser.y', 151)
end
.,.,
-module_eval(<<'.,.,', 'parser.y', 161)
- def _reduce_40(val, _values, result)
+module_eval(<<'.,.,', 'parser.y', 162)
+ def _reduce_41(val, _values, result)
val[1].each {|hash|
hash[:tokens].each {|id|
sym = @grammar.add_term(id: id)
@@ -1471,8 +1501,8 @@ module_eval(<<'.,.,', 'parser.y', 161)
end
.,.,
-module_eval(<<'.,.,', 'parser.y', 171)
- def _reduce_41(val, _values, result)
+module_eval(<<'.,.,', 'parser.y', 172)
+ def _reduce_42(val, _values, result)
val[1].each {|hash|
hash[:tokens].each {|id|
sym = @grammar.add_term(id: id)
@@ -1485,8 +1515,8 @@ module_eval(<<'.,.,', 'parser.y', 171)
end
.,.,
-module_eval(<<'.,.,', 'parser.y', 182)
- def _reduce_42(val, _values, result)
+module_eval(<<'.,.,', 'parser.y', 183)
+ def _reduce_43(val, _values, result)
val[0].each {|token_declaration|
@grammar.add_term(id: token_declaration[0], alias_name: token_declaration[2], token_id: token_declaration[1], tag: nil, replace: true)
}
@@ -1495,8 +1525,8 @@ module_eval(<<'.,.,', 'parser.y', 182)
end
.,.,
-module_eval(<<'.,.,', 'parser.y', 188)
- def _reduce_43(val, _values, result)
+module_eval(<<'.,.,', 'parser.y', 189)
+ def _reduce_44(val, _values, result)
val[1].each {|token_declaration|
@grammar.add_term(id: token_declaration[0], alias_name: token_declaration[2], token_id: token_declaration[1], tag: val[0], replace: true)
}
@@ -1505,8 +1535,8 @@ module_eval(<<'.,.,', 'parser.y', 188)
end
.,.,
-module_eval(<<'.,.,', 'parser.y', 194)
- def _reduce_44(val, _values, result)
+module_eval(<<'.,.,', 'parser.y', 195)
+ def _reduce_45(val, _values, result)
val[2].each {|token_declaration|
@grammar.add_term(id: token_declaration[0], alias_name: token_declaration[2], token_id: token_declaration[1], tag: val[1], replace: true)
}
@@ -1515,86 +1545,131 @@ module_eval(<<'.,.,', 'parser.y', 194)
end
.,.,
-module_eval(<<'.,.,', 'parser.y', 199)
- def _reduce_45(val, _values, result)
+module_eval(<<'.,.,', 'parser.y', 200)
+ def _reduce_46(val, _values, result)
result = [val[0]]
result
end
.,.,
-module_eval(<<'.,.,', 'parser.y', 200)
- def _reduce_46(val, _values, result)
+module_eval(<<'.,.,', 'parser.y', 201)
+ def _reduce_47(val, _values, result)
result = val[0].append(val[1])
result
end
.,.,
-module_eval(<<'.,.,', 'parser.y', 202)
- def _reduce_47(val, _values, result)
+module_eval(<<'.,.,', 'parser.y', 203)
+ def _reduce_48(val, _values, result)
result = val
result
end
.,.,
-# reduce 48 omitted
-
-# reduce 49 omitted
+module_eval(<<'.,.,', 'parser.y', 207)
+ def _reduce_49(val, _values, result)
+ builder = Grammar::ParameterizingRuleBuilder.new(val[1].s_value, val[3], val[6])
+ @grammar.add_parameterizing_rule_builder(builder)
-# reduce 50 omitted
+ result
+ end
+.,.,
-# reduce 51 omitted
+module_eval(<<'.,.,', 'parser.y', 211)
+ def _reduce_50(val, _values, result)
+ result = [val[0]]
+ result
+ end
+.,.,
module_eval(<<'.,.,', 'parser.y', 212)
+ def _reduce_51(val, _values, result)
+ result = val[0].append(val[2])
+ result
+ end
+.,.,
+
+module_eval(<<'.,.,', 'parser.y', 216)
def _reduce_52(val, _values, result)
- result = [{tag: nil, tokens: val[0]}]
+ builder = val[0]
+ result = [builder]
result
end
.,.,
-module_eval(<<'.,.,', 'parser.y', 216)
+module_eval(<<'.,.,', 'parser.y', 221)
def _reduce_53(val, _values, result)
- result = [{tag: val[0], tokens: val[1]}]
+ builder = val[2]
+ result = val[0].append(builder)
result
end
.,.,
-module_eval(<<'.,.,', 'parser.y', 220)
+module_eval(<<'.,.,', 'parser.y', 227)
def _reduce_54(val, _values, result)
- result = val[0].append({tag: val[1], tokens: val[2]})
+ reset_precs
+ result = Grammar::ParameterizingRuleRhsBuilder.new
result
end
.,.,
-module_eval(<<'.,.,', 'parser.y', 223)
+module_eval(<<'.,.,', 'parser.y', 232)
def _reduce_55(val, _values, result)
- result = [val[0]]
+ reset_precs
+ result = Grammar::ParameterizingRuleRhsBuilder.new
+
result
end
.,.,
-module_eval(<<'.,.,', 'parser.y', 224)
+module_eval(<<'.,.,', 'parser.y', 237)
def _reduce_56(val, _values, result)
- result = val[0].append(val[1])
+ token = val[1]
+ token.alias_name = val[2]
+ builder = val[0]
+ builder.symbols << token
+ result = builder
+
result
end
.,.,
-# reduce 57 omitted
+module_eval(<<'.,.,', 'parser.y', 245)
+ def _reduce_57(val, _values, result)
+ builder = val[0]
+ builder.symbols << Lrama::Lexer::Token::InstantiateRule.new(s_value: val[2], location: @lexer.location, args: [val[1]])
+ result = builder
+
+ result
+ end
+.,.,
+
+module_eval(<<'.,.,', 'parser.y', 251)
+ def _reduce_58(val, _values, result)
+ builder = val[0]
+ builder.symbols << Lrama::Lexer::Token::InstantiateRule.new(s_value: val[1].s_value, location: @lexer.location, args: val[3])
+ result = builder
-# reduce 58 omitted
+ result
+ end
+.,.,
-module_eval(<<'.,.,', 'parser.y', 231)
+module_eval(<<'.,.,', 'parser.y', 257)
def _reduce_59(val, _values, result)
- begin_c_declaration("}")
+ if @prec_seen
+ on_action_error("multiple User_code after %prec", val[0]) if @code_after_prec
+ @code_after_prec = true
+ end
+ begin_c_declaration("}")
result
end
.,.,
-module_eval(<<'.,.,', 'parser.y', 235)
+module_eval(<<'.,.,', 'parser.y', 265)
def _reduce_60(val, _values, result)
end_c_declaration
@@ -1602,102 +1677,192 @@ module_eval(<<'.,.,', 'parser.y', 235)
end
.,.,
-module_eval(<<'.,.,', 'parser.y', 239)
+module_eval(<<'.,.,', 'parser.y', 269)
def _reduce_61(val, _values, result)
- result = val[0].append(val[3])
+ user_code = val[3]
+ user_code.alias_name = val[6]
+ builder = val[0]
+ builder.user_code = user_code
+ result = builder
result
end
.,.,
-module_eval(<<'.,.,', 'parser.y', 243)
+module_eval(<<'.,.,', 'parser.y', 277)
def _reduce_62(val, _values, result)
+ sym = @grammar.find_symbol_by_id!(val[2])
+ @prec_seen = true
+ builder = val[0]
+ builder.precedence_sym = sym
+ result = builder
+
+ result
+ end
+.,.,
+
+# reduce 63 omitted
+
+# reduce 64 omitted
+
+# reduce 65 omitted
+
+# reduce 66 omitted
+
+module_eval(<<'.,.,', 'parser.y', 292)
+ def _reduce_67(val, _values, result)
+ result = [{tag: nil, tokens: val[0]}]
+
+ result
+ end
+.,.,
+
+module_eval(<<'.,.,', 'parser.y', 296)
+ def _reduce_68(val, _values, result)
+ result = [{tag: val[0], tokens: val[1]}]
+
+ result
+ end
+.,.,
+
+module_eval(<<'.,.,', 'parser.y', 300)
+ def _reduce_69(val, _values, result)
+ result = val[0].append({tag: val[1], tokens: val[2]})
+
+ result
+ end
+.,.,
+
+module_eval(<<'.,.,', 'parser.y', 303)
+ def _reduce_70(val, _values, result)
+ result = [val[0]]
+ result
+ end
+.,.,
+
+module_eval(<<'.,.,', 'parser.y', 304)
+ def _reduce_71(val, _values, result)
+ result = val[0].append(val[1])
+ result
+ end
+.,.,
+
+# reduce 72 omitted
+
+# reduce 73 omitted
+
+module_eval(<<'.,.,', 'parser.y', 311)
+ def _reduce_74(val, _values, result)
begin_c_declaration("}")
result
end
.,.,
-module_eval(<<'.,.,', 'parser.y', 247)
- def _reduce_63(val, _values, result)
+module_eval(<<'.,.,', 'parser.y', 315)
+ def _reduce_75(val, _values, result)
end_c_declaration
result
end
.,.,
-module_eval(<<'.,.,', 'parser.y', 251)
- def _reduce_64(val, _values, result)
+module_eval(<<'.,.,', 'parser.y', 319)
+ def _reduce_76(val, _values, result)
+ result = val[0].append(val[3])
+
+ result
+ end
+.,.,
+
+module_eval(<<'.,.,', 'parser.y', 323)
+ def _reduce_77(val, _values, result)
+ begin_c_declaration("}")
+
+ result
+ end
+.,.,
+
+module_eval(<<'.,.,', 'parser.y', 327)
+ def _reduce_78(val, _values, result)
+ end_c_declaration
+
+ result
+ end
+.,.,
+
+module_eval(<<'.,.,', 'parser.y', 331)
+ def _reduce_79(val, _values, result)
result = [val[2]]
result
end
.,.,
-module_eval(<<'.,.,', 'parser.y', 256)
- def _reduce_65(val, _values, result)
+module_eval(<<'.,.,', 'parser.y', 336)
+ def _reduce_80(val, _values, result)
result = [{tag: nil, tokens: val[0]}]
result
end
.,.,
-module_eval(<<'.,.,', 'parser.y', 260)
- def _reduce_66(val, _values, result)
+module_eval(<<'.,.,', 'parser.y', 340)
+ def _reduce_81(val, _values, result)
result = [{tag: val[0], tokens: val[1]}]
result
end
.,.,
-module_eval(<<'.,.,', 'parser.y', 264)
- def _reduce_67(val, _values, result)
+module_eval(<<'.,.,', 'parser.y', 344)
+ def _reduce_82(val, _values, result)
result = val[0].append({tag: val[1], tokens: val[2]})
result
end
.,.,
-module_eval(<<'.,.,', 'parser.y', 267)
- def _reduce_68(val, _values, result)
+module_eval(<<'.,.,', 'parser.y', 347)
+ def _reduce_83(val, _values, result)
result = [val[0]]
result
end
.,.,
-module_eval(<<'.,.,', 'parser.y', 268)
- def _reduce_69(val, _values, result)
+module_eval(<<'.,.,', 'parser.y', 348)
+ def _reduce_84(val, _values, result)
result = val[0].append(val[1])
result
end
.,.,
-# reduce 70 omitted
+# reduce 85 omitted
-module_eval(<<'.,.,', 'parser.y', 272)
- def _reduce_71(val, _values, result)
+module_eval(<<'.,.,', 'parser.y', 352)
+ def _reduce_86(val, _values, result)
on_action_error("ident after %prec", val[0]) if @prec_seen
result
end
.,.,
-module_eval(<<'.,.,', 'parser.y', 273)
- def _reduce_72(val, _values, result)
+module_eval(<<'.,.,', 'parser.y', 353)
+ def _reduce_87(val, _values, result)
on_action_error("char after %prec", val[0]) if @prec_seen
result
end
.,.,
-# reduce 73 omitted
+# reduce 88 omitted
-# reduce 74 omitted
+# reduce 89 omitted
-# reduce 75 omitted
+# reduce 90 omitted
-# reduce 76 omitted
+# reduce 91 omitted
-module_eval(<<'.,.,', 'parser.y', 283)
- def _reduce_77(val, _values, result)
+module_eval(<<'.,.,', 'parser.y', 363)
+ def _reduce_92(val, _values, result)
lhs = val[0]
lhs.alias_name = val[1]
val[3].each do |builder|
@@ -1710,8 +1875,8 @@ module_eval(<<'.,.,', 'parser.y', 283)
end
.,.,
-module_eval(<<'.,.,', 'parser.y', 294)
- def _reduce_78(val, _values, result)
+module_eval(<<'.,.,', 'parser.y', 374)
+ def _reduce_93(val, _values, result)
builder = val[0]
if !builder.line
builder.line = @lexer.line - 1
@@ -1722,8 +1887,8 @@ module_eval(<<'.,.,', 'parser.y', 294)
end
.,.,
-module_eval(<<'.,.,', 'parser.y', 302)
- def _reduce_79(val, _values, result)
+module_eval(<<'.,.,', 'parser.y', 382)
+ def _reduce_94(val, _values, result)
builder = val[2]
if !builder.line
builder.line = @lexer.line - 1
@@ -1734,10 +1899,10 @@ module_eval(<<'.,.,', 'parser.y', 302)
end
.,.,
-# reduce 80 omitted
+# reduce 95 omitted
-module_eval(<<'.,.,', 'parser.y', 312)
- def _reduce_81(val, _values, result)
+module_eval(<<'.,.,', 'parser.y', 392)
+ def _reduce_96(val, _values, result)
reset_precs
result = Grammar::RuleBuilder.new(@rule_counter, @midrule_action_counter)
@@ -1745,8 +1910,8 @@ module_eval(<<'.,.,', 'parser.y', 312)
end
.,.,
-module_eval(<<'.,.,', 'parser.y', 317)
- def _reduce_82(val, _values, result)
+module_eval(<<'.,.,', 'parser.y', 397)
+ def _reduce_97(val, _values, result)
reset_precs
result = Grammar::RuleBuilder.new(@rule_counter, @midrule_action_counter)
@@ -1754,8 +1919,8 @@ module_eval(<<'.,.,', 'parser.y', 317)
end
.,.,
-module_eval(<<'.,.,', 'parser.y', 322)
- def _reduce_83(val, _values, result)
+module_eval(<<'.,.,', 'parser.y', 402)
+ def _reduce_98(val, _values, result)
token = val[1]
token.alias_name = val[2]
builder = val[0]
@@ -1766,9 +1931,9 @@ module_eval(<<'.,.,', 'parser.y', 322)
end
.,.,
-module_eval(<<'.,.,', 'parser.y', 330)
- def _reduce_84(val, _values, result)
- token = Lrama::Lexer::Token::Parameterizing.new(s_value: val[2], location: @lexer.location, args: [val[1]])
+module_eval(<<'.,.,', 'parser.y', 410)
+ def _reduce_99(val, _values, result)
+ token = Lrama::Lexer::Token::InstantiateRule.new(s_value: val[2], location: @lexer.location, args: [val[1]])
builder = val[0]
builder.add_rhs(token)
builder.lhs_tag = val[3]
@@ -1779,9 +1944,9 @@ module_eval(<<'.,.,', 'parser.y', 330)
end
.,.,
-module_eval(<<'.,.,', 'parser.y', 339)
- def _reduce_85(val, _values, result)
- token = Lrama::Lexer::Token::Parameterizing.new(s_value: val[1].s_value, location: @lexer.location, args: val[3])
+module_eval(<<'.,.,', 'parser.y', 419)
+ def _reduce_100(val, _values, result)
+ token = Lrama::Lexer::Token::InstantiateRule.new(s_value: val[1].s_value, location: @lexer.location, args: val[3])
builder = val[0]
builder.add_rhs(token)
builder.lhs_tag = val[5]
@@ -1792,8 +1957,8 @@ module_eval(<<'.,.,', 'parser.y', 339)
end
.,.,
-module_eval(<<'.,.,', 'parser.y', 348)
- def _reduce_86(val, _values, result)
+module_eval(<<'.,.,', 'parser.y', 428)
+ def _reduce_101(val, _values, result)
if @prec_seen
on_action_error("multiple User_code after %prec", val[0]) if @code_after_prec
@code_after_prec = true
@@ -1804,16 +1969,16 @@ module_eval(<<'.,.,', 'parser.y', 348)
end
.,.,
-module_eval(<<'.,.,', 'parser.y', 356)
- def _reduce_87(val, _values, result)
+module_eval(<<'.,.,', 'parser.y', 436)
+ def _reduce_102(val, _values, result)
end_c_declaration
result
end
.,.,
-module_eval(<<'.,.,', 'parser.y', 360)
- def _reduce_88(val, _values, result)
+module_eval(<<'.,.,', 'parser.y', 440)
+ def _reduce_103(val, _values, result)
user_code = val[3]
user_code.alias_name = val[6]
builder = val[0]
@@ -1824,8 +1989,8 @@ module_eval(<<'.,.,', 'parser.y', 360)
end
.,.,
-module_eval(<<'.,.,', 'parser.y', 368)
- def _reduce_89(val, _values, result)
+module_eval(<<'.,.,', 'parser.y', 448)
+ def _reduce_104(val, _values, result)
sym = @grammar.find_symbol_by_id!(val[2])
@prec_seen = true
builder = val[0]
@@ -1836,41 +2001,41 @@ module_eval(<<'.,.,', 'parser.y', 368)
end
.,.,
-# reduce 90 omitted
+# reduce 105 omitted
-# reduce 91 omitted
+# reduce 106 omitted
-# reduce 92 omitted
+# reduce 107 omitted
-module_eval(<<'.,.,', 'parser.y', 379)
- def _reduce_93(val, _values, result)
+module_eval(<<'.,.,', 'parser.y', 459)
+ def _reduce_108(val, _values, result)
result = [val[0]]
result
end
.,.,
-module_eval(<<'.,.,', 'parser.y', 380)
- def _reduce_94(val, _values, result)
+module_eval(<<'.,.,', 'parser.y', 460)
+ def _reduce_109(val, _values, result)
result = val[0].append(val[2])
result
end
.,.,
-# reduce 95 omitted
+# reduce 110 omitted
-module_eval(<<'.,.,', 'parser.y', 383)
- def _reduce_96(val, _values, result)
+module_eval(<<'.,.,', 'parser.y', 463)
+ def _reduce_111(val, _values, result)
result = val[1].s_value
result
end
.,.,
-# reduce 97 omitted
+# reduce 112 omitted
-# reduce 98 omitted
+# reduce 113 omitted
-module_eval(<<'.,.,', 'parser.y', 390)
- def _reduce_99(val, _values, result)
+module_eval(<<'.,.,', 'parser.y', 470)
+ def _reduce_114(val, _values, result)
begin_c_declaration('\Z')
@grammar.epilogue_first_lineno = @lexer.line + 1
@@ -1878,8 +2043,8 @@ module_eval(<<'.,.,', 'parser.y', 390)
end
.,.,
-module_eval(<<'.,.,', 'parser.y', 395)
- def _reduce_100(val, _values, result)
+module_eval(<<'.,.,', 'parser.y', 475)
+ def _reduce_115(val, _values, result)
end_c_declaration
@grammar.epilogue = val[2].s_value
@@ -1887,44 +2052,44 @@ module_eval(<<'.,.,', 'parser.y', 395)
end
.,.,
-# reduce 101 omitted
+# reduce 116 omitted
-# reduce 102 omitted
+# reduce 117 omitted
-# reduce 103 omitted
+# reduce 118 omitted
-# reduce 104 omitted
+# reduce 119 omitted
-# reduce 105 omitted
+# reduce 120 omitted
-module_eval(<<'.,.,', 'parser.y', 406)
- def _reduce_106(val, _values, result)
+module_eval(<<'.,.,', 'parser.y', 486)
+ def _reduce_121(val, _values, result)
result = [val[0]]
result
end
.,.,
-module_eval(<<'.,.,', 'parser.y', 407)
- def _reduce_107(val, _values, result)
+module_eval(<<'.,.,', 'parser.y', 487)
+ def _reduce_122(val, _values, result)
result = val[0].append(val[1])
result
end
.,.,
-# reduce 108 omitted
+# reduce 123 omitted
-# reduce 109 omitted
+# reduce 124 omitted
-module_eval(<<'.,.,', 'parser.y', 412)
- def _reduce_110(val, _values, result)
+module_eval(<<'.,.,', 'parser.y', 492)
+ def _reduce_125(val, _values, result)
result = Lrama::Lexer::Token::Ident.new(s_value: val[0])
result
end
.,.,
-# reduce 111 omitted
+# reduce 126 omitted
-# reduce 112 omitted
+# reduce 127 omitted
def _reduce_none(val, _values, result)
val[0]
diff --git a/tool/lrama/lib/lrama/states_reporter.rb b/tool/lrama/lib/lrama/states_reporter.rb
index 8be0f71e40..19830a63bb 100644
--- a/tool/lrama/lib/lrama/states_reporter.rb
+++ b/tool/lrama/lib/lrama/states_reporter.rb
@@ -156,7 +156,7 @@ module Lrama
nl = true
end
- if r = state.default_reduction_rule
+ if (r = state.default_reduction_rule)
nl = true
s = "$default".ljust(max_len)
diff --git a/tool/lrama/lib/lrama/version.rb b/tool/lrama/lib/lrama/version.rb
index 3e68736482..8ec2c458a1 100644
--- a/tool/lrama/lib/lrama/version.rb
+++ b/tool/lrama/lib/lrama/version.rb
@@ -1,3 +1,3 @@
module Lrama
- VERSION = "0.5.12".freeze
+ VERSION = "0.6.0".freeze
end