【问题标题】:Flex lexer output modificationFlex 词法分析器输出修改
【发布时间】:2013-04-05 14:21:52
【问题描述】:

如何在 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,其评论值在/**/ 之间。 (上述解决方案将“/*”作为值。

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

编辑 当然我可以修改yytextyyleng的值(比如yytext+=1; yyleng-=1,但是还是不能解决上面的问题)

【问题讨论】:

  • 你有一个解析器从这里获取令牌。或者它只是词法分析器?您可以在解析器中轻松解决此问题。
  • 我真的很想在词法分析器中解决它 - 有可能吗?
  • 对不起,我的问题没有答案:(
  • @danilo2 好的。那么如何处理字符串呢?你有一些水池来存放它们吗?或者告诉我你是如何识别字符串文字的。

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


【解决方案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

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

【讨论】:

  • 您的解决方案不跟踪行号。所以如果你想获取地点信息,你是做不到的。
  • 如果这是一个要求,那么我将修改我的代码以支持它。
  • 是的(我更新了问题),所以如果您知道答案,我将不胜感激。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-27
  • 2011-07-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多