简体   繁体   English

flex和bison:字符串文字

[英]flex and bison: string literal

I need your advice on how to get string literal. 我需要您关于如何获取字符串文字的建议。 String literals is everything what starts with b" , has zero or more symbols then and ends with " . 字符串文字是所有以b"开头,零个或多个符号然后以"结尾" Token is called BYTES_OBJECT . 令牌称为BYTES_OBJECT bytes_type is a name of type which stores such string literals. bytes_type是存储此类字符串文字的类型名称。 Here is what I've tried: 这是我尝试过的:

{%
#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

However, when I try to create string, it cause segment fault. 但是,当我尝试创建字符串时,它会导致段错误。 If return BYTES_OBJECT is before BEGIN INITIAL , it processes literals incorrect. 如果return BYTES_OBJECTBEGIN INITIAL之前,则它将处理不正确的文字。 How can I solve it? 我该如何解决? I guess that even concept can be done more easy than I've written. 我想即使是概念,也比我写的要容易。

Thanks in advance! 提前致谢!

Your input file has some errors. 您的输入文件有一些错误。 You should not be doing such detailed handling just to recognize strings. 您不应该仅仅为了识别字符串而进行如此详细的处理。 A simpler example: 一个简单的例子:

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

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

%%

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM