在 Flex 中包含外部头文件
Including an external header file in Flex
我正在使用 flex 编写一个程序,该程序从文本文件中获取输入并将它们拆分为一些标记,例如标识符、关键字、运算符等。我的文件名为 test.l。我制作了另一个散列 table 程序,其中包含一个名为 SymbolTable.h 的文件。有什么方法可以将这个头文件包含在我的 test.l 文件中,以便我可以在读取输入时进行一些操作(例如:将标识符插入散列 table)?我已经尝试包含它但是当我尝试使用 gcc lex.yy.c -lfl
进行编译时,它会生成一条错误消息:
"fatal error: SymbolTable.h: No such file or directory."
请帮助我了解如何包含头文件或以任何其他方式执行我上面所述的所需操作。
您的 include 语句运行良好。编译器找不到您的文件,因为它不在包含搜索路径中。尝试添加 -I。调用 gcc 时。比如:gcc -I。
对于简单的应用,您可以使用我的 bison/yacc 项目的一个小模板。
gram.y
%{
#include <stdio.h>
#include <stdlib.h>
%}
// tokens here
%%
// rules here
%%
int main() {
return yyparse();
}
scan.l:
%{
#include <stdio.h>
//include a YACC grammar header
//#include "gram.h"
%}
%%
. /*LEX RULES*/;
%%
// C code
int yywrap() {
return 1;
}
生成文件:
all: gram
gram: gram.c gram.h scan.c
gcc gram.c scan.c -lfl -ly -o gram
gram.c: gram.y
yacc -d gram.y -o gram.c
scan.c: scan.l
flex -o scan.c scan.l
scan: scan.c
gcc scan.c -lfl -o scan
扫描器在这个例子中使用了从野牛生成的头文件。但是你当然可以在同一个地方包含一些其他的头文件。
要编译你的词法分析器,只需键入 make scan
或 make
即可同时编译词法分析器和语法。
祝你的词法分析之旅好运!
看来您的问题不在于 flex,而在于 C 语言如何处理不同的语法。这在这个问题中有解释:What is the difference between #include <filename> and #include "filename"?.
你可能有:
#include <SymbolTable.h>
什么时候应该
#include "SymbolTable.h"
由于您没有显示您使用的实际代码,因此很难正确回答。
我正在使用 flex 编写一个程序,该程序从文本文件中获取输入并将它们拆分为一些标记,例如标识符、关键字、运算符等。我的文件名为 test.l。我制作了另一个散列 table 程序,其中包含一个名为 SymbolTable.h 的文件。有什么方法可以将这个头文件包含在我的 test.l 文件中,以便我可以在读取输入时进行一些操作(例如:将标识符插入散列 table)?我已经尝试包含它但是当我尝试使用 gcc lex.yy.c -lfl
进行编译时,它会生成一条错误消息:
"fatal error: SymbolTable.h: No such file or directory."
请帮助我了解如何包含头文件或以任何其他方式执行我上面所述的所需操作。
您的 include 语句运行良好。编译器找不到您的文件,因为它不在包含搜索路径中。尝试添加 -I。调用 gcc 时。比如:gcc -I。
对于简单的应用,您可以使用我的 bison/yacc 项目的一个小模板。
gram.y
%{
#include <stdio.h>
#include <stdlib.h>
%}
// tokens here
%%
// rules here
%%
int main() {
return yyparse();
}
scan.l:
%{
#include <stdio.h>
//include a YACC grammar header
//#include "gram.h"
%}
%%
. /*LEX RULES*/;
%%
// C code
int yywrap() {
return 1;
}
生成文件:
all: gram
gram: gram.c gram.h scan.c
gcc gram.c scan.c -lfl -ly -o gram
gram.c: gram.y
yacc -d gram.y -o gram.c
scan.c: scan.l
flex -o scan.c scan.l
scan: scan.c
gcc scan.c -lfl -o scan
扫描器在这个例子中使用了从野牛生成的头文件。但是你当然可以在同一个地方包含一些其他的头文件。
要编译你的词法分析器,只需键入 make scan
或 make
即可同时编译词法分析器和语法。
祝你的词法分析之旅好运!
看来您的问题不在于 flex,而在于 C 语言如何处理不同的语法。这在这个问题中有解释:What is the difference between #include <filename> and #include "filename"?.
你可能有:
#include <SymbolTable.h>
什么时候应该
#include "SymbolTable.h"
由于您没有显示您使用的实际代码,因此很难正确回答。