#### 卒業研究の計画表 # 第1回 計画表の作成 低レイヤを知りたい人のためのCコンパイラ作成入門を参考に進めていく エクセルでガンチャート作成により、把握する。 # 第2回 * 情報工学実験Ⅱを実際にうごかしていない 大まかな計画表の完成 1. 情報工学実験II: LLVMを用いた簡単なコンパイラの作成 課題3の完成を目指す 2. 情報工学実験II: LLVMを用いた簡単なコンパイラの作成 課題4の完成を目指す 3. 情報工学実験Ⅱの応用(for,int配列,関数呼び出し) 4. コンパイラの教材づくり * 次回の目標 - [ ]  課題3以前の立ち上げ - [ ]  課題3に取り組む - [ ]  課題4に取り組む - [ ]  レポートづくり # 第3回 * 情報工学実験Ⅱの復讐 * コンパイラの復習 メモ ![コンパイラの復習 メモ-2](https://hackmd.io/_uploads/SyBVJ4wzC.jpg) visual studioを開く ```=1 code hello.ll ``` visual studiを開いた ```hello.ll=1 define i32 @main(){ ret i32 123 } ``` バックエンド ```=1 clang-15 -Wno-override-module hello.ll ``` hello.llの結果 ```hello=1 ./a.out; echo $? 123 ``` # 第4、5回 ## わからないリスト - [x] 構文図式とは - [x] LL(1)文法とは - [ ] - [ ] - [ ] ## 課題3 やるべきリスト 1. pico言語の構文図式を拡張する。{ 構文図式 } 2. それがLL(1)文法であることを確認せよ。 3. 構文図式に従いpicoc.cに必要なコードを追加せよ。 4. テストを行う。 ## 構文図式 構文図式の例 ![スクリーンショット 2024-05-26 200041](https://hackmd.io/_uploads/B1DKIqxVR.png) ## LL(1)文法であることの確認 LL(1)文法であることを確認するには、以下の手順を踏む必要があります。 * chat gptでそれがLL(1)文法であることを確認せよ。と命令。 1. **左再帰の除去**: 文法に左再帰が含まれていないことを確認する。左再帰があれば、除去する。 2. **ファースト集合(First Set)の計算**: 各非終端記号のファースト集合を計算する。 3. **フォロー集合(Follow Set)の計算**: 各非終端記号のフォロー集合を計算する。 4. **解析表の構築**: ファースト集合とフォロー集合を使って解析表を構築し、各セルにおいて選択規則が一意であることを確認する。 以下に、算術式を解析するための文法に対してこれらの手順を適用します。 ### 例文法 ``` Expr ::= Term Expr' Expr' ::= '+' Term Expr' | ε Term ::= Factor Term' Term' ::= '*' Factor Term' | ε Factor ::= '(' Expr ')' | 'num' ``` ### ステップ1: 左再帰の除去 上記の文法には左再帰は含まれていません。 ### ステップ2: ファースト集合(First Set)の計算 - **First(Expr)** = First(Term) = First(Factor) - **First(Expr')** = {'+', ε} - **First(Term)** = First(Factor) - **First(Term')** = {'*', ε} - **First(Factor)** = {'(', 'num'} 具体的には: - **First(Expr)** = {'(', 'num'} - **First(Expr')** = {'+', ε} - **First(Term)** = {'(', 'num'} - **First(Term')** = {'*', ε} - **First(Factor)** = {'(', 'num'} ### ステップ3: フォロー集合(Follow Set)の計算 - **Follow(Expr)** = {'$', ')'} ($は入力の終端を示す) - **Follow(Expr')** = Follow(Expr) = {'$', ')'} - **Follow(Term)** = Follow(Expr) - **Follow(Term')** = Follow(Term) = {'$', ')', '+'} - **Follow(Factor)** = Follow(Term) 具体的には: - **Follow(Expr)** = {'$', ')'} - **Follow(Expr')** = {'$', ')'} - **Follow(Term)** = {'$', ')'} - **Follow(Term')** = {'$', ')', '+'} - **Follow(Factor)** = {'$', ')', '+'} ### ステップ4: 解析表の構築 解析表を作成し、各セルにおいて選択規則が一意であることを確認します。 | 非終端記号 | 次のトークン | 適用する規則 | |------------|---------------|---------------------| | Expr | num | Expr -> Term Expr' | | Expr | '(' | Expr -> Term Expr' | | Expr' | '+' | Expr' -> + Term Expr' | | Expr' | ')' | Expr' -> ε | | Expr' | $ | Expr' -> ε | | Term | num | Term -> Factor Term'| | Term | '(' | Term -> Factor Term'| | Term' | '+' | Term' -> ε | | Term' | '*' | Term' -> * Factor Term' | | Term' | ')' | Term' -> ε | | Term' | $ | Term' -> ε | | Factor | num | Factor -> num | | Factor | '(' | Factor -> ( Expr ) | ### 一意性の確認 解析表を確認すると、各非終端記号と次の入力トークンの組み合わせごとに適用される規則が一意であることがわかります。したがって、この文法はLL(1)であると確認できます。 しかし、これで確認するというのがわからない。 今後はLL(1)文法の確認の方法を見つけることが課題である。 ### まとめ この文法がLL(1)であることを確認するために、左再帰がないこと、ファースト集合とフォロー集合の交差が空であること、解析表に曖昧さがないことを確認しました。したがって、この文法はLL(1)文法であることが確認されました。 #### 5月14~5月21  ![スクリーンショット 2024-05-21 122520](https://hackmd.io/_uploads/SJm94cFmC.png) #### 5/21~5/27 ![スクリーンショット 2024-05-28 122639](https://hackmd.io/_uploads/r1UNJ0G4A.png) #### 5月28日~6月3日 ![スクリーンショット 2024-06-04 123204](https://hackmd.io/_uploads/Hyn65Zh4C.png) ### 構文図式 メモ コンパイラ ノート 第7,9,11回 参考文献 [情報工学実験II: LLVMを用いた簡単なコンパイラの作成](https://hackmd.io/@okuisatoshi/jikkenII-2023) [低レイヤを知りたい人のためのCコンパイラ作成入門](https://www.sigbus.info/compilerbook) [2024 ガンチャート(excel)](https://docs.google.com/spreadsheets/d/1BrvprLSJmW8-NMBTl8OAtksjK5aU4GzdV4cWOj16YEc/edit#gid=1239502503) 次回の目標 # 6/4 ゼミ - [ ] ツール 構文図式 - [ ] 課題3の構文図式を完成させる。 ![IMG_1455](https://hackmd.io/_uploads/S1mnNV3VR.jpg) - [ ] わからないリストを作る - [ ] 1週間のログをつくる