2011-02-24 19 views
2

我試圖在Antlr 3.1和Antlrworks 1.4.2中使用複合語法。當我放入導入語句時,它說'未定義導入'。我已經嘗試了許多詞法分析器語法和解析器語法的不同組合,但無法讓它生成代碼。我錯過了明顯的東西嗎?下面是一個例子。Antlr undefined在使用複合語法的Antlrworks中導入

grammar Tokens; 

TOKEN : 'token'; 

grammar Parser; 
import Tokens;//gives undefined import error 

rule : TOKEN+; 

我從

http://www.antlr.org/wiki/display/ANTLR3/Composite+Grammars

感謝

回答

3

當分離lexer-和語法解析器引用文檔,你需要明確定義什麼類型的它是語法。

嘗試:

parser grammar Parser; 
import Tokens;//gives undefined import error 

rule : TOKEN+; 

和:

lexer grammar Tokens; 

TOKEN : 'token'; 

注意,從組合語法文件Foo.g,詞法和語法分析器在默認情況下得到ParserLexer前綴:分別爲FooLexer.javaFooParser.java。但在「顯式」語法中,.java文件的名稱是文法本身的名稱:Parser.javaTokens.java。您可能要注意調用類Parser因爲這是ANTLR的基礎解析器類的名稱:

http://www.antlr.org/api/Java/classorg_1_1antlr_1_1runtime_1_1_parser.html

同時還要注意的地方下面options { ... }部分import聲明,但之前的任何tokens { ... }你可能已經定義了,否則你可能會得到奇怪的錯誤。

2

Argghh這是愚蠢的。 Antlrworks會強調導入並將所有令牌突出顯示爲未定義的語法錯誤,但仍允許您在嘗試時生成代碼!

它第一次不工作的原因是根據Bart的建議,導入高於選項。

+0

:)是的,ANTLRWorks是一個偉大的工具,但只適用於相當小的組合語法。 – 2011-02-25 09:02:19

+1

理查德,請注意,這些部分的順序可能會在ANTLR v4中消失(儘管......可能還需要一段時間才能出來)。 – 2011-02-25 10:02:23