如何在C ++中使用flex lexer并修改令牌的yytext
值?
可以说,我有这样的规则:
"/*" {
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);
}
}
}
我希望在tokens::COMMENT
和/*
之间获得带有评论值的令牌*/
。
(bove解决方案给出“/ *”作为值。
另外,非常重要的是跟踪行号,所以我正在寻找支持它的解决方案。
修改
我当然可以修改yytext
和yyleng
值(例如yytext+=1; yyleng-=1
,但我仍然无法解决上述问题)
答案 0 :(得分: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); }
我使用以下作为参考:
http://ostermiller.org/findcomment.html
https://stackoverflow.com/a/2130124/1003855
您应该能够使用类似的正则表达式来处理字符串。