隐式乘法规则会导致减法规则产生歧义: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
and log 3n
但这开始变得有点棘手。什么是sin 2x cos 2x
意思是?大概意思就是(sin(2*x))*(cos(2*x))
。但确实log nlog n
并不意味着log(n*log(n))
?这一切都可以实现;它只需要考虑所有的可能性。