2011-09-14 13 views
2

私はEBNFに次の文法を変換する必要があります。BNFから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を使用している場合、すべての再帰を排除するのが最善ですか? <expr><id>だけを使用してそれを達成する方法さえありますか?

答えて

3

これはどう:

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

ない左再帰、および*+オーバーではなく(...)よりも優先されます。

+0

ああ、他の非端末を追加するとは思わなかった。ありがとう! – zarose

+0

@zarose、よろしくお願いします。 –

関連する問題