首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >编程语言语法

编程语言语法
EN

Stack Overflow用户
提问于 2017-04-11 16:24:08
回答 2查看 62关注 0票数 1

让我说我有以下语法

代码语言:javascript
复制
program = mul
mul = add {"*" add}
add = NUM {"+" NUM}

和下面的输入

代码语言:javascript
复制
1 + 2 * 3

通常情况下,我会假设输入将得到7,因为BIDMAS (先做乘法,然后再加法),但是在阅读递归下降解析器之后,我就不知道它是否会输出。

一个。

代码语言:javascript
复制
(1 + 2) * 3 = 9

或B.

代码语言:javascript
复制
1 + (2 * 3) = 7

我希望解析器做B,因为这是数学通常是如何完成的,所以我创建的语法正确吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-04-11 16:35:41

好吧,解析器不会自己做任何事情,它只会产生一个抽象语法树(AST)。我相信要完全实现运算的数学顺序,你需要稍微扩展语法。在这个简短的例子中,我希望它(除非我误解了这个特定的语法)抛出一个错误,因为您定义了两个二进制操作并传递了三个数字。1 + 2 * 3 + 4似乎是更明智的测试输入,是的,它将完全错误地工作(它会告诉您有一个由两个加法组成的表达式):mul(add(1,2),add(3,4))

倒排的例子可能会奏效:

代码语言:javascript
复制
program = add
mul = NUM {"*" NUM}
add = mul {"+" mul}

我希望它能将1 * 2 + 3 * 4解析为add(mul(1,2),mul(3,4))。但是,正如您所看到的,我不得不更改输入,再次声明:您期望输入是非常严格的。

尝试使用一些抽象语法--创造"p“和"q”(或任何其他字符)的特定模式,以便更好地适应与解析器/词汇者合作时所需的相当落后的思维方式。

票数 2
EN

Stack Overflow用户

发布于 2017-04-11 16:32:39

我现在发现不,这不是正确的语法。语法应该是

代码语言:javascript
复制
program = add
add = mul {"+" mul}
mul = NUM {"*" NUM}

这样,它总是把乘数相加在一起,而不是相乘。

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

https://stackoverflow.com/questions/43351411

复制
相关文章

相似问题

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