我正在尝试解析一种既有标识符又有文字的语言。
b
b""这里b是一个识别符,而b""是一个文字(也可以是b"foo")。
我有以下简化的语法:
module.exports = grammar({
name: 'foo',
rules: {
file: $ => repeat(choice(
$.ident,
$.literal,
)),
ident: _ => /[a-z]/,
literal: _ => seq('b', /\"[a-z]*\"/),
},
});这将产生以下匹配状态:
(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,但没有成功。这里缺少什么?
发布于 2020-12-23 17:26:32
正如@maxbrunsfeld在GH讨论中指出的那样,token确实是这个玩具示例的答案。
通过以下更改,这个玩具示例确实可以工作:
- literal: _ => seq('b', /\"[a-z]*\"/),
+ literal: _ => token(seq('b', /\"[a-z]*\"/)),(file [0, 0] - [2, 0]
(ident [0, 0] - [0, 1])
(literal [1, 0] - [1, 3]))如果literal的引用部分的匹配器变得更加复杂,这就像预期的那样遇到了非终端的常见问题,但这是token的一个特性,而不是我发布的示例,例如,
ident: _ => /[a-z]/,
literal: $ => token(seq('b', $.ident)), // WRONG.Error processing rule literal
Details:
Grammar error: Unexpected rule Symbol(Symbol { kind: NonTerminal, index: 1 })https://stackoverflow.com/questions/65401269
复制相似问题