2010-07-06 66 views
2

當我運行下面的語法:「測試」

test : WORD+; 

WORD : ('a'..'z')+; 
WS : ' '+ {$channel = HIDDEN;}; 

,我給輸入爲什麼ANTLR接受這個作爲有效的輸入?我認爲('a'..'z')只能匹配小寫字母內的字符?

+1

我還以爲。你確定 ?你是否說「?test」被解析爲WORD標記? – leonbloy 2010-07-06 17:33:41

+0

是的,這就是發生的事情。我正在使用antlr3 IDE進行eclipse測試... – 2010-07-07 12:13:27

回答

3

ANTLR 確實使用您發佈的語法解析輸入字符串?test時產生錯誤。通常情況下,錯誤在於圍繞ANTLR使用的工具(不幸的是,我發現它也發生了很多ANTLRWorks)。

爲了測試它自己(正確),創建一個文件Test.g

grammar Test; 

test : WORD+; 

WORD : ('a'..'z')+; 

WS : ' '+ {$channel = HIDDEN;}; 

和文件Main.java

import org.antlr.runtime.*; 

public class Main { 
    public static void main(String[] args) throws Exception { 
     ANTLRStringStream in = new ANTLRStringStream("?test"); 
     TestLexer lexer = new TestLexer(in); 
     CommonTokenStream tokens = new CommonTokenStream(lexer); 
     TestParser parser = new TestParser(tokens); 
     parser.test(); 
    } 
} 

,並在同一目錄下下載ANTLR 3.2 JAR的副本。

現在產生一個詞法&解析器:

java -cp antlr-3.2.jar org.antlr.Tool Test.g 

編譯所有的Java源文件:

javac -cp antlr-3.2.jar *.java 

和運行主類:

java -cp .:antlr-3.2.jar Main 

(更換:;如果你是在Windows上)

將產生以下錯誤消息:

line 1:0 no viable alternative at character '?'