C++ flex和bison:字符串文本

C++ flex和bison:字符串文本,c++,string,bison,flex-lexer,C++,String,Bison,Flex Lexer,我需要你关于如何获取字符串文字的建议。字符串文字是以b“开头,然后有零个或多个符号,最后以”结尾的所有内容。令牌被称为BYTES\u对象bytes\u type是存储此类字符串文本的类型名称。 以下是我尝试过的: {% #include "parser.hpp" #include <iostream> #include <string> string BUFFER; %} %option noyywrap %x COMMENT %x BYTESMODE "b"[\"]

我需要你关于如何获取字符串文字的建议。字符串文字是以
b“
开头,然后有零个或多个符号,最后以
结尾的所有内容。令牌被称为
BYTES\u对象
bytes\u 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
{%
#包括“parser.hpp”
#包括
#包括
字符串缓冲区;
%}
%选项No yywrap
%x评论
%x字节模式
“b”[\“]{
BUFFER=string();
开始字节模式;
}//字节模式
{BYTES_HEXCODE}{
//转换为十六进制代码
}//字节\u十六进制代码
{BYTES_ESCAPE}{
yytext++;//移动到下一个字符
开关(*yytext){
大小写'\'':缓冲区+='\'';中断;
大小写“\”:缓冲区+=”\”;中断;
大小写“\\”:缓冲区+=“\\”;中断;
大小写“\?”:缓冲区+=”?”;中断;
案例“a”:缓冲区+=“\a”;中断;
案例“b”:缓冲区+='\b';中断;
案例“f”:缓冲区+=“\f”;中断;
案例'n':缓冲区+='\n';中断;
案例'r':缓冲区+='\r';中断;
案例't':缓冲区+='\t';中断;
大小写“v”:缓冲区+=“\v”;中断;
}//开关结束
}//字节\u转义
[^\"] {
缓冲区+=文本;
}//字节\u符号
\" {
字节\类型对象=缓冲区;
yylval.bytes_buffer=&object;
开始首字母;
返回字节作为对象;
}//结束报价
然而,当我试图创建字符串时,它会导致段错误。如果
返回字节\u对象
开始初始
之前,它会处理不正确的文本。我如何解决它?我想即使是概念也可以比我写的更容易


提前感谢!

您的输入文件有一些错误。您不应该仅仅为了识别字符串而进行如此详细的处理。一个简单的示例:

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

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

%%

int main() {
  yylex();
  return 0;
}
%选项noyywrap
%{
#包括
#包括
%}
%%
b\“(\\.\[^\\”])*\”{

std::cout您的输入文件有一些错误。您不应该仅仅为了识别字符串而进行如此详细的处理。一个简单的示例:

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

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

%%

int main() {
  yylex();
  return 0;
}
%选项noyywrap
%{
#包括
#包括
%}
%%
b\“(\\.\[^\\”])*\”{

std::它能处理转义序列吗?如果文字被翻译成下一行,比如“abcde\fgh”(在“e”之后是空行),该怎么办你可以检查一下。据我所知,
yytext
只是一个指向
char
数组的指针。将它复制到
%union
bison
的最好方法是使用
strdup
足够了吗?对于
b“1\n\t2”
,它应该返回
b“1\n\t2”“
。换句话说,它不识别转义序列。是的,但在识别文本后处理它们更容易。它处理转义序列吗?如果文本被翻译成下一行,类似于“abcde\fgh”(在“e”之后是空行),该怎么办你可以检查一下。据我所知,
yytext
只是一个指向
char
数组的指针。将它复制到
%union
bison
的最好方法是使用
strdup
足够了吗?对于
b“1\n\t2”
,它应该返回
b“1\n\t2”
。换句话说,它不识别转义序列。是的,但在识别文本后处理它们更容易。