我有这个语法:
name = /[_a-zA-Z][a-zA-Z0-9]*/;
expression = name '+' name;
def_body = 'def' name:name args:{name} body:expression;
但是当我尝试解析时,它总是使用表达式的第一个名称 作为论据的一部分。是否可以在args闭包中的每个名称之前进行测试,如果它可以匹配表达式,如果它通过则结束?
提前致谢。
编辑:我通过语义解决了这个问题,但是如果有可能通过grako ebnf,我仍然很好奇。答案 0 :(得分:0)
缺少参数的分隔符需要在输入中进一步查看以确定是否应该继续关闭。否定前瞻应该在语法层面解决问题:
def_body = 'def' name:name args:{name !'+'} body:expression;
Lookahead不是"作弊" 。由于重要原因,它们是PEG定义的组成部分。