a21_txt01_2の補足説明#2

(0)

(1) lexer()をmallocを使って書き直してみると・・・

int lexer(String s, String b, String t[])		// プログラムを単語(トークン)に切り分ける.
{
    int i = 0, j = 0, k = 0;
    for (;;) {
        if (s[i] == ' ' || s[i] == '\t' || s[i] == '\n') {	// スペース、タブ、改行.
            i++;
            continue;
        }
        if (s[i] == 0)	// ファイル終端.
            return k;
        t[k++] = &b[j];	// 単語の先頭を登録.
        if (strchr("(){}[];,", s[i]) != 0) {	// 1文字記号.
            b[j++] = s[i++];
        } else if ('0' <= s[i] && s[i] <= '9') {  // 1文字目が数字.
            while ('0' <= s[i] && s[i] <= '9')
                b[j++] = s[i++];
        } else if (isAlphabet(s[i]) != 0) {  // 1文字目が英字.
            while (isAlphabet(s[i]) != 0 || ('0' <= s[i] && s[i] <= '9'))
                b[j++] = s[i++];
        } else if (strchr("=+-*/!%&~|<>?:.", s[i]) != 0) {  // 1文字目が普通の記号.
            while (strchr("=+-*/!%&~|<>?:.", s[i]) != 0 && s[i] != 0)
                b[j++] = s[i++];
        } else {
            printf("syntax error : %.10s\n", &s[i]);
            exit(1);
        }
        b[j++] = 0; // 単語の終端コード.
    }
}
int lexer(String s, String t[])		// プログラムを単語(トークン)に切り分ける.
{
    int i = 0, len, k = 0;
    for (;;) {
        if (s[i] == ' ' || s[i] == '\t' || s[i] == '\n') {	// スペース、タブ、改行.
            i++;
            continue;
        }
        if (s[i] == 0)	// ファイル終端.
            return k;
        len = 0;
        if (strchr("(){}[];,", s[i]) != 0) {	// 1文字記号.
            len = 1;
        } else if ('0' <= s[i] && s[i] <= '9') {  // 1文字目が数字.
            while ('0' <= s[i + len] && s[i + len] <= '9')
                len++;
        } else if (isAlphabet(s[i]) != 0) {  // 1文字目が英字.
            while (isAlphabet(s[i + len]) != 0 || ('0' <= s[i + len] && s[i + len] <= '9'))
                len++;
        } else if (strchr("=+-*/!%&~|<>?:.", s[i]) != 0) {  // 1文字目が普通の記号.
            while (strchr("=+-*/!%&~|<>?:.", s[i + len]) != 0 && s[i + len] != 0)
                len++;
        } else {
            printf("syntax error : %.10s\n", &s[i]);
            exit(1);
        }
        t[k] = malloc(len + 1);
        strncpy(t[k], &s[i], len);
        t[k][len] = 0; // 単語の終端コード.
        i += len;
        k++;
    }
}

こめんと欄


コメントお名前NameLink

トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS