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

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

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

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

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

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

这输出如下:

 value =   value =   

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

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

你的正则表达式只匹配字符串\转义符 – 它实际上并没有将它们转换为它们所代表的字符。 我更喜欢使用flex start状态和可以累积字符的字符串构建缓冲区来处理这类事情。 就像是:

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

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