今日の作業

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;
}

こんなふうに。ただし、このままではリーク確定。どうにかする。