我正在尝试使用ANTLR(尝试过3.3和3.4)。当我尝试运行我的测试代码时会发生奇怪的事情。请先查看我非常简单的代码,然后我会解释我的问题。
测试语法:
lexer grammar CSVLexer;
Comma
: ','
;
LineBreak
: '\r'? '\n'
| '\r'
;
SimpleValue
: ~(',' | '\r' | '\n' | '"')+
;
QuotedValue
: '"' ('""' | ~'"')* '"'
;
测试代码:
import org.antlr.runtime.*;
public class JMain {
public static void main(String[] args) throws Exception {
String source = "val1,val2,val3";
CSVLexer lexer = new CSVLexer(new ANTLRStringStream(source));
CommonTokenStream tokens = new CommonTokenStream(lexer);
int n = 1;
for (Object o : tokens.getTokens()) {
CommonToken token = (CommonToken) o;
System.out.println("token(" + n + ") = " + token.getText().replace("\n", "\\n"));
n++;
}
}
}
Compiation:
$ export CLASSPATH=antlr3.jar
$ java org.antlr.Tool CSVLexer.g
$ javac *.java
$ java JMain
第一个问题是它不打印任何东西:)。我在Intellij IDEA(10)工作,我试图从这里运行代码没有成功(在CLASSPATH中使用ANTLR)。但是,如果我在int i = 1
上放置断点,调试并等待,比如说继续前1-3秒就可以了!如果我在调试模式下运行它没有断点,它不会。有人可以向我解释一下这可能是什么问题吗?谢谢。
编辑:
所以我尝试了tu put:
tokens.fill()
之后
CommonTokenStream tokens = new CommonTokenStream(lexer);
它有效。然而,我开始调试 CommonTokenStream 构造函数(几分钟),当我进入tokens.fill()
时,我得到了IndexOutOfBoundException。所以在某种程度上背景中的东西做了些什么,但我在IDEA中看不到其他线程。
EDIT2:
问题解决了。似乎有必要先调用fill()
,而BufferedTokenStream
可能并不意味着像这样使用。我按照这个教程http://bkiers.blogspot.com/2011/03/2-introduction-to-antlr.html,它可能以某种方式为作者工作(我想知道为什么)。 IntelliJ IDEA调试器在本地对象上调用toString()
,然后又调用fill()
,这就是我设置断点时它工作的原因。 toString()
modyfing状态是邪恶的!