2015-10-07 3 views
0

Я хочу реализовать парсер для лямбда-выражений. Но я получаю «несоответствующие вход„“, ожидающей„)“» ошибка для этого входа: (\ хх х) (\ хх х), не знаю, почему ...Lambda выражение в ANTLR несоответствующий ввод

У меня есть грамматики:

grammar Lambda; 


lambda_expression : VARIABLE 
       | '\\' VARIABLE '.' lambda_expression 
       | ('(' lambda_expression ')')+ 
       | EOF 
; 

VARIABLE : 'x' | 'y' | 'z' | 'v' | 'w' 
;     

WS : (' ')+ -> channel(HIDDEN);  

и это мой основной класс:

public static void main(String[] args) throws IOException { 
     // TODO code application logic here 
     ANTLRInputStream input = new ANTLRInputStream("(\\x.x x) (\\x.x x)"); 
     LambdaLexer lex = new LambdaLexer(input) ; 
     CommonTokenStream tokens = new CommonTokenStream(lex); 
     LambdaParser parser = new LambdaParser(tokens); 
     parser.lambda_expression(); 

     parser.setBuildParseTree(true); 
     LambdaParser.Lambda_expressionContext tree = parser.lambda_expression(); 
     System.out.println(tree.toStringTree(parser)); 

    } 

Я использую antlr4-4.1-complete.jar

ответ

0

рекурсии на lambda_expression из ALT3 ( -> Alt2 \x. -> alt1 x соответствует (\x.x, оставляя парсер желающим завершить матч с alt3 с ).

Изменение Alt2 к

| '\\' VARIABLE ('.' lambda_expression)+ lambda_expression 

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

+0

, но я думаю, что есть проблема с синтаксическим разбором WS, не так ли? потому что lexer не распознает его, однако я определил WS – Thomas

+0

№. Сообщение об ошибке показывает, что будет дальше в потоке фактических входных символов, а не следующем токене. Если возникает вопрос о том, что делает lexer, [dump поток токенов] (http://stackoverflow.com/questions/29197727/antlr-4-5-parser-error-during-runtime/29198883#29198883). Значок пространства будет правильно помечен как скрытый. – GRosenberg

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

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