Грако покинул рекурсию

Я пытаюсь использовать грако для описания простой леворекурсивной грамматики, но у меня проблемы с этим.

Правая рекурсия работает без проблем:

symbol = /[a-z]/ ;
condition = symbol "AND" condition | symbol ;
start = condition $ ;

Согласно всем найденным примерам левая рекурсия должна быть описана так:

symbol = /[a-z]/ ;
condition = condition "AND" symbol | symbol ;
start = condition $ ;

Тем не менее, это не работает для правила, приведенного ниже:

a AND b AND c

Я получаю эту ошибку:

grako.exceptions.FailedParse: srecur(1:3) Expecting end of text. :
a AND b AND c
  ^
start

На данный момент я понимаю, что первый символ правила соответствует symbol и не condition "AND" symbolтак что grako хотел бы использовать его. Но мое правило запуска заставляет всех персонажей быть уничтоженными.

Я пытался использовать много обходных путей, но я не смог найти подходящий.

1 ответ

Решение

Grako на самом деле является парсером PEG. Эти парсеры обладают неявным свойством неспособности легко обрабатывать левую рекурсию.

Больше подробностей здесь и там.

Для моих нужд я смог решить мою проблему с помощью таких выражений:

condition = symbol { "AND" symbol }* ;
Другие вопросы по тегам