疑问:关于ANTLR判断的结束符

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如何判断输入结束!!

相关推荐