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”
。换句话说,它不识别转义序列。是的,但在识别文本后处理它们更容易。