一般来说,automake在构建解析器和扫描器时正确调用flex和bison的能力非常有用。然而,我遇到了一个我似乎无法解决的问题。
我有一个lex文件triraphs.l,它执行C三元图序列的文本替换。在最终的可执行文件中将包含多个词法分析器,这将是一个预处理器,它为C预处理器准备好源文件,因此后续的词法分析器将负责连接跨越多个物理行的逻辑行,另一个将剥离注释,等等。根据C标准,这些转换应该按照特定的顺序发生,因此为了避免出现问题,我使用了三个独立的词法分析器,它们将以正确的顺序运行。
总之,为了避免符号名称冲突,我使用%option prefix="blah“,所以我的三元扫描仪如下所示:
%option noyywrap
%option prefix="trigraphs_"
%%
"??<" { printf("{"); }
"??>" { printf("}"); }
"??(" { printf("["); }
"??)" { printf("]"); }
"??=" { printf("#"); }
"??/" { printf("\\"); }
"??'" { printf("^"); }
"??!" { printf("|"); }
"??-" { printf("~"); }
. { printf("%c", *yytext); }
%%这个问题似乎是,automake->ylwrap期望flex的输出带有传统的lex.yy.c文件名,将其重命名为triraphs.c。但是,由于%选项前缀还会更改输出文件名(更改为lex.trigraphs_.c),因此不会将其重命名为Makefile期望的triraphs.c。当Makefile想要编译triraphs.c而它并不存在时,这会导致明显的编译错误。
我想到的一个解决方案是使用%option outfile="lex.yy.c“来避开这个问题。到目前为止,它似乎还行得通;但是,它感觉有点“老土”,所以我想知道是否有更通用或更规范的方法来处理这一问题。在搜索其他人已经找到的解决方案时,我确实遇到了this question on StackExchange,但它现在已经有八年的历史了,所以在此期间可能会有一些发展。
发布于 2020-12-18 17:46:25
没有更惯用的方法来处理这个问题,因为Automake规则对flex一无所知。Automake希望使用与POSIX lex兼容的项目,并希望任何lex实现都遵循POSIX convention of producing a lex.yy.c file。
https://stackoverflow.com/questions/65079852
复制相似问题