2013-04-02 72 views
0

我顯然是在下面的語言定義了一個錯誤:ANTLR語言 - 樹沒有創建(EOF - 語法錯誤)

grammar Hello; 


object : 
ALL* NAME ALL* '{' 
    (ALL* | (ALL* NAME ALL* NAME)* | (ALL* object)*)* 
'}' ALL*; 

ALL  : 
(~('{' | '}' | '"'))+ -> skip;  // All but braces and double quotes 

NAME : 
'"' ALL* '"'; 


當我試圖讀取文件或直接添加內容(與run.bat Hello object -gui),解析器給我一個語法錯誤mismatched input '<EOF>' expecting NAME。 而我只有一棵有單個節點的樹:'object'。


這裏是Java源代碼:

public static void main(String[] args) throws Exception { 
    HelloLexer lexer = new HelloLexer(new ANTLRFileStream("gamemodes.txt")); 
    TokenStream tokenStream = new CommonTokenStream(lexer); 
    HelloParser parser = new HelloParser(tokenStream); 

    System.out.println(lexer.getAllTokens().size()); 

    parser.setBuildParseTree(true); 

    // Tree Creation 
    RuleContext tree = parser.object(); 
    tree.inspect(parser); 
} 


最後,文件結構(有一些空格/任何字符(不含括號和雙引號)):

... 
"objName" 
{ 
    ... 
    "innerObjName1" 
    { 
     "firstProperty" "firstResult" 
     ... 
     "secondProp"  "" 
    } 

    "innerObjName2" 
    { 
     "firstProperty" "firstResult" 
     "secondProp"  "" 
    } 
} 
... 


備註:我在Windows上。

謝謝!

+0

我認爲你正試圖用正則表達式創建的語法規則(以小寫字母開頭的規則,如'object'規則)。我不認爲antlr可以處理這個問題。解析器規則擁有更簡單的機制。 –

+0

我在正式網站(http://www.antlr.org/wiki/display/ANTLR4/Parser+Rules#ParserRules-Subrules)中看到了一些類似於語法(*,+,?)的正則表達式的例子。 。順便說一句,如果你有一個想法來解決我的問題,我在聽你:) – Val

+0

哇,這好像叫做EBNF,我甚至不知道它存在。很高興知道這一點。可悲的是,雖然我無法幫助你解決你的問題。 –

回答

2

reportAttemptingFullContext不是錯誤。它只是讓你知道,ANTLR 4正在使用其內部實現的部分,它使用完整的解析上下文來確保準確性。包含該消息是因爲完整上下文算法比首先嚐試的SLL算法慢一點。

編輯:如果您使用的是非標準發行版,您可能需要指定以下選項以確保構建分析樹。官方發行版默認使用此選項。

parser.setBuildParseTree(true); 

編輯2:覆蓋語法問題。

以下是原始語法中的object規則,僅對格式進行了更改。

object // intermediate form 1 
    : ALL* NAME ALL* '{' 
     ( ALL* 
     | (ALL* NAME ALL* NAME)* 
     | (ALL* object)* 
     )* 
     '}' ALL* 
    ; 

該規則非常含糊。作爲一個簡單的例子,請注意以下修改過的語法實際上會匹配相同的輸入。

object // intermediate form 2 
    : ALL* NAME ALL* '{' 
     ( ALL 
     | ALL* NAME ALL* NAME 
     | ALL* object 
     )* 
     '}' ALL* 
    ; 

另一個簡化從2個ALTS移除不必要ALL*前綴。

object // final form 
    : ALL* NAME ALL* '{' 
     ( ALL 
     | NAME ALL* NAME 
     | object 
     )* 
     '}' ALL* 
    ; 

作爲最後一個變化,我將創建一個entry規則有明確的EOF結束:

entry : object EOF; 

爲了解析您的輸入,撥打entry()而不是object(),以確保所有的輸入變得解析。如果您需要ObjectContext對象,則可以致電EntryContext.object()

+0

感謝您的快速回答!很高興知道這不是一個錯誤,但樹似乎不是現在生成(之前,我有一個不同的語法產生它)..你有什麼想法嗎? – Val

+0

我已經增強了主題主題/內容以更好地解釋我的評論。 – Val

+0

@Valentin我編輯了我的答案,提到'setBuildParseTree'。 –

1

當您使用詞法分析器規則skip時,不得在解析器規則中使用它。

嘗試這樣:

grammar Hello; 

parse 
: object EOF 
; 

object 
: NAME (OBRACE object+ CBRACE | NAME) 
; 

NAME : '"' ~["{}]* '"'; 
OBRACE : '{'; 
CBRACE : '}'; 
OTHER : ~["{}]+ -> skip; 
+0

感謝您的回答巴特。我不知道'跳過'。順便說一句,錯誤仍然在這裏,在字符0的最後一行:'不匹配輸入''期待NAME' .. – Val