Как использовать Yyextra в C ++? - PullRequest
0 голосов
/ 27 июня 2018

Я хотел бы получить доступ к внешней структуре в рамках правил сканера. При использовании языка C, yyextra предоставляется в качестве решения для этого. Очевидно, yyextra недоступен при создании сканера C ++. Какое решение для достижения того же?

1 Ответ

0 голосов
/ 27 июня 2018

Вы можете получить свой собственный класс лексеров из 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() при вызове).
...