代码之家  ›  专栏  ›  技术社区  ›  HAL9000

如何在C++中使用yyTub?

  •  1
  • HAL9000  · 技术社区  · 6 年前

    我希望访问扫描仪规则内的外部结构。使用C语言时,会提供YYExtra作为解决方案。显然,当生成C++扫描仪时,YyTube是不可用的。 实现相同目标的正确解决方案是什么?

    1 回复  |  直到 6 年前
        1
  •  2
  •   rici    6 年前

    您可以从中派生自己的lexer类 yyFlexLexer 加上你想要的。

    如果这样做,您可能希望告诉flex您的类的名称:

    %option yyclass="myLexer"
    

    参见的说明 this option 以下内容:

    ‘--yyclass=NAME, %option yyclass="NAME"’
    …通知flex您已经 NAME 作为 YYflexlexer公司 ,因此flex将把您的操作放在成员函数中 NAME::yylex() 而不是 yyFlexLexer::yylex() ….

    以及 note about the yylex() 成员函数:

    virtual int yylex()
    执行相同的角色是 年x月x日 对于普通的flex扫描仪:它扫描输入流,使用令牌,直到规则的操作返回值。如果你派生出一个子类 S YYflexlexer公司 并希望访问的成员函数和变量 S 里面 年x月x日 ,然后需要使用 %option yyclass="S" 通知flex您将使用该子类而不是 YYflexlexer公司 .在这种情况下,而不是生成 YYflexLexer::YYlex()。 ,flex生成 S::yylex() (并生成一个虚拟对象 YYflexLexer::YYlex()。 那个电话 yyFlexLexer::LexerError() 如果调用)。