Я пишу программу, использующую flex, которая берет входные данные из текстового файла и разбивает их на несколько токенов, таких как идентификатор, ключевые слова, операторы и т. Д. Мое имя файла — test.l. Я сделал еще одну программу хэш-таблицы, которая включает в себя файл с именем SymbolTable.h. Есть ли способ включить этот заголовочный файл в мой файл test.l, чтобы я мог выполнять некоторые операции (например, вставлять идентификаторы в хеш-таблицу) при чтении ввода? Я уже пытался включить его, но когда я пытаюсь скомпилировать с помощью gcc lex.yy.c -lfl
, он генерирует сообщение об ошибке, говорящее:
msgstr «фатальная ошибка: SymbolTable.h: такого файла или каталога нет.»
Пожалуйста, помогите мне с тем, как включить заголовочный файл или каким-либо другим способом, которым я могу выполнить желаемую операцию, описанную выше.
Для простого применения вы можете использовать небольшой шаблон моего проекта 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;
}
Makefile:
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
составлять лексер и грамматику одновременно.
Удачи в вашем путешествии на Лексере!
Ваше заявление о включении сработало просто отлично. Компилятору не удалось найти ваш файл, потому что он не находится в пути поиска включения. Попробуйте добавить -I. при вызове gcc. Нравится: gcc -I.
Кажется, ваша проблема не в гибкости, а в том, как С язык обрабатывает другой синтаксис. Это объясняется в этом вопросе: В чем разница между #include <имя файла> и #include "имя файла"?.
Вы, вероятно, имеете:
#include <SymbolTable.h>
когда вы должны иметь
#include "SymbolTable.h"
Поскольку вы не показали реальный код, который вы использовали, было трудно ответить правильно.