2010-05-20 66 views
8

我正在試圖編寫標記代碼(如xml和html)的元語言,這些代碼可以直接嵌入到C/C++代碼中。 下面是用這種語言編寫一個簡單的示例,我把它叫做WDI(Web開發接口):如何高效地在C中構建解釋器(詞法分析器+解析器)?

/* 
    * Simple wdi/html sample source code 
    */ 
#include <mySite> 

string name = "myName"; 
string toCapital(string str); 

html 
{ 
    head { 
    title { mySiteTitle; } 
    link(rel="stylesheet", href="style.css"); 
    } 
    body(id="default") { 
    // Page content wrapper 
    div(id="wrapper", class="some_class") { 
    h1 { "Hello, " + toCapital(name) + "!"; } 

    // Lists post 
    ul(id="post_list") { 
    for(post in posts) { 
     li { a(href=post.getID()) { post.tilte; } } 
    } 
    } 
    } 
    } 
} 

基本上它是一個C源代碼HTML的用戶友好的界面。 正如你所看到的,傳統的基於標籤的風格被類C所取代,其中塊用花括號分隔。 我需要建立一個解釋器來將這段代碼翻譯成html,並且將它後面插入到C中,以便它可以被編譯。 C部分保持完好。 在wdi源內部沒有必要使用打印,每個返回語句將用於輸出(在printf函數中)。 該程序的輸出將是乾淨的html代碼。

因此,例如標題1個標籤將被轉換這樣的:

h1 { "Hello, " + toCapital(name) + "!"; } 
// would become: 
printf("<h1>Hello, %s!</h1>", toCapital(name)); 

我的主要目標是創建一個翻譯來翻譯WDI源爲HTML這樣的:

tag(attributes) {content} =><tag attributes>content</tag>其次,由解釋器返回的html代碼必須用printfs插入到C代碼中。在wdi中發生的變量和函數也應該進行排序,以便將它們用作printf參數(示例源中toCapital(名稱)的情況)。

我在尋找高效的(我想創建一個快速解析器)的方式來爲wdi創建一個詞法分析器和解析器。已經嘗試過彎曲和野牛,但是我不確定它們是否是最好的工具。有沒有什麼好的選擇?創建這樣的口譯員的最佳方式是什麼?你能否就這個問題提供一些簡要的文獻建議?

+5

imho,flex和野牛可能是這項工作的最佳工具。 – ereOn 2010-05-20 16:08:02

+0

你不是真的在問WDI-> C編譯器嗎?聽起來你不想直接執行WDI代碼,而是將其轉換爲C,然後將C代碼提供給C編譯器。 – 2010-05-20 16:13:26

+0

沒錯! WDI應該被轉換爲C.但是我認爲這個實現是相似的,所以我也想創建一個僅用於html的解釋器來使用和測試。 – Rizo 2010-05-20 16:20:12

回答

1

如果你對此非常認真,你想要做的是修改現有的C語法分析器。 Edison Design Group C Front End可能是一個選項,雖然它真的想成爲只是 C(C++)的前端。

另一種選擇是我們的DMS Software Reengineering Toolkit。可以通過包含完全由語法驅動的完整C語法分析器的C Front End獲得DMS。

DMS爲建立語言方言提供直接支持,你想要做的是建立一個C方言,所以它會支持你的目標。DMS還爲構建翻譯器提供了大量機器,因此將您的方言轉換爲真正的C代碼併發布它很容易。

3

野牛/ Flex或者YACC /法是傳統方式去做吧。恕我直言,沒有什麼更適合手頭的任務。

請注意,任務不能通過常規語言(即正則表達式,簡單的Perl腳本等)來完成,所以您確實需要一個解析器。

更好地做到這一點。最可取的是,yacc/bison生成的解析器比一些手工遞歸遞歸解析器要乾淨得多(而且速度更快)。

+0

如果你打算解析C(或者它的一個擴展,比如OP想要的),你會發現bison/yacc/LALR(1)不能很好地處理這個問題。 C編譯器解析器通常是解析機器與名稱解析糾纏在一起的糟糕手段。有關更多詳細信息,請參閱http://stackoverflow.com/questions/243383/why-c-cannot-be-parsed-with-a-lr1-parser/1004737#1004737。 – 2010-06-08 09:45:26

1

Boost spirit可能比bison/flex更好。

+0

你有沒有用過它?性能如何?與彎曲和野牛相比,它是否好?我已經開始使用flex和野牛來處理它,所以我必須確定這是值得推動的精神。 – Rizo 2010-06-25 17:46:00

+0

表現確實不錯。雖然編譯時間很慢。 – 2010-06-26 12:34:28