(0)
(1) lexer()をmallocを使って書き直してみると・・・
- 以下のlexer()は引数bがいまいちピンとこないかもしれないと、今になって思いました。
- だからもっと普通の書き方をしたらどうなるかを紹介したいと思います。
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++;
}
}
- これで分かるように書き換え前のlexer()におけるbの役割は、malloc()の代わりです。
こめんと欄