疑问:关于ANTLR判断的结束符
本人最近在看Hibernate源代码,也顺便研究了ANTLR这一应用在Hibernate中对HQL到SQL进行转换的文法分析器。
现有一些疑问列举如下,希望高手赐教:
本人自己写了个expr.g文件,工作平台 eclipse+Antlr studio插件 ANTLR2.7.6
class ExprParser extends Parser;
options{
??? buildAST=true;
}
expr: bexpr ;
bexpr: mexpr((PLUS^|MINUS^) mexpr)*;
mexpr
??? :? atom(STAR^ atom)*
??? ;
atom:? INT
??? | LPAREN! expr RPAREN!
??? ;
class ExprLexer extends Lexer;
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文件
public static void main(String[] args) throws Exception, TokenStreamException {
??? ??? System.out.println("OK");
??? ??? ExprLexer lexer = new ExprLexer(System.in);
??? ??? ExprParser parser= new ExprParser(lexer);
??? ??? parser.expr();?????? ???
??? ??? AST t =parser.getAST();
??? ??? System.out.println(t.toStringTree());
??? }
以上表达式分要是做词法分析,并转换成AST树
但本人输入1+2或者2+2*2任何表达式 按回车 均无任何反应, 感觉ANTLR并没认为回车是输入的结束,想问下ANTLR中默认的判断输入的结束符是什么?
好像expr: bexpr ;改成expr: bexpr SEMI; 并在Lexer中添加SEMI??? :';';,可以实现在Antl强制定义分号为结束符;但不知道如果不加SEMI,ANTLR如何判断输入结束!! 1 楼 wlcome998 2007-07-19 ANTLR中输入结束符难道都需要自己定义吗? 2 楼 wlcome998 2007-07-25 关于终结符.
在statement的规则里, 我们并没有设置终结符, 同时由于我们忽略了空格,制表符,回车, 所以在stdin状态下, 规则是无法终结的, 需要我们自己输入”EOF”来终止. 也就是结束lexer和parser. 使程序中止/ 3 楼 lubob 2007-09-28 ctrl+z