2011-12-05 37 views
1

我不確定它是否是一個錯誤。但有以下簡單的ANTLR語法識別記號「程序」,要走兩次相同的ANTLR解析器會給出錯誤消息。這是一個錯誤嗎?

grammar w; 
options{ 
    language = Java; 
    ASTLabelType=CommonTree; 
} 
root : 'program' ;  

試圖去通過語法兩倍以下試驗檯給出錯誤信息,儘管它編譯

import org.antlr.runtime.*; 
import org.antlr.runtime.tree.*; 
import antlr.CommonAST; 


public class wT{ 
    public static void main(String[] args) throws Exception { 
     wLexer lexer =  new wLexer(new ANTLRStringStream ("program")); 
     wParser parser = new wParser(new CommonTokenStream(lexer)); 
     System.out.println("###Test1"); 

     parser.root(); 
     parser.root(); 
     System.out.println("ok for w.g gramma"); 

    } 
} 

錯誤由ANT調用消息,

bash-3.2$ ant testrig 
Buildfile: /Users/fuzl/while-comp/trunk/_test/build.xml 

antlr: 

compile: 
    [javac] Compiling 1 source file to /Users/fuzl/while-comp/trunk/_test 

testrig: 
    [java] ###Test1 
    [java] ok for w.g gramma 
    [java] line 1:7 missing 'program' at '<EOF>' 

非常有趣的是,最後一行

 [java] line 1:7 missing 'program' at '<EOF>' 

是由於testrig的兩次「parser.root()」,並且只有使用一個parser.root()時,此錯誤消息纔會消失。

我想parser.root()更改對象「分析器」。如果是這樣,這應該是一個錯誤,對吧?

+0

沒有錯誤(sarnold是正確的)。 –

回答

2

您已經一直走到輸入的末尾 - 當您再次調用時,沒有什麼可以解析的。

您可能會發現setCharStream()reset()方法有用。