簡體   English   中英

flex和bison:字符串文字

[英]flex and bison: string literal

我需要您關於如何獲取字符串文字的建議。 字符串文字是所有以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_OBJECTBEGIN INITIAL之前,則它將處理不正確的文字。 我該如何解決? 我想即使是概念,也比我寫的要容易。

提前致謝!

您的輸入文件有一些錯誤。 您不應該僅僅為了識別字符串而進行如此詳細的處理。 一個簡單的例子:

%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