5

我最近购买了The Definitive ANTLR Reference,我很高兴开始使用 ANTLR。
在第一章中,这个语法被展示:

grammar T;

options {
    language = Java;
}

r : 'call' ID ';' {System.out.println("invoke " + $ID.text);} ;
ID : 'a'..'z'+ ;
WS : (' '|'\n'|'\r')+   {$channel=HIDDEN;} ;

我将这个语法复制到一个文件中(.g 扩展名),生成 Lexer 和 Parser,并创建了一个主类,如下所示:

import org.antlr.runtime.*;

public final class Test {
    public static void main(String[] args) throws Exception {
        ANTLRInputStream input = new ANTLRInputStream(System.in);
        TLexer lexer = new TLexer(input);
        CommonTokenStream tokens = new CommonTokenStream(lexer);
        TParser parser = new TParser(tokens);

        parser.r();
    }
}

没有真正的错误,但是当我运行主类并输入时:

call foo;

没发生什么事。“invoke foo”应该输出到屏幕上,但什么也没有发生。我不想在没有完成任何练习的情况下继续看书。如果重要的话,我在 Eclipse 中使用 ANTLR 3.4。抱歉,这似乎是一个简单的问题,但我是 ANTLR 的新手。

谢谢,
奥马尔

4

1 回答 1

6

您需要输入 EOF 字符。

对于基于 UNIX 的系统,它是Ctrl-D.

对于基于 Windows 的系统,它是Ctrl-Z.

编辑

由于您通过控制台输入输入,并且 ANTLR 正在将数据作为流读取,因此它需要 EOF。在本书后面,您将通过文件输入数据,文件的 EOF 将结束流。您还可以将输入保存到文件中,然后将输入从文件通过管道传输到命令中。

于 2012-05-03T01:07:41.757 回答