2
私はTreetopを使ってVerilog言語の文法を作成していますが、言語仕様にはTreetopに翻訳されない左回帰構文が含まれている場合があります。私はそれが実際にどのように動作するかのまわりで私の頭をラップすることはできませんし、誰か場合いただければ幸いです、しかしLeft recursion eliminationVerilog文法の左回帰を排除する方法
:
私はこの上でいくつかの読書を行っているが、この答えは左再帰を除去するために、一般的な方法の良い要約を与えます左再帰を含み、この元のルールについては、
...私のアプローチはここに正しいかどうかを確認することができ、より知識が豊富(コメントは、それが言語仕様に書かれている方法です):
# constant_expression ::=
# constant_primary
# | unary_operator { attribute_instance } constant_primary
# | constant_expression binary_operator { attribute_instance } constant_expression
# | constant_expression ? { attribute_instance } constant_expression : constant_expression
rule constant_expression
constant_primary/
(unary_operator (s attribute_instance)* s constant_primary)/
(constant_expression s binary_operator (s attribute_instance)* s constant_expression)/
(constant_expression s "?" (s attribute_instance)* s constant_expression s ":" s constant_expression)
end
以下は、左回帰が削除されたときと本当に等価ですか?
rule constant_expression
(constant_primary constant_expression_tail?)/
(unary_operator (s attribute_instance)* s constant_primary constant_expression_tail?)
end
rule constant_expression_tail
(s binary_operator (s attribute_instance)* s constant_expression constant_expression_tail?)/
(s "?" (s attribute_instance)* s constant_expression s ":" s constant_expression constant_expression_tail?)
end