Как я могу использовать flex lexer в C ++ и модифицировать токен 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
со значением комментария между /*
а также */
,
(Бове решение дает «/ *» в качестве значения.
Дополнительным, очень важным является отслеживание номера строки, поэтому я ищу решение, поддерживающее его.
РЕДАКТИРОВАТЬ
Конечно, я могу изменить 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); }
Я использовал следующие ссылки:
http://ostermiller.org/findcomment.html
https://stackoverflow.com/a/2130124/1003855
Вы должны иметь возможность использовать подобное регулярное выражение для обработки строк.
Других решений пока нет …