2

次の文法を EBNF に変換する必要があります。

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

私が現在行った進捗状況は以下のとおりです。

<assign> -> <id> = <expr>
<id> = (A | B | C)
<expr> -> <id> {(+ | * ) <expr>} | ‘(‘ <expr> ‘)’

EBNF を使用している場合、すべての再帰を排除するのが最善ですか? <id>のみを使用してそれを達成する方法さえあり<expr>ますか?

4

1 に答える 1

3

これはどう:

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

左再帰はなく、よりも優先されますが、*よりは優先されません。+( ... )

于 2011-09-14T20:13:54.063 に答える