2011-06-11 31 views
3

使用C#將類似C或類似Lisp的代碼解析到數組中的方法是什麼?解析代碼的好方法 - 用類似C或Lisp的(或任何)語言編寫 - 用C#解析成數組?

因此,例如,對於一個小片段如下所示:

if (number > 50) { 
    alert('Hello, World!'); 
} 

我希望能夠給每一個字和符號存儲到一個數組。

但到現在爲止我到輸出管理的陣列類似如下:

[0] if 
[1] (number 
[2] > 
[3] 50) 
[4] { 
[5] alert('Hello, 
[6] World!'); 
[7] } 

你看在陣列位置1,它說:(number?這不是我想要的。我甚至想把這個小圓括號放入它自己的數組位置。

我最初想做的是讀取代碼的每個字符,然後開始將它們存儲到數組中。但是,這似乎是我在解析字符串時重新發明輪子。有沒有更簡單的方法來做到這一點?

p.s.我這樣做是因爲我想學習適當的字符串操作。

+7

這稱爲標記化,它是構建編譯器的第一步。我研究編譯器標記化,可能有幾十個示例用於標記類C語言。 – 2011-06-11 15:46:44

+1

這個問題之前已經被問過很多次了;大多數最終提到http://stackoverflow.com/questions/1669/。此外,數組並不是語法的良好表示,如果您決定將代碼存儲在數組中,則字符串不是令牌的良好表示。首先決定你是否想學習如何解析代碼或操縱字符串,這兩者是不同的問題。 – 2011-06-11 16:47:19

回答

3

解析C語言有很多規則,而且不能簡單地用空白字符標記代碼。

您需要有符號的概念。標記. , - +/* -> () = == != < > <= >= << >> ; ? : " ' & && | || ~(依此類推)都是符號。如果在解析過程中遇到其中一個問題,則將其視爲單獨的標記,而不管接下來會出現什麼字符。在「和」無視此規則之後,直到你到另一個「/」,除非它是在轉義字符\之後。還有評論處理,trigraphs和宏處理,以及更多需要注意的事情。

+0

轉義字符是反斜槓(''\\''),不是正斜槓(''/'')。 – 2011-06-11 16:34:13

+0

@Ben,correct,thanx – Dialecticus 2011-06-11 16:35:40

0

您可以嘗試設置解析器,首先檢查文本是否是某種「某種東西」,然後相應地標記它。

對於描述這件事情的書,請看看世界上許多大學使用的「計算機程序的結構和解釋」(也稱爲SICP)書available online。你可以找到他們用作起點的an example of the eval function

1

閱讀關於fslex和fsyacc。瞭解抽象語法樹,詞法分析器和解析器可能是一個很好的起點。

此外,用fslex和fsyacc編寫的F#詞法分析器和解析器很容易在.NET應用程序中使用。

+0

我一直在尋找一個簡單但不平凡的F#解析器 - 我和一個類似的海報小船一樣,希望能夠解析我的腳。 – 2011-06-11 16:36:19

+1

或Antlr,[也可以創建用C#編寫的解析器](http://www.antlr。org/wiki/pages/viewpage.action?pageId = 557075) – 2011-06-11 16:36:24

+0

@Gabriel,Don Syme的'Expert F#'有一個簡單但有用的例子。不幸的是,我在網上看到的例子並沒有涵蓋所有內容:例如我沒有看到%right /%left /%noassoc或幾個詞法分析器規則來解析註釋的例子。所以我強烈推薦Don Syme的書。 – Dmitry 2011-06-11 16:41:31