Lex & Yacc

Lex和Yacc学习过程中遇到的几个问题

1.在Lex中表述空格,空格的表述得使用[ ] 或者 " " ,不可以直接写空格,否则是匹配不了的。

2.在同时使用Lex和Yacc的时候,如果我们不想编写main函数或者相关的配套函数,

   例如Lex的yywrap,Yacc的yyerror等,我们可以直接使用Lex或者Yacc提供的链接库

   -ll 和-ly ,但是特别要注意的是,此处特别要注意(这个问题查了我三四天的时间),一定要

   将-ly 写在-ll的前面,因为-ly和-ll均实现并导出了main,而在使用的过程中如果-ll写在了前面

   就会导致Yacc的执行根本就不会执行,汗!!!,贴上我的Makefile错误代码:

CC = gcc
LEX = lex
YACC = yacc
TARGET = calc
#重点看这里的顺序
LIBS = -ll -ly 
CCFLAGS = 

$(TARGET): calc.l.o y.tab.o
	$(CC) $(CCFLAGS) -o $@ $^ $(LIBS)

calc.l.o:calc.l.c
	$(CC) -c -o $@ $<

calc.l.c: calc.l y.tab.h
	$(LEX) -o $@ $<

y.tab.o:y.tab.c y.tab.h
	$(CC) -c -o $@ $<

y.tab.c y.tab.h:calc.y
	$(YACC) -d $<

clean:
	$(RM) -f *.h *.o *.c *.o $(TARGET)

rebuild: clean $(TARGET)

正确的形式如下:


CC = gcc
LEX = lex
YACC = yacc
TARGET = calc
#重点看这里的顺序
LIBS = -ly -ll
CCFLAGS = 

$(TARGET): calc.l.o y.tab.o
	$(CC) $(CCFLAGS) -o $@ $^ $(LIBS)

calc.l.o:calc.l.c
	$(CC) -c -o $@ $<

calc.l.c: calc.l y.tab.h
	$(LEX) -o $@ $<

y.tab.o:y.tab.c y.tab.h
	$(CC) -c -o $@ $<

y.tab.c y.tab.h:calc.y
	$(YACC) -d $<

clean:
	$(RM) -f *.h *.o *.c *.o $(TARGET)

rebuild: clean $(TARGET)


你可能感兴趣的:(Lex & Yacc)