首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何让automake在设置%option prefix=时识别flex生成的非默认文件名

如何让automake在设置%option prefix=时识别flex生成的非默认文件名
EN

Stack Overflow用户
提问于 2020-12-01 03:22:22
回答 1查看 26关注 0票数 0

一般来说,automake在构建解析器和扫描器时正确调用flex和bison的能力非常有用。然而,我遇到了一个我似乎无法解决的问题。

我有一个lex文件triraphs.l,它执行C三元图序列的文本替换。在最终的可执行文件中将包含多个词法分析器,这将是一个预处理器,它为C预处理器准备好源文件,因此后续的词法分析器将负责连接跨越多个物理行的逻辑行,另一个将剥离注释,等等。根据C标准,这些转换应该按照特定的顺序发生,因此为了避免出现问题,我使用了三个独立的词法分析器,它们将以正确的顺序运行。

总之,为了避免符号名称冲突,我使用%option prefix="blah“,所以我的三元扫描仪如下所示:

代码语言:javascript
复制
%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,但它现在已经有八年的历史了,所以在此期间可能会有一些发展。

EN

回答 1

Stack Overflow用户

发布于 2020-12-18 17:46:25

没有更惯用的方法来处理这个问题,因为Automake规则对flex一无所知。Automake希望使用与POSIX lex兼容的项目,并希望任何lex实现都遵循POSIX convention of producing a lex.yy.c file

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65079852

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档