如何創建接受任何先前規則不接受的分析規則?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。
是我的假設是正確的?這是一種實現這種忽略休息邏輯的正確方法嗎?
這正是我想知道的。如何編寫排除#if #ifndef等但包含其他所有內容的解析器規則? – JavaMan
你可以發佈你的工作語法嗎?ANTLR似乎更喜歡'oneNormalInputLine'而不是'preprocessorLineSet'? –
我認爲這只是我的語法錯誤。在進一步測試中,它會正確查找第一個替代品(preprocessorLineSet)。這是一個由我的catch-all規則導致的錯誤,它不排除#if(所以它看起來像preprocessorLineSet匹配,但實際上它是匹配它的oneNormalInputLine)。我想知道如何編寫一些規則來排除特定模式? – JavaMan