1

文字列リテラルを取得する方法についてアドバイスが必要です。文字列リテラルは、で始まり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、リテラルは正しく処理されません。どうすれば解決できますか?コンセプトでさえ、私が書いたよりも簡単にできると思います。

前もって感謝します!

4

1 に答える 1

1

入力ファイルにエラーがあります。文字列を認識するためだけに、このような詳細な処理を行うべきではありません。より簡単な例:

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

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

%%

int main() {
  yylex();
  return 0;
}
于 2012-12-24T22:57:47.093 に答える