3

数式パーサーのBisonファイルに取り組んでいます。今まではほとんど問題ありませんでしたが、暗黙の乗算で問題が発生しています。

ほら、のような表現をサポートしたい2x sin(4x) cos(4x)です。のように解析する必要があります2 * x * sin(4 * x) * cos(4 * x)。ここではそれほど悪いことはありませんが、次の一連のルールを検討してください。

expr
    : /* snip */
    | '-' expr      { /* negate expression */ }
    | expr '-' expr { /* subtract expressions */ }
    | expr expr     { /* multiply expressions */ }

その暗黙の乗算ルールがあると、減算ルールとのあいまいさが生じます。toの減算x - log(x)またはbyの乗算ですか?log(x)xx-log(x)

「減算しない限り乗算です」のような簡単な解決策を決める準備はできていますが、それをBisonに伝える方法がわかりません。

4

1 に答える 1

5

その暗黙の乗算ルールがあると、減算ルールとのあいまいさが生じます。x --log(x)は、log(x)からxへの減算ですか、それともxと-log(x)の乗算ですか?

それとも、そうx - l * o * g * xですか?それともただx - log * x

したがって、単純な問題ではありません。log関数であることがわかるとしましょう。次に、レクサーで曖昧さを解消すると、「疑わしい場合は、中置演算子のように見える演算子が中置演算子である」という状態になります。簡単な解決策は次のとおりです。

term   : ID
       | NUMBER
       | '(' expr ')'      { $$ = $2; }
       | FUNC '(' expr ')' { $$ = new_expr($1, 'c', $3); }
       ;

factor : term
       | term factor       { $$ = new_expr($1, '*', $2); }
       ;

prefix : factor
       | '-' factor        { $$ = new_expr(0, '-', $2); }
       ;

muldiv : prefix
       | muldiv '/' prefix { $$ = new_expr($1, '/', $3); }
       | muldiv '*' prefix { $$ = new_expr($1, '*', $3); }
       ;

expr   : muldiv
       | expr '+' muldiv { $$ = new_expr($1, '+', $3); }
       | expr '-' muldiv { $$ = new_expr($1, '-', $3); }
       ;

この特定の文法は--xを許可しませんが、y--x、つまりy-(-x)には完全に満足しています。--xを受け入れたい場合は、2番目のprefixプロダクションをに変更できます'-' prefix

個人的には、入力できるようにしたいと思いますsin 2xlog 3n、それは少しトリッキーになり始めます。どういうsin 2x cos 2x意味ですか?おそらく、それはを意味し(sin(2*x))*(cos(2*x))ます。しかしlog nlog n、という意味ではありませんlog(n*log(n))か?これはすべて達成できます。すべての可能性を考え抜く必要があります。

于 2012-10-14T02:59:51.697 に答える