0

この文法は BNF で書かれています。+ を * よりも優先し、+ を右結合にするように変換するにはどうすればよいですか?

<assign> -> id = <expr>
<id>     -> A | B | C
<expr>   -> <expr> + term | <term>
<term>   -> <term> * <factor> | <factor>
<factor> -> ( <expr> ) | <id>

これが私の解決策です:

<assign> -> id = <expr>
<id>     -> A | B | C
<expr>   -> <expr> * term | <term>
<term>   -> <term> + <factor> | <factor>
<factor> -> ( <expr> ) | <id>

特定の文法の正確性を確認するにはどうすればよいですか? 何か案が?
ありがとう、

4

1 に答える 1

2

加算よりも乗算の優先順位を元に戻したいのは奇妙に見えますが、とにかくそのように文法が必要な場合は、正しいBNFになります(3番目のプロダクションでタイプミスをしました)

<assign> -> id = <expr>
<id>     -> A | B | C
<expr>   -> <expr> * <term> | <term>
<term>   -> <term> + <factor> | <factor>
<factor> -> ( <expr> ) | <id>

これはLRパーサー(ボトムアップ)に適しています。

LLパーサー(トップダウン)の場合、上記の文法により、とで左再帰が発生し<expr>ます<term>。この問題を回避するには、LLパーサーに次の文法を使用する必要があります。

<assign> -> id = <expr>
<id>     -> A | B | C
<expr>   -> <term> * <expr> | <term>
<term>   -> <factor> + <term> | <factor>
<factor> -> ( <expr> ) | <id>
于 2011-02-12T16:28:25.670 に答える