ANTLR4 词法分析器 getTokens() 方法 returns 只有 <EOF> 标记

ANTLR4 lexer getTokens() method returns only the <EOF> token

基本上,我有以下代码:


assert lexer != null;
CommonTokenStream commonTokenStream = new CommonTokenStream(lexer);commonTokenStream.fill();

List<Token> lst = commonTokenStream.getTokens();
FileWriter f = new FileWriter(output);

            for (Token t : lst) {
                f.write(t.toString());
                System.out.println(t.getText());
            }
f.close();

但是,文件只得到写入的 <EOF> 令牌,我是不是漏掉了什么?我确定文件中还有更多标记。

当我copy-paste你的代码时,我无法复制它。

这是测试语法:

grammar T;

parse
 : ANY*? EOF
 ;

ANY
 : .
 ;

和Java代码:

TLexer lexer = new TLexer(CharStreams.fromString("mu"));
CommonTokenStream commonTokenStream = new CommonTokenStream(lexer);
commonTokenStream.fill();

List<Token> lst = commonTokenStream.getTokens();

for (Token t : lst) {
  System.out.println(t.getText());
}

产生以下输出:

m
u
<EOF>

很可能,您已经使用解析器实例消耗了所有令牌。在创建 CommonTokenStream 之前执行 lexer.reset();:

lexer.reset();
CommonTokenStream commonTokenStream = new CommonTokenStream(lexer);
...