* [[a21_txt01_2]]の補足説明#2
-(by [[K]], 2021.02.05)
** (0)
-これは[[「川合のプログラミング言語自作のためのテキスト第三版#2」>a21_txt01_2]]に対する補足説明のページです。
** (1) getTc()をmallocを使って書き直してみると・・・
-以下のgetTc()では、変数tcBuf[]や変数tcbがいまいちピンとこないかもしれないと、今になって思いました。
-だからもっと普通の書き方をしたらどうなるかを紹介したいと思います。

-書き換え前:

 int getTc(String s, int len) // トークン番号を得るための関数.
 {
     int i;
     for (i = 0; i < tcs; i++) { // 登録済みの中から探す.
         if (len == tl[i] && strncmp(s, ts[i], len) == 0)
             break;
     }
     if (i == tcs) {
         if (tcs >= MAX_TC) {
             printf("too many tokens\n");
             exit(1);
         }
         strncpy(&tcBuf[tcb], s, len); // 見つからなかったので新規登録.
         tcBuf[tcb + len] = 0; // 終端文字コード.
         ts[i] = &tcBuf[tcb];
         tl[i] = len;
         tcb += len + 1;
         tcs++;
     }
     return i;
 }

-書き換え後:

 int getTc(String s, int len) // トークン番号を得るための関数.
 {
     int i;
     for (i = 0; i < tcs; i++) { // 登録済みの中から探す.
         if (len == tl[i] && strncmp(s, ts[i], len) == 0)
             break;
     }
     if (i == tcs) {
         if (tcs >= MAX_TC) {
             printf("too many tokens\n");
             exit(1);
         }
         strncpy(&tcBuf[tcb], s, len); // 見つからなかったので新規登録.
         tcBuf[tcb + len] = 0; // 終端文字コード.
         ts[i] = &tcBuf[tcb];
         ts[j] = malloc(len + 1);
         strncpy(ts[j], s, len); // 見つからなかったので新規登録.
         ts[j][len] = 0; // 終端文字コード.
         tl[i] = len;
         tcb += len + 1;
         tcs++;
     }
     return i;
 }

-これで分かるように書き換え前のgetTc()におけるtcBuf[]とtcbの役割は、malloc()の代わりです。

* こめんと欄
#comment

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS