看板 C_and_CPP 關於我們 聯絡資訊
「除了作業三以外,其他的要怎麼寫才會漂亮 XD」 其實我也很想知道 orz 因為我作業二花了超多時間在後續的修改, 就是因為我一開始只想著要「通過測試」, 導致架構很差,程式碼幾乎無法複用。 我分享一下我到目前 pa3 的心得。 當然我的設計應該還算不上漂亮,至少我自己就知道好幾個點有問題, 但至少是一個證明會動的架構,可以省下一些「根本行不通」的冤枉路。 但看了我的設計,可能就會被我污染,錯失了更好的設計, 所以往下看之前最好思量一下,是不是要被我的設計污染… pa1: 主要目標,設計一個 class pptoken { ... } 可以取得 pptoken type (newline/id/keyword/...) 等等 可以取得 source 的字串,可以取得 keyword 或是 operator 是什麼 如果是 literal 的話,可以取得內容,可以取得是不是陣列, 可以取得型別(char, int, long) 可以取得 user-defined 的 suffix ... 之類的 把 source code 轉成一個 vector<pptoken>,然後輸入 parse 的部份我是仿造 yard 寫了一個 parsing framework 但我現在覺得這不一定是個好主意,因為我懷疑後續還會不會用到 pa2: 主要目標,設計一個 class token。 設計一個函數 pptoken2token,可以把一個 pptoken 轉成一個 token, 一顆對一顆,把 pptoken 統統轉成 token,先不考慮字串的接合。 會得到一個 vector<token>。 轉完以後,設計一個函數 vector<token> concate_str_lit(vector<token>) 會把連續的字串接合起來,結果還是一個 vector<token> 然後輸入。 pa3: 讀入一行,把一行轉成 vector<token> 寫一個 recur-descent parser,parse_ctrlexpr(vector<token>) 傳回值是 shared_ptr<ctrlexpr_node> ctrlexpr_node 有個 virtual ctrlexpr_value evaluate() = 0; 每個繼承者實作自己的 evaluate(),最後印出 root value 就好了。 後面還沒寫,我也想知道 = =|| -- To iterate is human, to recurse, divine. 遞迴只應天上有, 凡人該當用迴圈.   L. Peter Deutsch -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 219.71.75.152
jackace:我也幾乎是這樣 只是我用u32string取代vector<int> 04/29 00:20
jackace:還有pa3我對每個rule是寫成function非class 04/29 00:23