text0017
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
単語検索
|
最終更新
|
ヘルプ
]
開始行:
* 川合のプログラミング言語自作のためのテキスト第二版#0008
-(by [[K]], 2019.06.30)
** (15) TL-1k
-ここからの話題は単に言語を作るという話ではなく、ライブラ...
-ここからはC言語ではなくC++を使いますが、C++固有の難しい...
-以下に示すプログラムは、TL-1cを川合の自作ライブラリ kll0...
-kll0 はまだ公開していないので、以下のプログラムを簡単に...
#include "kll0.h"
int main(int argc, const char **argv)
{
int i, pc = 0, var[256]; // 変数.
unsigned char *txt = (unsigned char *) kerrorExitP0(...
for (i = 0; i < 10; i++)
var['0' + i] = i;
for (; txt[pc] != 0; pc++) {
if (txt[pc] == '\n' || txt[pc] == ' ' || txt[pc]...
continue;
if (txt[pc + 1] == '=') { // 2文字目が"=".
if (txt[pc + 3] == ';') { // 単純代入.
var[txt[pc]] = var[txt[pc + 2]];
} else if (txt[pc + 3] == '+' && txt[pc + 5]...
var[txt[pc]] = var[txt[pc + 2]] + var[tx...
} else if (txt[pc + 3] == '-' && txt[pc + 5]...
var[txt[pc]] = var[txt[pc + 2]] - var[tx...
} else
goto err;
} else if (txt[pc] == 'p' && txt[pc + 1] == 'r' ...
printf("%d\n", var[txt[pc + 6]]);
} else
goto err;
while (txt[pc] != ';')
pc++;
}
exit(0); // ファイル終端.
err:
kerrorExit("syntax error : %.30s", &txt[pc]);
}
-TL-1c(参照:[[text0010]])と比較すると、最初のloadText(...
-kll0 は、言語開発を支援することを目指したライブラリで、...
-支援が充実しているおかげで、言語そのものの記述に集中でき...
-void *kreadFileA(char *path, char *mode1, int mode2)
--ファイルをオープンしてメモリに読み込みます。mode1はfope...
--mode2= 1:fopenでエラーが生じたら、適当なエラーメッセー...
--mode2で1が指定されていないのにfopenがエラーになった場合...
--なおkreadFileが確保したメモリはmain()から抜ける時に自動...
-void kerrorExit(char *s, ...)
--文字列をstderrにprintfした後、exit(1)します。そんなのラ...
-void *kerrorExitP0(void *p, char *s, ...)
--もしpが0であれば、s以降を使ってkerrorExit()します。もし...
--これだってif文を一つ書けば済むことなのでありますが、少...
-こうしてTL-1kは31行で書けているわけです。
** 次回に続く
-次回: [[text0018]]
*こめんと欄
#comment
終了行:
* 川合のプログラミング言語自作のためのテキスト第二版#0008
-(by [[K]], 2019.06.30)
** (15) TL-1k
-ここからの話題は単に言語を作るという話ではなく、ライブラ...
-ここからはC言語ではなくC++を使いますが、C++固有の難しい...
-以下に示すプログラムは、TL-1cを川合の自作ライブラリ kll0...
-kll0 はまだ公開していないので、以下のプログラムを簡単に...
#include "kll0.h"
int main(int argc, const char **argv)
{
int i, pc = 0, var[256]; // 変数.
unsigned char *txt = (unsigned char *) kerrorExitP0(...
for (i = 0; i < 10; i++)
var['0' + i] = i;
for (; txt[pc] != 0; pc++) {
if (txt[pc] == '\n' || txt[pc] == ' ' || txt[pc]...
continue;
if (txt[pc + 1] == '=') { // 2文字目が"=".
if (txt[pc + 3] == ';') { // 単純代入.
var[txt[pc]] = var[txt[pc + 2]];
} else if (txt[pc + 3] == '+' && txt[pc + 5]...
var[txt[pc]] = var[txt[pc + 2]] + var[tx...
} else if (txt[pc + 3] == '-' && txt[pc + 5]...
var[txt[pc]] = var[txt[pc + 2]] - var[tx...
} else
goto err;
} else if (txt[pc] == 'p' && txt[pc + 1] == 'r' ...
printf("%d\n", var[txt[pc + 6]]);
} else
goto err;
while (txt[pc] != ';')
pc++;
}
exit(0); // ファイル終端.
err:
kerrorExit("syntax error : %.30s", &txt[pc]);
}
-TL-1c(参照:[[text0010]])と比較すると、最初のloadText(...
-kll0 は、言語開発を支援することを目指したライブラリで、...
-支援が充実しているおかげで、言語そのものの記述に集中でき...
-void *kreadFileA(char *path, char *mode1, int mode2)
--ファイルをオープンしてメモリに読み込みます。mode1はfope...
--mode2= 1:fopenでエラーが生じたら、適当なエラーメッセー...
--mode2で1が指定されていないのにfopenがエラーになった場合...
--なおkreadFileが確保したメモリはmain()から抜ける時に自動...
-void kerrorExit(char *s, ...)
--文字列をstderrにprintfした後、exit(1)します。そんなのラ...
-void *kerrorExitP0(void *p, char *s, ...)
--もしpが0であれば、s以降を使ってkerrorExit()します。もし...
--これだってif文を一つ書けば済むことなのでありますが、少...
-こうしてTL-1kは31行で書けているわけです。
** 次回に続く
-次回: [[text0018]]
*こめんと欄
#comment
ページ名: