2015-05-13 4 views
0

Я использую 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; 

Но это грязное и рекурсивный, который будет затем сделать его трудно читать и компилировать узлы. Есть ли какой-нибудь нерекурсивный или, по крайней мере, более простой способ разобрать это?

+0

Вы посмотрели на обработку пробелов в учебнике? (Поиск '[Skip]') – rici

+0

Да, но это будет пропускать все пробелы, в том числе между каждым аргументом, который не следует пропускать. – Juan

+0

Почему они не должны пропускаться? Пропущенный не означает «удаленный»: это означает «признанный, а затем проигнорированный». Маркер VARIABLE будет по-прежнему заканчиваться, когда встречается символ пробела. Попробуй и посмотри. – rici

ответ

1

Нет смысла путать парсер с пробелами. Достаточно для того, чтобы быть проигнорировано в сканере с помощью атрибута [Skip], как показано в учебнике:

[Skip] WHITESPACE -> @"\s+"; 

«Пропустить» не означает «удалить». Это означает, что сканер должен распознать токен, а затем проигнорировать его. Если вы пропустите пробелы, пробелы по-прежнему будут отличать буквенно-цифровые маркеры. Вы просто не должны включать в себя пространство лексемы в вашей грамматики, оставляя вам:

APPLICATION -> LPARENTHESES VARIABLE VARIABLE+ RPARENTHESES; 

(На самом деле, пустые списки приложений, как правило, разрешается, так что я бы написать, что с * вместо +. Но это ваш язык.)

 Смежные вопросы

  • Нет связанных вопросов^_^