2009-05-27 38 views
0

我正在嘗試編寫應用程序以從專有IDE設計文件中提取屬性和代碼。文件格式看起來像這樣:簡單代碼解析器的設計策略

HEADING 
{ 
    SUBHEADING1 
    { 
    PropName1 = PropVal1; 
    PropName2 = PropVal2; 
    } 

    SUBHEADING2 
    { 
    { 1 ; PropVal1 ; PropValue2 } 
    { 2 ; PropVal1 ; PropValue2 ; OnEvent1=BEGIN 
              MESSAGE('Hello, World!'); 
              { block comments are between braces } 
              //inline comments are after double-slashes 
              END; 
    PropVal3 } 
    { 1 ; PropVal1 ; PropVal2; PropVal3 } 
    } 
} 

我想要做的是提取子標題塊下的內容。在SUBHEADING2的情況下,我還會將每個令牌分隔爲由分號分隔的分隔符。我在統計括號並跟蹤目前所處的子標題方面取得了相當不錯的成績。我遇到的主要問題包括處理代碼註釋。

該語言正好使用塊註釋,這會干擾文件格式中的括號。爲了使它更有趣,它還需要考慮雙斜槓內聯評論,並忽略直到行尾的所有內容。

解決此問題的最佳方法是什麼?我查看了另一篇文章(ANTLR,Doxygen等)中討論的一些編譯器庫,但它們似乎對解決這個特定的解析問題來說是過度的。

+0

爲什麼不使用基於XML的語法? – xport 2010-12-09 02:35:44

回答

1

您應該能夠在幾個小時內將某些東西放在一起,使用正則表達式並結合使用結果的一些代碼。

像這樣的東西應該可以工作: - 通過將文件加載到字符串來初始化進程。

  • 從字符串中提取每個頂級塊,使用正則表達式標籤分別標識塊關鍵字和內容。
  • 如果發現塊,
    • 使基於關鍵字
    • 決定將內容傳遞到這個過程遞歸。

在此之後,你會處理標題,然後第一個副標題,那麼第二個副標題,然後每個子塊。對於包含塊註釋的子塊,大概知道該塊沒有關鍵字,即任何子塊都是註釋,因此不需要處理子塊。

+0

感謝您的建議。因此我主動學習了更多關於正則表達式的知識。 – polara 2009-05-29 14:33:16

5

我會建議編寫一個標記器和解析器;這會給你更多的靈活性。標記器基本上對源代碼進行簡單的文本分解並將其放入更有用的數據結構;解析器會指出如何處理它,通常利用遞歸。

條款谷歌:標記生成器,分析器,編譯器設計,文法

數學表達式求值:http://www.codeproject.com/KB/vb/math_expression_evaluator.aspx (你也許可以舉個例子像這一點,並攻擊它分割成你想要的)

有關解析的更多信息:http://www.codeproject.com/KB/recipes/TinyPG.aspx

您不必幾乎走到儘可能遠的文章去,但是,你會想先研究一下這個。

1

無論您選擇哪種解決方案,我都確信最好的方法是擁有2個解析器/標記器。一個用於具有{}作爲分組字符的主文件結構,另一個用於代碼塊。