2015-10-07 70 views
0

我想實現lambda表達式的解析器。但我得到 「不匹配輸入'預期 ')'」 的錯誤該輸入:(\ XX X)(\ XX X),不知道爲什麼......ANTLR不匹配輸入中的Lambda表達式

我有一個語法:

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

遞歸上ALT3的lambda_expression( - > ALT2 \x. - > ALT1 x(\x.x匹配,讓解析器想要完成alt3與)的匹配。

更改ALT2到

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

可能是解決方案,取決於它是否真正反映了你的允許lambda語法。

+0

但我認爲有一個WS解析的問題,不是嗎?因爲詞法分析器不識別它,但是我定義了WS – Thomas

+0

編號。錯誤消息顯示實際輸入字符流中的下一個內容,而不是下一個標記。如果有關於詞法分析器在做什麼的問題,[轉儲令牌流](http://stackoverflow.com/questions/29197727/antlr-4-5-parser-error-during-runtime/29198883#29198883)。空間令牌將被正確標記爲隱藏。 – GRosenberg