Parsing 使用二进制前缀、中缀和后缀运算符分析表达式
是否可以解析一个表达式(无歧义),该表达式可以包含二进制前缀、二进制中缀和二进制后缀运算符(假设所有符号都不同),并且它们之间具有优先级?例如:Parsing 使用二进制前缀、中缀和后缀运算符分析表达式,parsing,operator-precedence,postfix-operator,prefix-operator,infix-operator,Parsing,Operator Precedence,Postfix Operator,Prefix Operator,Infix Operator,是否可以解析一个表达式(无歧义),该表达式可以包含二进制前缀、二进制中缀和二进制后缀运算符(假设所有符号都不同),并且它们之间具有优先级?例如: a = 2 3 post+ b = pre+ 2 3*4 然后a将等于5,因为=的优先级低于后缀post+运算符,而b将为14。我知道可以使用运算符优先解析或分流码解析中缀符号表达式,但这个问题对我来说似乎要复杂得多 编辑: 允许使用括号,运算符的前后变化与中缀变化具有相同的优先级 我想推出一个手写算法 编辑2: 我说的优先是指消费多少。例如: a
a = 2 3 post+
b = pre+ 2 3*4
然后a
将等于5,因为=
的优先级低于后缀post+
运算符,而b
将为14
。我知道可以使用运算符优先解析或分流码解析中缀符号表达式,但这个问题对我来说似乎要复杂得多
编辑:
允许使用括号,运算符的前后变化与中缀变化具有相同的优先级
我想推出一个手写算法
编辑2:
我说的优先是指消费多少。例如:
a = 2 3 post+
可能导致这些AST-s:
'=' has higher precedence than 'post+':
post+
/ \
= 3
/ \
a 2
'post+' has higher precedence than '=':
=
/ \
a post+
/ \
2 3
(第二个是我在这种情况下需要的)。我无法真正使用现有的解析器生成器或操作数的固定语法,因为运算符是动态加载的。您如何仅使用
pre+
和post+
处理2+3+4
?我正在寻找一个红旗,并查看仅使用pre+
和post+
且它们彼此相邻的模式。@GuyCoder括号是允许的。2+3+4可以是pre+2+3+4 post+@GuyCoder也许应该有一条规则,如果pre+、post+和infix+具有相同的优先级,那么排序者是:pre+first,中缀next和post+最后一个最简单的检查方法是使用一个工具来检查语法的歧义,例如or,使用并查找多个答案。@PeterLenkefi:现在我不明白了。如果pre+
、post+
和infix+
的名称确实不同,那么它们各自的先例是什么又有什么关系呢?尽管如此,前缀运算符和后缀运算符不可能具有“相同”的优先级。为简单起见,只考虑一元运算符,并查看表达式<代码>前缀操作数后缀< /代码>。无论是前缀
还是后缀
都必须绑定得更紧。(您可以手动切换有关关联性的信息,但在这种情况下,这并不是真正有用的。最后,其中一个运算符绑定得更紧密。)