Я реализую синтаксический анализатор sql в lex и yacc, в котором я использую таблицу символов, которую я сохранил в отдельном файле .h (sql.h), и в этом заголовочном файле у меня есть объявления некоторых функций. Определения этих функций хранятся в файле .c (sql.c). Теперь я включил sql.h в sql.c, я ссылаюсь на символы и функции из sql.h как в моем файле lex (1.l), так и в файле yacc (1.y).
Проблема в том, что я не могу написать для этого правильный make-файл. Я получаю ошибки, такие как несколько объявлений. Куда включить какой файл и как написать зависимости? Пожалуйста помоги. Я искал решение, но я не понимаю.....
Обновлять:
Я компилирую код следующим образом:
lex 1.l yacc -d 1.y gcc lex.yy.c y.tab.c sql.c -ll -ly
Я получаю следующие ошибки после третьей команды gcc:
In file included from 1.l:5: sql.h:17: warning: ‘SQL’ initialized and declared ‘extern’ sql.h:18: warning: ‘SQL_SEL’ initialized and declared ‘extern’ 1.l: In function ‘makeTable’: 1.l:80: warning: assignment from incompatible pointer type In file included from 1.y:7: sql.h:17: warning: ‘SQL’ initialized and declared ‘extern’ sql.h:18: warning: ‘SQL_SEL’ initialized and declared ‘extern’ sql.c:3: error: redefinition of ‘SQL’ sql.h:15: note: previous definition of ‘SQL’ was here sql.c:4: error: redefinition of ‘SQL_SEL’ sql.h:16: note: previous definition of ‘SQL_SEL’ was here
sql.h:
#ifndef SQL_H
#define SQL_H
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
struct sym_table {
char *token;
char *value;
struct sym_table *next;
};
struct sym_select {
char **cols;
};
extern struct sym_table *SQL = NULL;
extern struct sym_select *SQL_SEL = NULL;
void addSymbol(char *, char *);
void print(struct sym_table *);
void showTable(struct sym_table *);
void makeTable(struct sym_table *, int);
sql.c:
#include "sql.h"
struct sym_table *SQL = NULL;
struct sym_select *SQL_SEL = NULL;
И определения функций, объявленных в sql.h
1.л файл:
%{
#include <stdio.h>
#include <stdlib.h>
#include "y.tab.h"
#include "sql.h"
int lineno=1;
void makeTable(struct sym_table *, int);
%}
..... и другие файлы lex
1.y
%{
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
extern int lineno;
extern void yyerror(char *);
#include "sql.h"
%}
.... и другие данные файла yacc
Можете ли вы предложить мне другой способ обойти это?