Flex lexer输出修改 如何在C++中使用Flex Listor并修改令牌的代码> yyTest< /Cl>值? 比如说,我有这样一条规则: "/*" { char c; while(true) { c = yyinput(); if(c == '\n') ++mylineno; if (c==EOF){ yyerror( "EOF occured while processing comment" ); break; } else if(c == '*') { if((c = yyinput()) == '/'){ return(tokens::COMMENT);} else unput(c); } } }

Flex lexer输出修改 如何在C++中使用Flex Listor并修改令牌的代码> yyTest< /Cl>值? 比如说,我有这样一条规则: "/*" { char c; while(true) { c = yyinput(); if(c == '\n') ++mylineno; if (c==EOF){ yyerror( "EOF occured while processing comment" ); break; } else if(c == '*') { if((c = yyinput()) == '/'){ return(tokens::COMMENT);} else unput(c); } } },c++,parsing,token,lexer,flex-lexer,C++,Parsing,Token,Lexer,Flex Lexer,我想获得标记tokens::COMMENT,其COMMENT值介于/*和*/之间。 (上述解决方案给出“/*”作为值 另外,非常重要的是跟踪行号,所以我正在寻找支持它的解决方案 编辑 当然我可以修改yytext和yyleng值(比如yytext+=1;yyleng-=1,但我仍然无法解决上述问题)我仍然认为启动条件是正确的答案 %x C_COMMENT char *str = NULL; void addToString(char *data) { if(!str) {

我想获得标记
tokens::COMMENT
,其COMMENT值介于
/*
*/
之间。 (上述解决方案给出“/*”作为值

另外,非常重要的是跟踪行号,所以我正在寻找支持它的解决方案

编辑
当然我可以修改
yytext
yyleng
值(比如
yytext+=1;yyleng-=1
,但我仍然无法解决上述问题)

我仍然认为启动条件是正确的答案

%x C_COMMENT
char *str = NULL;
void addToString(char *data)
{
    if(!str)
    { 
        str = strdup(data);
    }
    else
    {
        /* handle string concatenation */
    }
}

"/*"                       { BEGIN(C_COMMENT); }
<C_COMMENT>([^*\n\r]|(\*+([^*/\n\r])))*    { addToString(yytext); }
<C_COMMENT>[\n\r]          { /* handle tracking, add to string if desired */ }
<C_COMMENT>"*/"            { BEGIN(INITIAL); }
%x C\u注释
char*str=NULL;
void addToString(字符*数据)
{
如果(!str)
{ 
str=strdup(数据);
}
其他的
{
/*句柄字符串串联*/
}
}
“/*”{开始(C_注释);}
([^*\n\r]|(\*+([^*/\n\r]))*{addToString(yytext);}
[\n\r]{/*句柄跟踪,如果需要,添加到字符串中*/}
“*/”{开始(首字母);}
我使用以下内容作为参考:


您应该能够使用类似的正则表达式来处理字符串。

我仍然认为开始条件是正确的答案

%x C_COMMENT
char *str = NULL;
void addToString(char *data)
{
    if(!str)
    { 
        str = strdup(data);
    }
    else
    {
        /* handle string concatenation */
    }
}

"/*"                       { BEGIN(C_COMMENT); }
<C_COMMENT>([^*\n\r]|(\*+([^*/\n\r])))*    { addToString(yytext); }
<C_COMMENT>[\n\r]          { /* handle tracking, add to string if desired */ }
<C_COMMENT>"*/"            { BEGIN(INITIAL); }
%x C\u注释
char*str=NULL;
void addToString(字符*数据)
{
如果(!str)
{ 
str=strdup(数据);
}
其他的
{
/*句柄字符串串联*/
}
}
“/*”{开始(C_注释);}
([^*\n\r]|(\*+([^*/\n\r]))*{addToString(yytext);}
[\n\r]{/*句柄跟踪,如果需要,添加到字符串中*/}
“*/”{开始(首字母);}
我使用以下内容作为参考:


您应该能够使用类似的正则表达式来处理字符串。

您是否有一个解析器从这里获取令牌。或者它只是lexer?您可以在解析器中轻松解决这个问题。我真的很想在lexer中解决它-可能吗?请查看现有答案:抱歉,我的问题没有答案:(@danilo2好的。那么你如何处理字符串?你有一些池来存储它们吗?或者告诉我你如何识别字符串文字。你有一个解析器从这里提取标记。或者它只是lexer?你可以在解析器中轻松解决这个问题。我真的很想在lexer中解决它-有可能吗?检查一下现有的答案:抱歉,但是re不是我问题的答案:(@danilo2好的。那么你如何处理字符串?你有存储字符串的池吗?或者告诉我你如何识别字符串文字。你的解决方案不跟踪行号。因此,如果你想获取位置信息,你不能这样做。如果这是一个要求,那么我将修改我的代码以支持它。是的(我更新了问题),因此如果您知道答案,我将对此表示感谢。您的解决方案不跟踪行号。因此,如果您想要获取位置信息,您无法这样做。如果这是一项要求,那么我将修改代码以支持它。是的,(我更新了问题),因此如果您知道答案,我将对此表示感谢。