微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

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

S ⊂ T ⊂ M

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

S ⊂ T ⊆ M

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

解决方法

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

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。