バイナリの合計/積の解析は簡単ですが、解析する文法を定義するのに問題があります
a + b * c + d + e
なので
sum(a, prod(b, c), d, e)
私の最初の(ナイーブな)試みは、61シフト/競合の削減を生み出しました。
私はJavaカップを使用しています(ただし、他のパーサージェネレーターのソリューションは簡単に変換できると思います)。
バイナリの合計/積の解析は簡単ですが、解析する文法を定義するのに問題があります
a + b * c + d + e
なので
sum(a, prod(b, c), d, e)
私の最初の(ナイーブな)試みは、61シフト/競合の削減を生み出しました。
私はJavaカップを使用しています(ただし、他のパーサージェネレーターのソリューションは簡単に変換できると思います)。
次のANTLR文法:
parse
: exp EOF
;
exp
: add_exp
;
add_exp
: mul_exp ('+' mul_exp)*
;
mul_exp
: atom ('*' atom)*
;
atom
: Number
| '(' exp ')'
;
Number
: 'a'..'z'
;
a + b * c + d + e
入力を次のように解析します。
代替テキストhttp://img266.imageshack.us/img266/7099/17212574.png
ご覧のとおり、mul_exp
はツリー内で最も遠くにあり、(ツリー内を適切に「ウォーク」して)最初に評価されます。
入力a + b * (c + d) + e
は次のように解析されます。
代替テキストhttp://img688.imageshack.us/img688/2207/89332200.png
画像はANTLRWorksで生成されました。
編集:
ANTLRWorksのようなツールを使用すると、文法のデバッグが簡単になります。たとえば、atom
上の文法のルールをクリックすると、次のものが自動的に生成され、画面の下部に表示されます。
代替テキストhttp://img340.imageshack.us/img340/6793/53395907.png
もちろん、そのルールはまったく複雑ではありませんが、より複雑なルールを使用するようになると、そのように視覚化するのは非常に簡単です。
HTH。