目前正在try 使用Flex创建词法分析器.当运行命令flex pl0_lexer.l时,我的pl0_lexper.h中的Include语句与我的pl0_lexper.c不匹配.

pl0_lexer.l Snippet

%option header-file = "pl0_lexer.h"
%option outfile = "pl0_lexer.c"
%option yylineno
%option bison-bridge

%{
#include <stdio.h>
#include <string.h>
#include <stdbool.h>
#include <limits.h>
#include "ast.h"
#include "parser_types.h"
#include "utilities.h"
#include "lexer.h"

 /* Tokens generated by Bison */
#include "pl0.tab.h"
%}

My problem是所有用户定义的标头(如"ast.h")都出现在.c代码中,但pl0_lexer.h只包括标准C标头.

推荐答案

正如我在comment分中指出的那样:

这是因为pl0_lexer.h的内容不需要任何其他标头来编译.头是最小的-您的代码(在词法分析器之外)必须包括必要的头.您不能指望pl0_lexer.h包含这些标头.

生成的标头提供了能够使用词法分析器所需的定义--主要是yylex()的适当声明,但也包括支持函数.它不需要知道用户定义的头中的任何信息--这些头不构成词法分析器接口的一部分.

有关自包含、幂等、最小标头和How to link multiple implementation files in C?的讨论,另请参阅Should I use #include in headers?.

(顺便说一句,生成的标头不符合我对‘Minimal’的定义.例如,它确保定义了像flex_int8_tflex_uint64_t这样的类型名称,但(使用Flex 2.6.4)头中定义的 struct 不使用这些类型,也不使用其他任何类型.标题中并不直接需要所有这些代码.我不确定哪里记录了词法分析器的使用者必须(或应该)使用这些类型.)

C++相关问答推荐

有什么方法可以检测SunOS上的SparcWorks吗?

为什么静态说明符为内联函数生成外部定义?

理解没有返回语句的递归C函数的行为

单指针和空参数列表之间的函数指针兼容性

ATmega328P EEPROM未写入

在移动数组元素时获得意外输出

在libwget中启用Cookie会导致分段故障

如何在C++中安全地进行浮点运算

我在反转双向链表时遇到问题

C语言中神秘的(我认为)缓冲区溢出

C-try 将整数和 struct 数组存储到二进制文件中

GetText不适用于包含国际字符的帐户名称

将复合文字数组用作临时字符串缓冲区是否合理?

如何使用calloc和snprintf

在文件描述符上设置FD_CLOEXEC与将其传递给POSIX_SPOWN_FILE_ACTIONS_ADCLOSE有区别吗?

I';我试着从.txt文件中读取文本,并用c计算其中的单词数量

模仿 memmove 的行为

中位数和众数不正确

尽管将其标记为易失性,但 gcc 是否优化了我的等待代码?

C Makefile - 如何避免重复提及文件名