# 定义编译器和选项
CC = gcc
CFLAGS = -I. -g
FLEX = flex
BISON = bison
LDFLAGS = -lfl

# 目标文件
TARGET = bin/bplc

# 源文件和中间文件
SRCS = main.c tree.c syntax.tab.c lex.yy.c
OBJS = $(SRCS:.c=.o)

# 默认目标
all: $(TARGET)

# 生成可执行文件，确保 bin 目录存在
$(TARGET): $(OBJS)
	@mkdir -p bin
	$(CC) $(CFLAGS) -o $(TARGET) $(OBJS) $(LDFLAGS)

# 生成 Bison 的 C 文件和头文件
syntax.tab.c syntax.tab.h: syntax.y
	$(BISON) -d syntax.y

# 生成 Flex 的 C 文件
lex.yy.c: lex.l syntax.tab.h
	$(FLEX) lex.l

# 关键修正：确保在编译 tree.c 和 main.c 之前，syntax.tab.h 已经生成
tree.o main.o: syntax.tab.h

# 通用的 C 文件编译规则
%.o: %.c
	$(CC) $(CFLAGS) -c $< -o $@

# 清理生成的文件
clean:
	rm -f $(OBJS) syntax.tab.c syntax.tab.h lex.yy.c $(TARGET)

# 伪目标
.PHONY: all clean