在 tree-sitter 语法中,运算符优先级/关联性冲突是否可能导致运行时解析失败?

问题描述

考虑像子集 (⊂) 这样的中缀运算符。子集运算符不是关联的,因为它的结果(布尔值)本身不是一个集合,因此不能输入到子集运算符的一侧或另一侧。考虑:

S ⊂ T ⊂ M

理想情况下,这将是解析失败,但 tree-sitter 似乎不允许基于运算符冲突的解析失败;相反,它要求您通过指定关联性或优先级在解析器生成时明确解决冲突。有什么方法可以向看树人表明这应该是解析冲突吗?不仅适用于同类的非关联运算符,也适用于具有同等优先级的不同运算符之间的非关联运算符,例如:

S ⊂ T ⊆ M

或者是指定明确解析的唯一解决方案,然后在语义级别处理?

解决方法

您说得对,这应该在语义级别处理。所以 ⊂ 应该在语法中被标记为左结合以进行解析,即使它不是。对于字符串 S ⊂ T ⊂ M,它将被解析为:

(op ⊂
  (op ⊂
    (id S)
    (id T)
  )
  (id M)
)

在语义级别,您可以添加规则检查 是否有任何子节点也是 (或任何其他具有相同优先级的运算符),您可以将其作为关联性/优先级冲突错误。