文字列の最初と最後にある二重引用符を削除したいと思います。
次のようにLexルールを使用して、入力ファイルから文字列リテラルを取得します。
\".*\" {yyno++; yylval.string = strdup(yytext); return STRINGLITERAL;}
しかし、Yaccプログラムのどこかで文字列を使用する場合は、文字列部分のみを使用したいと思います。
これを手伝ってくれませんか。
あなたはただ関連する部分を取る必要があります、例えば:
// you allocate a string which is the length of the token - 2 " + 1 for '\0'
yylval.string = calloc(strlen(yytext)-1, sizeof(char));
// you copy the string
strncpy(yylval.string, &yytext[1], strlen(yytext-2));
// you set the NULL terminating at the end
yylval.string[yytext-1] = '\0';
yytext == "\"foobar\""
そのため、最初に長さバイトの文字列を割り当てる場合8 - 2 + 1 = 7
(これは正しいのでfoobar\0
、次に、から始まる8〜2文字をコピーし'f'
、最後にNULL
終了文字を設定します。
NULL
実際には、callocメモリはすでに0に設定されているため、終了文字を配置する必要はありませんが、配置する必要がありmalloc
ます。
\".*\" {
yylval.string = (char*)calloc(strlen(yytext)-1, sizeof(char));
strncpy(yylval.string, &yytext[1], strlen(yytext)-2);
return STRINGLITERAL;
}
Janはそれをうまく説明しました、私はただlexを明確にし、次の貧しい魂のためにいくつかのタイプミスを修正しています。