Я использую TinyPG, который является генератором парсеров LL1, для анализа исчисления лямбда. Я пытаюсь написать правило, которое будет анализировать функциональное приложение вроде (a b)
или (a b c)
и так далее.Разбирайте функции функции стиля исчисления лямбды с помощью анализатора LL1
До сих пор у меня есть это правило (немного упрощенным):
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]') – rici
Да, но это будет пропускать все пробелы, в том числе между каждым аргументом, который не следует пропускать. – Juan
Почему они не должны пропускаться? Пропущенный не означает «удаленный»: это означает «признанный, а затем проигнорированный». Маркер VARIABLE будет по-прежнему заканчиваться, когда встречается символ пробела. Попробуй и посмотри. – rici