2015-07-12 120 views
1

我試圖使自定義基於C語言的編譯器,它支持使用C++和Flex +野牛變量的作用域與作用域的語言。我已經做了詞法和語法分析器,但我有麻煩解決問題與作用域。我在野牛解析器文件中實現了語義動作,例如編譯器使用野牛

while_stmt : WHILE LEFT_PAREN expr RIGHT_PAREN LEFT_CBRACE stmts RIGHT_CBRACE { $$ = new WhileStatement($3, *$6); } 
      ; 

我有是什麼時候把新的符號表上的上下文符號表堆找到了片刻的問題是什麼。由於它是一個自下而上的解析器,我不知道什麼時候新的塊開始,它剛剛結束時,進行還原後,它是太晚了我。我放在規則後面的代碼在裁減之後被擴展。

怎麼可以這樣解決了使用野牛?我正在頭腦風暴一會兒沒有解決方案。謝謝。

回答

1

在編譯器範圍是一種語義操作,並且通常不在解析級別處理,而是在語義樹遍歷期間的後期階段處理。

如果您嘗試在解析時執行此操作,則會發現已解釋的問題。 解析僅用於檢查令牌的序列相匹配的語法。其他所有內容都應該在解析時創建的解析樹中執行。

這不是一個野牛的具體問題。它適用於任何編譯器和解析器(使用上下文無關文法)。

+0

幾分鐘前,我已經發現了關於http://www.gnu.org/software/bison/manual/html_node/Using-Mid_002dRule-Actions.html#Using-Mid_002dRule-Actions什麼似乎解決了我所嘗試的實現。我已經實現了作用域符號表,如果我能夠將該操作置於規則的中間,那麼只要出現LEFT_CBRACE,我就可以放入新的符號表,並在RIGHT_CBRACE終止該塊時從堆棧中彈出它。我目前正在實施它,並讓你知道它是如何結束的。 –