【发布时间】:2016-10-30 09:36:39
【问题描述】:
这是我的语言的算术表达式:ADD 100 MUL 5 DIV 10 SUB 7 MOD 10 4
其中ADD = 加法,SUB = 减法,MUL = 乘法,DIV = 除法,MOD = 模数。
上面的表达式也可以改写成标准的100 + (5 * (10 / (7 - (10 % 4)))),括起来的括号用来标记操作的顺序。
这与标准完全不同,因为评估从最右边的操作开始,即MOD 10 4,然后将其结果用于评估下一个操作,即SUB 7 2,其中2是模运算的结果。此语法不需要括号。
我从https://ruslanspivak.com/lsbasi-part6/ 得到了标准符号的语法,这里是:
<expr> := <term> ((ADD|SUB) <term>)*
<term> := <factor> ((MUL|DIV|MOD) <factor>)*
<factor> := integer
在我的语言中,我对写算术运算的语法一无所知。上面的语法需要修改吗?还是我需要写一个全新的语法?
【问题讨论】:
-
写语法就像写程序一样。您提出了一些代码/语法片段,您决定它是否符合您的预期,如果没有,请更改它直到它符合您的要求。如果您了解语法,这应该不难。如果你不这样做,经验将帮助你理解它们。您尝试过如何编写自己的语法或测试此语法是否可行?
-
我已经成功地编写了解析标准算术表达式(+、-、*、/、%)的方法和代码,就像指南所做的那样,我只是将 Python 代码转换为 C#。通过将指南中的语法修改为
<expr> := (ADD|SUB) <term> <term>,我还成功地使用我的语言解析了单个操作,但我一直在解决如何解析具有多个操作的表达式。
标签: parsing syntax grammar interpreter