1

私はAntlrの初心者です。練習用に少し文法を書きますが、APICommonTokenStreamに混乱します

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遅延初期化されます。(EOF に到達するまでレクサーを呼び出すことによって) すべてのトークンをすぐに入力するように強制するには、次のメソッドnextTokenを呼び出すことができます。fill()

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