我正在编写一个程序,使用flex从文本文件中获取输入并将它们分成一些标记,如标识符,关键字,运算符等。我的文件名是test.l.我创建了另一个哈希表程序,其中包含一个名为SymbolTable.h的文件。有没有办法在我的test.l文件中包含这个头文件,以便我可以在读取输入时进行一些操作(例如:将标识符插入哈希表)?我已经尝试包含它,但是当我尝试使用gcc lex.yy.c -lfl
进行编译时,它会生成一条错误消息:
"致命错误:SymbolTable.h:没有这样的文件或目录。"
请帮我详细说明如何包含头文件或以其他任何方式帮助我完成上述所需的操作。
答案 0 :(得分:1)
你的包含声明工作得很好。编译器找不到您的文件,因为它不在包含搜索路径中。尝试添加-I。在调用gcc时。喜欢:gcc -I。
答案 1 :(得分:1)
对于简单的应用程序,您可以使用我的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
扫描程序使用此示例中从bison生成的头文件。但肯定你可以在同一个地方包含一些其他头文件。
要编译词法分析器,只需键入make scan
或只需make
即可同时编译词法分析器和语法。
在你的词法旅程中祝你好运!
答案 2 :(得分:1)
看来你的问题不在于flex,而在于 C 语言如何处理不同的语法。这个问题在这个问题中得到了解释:What is the difference between #include <filename> and #include "filename"?。
你可能有:
#include <SymbolTable.h>
何时应该
#include "SymbolTable.h"
由于您没有显示您使用的实际代码,因此很难正确回答。