Parsing 表示AST和语法中的后缀和前缀递增和递减

Parsing 表示AST和语法中的后缀和前缀递增和递减,parsing,abstract-syntax-tree,lexer,post-increment,Parsing,Abstract Syntax Tree,Lexer,Post Increment,我有这些规则来构建一个简单的计算器: statement -> assignment | calculation assignment -> variable '=' sum end calculation -> sum end sum -> product (('+' product)|('-' product))* product -> factor (('*' factor)|('/' factor))* factor -> term term ->

我有这些规则来构建一个简单的计算器:

statement -> assignment | calculation
assignment -> variable '=' sum end
calculation -> sum end
sum -> product (('+' product)|('-' product))*
product -> factor (('*' factor)|('/' factor))*
factor -> term
term ->  variable | number
我的问题是如何建模后缀和前缀递增和递减的规则。如何在上述语法中表示它,例如,如果我有作业:

x=1
j=x++ +2

结果将是
j=3
x=2
。赋值后如何进行增量后处理?

最简单的语法更改是将新运算符添加到
术语中:

术语->变量
|“++”变量|“--”变量
|变量'+'|变量'--'
|数
新规则本来可以添加到
factor
中,尤其是因为
factor
目前毫无意义,可以删除。但是,如果您添加了比单个变量(例如数组下标)更复杂的左值,则必须对其进行调整。此外,将运算符添加到
因子
将使类似
++2
的无意义在语法上成为可能,或者在实现圆括号后使
(a+b)+
成为可能。因此,尽管将它们放在一些非终端而不是
术语中
更常见,也可能更合适,但在这种特殊情况下,这不一定是最好的解决方案


关于AST和AST评估的问题如果不了解更多有关如何构建AST的信息,就无法回答。您可以自由地以任何您认为合适的方式构建AST,但可能值得注意的是,AST必须能够区分增量后和增量前。要么你需要为两种情况使用不同的操作符符号,要么需要一些黑客攻击(比如在两种情况中添加一个假操作数的C++黑客)。finished@user63898你为什么觉得这么复杂?有两个完全独立的东西:为变量存储的值和作为运算符值返回的值。只要你把这两个想法分开放在脑子里,你就会发现在实现增量前和增量后一点问题都没有。如果你真的不明白,可以问一个新问题,但要包括你如何构建和评估AST的细节,以及为什么它不能按你想要的方式工作。