コンパイラ作成(94) 値を返さないreturn文

今回の目標

単純なreturn文。

// 関数の呼び出し
void sub(void)
{
    return;
}

int main()
{
    sub();
    printf("%d\n",42);
}

これサポートしてなかったよ。

statement

return文の処理。

  def statement(kind, str)
    if kind == TK::RESERVE && str == "return" then
      # return文の処理
      kind, str = @lex.gettoken
      if kind != TK::SYMBOL && str != ";" then
        kind, str = expr kind, str
        f = @functions[@funcname]
        if f[0] == "double" then
          codegen "  movsd  xmm0, xmm8"
        end
      end
      codegen "  jmp  .RET_" + @funcname
      if kind != TK::SYMBOL || str != ";" then
        perror "expected ';' after return statement"
      end

if文を一個追加しただけ。

動作テスト
~/myc$ myc g4.myc
~/myc$ ./g4
42
~/myc$

コンパイル通るようになったよ。返値の型のチェックも入れようと思ったんだけど、exprにも手を入れて型を返すようにしないと駄目なんで今回は諦めたよ。今回、ちっとも進んでないなあ。明日頑張ろう。