问题描述
考虑像子集 (⊂) 这样的中缀运算符。子集运算符不是关联的,因为它的结果(布尔值)本身不是一个集合,因此不能输入到子集运算符的一侧或另一侧。考虑:
S ⊂ T ⊂ M
理想情况下,这将是解析失败,但 tree-sitter 似乎不允许基于运算符冲突的解析失败;相反,它要求您通过指定关联性或优先级在解析器生成时明确解决冲突。有什么方法可以向看树人表明这应该是解析冲突吗?不仅适用于同类的非关联运算符,也适用于具有同等优先级的不同运算符之间的非关联运算符,例如:
S ⊂ T ⊆ M
或者是指定明确解析的唯一解决方案,然后在语义级别处理?
解决方法
您说得对,这应该在语义级别处理。所以 ⊂ 应该在语法中被标记为左结合以进行解析,即使它不是。对于字符串 S ⊂ T ⊂ M
,它将被解析为:
(op ⊂
(op ⊂
(id S)
(id T)
)
(id M)
)
在语义级别,您可以添加规则检查 ⊂
是否有任何子节点也是 ⊂
(或任何其他具有相同优先级的运算符),您可以将其作为关联性/优先级冲突错误。