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

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

arato-make.hatenablog.com

僕の現状の実装 github.com

STEP9

比較演算子の部分を考慮しながらサイトを参考に書いていきました.

サイトではconsume_ident()を作成して変数を読み進めるような形式を取っていましたが,僕は数値に寄せる形でnew_node_ident()を作成して変数を読み進めるような形を取りました.

「;」をつけないと今までのテストが動かないので注意です.  

github.com

STEP10

localsの初期化はprogram()内で,offsetが0のLVarを作成して行いました. tokenize部分では以下のように複数文字受け入れるように変数取得部分を変更しました.

if('a' <= *p && *p <= 'z') {
    cur = new_token(TK_IDENT, cur, p++, 1);
    int i = 0;
    while ('a' <= *p && *p <= 'z') {
        i++;
        p++;
    }
    p -= i;

    cur = new_token(TK_IDENT, cur, p, i);

    p += i;
    continue;
}

github.com

STEP11

consume(TokenKind)を実装しないで,数値や変数と同じように処理する場合にはnode->lhs=expr()する前にtoken = token->nextをしないとトークンがTK_RETURNのまま進んでしまうので注意です.

https://github.com/arato-make/9cc/commit/893c5fbdb01a3a0cb1e8d5298c9d7b03bdef5567