MyIgnorance 2007-07-18
本人最近在看Hibernate源代码,也顺便研究了ANTLR这一应用在Hibernate中对HQL到SQL进行转换的文法分析器。
现有一些疑问列举如下,希望高手赐教:
本人自己写了个expr.g文件,工作平台eclipse+Antlrstudio插件ANTLR2.7.6
classExprParserextendsParser;
options{
buildAST=true;
}
expr:bexpr;
bexpr:mexpr((PLUS^|MINUS^)mexpr)*;
mexpr
:atom(STAR^atom)*
;
atom:INT
|LPAREN!exprRPAREN!
;
classExprLexerextendsLexer;
options{
k=2;
charVocabulary='\u0000'..'\u007F';
}
LPAREN:'(';
RPAREN:')';
PLUS:'+';
MINUS:'-';
STAR:'*';
INT:('0'..'9')+;
WS:(''
|'\t'
|'\r''\n'{newline();}
|'\n'{newline();}
)
{$setType(Token.SKIP);}
;
java文件
publicstaticvoidmain(String[]args)throwsException,TokenStreamException{
System.out.println("OK");
ExprLexerlexer=newExprLexer(System.in);
ExprParserparser=newExprParser(lexer);
parser.expr();
ASTt=parser.getAST();
System.out.println(t.toStringTree());
}
以上表达式分要是做词法分析,并转换成AST树
但本人输入1+2或者2+2*2任何表达式按回车均无任何反应,感觉ANTLR并没认为回车是输入的结束,想问下ANTLR中默认的判断输入的结束符是什么?
好像expr:bexpr;改成expr:bexprSEMI;并在Lexer中添加SEMI:';';,可以实现在Antl强制定义分号为结束符;但不知道如果不加SEMI,ANTLR如何判断输入结束!!