我想在扫描仪规则内访问外部结构。使用C语言时,为此提供了yyextra作为解决方案。显然,当生成C ++扫描器时,yyextra不可用。 实现相同目标的正确解决方案是什么?
答案 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
并想访问S
内yylex()
的成员函数和变量,则需要使用%option yyclass="S"
来通知flex您将使用该子类而不是yyFlexLexer
。在这种情况下,flex不会生成yyFlexLexer::yylex()
,而是会生成S::yylex()
(并且还会生成一个伪yyFlexLexer::yylex()
,该伪yyFlexLexer::LexerError()
会调用jboss-cli.sh
)。