如何在C ++中使用yyextra?

时间:2018-06-27 14:23:41

标签: flex-lexer

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

1 个答案:

答案 0 :(得分:2)

您可以从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()
执行与yylex()相同的作用,与普通的柔韧性扫描仪一样:它扫描输入流并消耗令牌,直到规则的操作返回值为止。如果您从S派生子类yyFlexLexer并想访问Syylex()的成员函数和变量,则需要使用%option yyclass="S"来通知flex您将使用该子类而不是yyFlexLexer。在这种情况下,flex不会生成yyFlexLexer::yylex(),而是会生成S::yylex()(并且还会生成一个伪yyFlexLexer::yylex(),该伪yyFlexLexer::LexerError()会调用jboss-cli.sh)。