2010-05-26 77 views
1

我需要解析一個文本文件,它有很多級別和字符。我一直在嘗試不同的方式來解析它,但我一直無法獲得任何工作。我已經包含了我正在處理的文本文件的示例。有關如何解析此文件的任何建議?用C解析複雜文本文件#

我用TEXTINEED表示了我需要的文件部分。

(bean name: 
     'TEXTINEED 
     context: 
     (list '/text 
      '/content/home/left-nav/text 
      '/content/home/landing-page) 
     type: 
     '/text/types/text 
     module: 
     '/modules/TEXTINEED 
     source: 
     '|moretext| 
     ((contents 
      (list (list (bean type: 
          '/directory/TEXTINEED 
          ((directives 
           (bean ((chartSize (list 600 400)) 
             (showCorners (list #f)) 
             (showColHeader (list #f)) 
             (showRowHeader (list #f))))))) 
         (bean type: 
          '/directory/TEXTINEED 
          ((directives 
           (bean ((displayName (list "MTD")) 
             (showCorners (list #f)) 
             (showColHeader (list #f)) 
             (showRowLabels (list #f)) 
             (hideDetailedLink (list #t)) 
             (showRowHeader (list #f)) 
             (chartSize (list 600 400))))))) 
         (bean type: 
          '/directory/TEXTINEED 
          ((directives 
           (bean ((displayName (list "QTD")) 
             (showCorners (list #f)) 
             (showColHeader (list #f)) 
             (showRowLabels (list #f)) 
             (hideDetailedLink (list #t)) 
             (showRowHeader (list #f)) 
             (chartSize (list 600 400)))))))) 
+0

那麼,你已經嘗試過什麼?問題到底是什麼?看起來像一個普通的S-Expr解析的東西,有可能已經在網上做這件事...... – gimpf 2010-05-26 17:23:36

+0

它看起來有點奇怪什麼單引號不結尾單引號 – 2010-05-26 17:27:31

+0

它可能會幫助,如果你知道什麼工具產生這個文件。 – 2010-05-26 17:37:03

回答

0

您可能會考慮編寫一個狀態機實現,根據您在文件中遇到的不同標記更改狀態。我發現基於狀態的解析器很容易編寫和調試。最困難的部分可能是定義你使用的令牌。

2

它看起來像你偶然發現了一個不錯的S-Expression文件,也被稱爲LISP的代碼。它看起來很複雜,但實際上很容易解析。事實上,如果你不想學習很多關於Lisp的知識,你可以按照這些blog posts,它的一小部分是爲這樣的文件編寫解析器。但那可能會讓你過度消耗。 :)

相反,您應該使用已經可用的S表達式解析器,這裏的項目具有用於.NET的lisp interpreter,您應該能夠使用他們的代碼或他們的項目來解析文件。

lispy要做的事情就是將該文件作爲lisp程序讀取,而不是'解析'它只是執行它。所以,另一種選擇是隻編寫一個小的lisp程序來將文件轉換成C#中更自然的東西(也許是XML?)。

參考這裏的另一個貼子,討論lisp in C#

編輯

here是用C語言編寫的方案解釋器(它只有大約1000 LOC)你有興趣在read和相關程序。這使用一個非常簡單的向前解析性壓縮到一個樹結構樹,你應該能夠適應這個到C#沒有問題。

0

使用像ANTLR這樣的解析器生成器。它需要類似EBNF的語法描述,並以您選擇的語言創建解析器代碼。

0

我爲使用OMeta#的C#編寫了S表達式解析器。它在https://github.com/databigbang/SExpression.NET

看看你的S表達式變體,你只需要改變我的字符串的定義,開始和結束雙引號爲單引號,並添加最後包含冒號的元素的定義(I假設是詞典)。