Включение файла внешнего заголовка в Flex

Я пишу программу, использующую flex, которая берет входные данные из текстового файла и разбивает их на несколько токенов, таких как идентификатор, ключевые слова, операторы и т. Д. Мое имя файла — test.l. Я сделал еще одну программу хэш-таблицы, которая включает в себя файл с именем SymbolTable.h. Есть ли способ включить этот заголовочный файл в мой файл test.l, чтобы я мог выполнять некоторые операции (например, вставлять идентификаторы в хеш-таблицу) при чтении ввода? Я уже пытался включить его, но когда я пытаюсь скомпилировать с помощью gcc lex.yy.c -lfl , он генерирует сообщение об ошибке, говорящее:

msgstr «фатальная ошибка: SymbolTable.h: такого файла или каталога нет.»

Пожалуйста, помогите мне с тем, как включить заголовочный файл или каким-либо другим способом, которым я могу выполнить желаемую операцию, описанную выше.

3

Решение

Для простого применения вы можете использовать небольшой шаблон моего проекта 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 составлять лексер и грамматику одновременно.

Удачи в вашем путешествии на Лексере!

1

Другие решения

Ваше заявление о включении сработало просто отлично. Компилятору не удалось найти ваш файл, потому что он не находится в пути поиска включения. Попробуйте добавить -I. при вызове gcc. Нравится: gcc -I.

1

Кажется, ваша проблема не в гибкости, а в том, как С язык обрабатывает другой синтаксис. Это объясняется в этом вопросе: В чем разница между #include <имя файла> и #include "имя файла"?.

Вы, вероятно, имеете:

#include <SymbolTable.h>

когда вы должны иметь

#include "SymbolTable.h"

Поскольку вы не показали реальный код, который вы использовали, было трудно ответить правильно.

1
По вопросам рекламы [email protected]