lib/lrama/grammar/code/rule_action.rb in lrama-0.6.2 vs lib/lrama/grammar/code/rule_action.rb in lrama-0.6.3
- old
+ new
@@ -9,12 +9,14 @@
private
# * ($$) yyval
# * (@$) yyloc
+ # * ($:$) error
# * ($1) yyvsp[i]
# * (@1) yylsp[i]
+ # * ($:1) i - 1
#
#
# Consider a rule like
#
# class: keyword_class { $1 } tSTRING { $2 + $3 } keyword_end { $class = $1 + $keyword_end }
@@ -22,33 +24,41 @@
# For the semantic action of original rule:
#
# "Rule" class: keyword_class { $1 } tSTRING { $2 + $3 } keyword_end { $class = $1 + $keyword_end }
# "Position in grammar" $1 $2 $3 $4 $5
# "Index for yyvsp" -4 -3 -2 -1 0
+ # "$:n" $:1 $:2 $:3 $:4 $:5
+ # "index of $:n" -5 -4 -3 -2 -1
#
#
# For the first midrule action:
#
# "Rule" class: keyword_class { $1 } tSTRING { $2 + $3 } keyword_end { $class = $1 + $keyword_end }
# "Position in grammar" $1
# "Index for yyvsp" 0
+ # "$:n" $:1
def reference_to_c(ref)
case
when ref.type == :dollar && ref.name == "$" # $$
tag = ref.ex_tag || lhs.tag
raise_tag_not_found_error(ref) unless tag
"(yyval.#{tag.member})"
when ref.type == :at && ref.name == "$" # @$
"(yyloc)"
+ when ref.type == :index && ref.name == "$" # $:$
+ raise "$:$ is not supported"
when ref.type == :dollar # $n
i = -position_in_rhs + ref.index
tag = ref.ex_tag || rhs[ref.index - 1].tag
raise_tag_not_found_error(ref) unless tag
"(yyvsp[#{i}].#{tag.member})"
when ref.type == :at # @n
i = -position_in_rhs + ref.index
"(yylsp[#{i}])"
+ when ref.type == :index # $:n
+ i = -position_in_rhs + ref.index
+ "(#{i} - 1)"
else
raise "Unexpected. #{self}, #{ref}"
end
end
@@ -68,10 +78,10 @@
def lhs
@rule.lhs
end
def raise_tag_not_found_error(ref)
- raise "Tag is not specified for '$#{ref.value}' in '#{@rule.to_s}'"
+ raise "Tag is not specified for '$#{ref.value}' in '#{@rule}'"
end
end
end
end
end