最终ANTLR参考-第一个程序不工作

最终ANTLR参考-第一个程序不工作,antlr,antlr3,Antlr,Antlr3,我最近购买了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,并创建

我最近购买了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();
    }
}
没有真正的错误,但是当我运行main类并输入:

call foo;
什么也没发生。“invokefoo”应该被输出到屏幕上,但是什么也没有发生。我不想在没有完成任何一个练习的情况下继续写这本书。如果有必要的话,我将在Eclipse中使用Antlr3.4。抱歉,如果这是一个简单的问题,但我是ANTLR的新手

谢谢,

Omer

您需要输入EOF字符

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

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

编辑


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

欢迎使用ANTLR。你的问题对初学者来说非常有效。你是否按照书中的注释输入了文件结尾字符?不,我从未想过。在Windows系统上,这是\n、\r还是\r\n?还是只需按一下回车键?非常感谢!成功了!但是,你能解释一下为什么需要这样做,以及我如何删除它吗?