具体来说,我将使用 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-: b
与a * 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 --> "-"