Codelogy

« 2007年10月 | メイン | 2007年12月 »

2007年11月 アーカイブ

2007年11月17日

ドキュメントの重要性

「コードを書くのは楽しいけど、そのドキュメントを書くのは面倒くさいよ。」
殆どのプログラマはそう思っており、私もそんなプログラマの一人だったりします。
しかしながら、ドキュメントのないプログラムというのは殆ど無意味であり、実用上の価値は皆無といえます。

続きを読む "ドキュメントの重要性" »

コード添削

松浦の記事、【c++】インタプリタを初めから丁寧に 第02回 のコードが、ちょっと冗長な気がしますので、これを添削してみようかと思います。

まずは、識別子の解析をする部分から。 (もとのコードはこちらを参照してください。)

#include <ctype.h>

std::string str; // スクリプトの内容
static int Pos;  //読み取り位置

bool ReadIdentifier(){

    int n =Pos;

    // 1文字目 (英字 or アンダースコア)
    if (isascii(str[n]) && (isalpha(str[n]) || str[n] == '_'))
        ++n;
    else
        return false;
 
    // 2文字目以降 (英数字 or アンダースコア)
    while (isascii(str[n]) && (isalnum(str[n]) || str[n] == '_')) ++n;

    //識別子を格納
    std::string identify =str.substr(Pos, Pos - n);

    //読み取り位置を更新
    Pos =n;

   return true;
}
1. 関数名
もとの関数名は ReadIdentify ですが、識別子は "identifier" なので、関数名もこれに併せて修正しました。
2. 読み込みの位置
もとのコードでは、関数内で ReadLine を用いてテキストデータを読み込んでいましたが、これは不適切。
これでは、空行に対応できませんし、1行に複数のトークンがある場合も上手く動作しません。(str を上書きしてしまっているから。)
プログラムの全体的な作りからして、この関数は str に充分な長さのテキスト (スクリプト) を読み込んでから呼び出す、といった使い方をする必要があります。
そのため、内部での読み込みは廃止しました。
3. 標準関数を使おう
C言語では、isalpha, isalnum といった関数が標準ライブラリにより提供されおり、これを使わない手はありません
また、これらの関数はテーブル参照で実装されているため、< <= 演算子を用いての比較よりもパフォーマンスに優れます。
4. ループと終了条件
もとのコードでは、2文字目以降を読み込むループの終了条件が分かりづらくなっています。
そもそも、空白 (' ') 以外の文字での終了が認められないことになっていますが、これは不適切です。(data=10; などに対応できない。)
修正版では、while ループを、識別子の要素となる文字が続いているうちは続行される、という自然な形式に修正しました。

続きを読む "コード添削" »

2007年11月30日

【c++】インタプリタを初めから丁寧に第03回

前回に引き続き字句解析プログラムの内容について考えます。
成田さんに添削していただいた部分も合わせて冗長な部分を削除した・・・つもりです。

  • 演算子
  • 制御文判別子

続きを読む "【c++】インタプリタを初めから丁寧に第03回" »

About 2007年11月

2007年11月にブログ "Codelogy" に投稿されたすべてのエントリーです。 過去のものから新しいものへ順番に並んでいます。

Prev: 2007年10月
Next: 2007年12月

メインページアーカイブページもご覧ください。