使用转义字符的 Flex / Lex 编码字符串

7

以下是一些背景信息的参考:

在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>

看起来它将换行字符单独处理为反斜杠后跟着一个n。

这里发生了什么,我该如何处理文本以使其与C输入相同?

1个回答

17

你的正则表达式只匹配字符串中的转义符,而不是将它们转换为对应的字符。我更喜欢使用flex起始状态和字符串构建缓冲区来处理这种情况,可以累加字符。类似于:

%{
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"); }

这样做可以使情况更加清晰,易于为新的转义添加处理代码,并在出现问题时发出清晰的错误消息。请保留HTML标签。

4
或许还可以加上 <string><<EOF>> { error("未结束的字符串\n") } 作为参考? - Downgoat

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接