Cコンパイラを作る-その2
以下のサイトを参考にCコンパイラを書いていきます.エラーが出たところとかをメモがわりに残していきながらやっていきます. www.sigbus.info
僕の現状の実装 github.com
STEP9
比較演算子の部分を考慮しながらサイトを参考に書いていきました.
サイトではconsume_ident()
を作成して変数を読み進めるような形式を取っていましたが,僕は数値に寄せる形でnew_node_ident()
を作成して変数を読み進めるような形を取りました.
「;」をつけないと今までのテストが動かないので注意です.
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; }
STEP11
consume(TokenKind)
を実装しないで,数値や変数と同じように処理する場合にはnode->lhs=expr()
する前にtoken = token->next
をしないとトークンがTK_RETURNのまま進んでしまうので注意です.
https://github.com/arato-make/9cc/commit/893c5fbdb01a3a0cb1e8d5298c9d7b03bdef5567