2013-10-04 76 views
-1

我有這個巨大的Maude字符串。這是一小片的那樣:如何着手編寫解析器?

NamedElements 
( 
    (
     NamedElement 
     (
      SpecTable 
      (
       SpecColumns 
       (

        (
         SpecColumn 
         (
          Name 
          (
           "Id" 
          ) 
          , 
          TypeVarChar 
          (
           18 
          ) 

         ) 
         , 
         SpecColumn 
         (
          name 
          (
           "IsDeleted" 
          ) 
          , 
           DataTypeBit 
         ) 

... ...

只有一種東西叫做NamedElements。這裏有很多NamedElement對象。格式很容易理解。我需要爲此編寫一個解析器,以便我可以執行類似於獲取所有SpecColumn對象的名稱相同的東西。我不確定最好的方法來做到這一點。

有些事情我也想過:。通過每個字符

循環播放,直到我找到了「(」我做一個新的對象我添加此對象作爲它上面的對象上的屬性我繼續去直到找到匹配的')'。然後,這完成了該對象中的內容。

基本上,我從來沒有做過這樣的事情,並想知道是否有一些既定的方式來做到這一點,或者我是否需要做一些類似於我上面描述的事情?

+0

https://en.wikipedia.org/wiki/Recursive_descent_parsing –

+1

對不起,這個問題不適合以及堆棧溢出的範圍,但這裏有一些建議:1.谷歌「遞歸下降解析器「,這是最簡單的解析技術,你會發現很多示例實現。 2.看看我寫的[過於簡單的JSON解析器](https://github.com/H2CO3/libjsonz/tree/master/src/jsonz.c)。 – 2013-10-04 17:39:14

+0

有一些優秀的圖書館可用於這種事情,你指定的語法。一個語言的想法將有助於提供更多的指導,但提升精神將是我對C++的推薦。它也快得驚人。 – OllieB

回答

1

要編寫一個解析器,您需要定義您的語法和語法:可以使用的單詞以及這些單詞如何組合在一起生成語句。這看起來大多像對象的標記,類似於XML或JSON。但是,仍然需要在編寫解析器之前定義您的語言。

在編寫解析器時,您應該看看lexical analysis。這是一個開始的好地方。一旦你知道什麼是和不是你的語言,你就可以「解析」它,並將其轉換爲你想要的其他任何東西,並將其轉換成另一種語言,格式等等。

解析器由掃描儀,標記器和詞法分析器組成。我知道所有這些都有些模糊,但你的問題也相當公開。

0

我建議你把語法形式化一下。

Name  ::= ("STRING") 

TypeVarChar ::= (NUMBER) 

DataTypeBit ::= DATATYPEBIT 

SpecColumn ::= (Name {, TypeVarChar | DataTypeBit}) 

SpecColumns ::= (SpecColumn {, SpecColumn}*) 

SpecTable ::= (SpecColumns)