Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Parsing 你怎么写这个算术表达式的语法?_Parsing_Syntax_Grammar_Interpreter - Fatal编程技术网

Parsing 你怎么写这个算术表达式的语法?

Parsing 你怎么写这个算术表达式的语法?,parsing,syntax,grammar,interpreter,Parsing,Syntax,Grammar,Interpreter,这是我的语言的一个算术表达式:ADD 100 MUL 5 DIV 10 SUB 7 MOD 10 4 其中加法=加法,SUB=减法,MUL=乘法,DIV=除法,MOD=模 上面的表达式也可以重新连接到标准的100+5*10/7-10%4中,括号用于标记操作顺序 这与标准大不相同,因为求值从最右边的运算开始,即MOD 10 4,然后将其结果用于求值下一个运算,即SUB 7 2,其中2是模运算的结果。此语法不需要括号 我已经掌握了标准符号的语法,这里是: <expr> := <t

这是我的语言的一个算术表达式:ADD 100 MUL 5 DIV 10 SUB 7 MOD 10 4

其中加法=加法,SUB=减法,MUL=乘法,DIV=除法,MOD=模

上面的表达式也可以重新连接到标准的100+5*10/7-10%4中,括号用于标记操作顺序

这与标准大不相同,因为求值从最右边的运算开始,即MOD 10 4,然后将其结果用于求值下一个运算,即SUB 7 2,其中2是模运算的结果。此语法不需要括号

我已经掌握了标准符号的语法,这里是:

 <expr> := <term> ((ADD|SUB) <term>)*
 <term> := <factor> ((MUL|DIV|MOD) <factor>)*
 <factor> := integer

在我的语言中,我对算术运算的语法写作一无所知。上述语法是否需要修改?还是我需要写一个全新的语法?

我通过分析代码中每个产品的执行情况来解决这个问题。令我惊讶的是,我忘了在这本书中包括一部作品。在移动某些条件时稍微更改了代码,我就能够解析上面的示例表达式。这是我的语言中算术表达式的语法:

<expr> := ((ADD|SUB) <term> <term>)* | <term>
<term> := ((MUL|DIV|MOD) <factor> <factor>)* | <factor>
<factor> := INTEGER | <expr>

中的产品使多个操作成为可能,因为它返回到开始处解析下一个操作。

编写语法就像编写程序一样。您提出一些代码/语法片段,决定它是否符合您的期望,如果不符合,则更改它,直到它符合您的期望。如果你懂语法,这应该不难。如果你不这样做,经验将帮助你理解他们。为了编写自己的语法或测试这个语法是否正确,您尝试过做些什么?我已经成功地编写了解析标准算术表达式+,-,*,/,%的方法和代码,就像指南所做的一样,我刚刚将Python代码转换为C。我还通过修改指南中的语法成功地使用我的语言解析了一个操作:=ADD | SUB,但我一直在解决如何用多个操作解析表达式的问题。这真的有效吗?在我看来,它可以无限地将expr扩展到项到因子到expr。。。我想你还有更多的工作要做。我用括号中的短语表示法生成了一个解析树:[[ADD][[100]][[MUL][5][[DIV][10][[SUB][7]][[MOD][10][4][4][3][3][4][3][4][4][3][4][4][4][4][4][4][4][4][4][4][4][4][4][4][4][4][。什么让你不这么想?你没有生成解析树;看来你是凭空想象发明了一个,然后简单地写了下来。发明答案不是测试解析器的方法。用你的语法构建一个真正的解析器,并用它来构建一个解析树。你会发现你的语法有错误。看到我的评论了吗?这意味着其他人同意我的观点。要么使用一个真正的解析器生成器ANTLR,要么手工编写一个递归下降解析器,请参见。我确实为此用C编写了一个RDP,语法检查出来了。它正确解析表达式并返回结果。请指出我语法中的错误。我确实指出了。仔细阅读我的评论。