0

我有这个语法:

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

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

提前致谢。

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

4

1 回答 1

0

参数缺少分隔符需要在输入中进一步查看以决定是否应该继续关闭。否定的前瞻应该解决语法级别的问题:

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

前瞻不是“作弊”。出于重要原因,它们是 PEG 定义的一个组成部分。

于 2015-04-12T12:11:34.110 回答