Строки кодирования Flex/Lex с экранированными символами

Я обращусь к этому вопросу для некоторого фона:

Регулярное выражение для строкового литерала в 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?


person Dan    schedule 24.03.2011    source источник


Ответы (1)


Ваше регулярное выражение просто соответствует строке \ escapes - оно фактически не переводит их в символы, которые они представляют. Я предпочитаю обрабатывать такие вещи с помощью гибкого начального состояния и буфера построения строк, который может накапливать символы. Что-то типа:

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

Это делает происходящее намного яснее, упрощает добавление нового кода обработки экранирования для новых экранирований и позволяет легко выдавать четкие сообщения об ошибках, когда что-то идет не так.

person Chris Dodd    schedule 24.03.2011
comment
Возможно также добавить <string><<EOF>> { error("unterminated string\n") } для дальнейшего использования? - person Downgoat; 23.01.2017