2011-10-28 93 views
0

如何創建接受任何先前規則不接受的分析規則?ANTLR規則接受任何先前不匹配的規則

我在做什麼是我嘗試用ANTLR重寫C++ src文件。我的語法只需要瞭解C++的一個子集並忽略其餘部分。通過忽略其餘部分,我的意思是我仍然必須輸出輸入行。我不能簡單地刪除輸入。例如,我可能需要找到#if,#ifdef,#ifndef,#else,#elif,#endif,但將任何其他有效的C++語法發回到輸出。我的解決方案的

部分看起來像:

inputLines : (preprocessorLineSet | oneNormalInputLine) ; 
preprocessorLineSet : ....;// pattern to match #if #else etc 
oneNormalInputLine : (any_token_except_crlf)* CRLF {System.out.println($text)}; 
// a catch-all rule for anything including #if #else #endif, it must send any unrecognised input back to the ouput 

我假設的解析器會嘗試在語法列出的順序選擇。所以我的預處理器線組規則是在之前列出的一個常規輸入線中的inputLines規則。但是,即使輸入是#if模式,我認爲應該與前面的規則匹配,ANTLR似乎仍然傾向於oneNormalInputLine

是我的假設是正確的?這是一種實現這種忽略休息邏輯的正確方法嗎?

回答

1

JavaMan寫道:

我假設的解析器會嘗試在語法列出的順序選擇。因此,我的preprocessorLineSet規則在inputLines規則中的oneNormalInputLine之前列出。

正確,規則是從左到右(preprocessorLineSetoneNormalInputLine之前)嘗試的。

JavaMan寫道:

但是,它看起來像ANTLR仍然喜歡oneNormalInputLine即使輸入的是,我認爲應該由先前的規則匹配的#if格局。

難道你不需要從any_token_except_crlf排除像#if#elif這樣的東西嗎?你能發佈一個包含驅動程序類的工作示例來顯示意外的行爲嗎?

+0

這正是我想知道的。如何編寫排除#if #ifndef等但包含其他所有內容的解析器規則? – JavaMan

+0

你可以發佈你的工作語法嗎?ANTLR似乎更喜歡'oneNormalInputLine'而不是'preprocessorLineSet'? –

+0

我認爲這只是我的語法錯誤。在進一步測試中,它會正確查找第一個替代品(preprocessorLineSet)。這是一個由我的catch-all規則導致的錯誤,它不排除#if(所以它看起來像preprocessorLineSet匹配,但實際上它是匹配它的oneNormalInputLine)。我想知道如何編寫一些規則來排除特定模式? – JavaMan