0

文字列の最初と最後にある二重引用符を削除したいと思います。

次のようにLexルールを使用して、入力ファイルから文字列リテラルを取得します。

\".*\"   {yyno++; yylval.string = strdup(yytext); return STRINGLITERAL;}

しかし、Yaccプログラムのどこかで文字列を使用する場合は、文字列部分のみを使用したいと思います。

これを手伝ってくれませんか。

4

2 に答える 2

2

あなたはただ関連する部分を取る必要があります、例えば:

 // 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ます。

于 2013-01-06T18:25:12.110 に答える
1
\".*\" {
    yylval.string = (char*)calloc(strlen(yytext)-1, sizeof(char));
    strncpy(yylval.string, &yytext[1], strlen(yytext)-2);
    return STRINGLITERAL;
}

Janはそれをうまく説明しました、私はただlexを明確にし、次の貧しい魂のためにいくつかのタイプミスを修正しています。

于 2013-11-22T20:38:55.570 に答える