Makefile для написания зависимостей парсера sql

Я реализую синтаксический анализатор 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


Можете ли вы предложить мне другой способ обойти это?


person pratik    schedule 27.02.2011    source источник


Ответы (2)


Пожалуйста, опубликуйте свой Makefile. Насколько я понимаю, тут тоже проблема с кодом, не только с Makefile. Или может быть, вы пытаетесь сделать 1.o из 1.l и разные 1.o из 1.y.

Обычно зависимости должны выглядеть примерно так:

1l.o: 1.l sql.h; # lex invocation
1y.o: 1.y sql.h; # bison invocation
sql.o: sql.c sql.h; # cc invocation
prog: 1l.o 1y.o sql.o; # ld invocation

Вероятно, вам также нужно будет зависеть от файла объявления токенов.

РЕДАКТИРОВАТЬ: Ах, так что, вероятно, вам нужно поместить определение этой таблицы в один файл и объявление в заголовок. Сначала вы должны понять разницу между объявлением и определением в C. Например, если у вас есть следующие файлы:

aaa.h
int arr[]={1};

aaa.c
#include aaa.h

bbb.c
#include aaa.h

И затем вы пытаетесь cc -o aaa aaa.c bbb.c получить ошибку множественного определения. То есть сам массив должен быть в одном файле, а в заголовке должно быть что-то вроде extern int arr[];

Обновлять:

Вы должны удалить настройку NULL в sql.h. Там только объявление, что где-то есть такая-то переменная. Фактическое значение должно быть присвоено в sql.c.

person Community    schedule 27.02.2011
comment
на самом деле код работает, это просто проблема связывания этих файлов вместе ... я узнал, что проблема d заключается в том, что dat m включает sql.h в sql.c и как в 1.l (файл lex), так и в 1.y (yacc файл).. dts y таблица символов n ее объекты объявляются несколько раз один раз в sql.c den 1.l den in 1.y... m nt в состоянии получить, куда я должен включить, какой файл и den как wud d makefile будет ... предложенный вами makefile - это то, что я написал, ошибка bt d состоит из нескольких определений символов, определенных в sql.h .... - person pratik; 28.02.2011
comment
и да... 1l.o зависит от файла объявления токенов y.tab.c d.. не могли бы вы, пожалуйста, дайте мне знать, как связать все эти файлы вместе.. я полностью застрял на этом.. спасибо..) - person pratik; 28.02.2011
comment
Я разместил свои файлы src .. пожалуйста, посмотрите - person pratik; 01.03.2011

extern struct sym_table *SQL = NULL;
extern struct sym_select *SQL_SEL = NULL;

Удалите инициализацию = NULL из заголовочного файла.

person Maxim Egorushkin    schedule 01.03.2011
comment
да... все правильно.. убрал d NULL и заработало.. спасибо.. )))) - person pratik; 01.03.2011