1

我是 Antlr 的新手。我写了一点语法来练习,但被 API CommonTokenStream 搞糊涂了

lexer grammar Expr;
options {
  language = Java;
}

EXPRS:EXPRT {System.out.println($EXPRT.text);};
fragment
EXPRT : 'xxx' ID {System.out.println($ID.text);} ' zzz';
fragment 
ID : ('a'..'z' |'A'..'Z' |'_' )('a'..'z' |'A'..'Z'|'_')*; 

测试代码是这样的:

ANTLRStringStream input = new ANTLRStringStream(msg);
Expr expr = new Expr(input);
CommonTokenStream cs = new CommonTokenStream(expr);
System.out.println(cs.size());

无论输入是什么,CommonTokenStream 都没有令牌。但是,当我直接使用 expr 时,它会输出。有谁知道为什么?antlr的版本是3.5

4

1 回答 1

3

CommonTokenStream被延迟初始化。要强制它立即填充所有标记(通过调用nextToken您的词法分析器直到到达 EOF),您可以调用该fill()方法:

CommonTokenStream cs = new CommonTokenStream(expr);
cs.fill();
System.out.println(cs.size());
于 2013-03-24T01:25:48.123 回答