我最近购买了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;} ;
Run Code Online (Sandbox Code Playgroud)
我将这个语法复制到一个文件(.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();
}
}
Run Code Online (Sandbox Code Playgroud)
没有真正的错误,但是当我运行主类并输入:
call foo;
Run Code Online (Sandbox Code Playgroud)
什么都没发生.应该将"invoke foo"输出到屏幕,但没有任何反应.我不想在没有完成任何练习的情况下继续读书.如果重要的话,我在Eclipse中使用ANTLR 3.4.很抱歉,这似乎是一个简单的问题,但我是ANTLR的新手.
谢谢,
奥梅尔
您需要输入EOF字符.
对于基于UNIX的系统,它是Ctrl-D.
对于基于Windows的系统,它是Ctrl-Z.
编辑
由于您通过控制台输入输入,并且ANTLR正在将数据作为流读取,因此它需要EOF.在本书的后面,您将通过文件输入数据,文件的EOF将结束流.您还可以将输入保存到文件,然后将文件中的输入传递到命令中.
| 归档时间: |
|
| 查看次数: |
378 次 |
| 最近记录: |