文字列リテラルを取得する方法についてアドバイスが必要です。文字列リテラルは、で始まりb"
、0個以上の記号があり、で終わるすべてのもの"
です。トークンはと呼ばれ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
、リテラルは正しく処理されません。どうすれば解決できますか?コンセプトでさえ、私が書いたよりも簡単にできると思います。
前もって感謝します!