флекс и бизон: строковый литерал

Мне нужен ваш совет о том, как получить строковый литерал. Строковые литералы — это все, что начинается с b", имеет ноль или более символов и заканчивается на ", Токен называется BYTES_OBJECT, bytes_type это имя типа, в котором хранятся такие строковые литералы.
Вот что я попробовал:

{%
#include "parser.hpp"#include <iostream>
#include <string>
string BUFFER;
%}

%option noyywrap
%x COMMENT
%x BYTESMODE

"b"[\"] {
BUFFER = string();
BEGIN BYTESMODE;
} // BYTESMODE

<BYTESMODE>{BYTES_HEXCODE} {
// convert to hexcode
} // BYTES_HEXCODE

<BYTESMODE>{BYTES_ESCAPE} {
yytext++; // Move to the next char
switch (*yytext) {
case '\'': BUFFER += '\''; break;
case '\"': BUFFER += '\"'; break;
case '\\': BUFFER += '\\'; break;
case '\?': BUFFER += '?';  break;
case 'a':  BUFFER += '\a'; break;
case 'b':  BUFFER += '\b'; break;
case 'f':  BUFFER += '\f'; break;
case 'n':  BUFFER += '\n'; break;
case 'r':  BUFFER += '\r'; break;
case 't':  BUFFER += '\t'; break;
case 'v':  BUFFER += '\v'; break;
} // end of switch
} // BYTES_ESCAPE

<BYTESMODE>[^\"] {
BUFFER += yytext;
} // BYTES_SYMBOL

<BYTESMODE>\" {
bytes_type object = BUFFER;
yylval.bytes_buffer = &object;
BEGIN INITIAL;
return BYTES_OBJECT;
} // closing quote

Однако, когда я пытаюсь создать строку, это вызывает ошибку сегмента. Если return BYTES_OBJECT раньше BEGIN INITIAL, он обрабатывает литералы некорректно. Как я могу решить это? Я думаю, что даже концепцию можно сделать проще, чем я написал.

Заранее спасибо!

1

Решение

Ваш входной файл имеет некоторые ошибки. Вы не должны делать такую ​​подробную обработку, чтобы распознать строки. Более простой пример:

%option noyywrap
%{
#include <iostream>
#include <string>
%}

%%
b\"(\\.|[^\\"])*\" {
std::cout << "string:" << yytext << std::endl;
return(1);
}

%%

int main() {
yylex();
return 0;
}
1

Другие решения

Других решений пока нет …