Почему эта грамматика привязки не распознает 42?

Использование грамматики

start
  = b
  / a

a
  = "4" "2"

b
  = "4"

с peg.js распознает 4, но не 42, и в этом случае ошибка

«Строка 1, столбец 2: ожидается конец ввода, но найдено «2».

сообщается. Очевидно, синтаксический анализатор завершает правило start -> b, потребляя "4", а затем понятия не имеет, что делать с "2". Но почему он не пытается снова с другим правилом для a, когда обнаруживает ошибку?


person citykid    schedule 28.07.2013    source источник


Ответы (1)


В грамматике PEG оператор выбора называется «приоритетным выбором», а альтернативы должны обрабатываться в порядке их появления в грамматике. Во время выполнения синтаксический анализатор PEG начнет обработку выбора с первой альтернативы. Когда это не удается, синтаксический анализатор возвращается к состоянию, в котором он находился до анализа этой альтернативы, а затем переходит к следующему. Однако в случае успеха альтернатива считается частью правильного синтаксического анализа, и любые оставшиеся альтернативы не рассматриваются в отношении текущего выбора.

Для вашей грамматики это означает, что второй вариант никогда не используется, потому что первый образует его префикс. Если вы измените порядок альтернатив, он должен работать так, как вы ожидаете.

person Gunther    schedule 29.07.2013