首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我怎样才能对Bison有一个“隐式乘法”规则呢?

我怎样才能对Bison有一个“隐式乘法”规则呢?
EN

Stack Overflow用户
提问于 2012-10-14 02:09:24
回答 1查看 892关注 0票数 3

我正在为一个数学表达式解析器编写一个Bison文件。到目前为止,它基本上是好的,但我面临着隐式乘法的问题。

你看,我想支持像2x sin(4x) cos(4x)这样的表达式。它应该像2 * x * sin(4 * x) * cos(4 * x)一样解析。这里没有什么太糟糕的,但请考虑以下规则集:

代码语言:javascript
复制
expr
    : /* snip */
    | '-' expr      { /* negate expression */ }
    | expr '-' expr { /* subtract expressions */ }
    | expr expr     { /* multiply expressions */ }

使用隐式乘法规则会产生减法规则的歧义: is x - log(x)log(x)x的减法,还是x-log(x)的乘法

我已经准备好接受一个简单的解决方案,比如“它是乘法,除非它是减法”,但我不知道如何告诉Bison这一点。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-10-14 10:59:52

具有隐式乘法规则的对数会与减法规则产生歧义:x-

(X)是log(x)与x的减法还是x与-log(x)的乘法?

甚至,是x - l * o * g * x吗?或者仅仅是x - log * x

所以这不是一个简单的问题。假设您可以通过查看log就知道它是一个函数。然后你可以在词法分析器中消除歧义,剩下的就是“如果有疑问,一个看起来像中缀操作符的操作符就是一个中缀操作符”。这里有一个快速的解决方案:

代码语言:javascript
复制
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 2xlog 3n,但这开始变得有点棘手。sin 2x cos 2x是什么意思?大概,它的意思是(sin(2*x))*(cos(2*x))。但是log nlog n不是指log(n*log(n))吗?这一切都是可以实现的;它只需要考虑所有的可能性。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12875573

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档