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+
的名称确实不同,那么它们各自的先例是什么又有什么关系呢?尽管如此,前缀运算符和后缀运算符不可能具有“相同”的优先级。为简单起见,只考虑一元运算符,并查看表达式<代码>前缀操作数后缀< /代码>。无论是
前缀
还是
后缀
都必须绑定得更紧。(您可以手动切换有关关联性的信息,但在这种情况下,这并不是真正有用的。最后,其中一个运算符绑定得更紧密。)