Грако конец закрытия, когда правило соответствует

У меня есть эта грамматика:

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

Но когда я пытаюсь разобрать, он всегда использует имя выражения как часть аргументов. Есть ли способ заставить его тестировать перед каждым именем в аргументе замыкания, если оно может совпадать с выражением и заканчиваться, если оно проходит?

Заранее спасибо.

РЕДАКТИРОВАТЬ: Я решил это с помощью семантики, но мне все еще любопытно, если это возможно через grako ebnf.

1 ответ

Решение

Отсутствие разделителей для параметров требует заглядывать дальше во входные данные, чтобы решить, следует ли продолжать закрытие. Отрицательный взгляд должен решить проблему на уровне грамматики:

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

Lookahead не "обманывают". Они являются неотъемлемой частью определения PEG по важным причинам.

Другие вопросы по тегам