我想消除位於字符串開頭和結尾的雙引號。lex - 如何從字符串文字中消除雙引號
我拿一個字符串從使用萊克斯規則我的輸入文件如下:
\".*\" {yyno++; yylval.string = strdup(yytext); return STRINGLITERAL;}
但是,當我在Yacc的程序某處使用一個字符串,我希望只使用字符串的一部分。
你能幫我解決嗎?
我想消除位於字符串開頭和結尾的雙引號。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 - 從'f'
開始2個字符,最後你設定的NULL
終止字符。
其實用calloc內存已被設置爲0,所以你不需要放置NULL
終止符但malloc
你會的。
\".*\" {
yylval.string = (char*)calloc(strlen(yytext)-1, sizeof(char));
strncpy(yylval.string, &yytext[1], strlen(yytext)-2);
return STRINGLITERAL;
}
Jan解釋得很清楚,我只是澄清lex併爲下一個可憐的靈魂確定一些拼寫錯誤。
你的字符串文字模式既貪婪又不夠貪婪。它過於貪婪,因爲它會將''abc「+」def「'解析爲單個字符串文字(這不是字符串文字通常定義的方式)。它不夠貪婪,因爲它不處理嵌入字符串中的雙引號。有兩種主要的處理方式:(1)雙引號加倍(''abc「」def「',這是刪除雙引號時的字符串'abc'def'),或者(2)使用一個轉義字符,通常是反斜槓''\\''來處理它('「abc \」def「')。選擇你約定的目標。 –
這不是Lex規則,而不是Yacc規則? –
這是一個Lex規則。 – yildizabdullah