我需要一個外語編程語言的解析器。我爲它寫了一個語法,並使用解析器生成器(PEGjs)來生成解析器。這完美地工作......除了一件事:宏(用預定義文本替換佔位符)。我不知道如何將它融入語法。讓我來說明這個問題:如何用基於語法的解析器替換宏?
一個例子程序解析通常是這樣的:
instructionA parameter1, parameter2
instructionB parameter1
instructionC parameter1, parameter2, parameter3
沒有問題爲止。但該語言也支持宏:
Define MacroX { foo, bar }
instructionD parameter1, MacroX, parameter4
Define MacroY(macroParameter1, macroParameter2) {
instructionE parameter1, macroParameter1
instructionF macroParameter2, MacroX
}
instructionG parameter1, MacroX
MacroY
當然,我可以定義一個語法來標識宏和對宏的引用。但在這種情況下,我不知道我將如何解析宏的內容,因爲它不清楚宏包含的內容。它可能只是一個參數(這是最簡單的),但它也可以是一個宏中的幾個參數(如我的示例中的MacroX,代表兩個參數)或一整塊指令(如MacroY)。而宏甚至可以包含其他宏。如果不清楚宏的語義是什麼,我怎樣才能把它寫成語法?
最簡單的方法似乎是先運行預處理器來替換所有的宏,然後才運行解析器。但在這種情況下,行號會變得混亂。如果存在解析錯誤,我希望解析器生成包含行號的錯誤消息。如果我預處理輸入,行號不再對應。
非常感謝。
回覆:線條越來越亂了:在讀入宏定義之後,可以輸出相當數量的空行,或者可以輸出類似'#line N'的東西,並向您的解析器添加一條規則:#line N'將當前行號改爲'N'。 (這是GCC和大多數C預處理程序處理'#include'指令的方式。) –