首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Treesitter会生成错误节点,即使其他匹配似乎也是可能的

Treesitter会生成错误节点,即使其他匹配似乎也是可能的
EN

Stack Overflow用户
提问于 2020-12-22 07:19:23
回答 1查看 24关注 0票数 0

我正在尝试解析一种既有标识符又有文字的语言。

代码语言:javascript
复制
b
b""

这里b是一个识别符,而b""是一个文字(也可以是b"foo")。

我有以下简化的语法:

代码语言:javascript
复制
module.exports = grammar({
    name: 'foo',

    rules: {
        file: $ => repeat(choice(
            $.ident,
            $.literal,
        )),

        ident: _ => /[a-z]/,
        literal: _ => seq('b', /\"[a-z]*\"/),
    },
});

这将产生以下匹配状态:

代码语言:javascript
复制
(file [0, 0] - [2, 0]
  (ERROR [0, 0] - [0, 1])
  (literal [1, 0] - [1, 3]))
foo.bar 0 ms    (ERROR [0, 0] - [0, 1])

也就是说,我能够解析像b""这样的结构,但是ident的匹配器出现了错误分支,并且不能恢复。

我曾经尝试过token,但没有成功。这里缺少什么?

EN

回答 1

Stack Overflow用户

发布于 2020-12-23 17:26:32

正如@maxbrunsfeld在GH讨论中指出的那样,token确实是这个玩具示例的答案。

通过以下更改,这个玩具示例确实可以工作:

代码语言:javascript
复制
-         literal: _ => seq('b', /\"[a-z]*\"/),
+         literal: _ => token(seq('b', /\"[a-z]*\"/)),
代码语言:javascript
复制
(file [0, 0] - [2, 0]
  (ident [0, 0] - [0, 1])
  (literal [1, 0] - [1, 3]))

如果literal的引用部分的匹配器变得更加复杂,这就像预期的那样遇到了非终端的常见问题,但这是token的一个特性,而不是我发布的示例,例如,

代码语言:javascript
复制
        ident: _ => /[a-z]/,
        literal: $ => token(seq('b', $.ident)), // WRONG.
代码语言:javascript
复制
Error processing rule literal
Details:
  Grammar error: Unexpected rule Symbol(Symbol { kind: NonTerminal, index: 1 })
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65401269

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档