# **C-- 编译器实现**
# **一、使用说明**
运行环境:Ubuntu 14.04 Ubuntu 16.04
本编译器所支持的词法和语法请参考第二第三小节
解压压缩包 运行命令
```
unzip compiler.zip
```
进入文件夹运行命令
```
./compiler test.cmm
```
其中test.cmm可以替换成其他文件
如果报错,则输出错误行号输出语法树
产生语法树所用的产生式的推导/规约序列
![](img/Aspose.Words.04510162-3626-460a-aae2-6b21498f32dc.016.png)
![](img/Aspose.Words.04510162-3626-460a-aae2-6b21498f32dc.017.jpeg)...
![](img/Aspose.Words.04510162-3626-460a-aae2-6b21498f32dc.018.png)
# **二、词法分析**
## 1.概述
词法分析器的作用是读取源程序生成词法单元,并过滤掉注释和空白。项目中的词法分析使用了lex 。
## 2.词元类型说明
### INT
INT表示的是整型常数。一个十进制整数由0~9十个数字组成,数字与数字中间没有空格之类 的分隔符。
除0之外,十进制整数的首位数字不为0。
八进制或十六进制的形式。八进制整数由0-7八个数字组成并以数字0开头。 十六进制整数由0-9、a-f十六个数字组成并以0x开头。
## FLOAT
FLOAT表示的是浮点型常数。一个浮点数由一串数字与一个小数点组成,小数点的前后必须有数字出现。
浮点型常数还可以以指数形式表示。指数形式的浮点数必须包括基数、指数符号和指数三个 部分,且三部分依次出现。基数部分由一串数字(0~9)和一个小数点组成,小数点可以出 现在数字串的任何位置;指数符号为E或e;指数部分由可带-或者不带的一串数字组成,-必 须出现在数字串之前。
# ID
ID表示的是标识符。标识符由大小写字母、数字以及下划线组成,但必须以字母或者下划线 开头。
![1](img/1.png)
![2](img/2.png)
# **三、语法分析**
## 1.概述
语法分析接收词法分析器提供的记号串,检查记号串是否能由 c-- 规定的文法产生,并提示错误信息。
## 2.语法规则
![](img/Aspose.Words.04510162-3626-460a-aae2-6b21498f32dc.033.png)Program ExtDefList
![](img/Aspose.Words.04510162-3626-460a-aae2-6b21498f32dc.034.png)一段程序可以看作是定义的集合
![](img/Aspose.Words.04510162-3626-460a-aae2-6b21498f32dc.022.png)ExtDefList ExtDef ExtDefList
![3](img/3.png)
![](img/Aspose.Words.04510162-3626-460a-aae2-6b21498f32dc.034.png)描述的是定义的集合
![](img/Aspose.Words.04510162-3626-460a-aae2-6b21498f32dc.036.png)ExtDef Specifier Dec SEMI
| Specifier FunDec CompSt
| VOID FunDec CompSt
![](img/Aspose.Words.04510162-3626-460a-aae2-6b21498f32dc.034.png)定义:全局变量的定义、有返回值函数的定义、无返回值函数的定义
![](img/Aspose.Words.04510162-3626-460a-aae2-6b21498f32dc.034.png)![](img/Aspose.Words.04510162-3626-460a-aae2-6b21498f32dc.024.png)Specifier TYPE int或者float
![](img/Aspose.Words.04510162-3626-460a-aae2-6b21498f32dc.036.png)VarDec ID
![](img/Aspose.Words.04510162-3626-460a-aae2-6b21498f32dc.034.png)变量的声明,即标识符
![](img/Aspose.Words.04510162-3626-460a-aae2-6b21498f32dc.022.png)FunDec ID LP VarList RP //含参函数头的定义 func(a)
| ID LP RP //不含参函数头定义. func()
| MAIN LP RP
![](img/Aspose.Words.04510162-3626-460a-aae2-6b21498f32dc.034.png)函数的声明:含参函数的声明,不含参数函数的声明,main函数的声明
![](img/Aspose.Words.04510162-3626-460a-aae2-6b21498f32dc.022.png)VarList ParamDec
![](img/Aspose.Words.04510162-3626-460a-aae2-6b21498f32dc.034.png)函数参数列表,这里只支持一个参数的参数列表
![](img/Aspose.Words.04510162-3626-460a-aae2-6b21498f32dc.033.png)ParamDec Specifier VarDec
![](img/Aspose.Words.04510162-3626-460a-aae2-6b21498f32dc.034.png)参数列表中,每个变量的声明例如int a
![](img/Aspose.Words.04510162-3626-460a-aae2-6b21498f32dc.022.png)CompSt LC DefListAndStmtList RC
![](img/Aspose.Words.04510162-3626-460a-aae2-6b21498f32dc.034.png)函数体,由花括号包裹的定义和statement列表
![](img/Aspose.Words.04510162-3626-460a-aae2-6b21498f32dc.024.png)DefListAndStmtList Def DefListAndStmtList
| Stmt DefListAndStmtList
![](img/Aspose.Words.04510162-3626-460a-aae2-6b21498f32dc.034.png)![](img/3.png)
| declaration和statement的集合
Stmt![](img/Aspose.Words.04510162-3626-460a-aae2-6b21498f32dc.024.png)Exp SEMI
|CompSt
|RETURN Exp SEMI
|IF LP Exp RP Stmt
|IF LP Exp RP Stmt ELSE Stmt
|WHILE LP Exp RP Stmt
| FOR LP Exp SEMI Exp SEMI Exp RP Stmt
| FOR LP SEMI Exp SEMI Exp RP Stmt
| FOR LP Exp SEMI SEMI Exp RP Stmt
| FOR LP Exp SEMI Exp SEMI RP Stmt
| FOR LP SEMI Exp SEMI RP Stmt
| FOR LP SEMI SEMI RP Stmt
|EASY SEMI
![](img/Aspose.Words.04510162-3626-460a-aae2-6b21498f32dc.038.png)statement的定义:函数体,return语句,if语句,while循环,for循环,break语句,continue语句等
![](img/Aspose.Words.04510162-3626-460a-aae2-6b21498f32dc.024.png)Def Specifier Dec SEMI
![](img/Aspose.Words.04510162-3626-460a-aae2-6b21498f32dc.034.png)局部变量的声明
![](img/Aspose.Words.04510162-3626-460a-aae2-6b21498f32dc.033.png)Dec VarDec
|VarDec ASSIGNOP Exp
![](img/Aspose.Words.04510162-3626-460a-aae2-6b21498f32dc.034.png)局部变量声明的写法:形如a 或者 a=1
![](img/Aspose.Words.04510162-3626-460a-aae2-6b21498f32dc.022.png)Exp Exp ASSIGNOP Exp
| Exp RELOP Exp
| Exp PLUS Exp
| Exp MINUS Exp
| Exp STAR Exp
| Exp DIV Exp
|MINUS Exp
|ID LP Exp RP
|ID LP RP
| ID
| INT
| FLOAT
![](Aspose.Words.04510162-3626-460a-aae2-6b21498f32dc.034.png)赋值语句,布尔表达式,加减乘除语句,取相反数,函数使用,标示符等语句
与C语言的区别:
- 程序不必满足有且只有一个main函数的条件
- 函数没有必要先声明再使用
- for 循环的第一个表达式,不支持声明局部变量
## 3.语法树输出实现
使用一个多叉树和一个单项链表构造并输出语法树
多叉树的实现:多叉树的主要作用是构造各个子语法树(以非终结符为单位)
- type:节点类型。type=0,代表为中间节点,type=1,代表叶子节点data:节点值(终结符或非终结符)
- length:子节点个数
- leaves是一个节点指针的数组,长度固定为9,其中有效值个数为length个,存储指向 子节点的指针
```c
//树节点
typedef struct TreeNode{ int type;
int length;
struct TreeNode\* leaves[9]; char\* data;
}TreeNode, \*Tree;
```
#### 多叉树操作
对于终结符,创建一个叶子节点,参数为终结符的值。默认type=1 ,length=0,叶子节点指针均指向空
```c
//创建叶子节点
Tree createLeaf(char\* rootData){ int i = 0;
Tree T = (Tree)malloc(sizeof(TreeNode)); if (T != NULL){
T -> type = 1;
T -> data = rootData; T -> length = 0;
for (i = 0 ; i < 9 ; i++){ T -> leaves[i] = NULL;
}
}else{
exit(-1);
}
return T;
}
```
对于非终结符,创建一个中间节点,并连接对应的子节点。参数为非终结符值、子节点 指针数组、子节点个数,type = 0
```c
//链接叶子节点和根节点
Tree createTree(char\* root, TreeNode\*\* leaves, int length){ int i = 0;
Tree T = (Tree)malloc(sizeof(TreeNode)); if (T == NULL){
exit(-1);
}else{
T -> type = 0;
T -> data = root;
T -> length = length;
for (i = 0 ; i < 9 ; i++){
T -> leaves[i] = leaves[i];
}
}
}
```
链表实现:链表的主要作用是按照语法分析(自底向上)顺序存储终结符子语法树,用以连 接各子语法树
data:指向一棵子语法树根节点的指针
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
资源包含文件:设计报告word+项目源码 词法分析器的作用是读取源程序生成词法单元,并过滤掉注释和空白。项目中的词法分析使用了lex 。 运行环境:Ubuntu 14.04 Ubuntu 16.04 本编译器所支持的词法和语法请参考第二第三小节 解压压缩包 运行命令 unzip compiler.zip 进入文件夹运行命令 ./compiler test.cmm 其中test.cmm可以替换成其他文件 如果报错,则输出错误行号输出语法树 产生语法树所用的产生式的推导/规约序列 详细介绍参考:https://blog.csdn.net/newlw/article/details/125597613
资源推荐
资源详情
资源评论
收起资源包目录
基于lex和yacc的词法分析器+语法分析器.zip (21个子文件)
设计报告.docx 255KB
img
Aspose.Words.04510162-3626-460a-aae2-6b21498f32dc.036.png 292B
Aspose.Words.04510162-3626-460a-aae2-6b21498f32dc.016.png 142KB
Aspose.Words.04510162-3626-460a-aae2-6b21498f32dc.018.png 36KB
1.png 10KB
Aspose.Words.04510162-3626-460a-aae2-6b21498f32dc.017.jpeg 15KB
Aspose.Words.04510162-3626-460a-aae2-6b21498f32dc.034.png 124B
Aspose.Words.04510162-3626-460a-aae2-6b21498f32dc.038.png 127B
Aspose.Words.04510162-3626-460a-aae2-6b21498f32dc.033.png 286B
2.png 16KB
Aspose.Words.04510162-3626-460a-aae2-6b21498f32dc.024.png 272B
Aspose.Words.04510162-3626-460a-aae2-6b21498f32dc.022.png 270B
3.png 1KB
all.sh 76B
yacc.y 27KB
yacc.tab.h 2KB
LICENSE 1KB
test.txt 120B
yacc.tab.c 80KB
README.md 12KB
lex.l 1KB
共 21 条
- 1
shejizuopin
- 粉丝: 9484
- 资源: 1288
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
- 1
- 2
- 3
前往页