を使用して文字列語彙素をコピーするフレックス コードがありますstrdup()
。
%{
#include "json.tab.h"
#define YY_DECL extern "C" int yylex()
%}
%option noyywrap
%%
[ \t\n]+ ;
\"[a-zA-Z]+\" {yylval.sval = strdup(yytext); return STRING; }
[0-9]+ {yylval.ival = atoi(yytext); return NUMBER; }
. {return yytext[0];} ;
%%
strdup()
メモリを割り当て、入力文字列をそれにコピーして返す ( strdup() - C では何をしますか? ) ため、不要になったら解放する必要があると思います。
この投稿から: BISON で %destructor が呼び出されるのはいつですか? %destructor { free($$); printf("free");} STRING
、 yacc ファイルに追加しました。
ただし、から返された新しい文字列が に割り当てられfree()
ている場合でも、 が呼び出されることはありません。yylval.sval
strdup()
何が間違っている可能性がありますか? フレックス/バイソンで割り当てられた文字列を解放する方法は?
追加した
次のように静的に割り当てられた sval を使用することを考えます。
%union {
int ival;
char sval[100]; // char* sval;
}
フレックスコードは次のようになります (yytext が 100 バイト未満の場合はチェックコードなし):
\"[a-zA-Z]+\" {
//yylval.sval = strdup(yytext);
memset(yylval.sval, 0, 100);
strcpy(yylval.sval, yytext);
return STRING;
}
このアプローチが人々が通常使用するものであるかどうかはわかりません。
追加2
私のアプリケーションでは、簡単なインターンシップで問題ありません。
extern char buffer[]; // [100];
%}
%option noyywrap
%%
\"[a-zA-Z]+\" {
//yylval.sval = strdup(yytext);
memset(buffer, 0, 100);
strcpy(buffer, yytext);
yylval.sval = buffer;
return STRING;
}
...
char buffer[100];
yacc コードの場合
%union {
int ival;
char *sval;
}