具有该隐式乘法规则会与减法规则产生歧义: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,您可以将第二个prefix
产生式更改为'-' prefix
.
就个人而言,我更喜欢能够打字sin 2x
,log 3n
但这开始有点棘手。是什么sin 2x cos 2x
意思?大概意思就是(sin(2*x))*(cos(2*x))
。但log nlog n
不是什么意思log(n*log(n))
?这一切都可以实现;它只需要考虑所有的可能性。