私はフレックスバイソンアプリケーションを持っています。いくつかのトークンについては、strdupを使用してflexからyytextをコピーします。これは、予期しないトークンのエラーがある場合を除いて、うまく機能します。
簡単な例
flex.l:
...
[a-zA-Z0-9]+ { lval.string = strdup(yytext); return IDENT };
[\{\}] { return yytext[0] };
...
と
parse.y
...
%destructor { free($$); } IDENT
%destructor { free($$->name); free($$->type); free($$); } tag
...
tag: IDENT '{' IDENT '}'
{
struct tag *mytag = malloc(sizeof(struct tag));
mytag->name = $1;
mytag->type = $3;
$<tag>$ = mytag;
}
...
ここで、入力を渡したとします。
blah blah blah
レクサーは最初のIDENTトークンを送信し、スタックにプッシュされます。最初のトークンの後、ブラケットトークンが必要ですが、代わりに別のIDENTトークンを取得します。これは構文エラーです。デストラクタは最初のIDENTトークンで呼び出されますが、2番目のトークン(予期しないもの)では呼び出されません。予期しないトークンを破壊する方法を見つけることができませんでした。誰かが私がそれをどのようにすべきか知っていますか?