2017-11-07 5 views
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 

答えて

1
意味をなさないように思わ

同じことを行います。理解に役立つことの1つは、以下のコードのように書き直すことです。 PEG文法について覚えておかなければならないことの1つは、ルールが一致しない場合、次の変更を照合しようと試みることです。

rule constant_expression 
    (constant_primary/(unary_operator (s attribute_instance)* s constant_primary)) constant_expression_tail? 
end 

rule constant_expression_tail 
    ((s binary_operator (s attribute_instance)* s)/
    (s "?" (s attribute_instance)* s constant_expression s ":" s)) constant_expression constant_expression_tail? 
end 
関連する問題