2

私はフレックスバイソンアプリケーションを持っています。いくつかのトークンについては、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番目のトークン(予期しないもの)では呼び出されません。予期しないトークンを破壊する方法を見つけることができませんでした。誰かが私がそれをどのようにすべきか知っていますか?

4

1 に答える 1

4

Flex で「エラー」トークンを適切に使用すると、デストラクタ関数を正しく呼び出すように促されることがわかりました。私に行きます!

parse.y
...
%destructor { free($$); } IDENT
%destructor { free($$->name); free($$->type); free($$); } tag
...
tags: tag tags | error tags | ;

tag: IDENT '{' IDENT '}'
     {
         struct tag *mytag = malloc(sizeof(struct tag));
         mytag->name = $1;
         mytag->type = $3;
         $<tag>$ = mytag;
     }
...
于 2010-07-20T13:29:22.277 に答える