2011-03-24 63 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