今日の作業
yaccファイルをいじって、変数の定義と参照ができるようにした。変数表のためにハッシュテーブルを実装する。ハッシュ関数は適当に決めた。まあ大丈夫でしょう。多分。
yylvalにcharポインタを持たせて、そこに変数名(の文字列)をstrndupしてyytextを保存している。のだが、これって、やっぱり勝手に解放はしてくれないのだろうなあ。yytextの保存のしかたを考えないといけない。あと、これでは絶対駄目。
%union { char* p_name; } %right EQ %% exp: ID EQ exp { printf("id: %s\n", $1.p_name); }
{ID} {
yylval.p_name = yytext;
return ID;
}
yytextが指している文字列(の実体)がトークンを読み込むたびにどんどん伸びていくから(?)。
このパーサに"a = 4"を読ませると、変数名が"a = 4"になってしまう("id: a = 4"と表示される)。
きっと複写が必要。
{ID} { yylval.p_name = strndup(yytext, yyleng); return ID; }
こんなふうに。ただし、このままではリーク確定。どうにかする。