синтаксический анализатор не может соответствовать последующему правилу из-за ошибки при оценке предыдущего правила - PullRequest
0 голосов
/ 10 июня 2019

Пример:

start = name / invocation;

name = [a-zA-Z]+ { return text() };

invocation = a:name "()" { return {type: 'inv', value: a } };

Если ввод abc() Я получаю сообщение об ошибке:

Expected [a-zA-Z] or end of input but "(" found

Однако, если запуск был определен следующим образом, проблем не возникает:

start = invocation / name;

Для более раннего случая, не должно ли правило имени не совпадать и, следовательно, ввести правило вызова?Иначе, как управлять такой вещью?

Рабочий пример: детская площадка

1 Ответ

0 голосов
/ 11 июня 2019

Это свойство грамматики выражений анализатора.Изменение порядка выражений в операторе выбора может изменить результат.

С Википедия :

Принципиальная разница между контекстно-свободными грамматиками и выражением синтаксического анализаГрамматика в том, что оператор выбора PEG упорядочен.Если первая альтернатива успешна, вторая альтернатива игнорируется.Таким образом, упорядоченный выбор не является коммутативным, в отличие от неупорядоченного выбора, как в контекстно-свободных грамматиках.

...