注:
课程:《编译技术》胡x蔷
本文仅用于帮助软件学院的孩子们填坑.....,并没有补充功能
因为老师给的命令以及代码,她自己故意刨了坑(迷惑???
前期准备
  1. flex,bison安装好(环境变量也配置好
  2. gcc 环境变量配置好
    在这里插入图片描述
开始踩坑
下图是老师给出的实验步骤:

在这里插入图片描述

第一步

首先按照他的附录,复制粘贴建立四个文件

在这里插入图片描述

第二步

下一步是使用flex lex.l命令,生成lex.yy.c

在这里插入图片描述

发现报错: "lex.l", line 53: unrecognized rule

看一下文档,发现这个注释是我们之后要补充的功能,现在还不能识别,直接将这一行删掉

在这里插入图片描述

删掉后:

在这里插入图片描述

成功生成了lex.yy.c文件
在这里插入图片描述

第三步

下一步是使用bison -d parser.y命令,生成parser.tab.cparser.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!坑填完啦!

写在结尾

希望以上可以帮到你!
如有错误,或不同想法,欢迎指出,互相学习共同进步!