実験演習

svnリポジトリを漁っていたら、昔の学部の実験演習の課題ソースが出てきた。
最初の方はひどいソースコードになっているw「今なら言える…ここはこう書くべきだろ」の連続でした。

コンパイラ作成とか正直難しかったなぁ。

%%
[0-9]+    {
  yylval.i = atoi(yytext);
  return CONSTANT;
}
"int"     return INT;
"while"   return WHILE;
"if"      return IF;
"else"    return ELSE;
"return"  return RETURN;
">="      return MT;
"<="      return LT;
"=="      return EQ;
"||"      return OR;
"&&"      return AND;
"!="      return NEQ;
"-"|"+"|"*"|"/"|">"|"<"|"{"|"("|")"|"}"|","|";"|"=" {
  return *yytext;
}
[a-z][a-z0-9_]* {
  if (!(yylval.n = lookup_sym(yytext))) {
    yylval.n = make_token_node(yytext);
  }
  return IDENTIFIER;
}
[ \t\n] ;
. {
  printf("Error: invalid character\n");
  yyerror("Error: invalid character");
}
%%

lexはまだいいけど、yaccは…。

function_definition:
		INT declarator '(' { $2 = make_fun_def($2); cur_lev++; } parameter_type_list
		{ set_argnum($2); }
		')' compound_statement
		{ $$ = make_tuple(FUNDEF, $2, $5, $8, NULL); pop(); cur_lev--; argnum = 0;}
	|	INT declarator '(' { cur_lev++; } ')' compound_statement
                { $$ = make_tuple(FUNDEF, make_fun_def($2), NULL, $6, NULL); pop(); cur_lev--; }

今なら多少は読めるけど、当時はきつかったなぁ…。
でもこれを作ったおかげで、かなり地平を見渡せるようになったというのもまた事実。コンピュータの勉強をしたいならコンパイラを作ることを、誰ともなくお勧めしておこう…。

CGレンダリングとかは割合簡単だった。というか、あれは計算式を実装するだけだった。強いて言えば、Cでの浮動小数点計算のコツを掴むための演習だったのではなかろうか。

オークションエージェントとかも出てきて懐かしむ。C++で書いたらTAがすごく嫌そうな顔したのを覚えてるwあれはほとんど数学の勉強だったなぁ。理論さえ分かれば、あとは計算式を実装するだけやし。でも、高度な数学をプログラムに落とすと、バグが取りにくくなることが分かった。

今は昔。