Я написал несколько парсеров перед использованием flex для создания лексера, но на этот раз я хотел, чтобы flex сгенерировал класс Lexer вместо классического файла C, т.е. я хотел, чтобы flex сгенерировал класс сканера C ++ … дело в том, что он не генерирует yyFlexLexer.h для меня, только lex.yy.cc
я прочел глава «Руководство по С ++» по Flex… ну и что делать … разве мой flex для windows не работает должным образом?
Это гибкие опции, которые я сейчас использую:
%option outfile="cmdsLexer.cpp"%option stdinit
%option case-insensitive
%option c++
%{
#include "global-scope.h"%}
ANDIGIT [a-zA-Z0-9]
IDNTIFIER [a-zA-Z_]({ANDIGIT}|_|-)*
INTEGER [-+]?[0-9]+
STRING \"[^\n\"]*\"....
Здесь нет yyFlexLexer.h
файл. Вместо этого cmdsLexer.cpp
файл будет содержать строку
#include <FlexLexer.h>
Обратите внимание на использование угловых скобок вместо двойных кавычек. Этот файл должен быть установлен в вашей системе, например, как /usr/include/FlexLexer.h
, Это то же самое для каждого лексера. Для Windows путь, очевидно, будет другим. Просто найдите файл в вашей гибкой установке и добавьте его в путь, по которому ваш компилятор ищет файлы заголовков, например, с использованием -I
вариант для gcc.
Также обратите внимание на последний абзац документ, на который вы ссылались для расширенного использования этого заголовка:
Если вы хотите создать несколько (разных) классов лексеров, вы используете
«-P
Флаг (илиprefix=
вариант) переименовать каждыйyyFlexLexer
для некоторых
Другой ‘xxFlexLexer
». Затем вы можете включить<FlexLexer.h>
в другом
исходники один раз на класс лексера, первое переименованиеyyFlexLexer
следующее:#undef yyFlexLexer #define yyFlexLexer xxFlexLexer #include <FlexLexer.h> #undef yyFlexLexer #define yyFlexLexer zzFlexLexer #include <FlexLexer.h>
если, например, вы использовали
%option prefix="xx"
для одного из ваших сканеров
а также%option prefix="zz"
для другого.
Других решений пока нет …