Cコンパイラを作る-その3

以下のサイトを参考にCコンパイラを書いていきます.エラーが出たところとかをメモがわりに残していきながらやっていきます. www.sigbus.info

arato-make.hatenablog.com

僕の現状の実装 github.com

STEP12

if else while forなどの予約語が増えててきたので以下のように配列を用意してそこから一致するものがあれば予約語,なければ変数になるようにしました.

char *reserve_word[] = {
     "==",
     "!=",
     "<=",
     ">=",
     "if",
     "else",
     "while",
     "for"
 };

 int get_reserved_len(char *p) {
     for (int i = 0; i < 8; i++) {
         if (memcmp(p, reserve_word[i], strlen(reserve_word[i])) == 0) {
             return strlen(reserve_word[i]);
         }
     }
     return 0;
 }
 int len = get_reserved_len(p);
 if (len != 0) {
       cur = new_token(TK_RESERVED, cur, p, len);
        p += len;
       continue;
 }

パース部分に関しては正直ごちゃごちゃになってしまいましたが,一応動作はするような形になりました.構文木等を気にせずとりあえず動作すればいい精神で書いてしまった部分があるので後々リファクタリングしたいです.

github.com

STEP13

ブロックに関しては,ブロックが終了するまでステートメントノードをつなげるような形にしました.コード生成時に最初まで遡ってから順に出力していくことで順番が担保できると思ってます.ブロックに含まれる式のベクタとかが正直よくわからなかったのですが,現状それっぽく動いてるのでよしとします.

 Node *block() {
     Node *node = stmt();
     if (check("}")){
         consume("}");
         return node;
     }
     return new_node(ND_BLOCK, node, block());
 }

github.com