Модификация вывода Flex lexer

Как я могу использовать 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, но все же не могу решить вышеуказанную проблему)

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

Вы должны иметь возможность использовать подобное регулярное выражение для обработки строк.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]