ANTLR - 运行/调试期间的非确定性行为

时间:2012-01-27 15:03:54

标签: java antlr non-deterministic

我正在尝试使用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状态是邪恶的!

0 个答案:

没有答案