规则匹配时 Grako 结束闭包

Grako end closure when rule is matched

我有这个语法:

name = /[_a-zA-Z][a-zA-Z0-9]*/;
expression = name '+' name;
def_body = 'def' name:name args:{name} body:expression;

但是当我尝试解析时,它总是使用表达式的名字 作为论点的一部分。有没有办法让它在 args 闭包中的每个名称之前测试它是否可以匹配表达式并在通过时结束?

提前致谢。

编辑:我通过语义解决了它,但我仍然很好奇是否可以通过 grako ebnf 实现。

由于缺少参数分隔符,需要进一步查看输入以决定是否应继续关闭。否定前瞻应该可以解决语法层面的问题:

def_body = 'def' name:name args:{name !'+'} body:expression;

前瞻不是 "cheating"。出于重要原因,它们是 PEG 定义的组成部分。