[英]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_OBJECT
在BEGIN 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.