Строки кодирования Flex / Lex с экранированными символами - PullRequest
3 голосов
/ 24 марта 2011

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

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

11 голосов
/ 24 марта 2011

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

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

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

...