如何将三元运算符合并到优先级攀爬算法中?

2024-01-07

我遵循“优先级攀登”部分中给出的解释这个网页 http://www.engr.mun.ca/~theo/Misc/exp_parsing.htm#climbing使用具有各种一元前缀和二元中缀运算符的优先级攀爬算法来实现算术求值器。我还想包括三元运算符(即三元条件运算符?:).

网页上给出的算法使用以下语法:

E --> Exp(0) 
Exp(p) --> P {B Exp(q)} 
P --> U Exp(q) | "(" E ")" | v
B --> "+" | "-"  | "*" |"/" | "^" | "||" | "&&" | "="
U --> "-"

如何将三元运算符合并到该语法中?


具体来说,我将使用 C/C++/Java?:举个例子。

看来在这些语言中?:运算符允许之间的任何有效表达式? and :,包括由以下形式组成的表达式?:其本身以及由运算符组成的优先级低于优先级的运算符?:, e.g. = and ,(例子:a ? b = c : d, a ? b , c : d, a ? b ? c : d : e).

这表明您应该治疗? and :以完全相同的方式( and )在解析表达式时。当你解析完之后? expr :,它作为一个整体,是一个二元运算符。所以,你解析( expr ) and ? expr :同样的方式,但前者是一个表达式,而后者是一个二元运算符(其中嵌入了一个表达式)。

现在? expr :是一个二元运算符 (a ?-expr-: ba * b就“二元性”而言),您应该能够像您已经支持的任何其他二元运算符一样支持它。

就我个人而言,我不会麻烦地分开?:分成自己的单独的二元运算符。最后,它仍然是一个三元运算符,并且必须链接到 3 个操作数,并在表达式求值时将其视为一个整体。如果您遵循问题中提到的文章中的方法并创建 AST,那么就可以了,?:有一个左子节点、一个右子节点(与任何其他二元运算符一样),此外还有一个中间子节点。

的优先级为?-expr-:整体应该是偏低的。但在 C/C++ 中(还有 Java?),它并不是最低的。由您决定您想要它是什么。

到目前为止我们还没有讨论关联性?:。在 C/C++ 和 Java 中,?-expr-:与赋值运算符一样是右结合的=。同样,由您决定将其设置为左关联还是保持右关联。

和这个:

E --> P {B P}
P --> v | "(" E ")" | U P
B --> "+" | "-" | "*" | "/" | "^"
U --> "-"

应该变成这样:

E --> P {B P}
P --> v | "(" E ")" | U P
B --> "+" | "-" | "*" | "/" | "^" | "?" E ":"
U --> "-"
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何将三元运算符合并到优先级攀爬算法中? 的相关文章

随机推荐