具有转义字符的Flex/Lex编码字符串

Dan*_*Dan 3 c string lex bison flex-lexer

我将在某些背景下提到这个问题:

flex/lex中字符串文字的正则表达式

我遇到的问题是在我的词法分析器中使用转义字符处理输入,我认为这可能与字符串的编码有关,但我不确定.

这是我在lexer中处理字符串文字的方式:

\"(\\.|[^\\"])*\"
{                   
    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);
}
Run Code Online (Sandbox Code Playgroud)

这输出如下:

value = <text\n"> <15a1bb0>
value = <text
> <7ac871>
Run Code Online (Sandbox Code Playgroud)

它似乎将换行符分别视为反斜杠后跟n.

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

Chr*_*odd 12

你的正则表达式只匹配字符串\转义符 - 它实际上并没有将它们转换为它们所代表的字符.我更喜欢使用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"); }
Run Code Online (Sandbox Code Playgroud)

这使得事情变得更加清晰,可以轻松地为新的转义添加新的转义处理代码,并且可以在出现问题时轻松发出明确的错误消息.

  • 也许还要添加`<string> << EOF >> {error("unterminated string \n")}`以供将来参考? (3认同)