Грако конец закрытия, когда правило соответствует
У меня есть эта грамматика:
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 по важным причинам.