我正在寫一個詞法分析器(帶有re2c)和一個解析器(帶有檸檬),用於稍微複雜的數據格式:類似於CSV,但在特定位置使用特定的字符串類型(僅字母數字字符,字母數字字符和減號,任何字符除了引號和逗號,但帶有平衡的大括號等),大括號內的字符串和看起來像帶有可以包含參數的大括號的函數調用的字符串。解析器和詞法分析器的設計指南?
我的第一槍是一個擁有許多州的詞法分析器,每個州都遵循特定的字符串格式。但是經過許多來自詞法分析器的無用的「意外輸入」信息(它變得非常大)之後,我意識到也許它試圖完成解析器的工作。我放棄了第一次嘗試,並使用只有一個狀態的詞法分析器,許多字符標記和一個將這些標記組合成不同字符串類型的解析器。這樣做效果更好,當某些事情關閉時,我從解析器中獲得更多有用的語法錯誤,但它仍然感覺不太正確。我正在考慮向詞法分析器中添加一個或兩個狀態,但是從分析器啓動狀態,該狀態具有更好的「概述」,在給定實例中需要字符串類型。總的來說,我覺得有點愚蠢:但我可能有一個教程或書籍可以解釋什麼是詞法分析器應該(而且不應該)如何構建良好的標記模式,何時使用詞法分析器狀態,何時以及如何使用遞歸規則(使用LALR解析器),如何避免含糊不清的規則。 「Lex和YACC primer/HOWTO」雖然不錯,但還不夠,因爲我只是想解析一下數據格式,所以編譯器編譯的書籍(比如紅龍書)看起來有點超大。
或者也許有人可以在這裏給我一些簡單的規則。
謝謝,這是有幫助的。我總是試圖爲我的終端創建巧妙的正則表達式。所以在將來,我會在解析器中使用更多生產規則。 – chiborg 2010-07-07 09:10:32