Насколько я понимаю, в flex не будет работать следующее:
...
std::string opt_val = "--help";
%%
opt_val { /* do something */ }
%%
Могу ли я вместо этого расширить макрос C? Я пробовал это:
%{
#define MCR_OPTION "--help"
%}
ALIAS_OPTION MCR_OPTION
%%
{ALIAS_OPTION} { /* do something */ }
%%
К сожалению, это, похоже, не работает. Я хочу хранить значения строковых литералов где-то еще, кроме раздела правил сканера, так что если они изменятся, у меня будет на одно место для обновления меньше. Я упускаю что-то очевидное?
(EDIT): Вот более полный образец, который я тестировал:
test.l
%option noyywrap
%{
#include <iostream>
#define MCR_HELP_OPT "--help"
#define MCR_HELP_OPT2 --help
%}
ALIAS_HELP_OPT MCR_HELP_OPT
ALIAS_HELP_OPT2 MCR_HELP_OPT2
%%
"--works" { std::cout << "this works" << std::endl; }
{ALIAS_HELP_OPT} { std::cout << "help" << std::endl; }
{ALIAS_HELP_OPT2} { std::cout << "help2" << std::endl; }
\n { return 0; }
. { /* consume */ }
%%
int main(int, char**) {
while (yylex()) {}
}
Я тестировал это так:
> flex test.l && c++ lex.yy.c
> echo "--help" | ./a.out
> echo "--works" | ./a.out
this works
Я не уверен, что это сработает, но вы пробовали без кавычек?
К сожалению, похоже, это тоже не работает :(
Запустите препроцессор самостоятельно. Используйте переключатель -E Clang или GCC.
Первый фрагмент не будет работать, потому что это C++ (по умолчанию Flex генерирует C) и потому что вы забыли %{ и %}. В противном случае создание переменной совершенно законно.





В конце концов я решил использовать функцию configure_file CMake; Вот минимальный рабочий пример:
CMakeLists.txt:
cmake_minimum_required(VERSION 3.25)
project(test)
find_package(FLEX REQUIRED)
set(SCANNER_FLEX ${CMAKE_BINARY_DIR}/test.l)
set(SCANNER_SRC ${CMAKE_BINARY_DIR}/test.cpp)
set(MCR_HELP_OPT "--help")
configure_file(test.l.in ${SCANNER_FLEX} @ONLY)
FLEX_TARGET(scanner ${SCANNER_FLEX} ${SCANNER_SRC})
add_executable(run ${SCANNER_SRC})
target_include_directories(run PRIVATE
${CMAKE_CURRENT_SOURCE_DIR}
)
test.l.in
%option noyywrap
%{
#include <iostream>
%}
%%
@MCR_HELP_OPT@ { std::cout << "help" << std::endl; }
\n { return 0; }
. { /* consume */ }
%%
int main(int, char**) {
while (yylex()) {}
}
Затем создайте и запустите его:
> cmake -B build
> make -C build
> echo "--help" | ./build/run
help
Это не имеет ничего общего с макетированием CSS flexbox. Пожалуйста, не забудьте использовать соответствующие теги в своем вопросе.