2011-03-24 66 views
3

我將把這個問題的一些背景:與轉義字符的Flex /萊克斯編碼字符串

Regular expression for a string literal in flex/lex

我有被處理的輸入,在我的詞法分析器和我轉義字符的問題認爲這可能是一個與字符串編碼有關的問題,但我不確定。

這裏的是我如何在我的詞法分析器處理字符串字面量:

\"(\\.|[^\\"])*\" 
{     
    char* text1 = strndup(yytext + 1, strlen(yytext) - 2); 
    char* text2 = "text\n"; 

    printf("value = <%s> <%x>\n", text1, text1); 
    printf("value = <%s> <%x>\n", text2, text2); 
} 

此輸出以下:

value = <text\n"> <15a1bb0> 
value = <text 
> <7ac871> 

這似乎是分開處理的換行符作爲一個反斜槓後跟ñ。

這裏發生了什麼,我如何處理文本以與C輸入相同?

回答

9

您的正則表達式只是匹配string \ escapes - 它實際上並沒有將它們轉換爲它們表示的字符。我更喜歡用可以積累字符的flex start狀態和字符串構建緩衝區來處理這類事情。喜歡的東西:

%{ 
static StringBuffer strbuf; 
%} 
%x string 
%% 

\"     { BEGIN string; ClearBuffer(strbuf); } 
<string>[^\\"\n]* { AppendBufferString(strbuf, yytext); } 
<string>\\n   { AppendBufferChar(strbuf, '\n'); } 
<string>\\t   { AppendBufferChar(strbuf, '\t'); } 
<string>\\[0-7]* { AppendBufferChar(strbuf, strtol(yytext+1, 0, 8)); } 
<string>\\[\\"]  { AppendBufferChar(strbuf, yytext[1]); } 
<string>\"   { yylval.str = strdup(BufferData(strbuf)); BEGIN 0; return STRING; } 
<string>\\.   { error("bogus escape '%s' in string\n", yytext); } 
<string>\n   { error("newline in string\n"); } 

這使得正在發生的事情更清晰,可以很容易地添加新的轉義處理代碼新逃逸,使出問題的時候很容易地發出清楚的錯誤消息。

+0

也許還加上'<> {error(「unterminated string \ n」)}'以備將來參考? – Downgoat 2017-01-22 23:13:41