我想实现一个lambda表达式解析器。但我得到"输入不匹配"期待")"错误的输入:(x。X X) ( X。我不知道为什么……
我有一个语法:
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
在lambda_expression
上递归的alt3 (
-> alt2 x.
-> alt1 x
匹配(x.x
,让解析器想要完成alt3与)
的匹配。
将alt2改为
| '\' VARIABLE ( '.' lambda_expression )+ lambda_expression
可能是解决方案,这取决于它是否实际反映了您允许的lambda语法。