Вы можете получить свой собственный класс лексеров из yyFlexLexer
и добавить к нему все, что захотите.
Если вы сделаете это, вы, вероятно, захотите сообщить Flex название вашего класса:
%option yyclass="myLexer"
См. Описание этой опции :
‘--yyclass=NAME, %option yyclass="NAME"’
& hellip; сообщает flex, что вы получили NAME
как подкласс yyFlexLexer
, поэтому flex поместит ваши действия в функцию-член NAME::yylex()
вместо yyFlexLexer::yylex()
. & hellip;
и примечание о функции-члене yylex()
:
virtual int yylex()
выполняет ту же роль, что и yylex()
, для обычных гибких сканеров: он сканирует входной поток, потребляя токены, пока действие правила не вернет значение. Если вы извлекаете подкласс S
из yyFlexLexer
и хотите получить доступ к функциям-членам и переменным S
внутри yylex()
, то вам нужно использовать %option yyclass="S"
, чтобы сообщить Flex, что вы будете использовать этот подкласс вместо yyFlexLexer
. В этом случае, вместо генерации yyFlexLexer::yylex()
, flex генерирует S::yylex()
(а также генерирует пустышку yyFlexLexer::yylex()
, которая вызывает yyFlexLexer::LexerError()
при вызове).