2007-07-18
疑问:关于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如何判断输入结束!!
现有一些疑问列举如下,希望高手赐教:
本人自己写了个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如何判断输入结束!!
评论
lubob
2007-09-28
ctrl+z
wlcome998
2007-07-25
关于终结符.
在statement的规则里, 我们并没有设置终结符, 同时由于我们忽略了空格,制表符,回车, 所以在stdin状态下, 规则是无法终结的, 需要我们自己输入”EOF”来终止. 也就是结束lexer和parser. 使程序中止/
在statement的规则里, 我们并没有设置终结符, 同时由于我们忽略了空格,制表符,回车, 所以在stdin状态下, 规则是无法终结的, 需要我们自己输入”EOF”来终止. 也就是结束lexer和parser. 使程序中止/
wlcome998
2007-07-19
ANTLR中输入结束符难道都需要自己定义吗?
发表评论
提醒: 该博客已发表在公共论坛,博客所有留言会成为论坛回贴,留言请注意遵守论坛发贴规则
- 浏览: 10428 次
- 性别:

- 来自: 南京

- 详细资料
搜索本博客
最近加入圈子
最新评论
-
请教一个系统设计的问题
强烈建议使用数据库驱动(或者hbm驱动,但是hbm要根据数据库的设计来) 个人觉 ...
-- by coolnight -
请教一个系统设计的问题
改造旧系统是不能或很难生成自己想要的结构的,对新系统用对象建模应该做对象缓存,应 ...
-- by maming2000 -
请教一个系统设计的问题
抛出异常的爱 写道数据库驱动 页面驱动 数据模型驱动 领域模型驱动 。。。。。。 ...
-- by Joo -
请教一个系统设计的问题
感觉两者都需要兼顾,一个良好的设计必定你的闹钟都会既有领域模型,又有数据库模型, ...
-- by gblyh -
请教一个系统设计的问题
其实领域模型中的实体和实体关系模型中的实体能有多大区别呢? 领域中有些对象是要建 ...
-- by sslaowan






评论排行榜