compiler-inservice-s22 / Discussion

MIT License
0 stars 0 forks source link

來自作業苦手的請求 #15

Open miizumi opened 2 years ago

miizumi commented 2 years ago

Hi All, 有同學願意討論跟分享一下這次作業的著手想法嗎, 對於程度較差的我來說作業真的是苦手, 如果有同學跟我一樣苦於每次思考作業該如何進行都需要花上一段時間, 希望我們能一起討論,讓彼此都有進步!

LittleLaGi commented 2 years ago

可以參考作業說明中第一筆測資的解法: https://github.com/compiler-inservice-s22/hw3-JayYou307/blob/master/hint.md 和其他部分對照著看,希望有助於理解~

miizumi commented 2 years ago

@LittleLaGi Hi 張軒, 感謝你願意回答我的問題,關於作業中的敘述與說明我有看過, 照著做也確實能完成第一項測試,但我仍然沒有頭緒該怎麼去撰寫接下來的東西, 可能我的理解能力較一般人差,但還是非常感謝你。

LittleLaGi commented 2 years ago

你好,我這邊講一下這次作業大致上的執行流程:

  1. 讀進 token,做 parsing,在 parse 到特定的 non terminal 的時候 (如: function, expression),產生對應的 AST node。
  2. parse 完以後,會得到完整的 AST,從 root (program node) 開始走訪 AST。
  3. 把走訪到的 node 的資訊印出來 (走訪的方式可以用一般的 polymorphism 或是用 visitor pattern)。

這邊建議你可以依序針對每個 test case,完成該 test 需要用到的 node 就好,然後跑 make test 測試。 實做 node (都放在 AST/ 裡) 大致的步驟如下:

  1. 依據該 node 的需求加入 member。比如說 constant 需要紀錄它的實際數值,以及取得目前數值的 c string 的 member function (就是 #18 在討論的)。這部份主要看你自己想要怎麼寫,基本上就是物件導向設計。
  2. 在 node 加入 visit child 的 member function。這部份是為了實做 visitor pattern,可以參考作業說明和提示。
  3. 在 parser.y 對應的 reduction rule 產生 node 的 instance (如: new ProgramNode())。這邊會實際產生 AST 的 node,並把他們串在一起 (把指向 child node 的 pointer 存到 parent 裡面,或是使用現成的 STL container,都可以)。
  4. 在 AstDumper 裡面實做每個 node 被走訪到的時候應該要做的事情。這邊可以參考作業說明和提示。

每個 node 實做的方式都大同小異 (跟作業的提示基本上是一樣的),主要是差在不同的 node 需要儲存不同的資料,也需要不同的 member function 方便在 AstDumper 內呼叫。