编译原理实验一(1)——预备工作(仅用于填坑)
注:
课程:《编译技术》胡x蔷
本文仅用于帮助软件学院的孩子们填坑.....,并没有补充功能
因为老师给的命令以及代码,她自己故意刨了坑(迷惑???
前期准备
- flex,bison安装好(环境变量也配置好
- gcc 环境变量配置好
开始踩坑
下图是老师给出的实验步骤:
第一步
首先按照他的附录,复制粘贴建立四个文件
第二步
下一步是使用flex lex.l命令,生成lex.yy.c
发现报错: "lex.l", line 53: unrecognized rule
看一下文档,发现这个注释是我们之后要补充的功能,现在还不能识别,直接将这一行删掉
删掉后:
成功生成了lex.yy.c文件
第三步
下一步是使用bison -d parser.y命令,生成parser.tab.c 与parser.tab.h
发现报错:
parser.y:23.147-159: symbol CaseStmtList0 is used, but is not defined as a token and has no rules
parser.y:23.161-172: symbol CaseStmtList is used, but is not defined as a token and has no rules
打开parser.y,在第23行发现CaseStmtList0,CaseStmtList
我们发现同一行的其他参数都在第48-123行有了详细定义, CaseStmtList却没有定义 这应该是我们之后要补充的功能
为了实验能够进行下去,我们先将他注释掉
再运行命令:
生成了parser.tab.c 与parser.tab.h:
第四步
下一步是使用gcc -o parser lex.yy.c parser.tab.c ast.c ast.c命令,生成parser.exe
好多报错,不要着急,咱们一个一个的看
首先是
parser.tab.c: In function 'yyparse':
parser.tab.c:813:16: warning: implicit declaration of function 'yylex' [-Wimplicit-function-declaration]
我在https://stackoverflow.com/questions/60333666/flex-bison-windows-introduction ,里看到一个相似的报错,有大神指出这是在文件开头缺少了声名的原因,如下图:
我们打开parser.y文件,在声名部分加上int yylex();(注意返回值是int,如果写成void是会报错的
重新依次运行命令
bison -d parser.y
gcc -o parser lex.yy.c parser.tab.c ast.c ast.c
发现报错少了!!成功填了一个坑
接下来改下面一个错误,
ast.c:(.text+0x0):multiple definition of `mknode'
ast.c:(.text+0x0): first defined here
ast.c:(.text+0x93): multiple definition of `display'
ast.c:(.text+0x93): first defined here
它说咱们的ast.c重复定义了 "mknode"与 “display”两个函数
可是打开ast.c文件,并没有重复定义啊?
我抱着试一试的心态,将命令gcc -o parser lex.yy.c parser.tab.c ast.c ast.c的其中一个ast.c去掉
即运行命令gcc -o parser lex.yy.c parser.tab.c ast.c
芜湖!起飞!✈又填上一个坑?
改最后一个报错:
parser.tab.c:(.text+0x8a8): undefined reference to `semantic_Analysis0'
collect2.exe: error: ld returned 1 exit status
打开parser.y,发现在第52行,调用了semantic_Analysis0()函数
这个函数没有在开头加上声名,但是当我加上也没有用,这是为什么呢? 我们打开def.h文件,发现这里并没有定义semantic_Analysis0()函数 而display()就定义了(因此display没有报错)
我们这里将semantic_Analysis0()删掉(之后自己补充好功能再添上吧)
再运行一次命令
bison -d parser.y
gcc -o parser lex.yy.c parser.tab.c ast.c
感动!没有报错!
且生成了parser.exe
第五步
下一步是使用parser test.c命令,查看输出结果
(test.c文件需自己创建
int a,b,c;
float m,n;
int fibo(int a) {
if (a==1 || a==2)
return 1;
return fibo(a-1)+fibo(a-2);
}
int main(){
int m,n,i;
m=read();
i=1;
while(i<=m)
{
n=fibo(i);
write(n);
i=i+1;
}
return 1;
}
注:使用cmd的话不用在parser前面加 ./
发现结果是乱码,但仍然依稀可以看出,已经有结果的雏形了!
解决cmd中文乱码,我们输入命令chcp 65001,回车,将编码格式改为UTF-8
Yeah!坑填完啦!
写在结尾
希望以上可以帮到你!
如有错误,或不同想法,欢迎指出,互相学习共同进步!
Share this content:
目前为止有一条评论