2012-10-03 62 views
0

我正在閱讀有關管道和過濾器架構模式的面向模式的軟件體系結構。在這裏我不需要知道編譯器的設計,但作者給出了編譯器設計的例子。我遵循了大部分,但我很難理解以下內容。在編譯器設計中,我們有不同的階段,如掃描器,解析器,語義分析,中間代碼生成和後端(MIPS後端,英特爾後端...)。管道和過濾器體系結構

這裏作者提到了前端階段,解析器,語義分析,中間代碼生成。後端是MIPS後端。

以下是文字片段

我們決定不明確構建一個抽象語法樹,從解析器語義分析儀通過。相反,我們嵌入到語義分析儀(SA)和代碼生成(CG)調用到YACC的語法規則:

addexpr : team 
     | addexpr '+' term 
      { sa.checkCompat($1,$3); cg.genAdd($1,$3);} 
     | addexpr '-' term 
      { sa.checkCompat($1,$3); cg.genSub($1,$3);} 

我上面的文字問題 1.什麼是筆者的意思是「不來構建抽象的樹explictily」 ? 2.我只需要了解上面的語法規則,它在做什麼?由於我不是設計語言,我必須瞭解模式。如果我對上面的例子有了很好的理解,我可以有效地遵循模式?

感謝您的時間和幫助。

回答

0

這個例子看起來像來自像yacc-lex/bison-flex這樣的詞法分析器的語法規則。像你所描述的那種規則是一種分級文法規則,如BNF

您要發佈的'代碼'告訴稱爲「addexpr」的表達式類型的語法規則。

addexpr := term | addexpr + term | addexpr - term 

這讀取類似:

一個附加的表達是一個術語或其他附加表達+一個術語或其他附加的表達 - 一個術語。

您可以使用這些遞歸語法規則來構建語言演示文稿。代碼{ sa.checkCompat($1,$3); cg.genAdd($1,$3);}看起來像是在$ 1和$ 3上進行輸入驗證 - 就像參數1和3中的「X + Y」$ 1將是'X',$ 2 ='+'和$ 3 ='Y'一樣。 對cg.genAdd的調用可能是一個函數調用,它會在抽象語法樹中添加一個「add」表達式。

這意味着當您解析源代碼時,您一次只生成一個元素的抽象語法樹。

1

我相信@MortenJensen回答了你的第一個問題。

如果你做了一些web開發,可能你已經知道管道是什麼。試想一下在Web服務器上處理你的請求。有一行獨立模塊解析它們的輸入(它是前一個模塊的輸出),最後一個生成輸出http響應。 (將tcp包轉換爲http請求,將其轉換爲服務器對象,請求被解析並創建響應服務器對象,將對象呈現爲html,將html包裝成http響應,並將其封裝到tcp包中)。

同樣是關於編譯器。它得到你的源代碼,經過幾次隨後的轉換,你將得到一個可執行文件。這對於管道模式來說是非常好的示例,但可能沒有這樣的細節可能會讓您從主要問題中分心。

1

我認爲Morten Jensen回答了關於語法解釋的問題。此外, 我猜測:

  • sa.checkCompat指的是 - 語義分析,檢查 兼容性兩個操作數
  • cg.genAdd指的是的 - 代碼生成器,生成的代碼添加兩個操作數

作者指出的主要問題是調用「下一個」編譯階段,SA和CG在解析階段被調用。換句話說,它不會等待整個解析器樹「在執行語義分析和代碼生成之前」生成。