2013-10-05 29 views
1

在Bison中實現簡單的while循環的最佳方式是什麼?如果它有所作爲,我使用C,但我也可以使用C++。解析Bison中的While循環

+0

你是什麼意思'實施'一個while循環?在你給野牛的C源?在野牛產生的語法中? –

回答

5

你所要求的並不適合堆棧溢出的答案。它非常詳細,許多書籍都是關於它的。

基本的答案是你不在Bison中實現while循環。野牛在這個意義上不是一種語言。 Bison從語法中構建解析器,並在該語法中構建與規則相關的操作。

解析器是一個pushdown automaton,它是一個附有堆棧的狀態機器。它需要線性序列的標記,並檢測語法中的規則何時得到滿足(或者是否有錯誤)。當規則滿足時,解析器將執行附加到該規則的動作。這裏,令牌(通常)是與語言中的關鍵字,標識符和文字相對應的整數值。用Bison編寫的解析器通常依靠一個單獨的例程(稱爲lexical scanner)將輸入文本翻譯爲令牌。

這臺機器沒有任何東西可以直接讓你實現一個while循環。相反,這些操作用於構建可以進一步處理的輸入的內部表示。對於具有while循環的複雜語法,此表示通常採用樹的形式,並且通常稱爲AST(abstract syntax tree)。爲了更具體的給定了輸入文本:

while (i < n) { ... } 

相應AST可能是這樣的:

     [while node] 
        _____/   \_____ 
      _____/      \____ 
      /        \ 
     [operator <]      [block subtree] 
    /  \ 
    /   \ 
    [ID: i]  [ID: n] 

的而節點預計兩個子樹:對應於所述繼續條件的表達式的子樹(i < n)和塊對應的塊子樹({ ... })。

給定一個適當的while循環的AST,通過處理AST的節點來實現循環,並結合一些處理標識符和變量值的機器,這是相當直接的。

如果您給Bison一個proper grammar(即:適用於LALR(1)解析)和構建AST的動作,您將獲得一個將令牌流轉換爲AST的例程。從AST執行循環超出了Bison的範圍。

+0

謝謝你的回答。我擔心情況會如此。 –