Я использую TinyPG, анализатор LL1. генератор для разбора лямбда-исчисления. Я пытаюсь написать правило, которое будет анализировать приложение функции, такое как (a b)
или (a b c)
и так далее.
Пока у меня есть это правило (немного упрощенное):
APPLICATION -> LPARENTHESES VARIABLE (SPACE+ VARIABLE)+ RPARENTHESES;
Но это не помогло бы проанализировать термин, в котором есть пробелы после левой и перед правой скобками: ( a b )
. Я могу разрешить пробелы после открывающей скобки следующим образом:
APPLICATION -> LPARENTHESES SPACE* VARIABLE (SPACE+ VARIABLE)+ RPARENTHESES;
Но у меня возникли проблемы с настройкой пробелов перед закрывающей скобкой. Я придумал это, которое, кажется, работает:
ARG_LIST -> (RPARENTHESES | (SPACE+ (RPARENTHESES | (VARIABLE ARG_LIST))));
APPLICATION -> LPARENTHESES SPACE* VARIABLE ARG_LIST;
Но это беспорядочно и рекурсивно, что затем затруднит чтение и компиляцию узлов. Есть ли какой-нибудь нерекурсивный или хотя бы более простой способ разобрать это?
[Skip]
) - person rici   schedule 13.05.2015WHITESPACE?
, но это будет отвлекать и неэффективно, и это ничего не добавит к удобочитаемости грамматики. Кроме того, это почти наверняка оставит вас с грамматикой, которая больше не будет LL(1). Пропуск пробелов — это не хак. Честный. - person rici   schedule 13.05.2015