Flex lexer输出修改

时间:2013-04-05 14:21:53

标签: c++ parsing token lexer flex-lexer

如何在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解决方案给出“/ *”作为值。

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

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

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

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