考虑像子集(⊂)这样的infix运算符。子集运算符不是关联的,因为它的结果(布尔值)本身不是一个集合,因此不能输入子集运算符的一个或另一侧。考虑:
S ⊂ T ⊂ M
理想情况下,这将是一个解析失败,但树保姆似乎不允许基于操作符冲突的解析失败;相反,它要求您在解析器生成时通过指定关联性或优先级来明确地解决冲突。有没有办法向树保姆指出这应该是一个解析冲突?不仅适用于同类型的非结合算子,也适用于具有等价优先级且非结合的不同算子之间,例如:
S ⊂ T ⊆ M
或者是唯一的解决方案来指定一个明确的解析,然后在语义级别处理这个问题?
发布于 2021-04-04 13:50:46
您是正确的,这应该在语义级别进行处理。因此,为了解析目的,⊂应该在语法中被标记为左联想,尽管它不是。对于字符串S ⊂ T ⊂ M
,它将被解析为:
(op ⊂
(op ⊂
(id S)
(id T)
)
(id M)
)
在语义级别,您可以添加一个规则,检查⊂
是否有任何子节点也是⊂
(或任何其他具有相同优先级的操作符),您可以将这些子节点作为关联/优先级冲突错误处理。
https://stackoverflow.com/questions/66932531
复制相似问题