# 编译原理实验
## 词法分析
### 实验内容
(1)从 txt 文件中读入字符。
(2)统计行数和列数用于定位。
(3)删除空格类字符,包括回车、制表符空格。
(4)按拼写单词,并用(内码,属性)二元式表示。 (属性值——token 的机内表示)
(5)如果发现错误则报告出错
(6)根据需要是否填写标识符表供以后各阶段使用。
### 实验环境
开发环境:windows10 Visual studio 2015
开发语言:C++
### 设计思想
根据各个状态的转移条件构造各个判断逻辑,将程序运行的状态加以区别。源程序来源采用文件导入的方式,对输入源程序的文件进行逐行的词法分析。支持对标识符、关键字、整数、分界符、运算符等的识别。
识别每一个单词依赖于其相应的词法分析的状态转换图。对于关键字,不专设对应的转换图,把其存放在字符串数组中(保留字表)。当转化图识别出一个标识符时,就去查这张表,确定是否为关键字。
### 概述图
![](https://www.writebug.com/myres/static/uploads/2021/11/15/2b323ed99536c2abd82e4a4ee193c9bb.writebug)
![](https://www.writebug.com/myres/static/uploads/2021/11/15/90baf91a7f86032c597534a822928833.writebug)
![](https://www.writebug.com/myres/static/uploads/2021/11/15/72cf0223e65db6987764c241d85dc3da.writebug)
![](https://www.writebug.com/myres/static/uploads/2021/11/15/fa1ca9efb2cfa13e756dda6b6854b011.writebug)
![](https://www.writebug.com/myres/static/uploads/2021/11/15/108dc17d9eb4a0389a55d49ec9f6fdcc.writebug)
### 部分代码解释
数组存储的关键字表,分隔符表,运算符表
![](https://www.writebug.com/myres/static/uploads/2021/11/15/c7f0980a9a5a80e22bf582de45f31fc4.writebug)
判断关键字,判断分界符,判断运算符,判断字母,判断数字的函数,都是简单的运用 strcmp 函数进行,或是判断是否在 ASCII 码的对应范围内
![](https://www.writebug.com/myres/static/uploads/2021/11/15/66bdcf8c55aabf35fd1f672110380d24.writebug)
调用各个自定义函数构成 analyse 函数
![](https://www.writebug.com/myres/static/uploads/2021/11/15/08b483cdce56b6ef87f87595ecc7d06e.writebug)
主函数运行 analyse 函数
![](https://www.writebug.com/myres/static/uploads/2021/11/15/df722a52e3016490a3823fb2ce4b6931.writebug)
![](https://www.writebug.com/myres/static/uploads/2021/11/15/9663a9372d820de35a3adecc9bd1398c.writebug)
![](https://www.writebug.com/myres/static/uploads/2021/11/15/25e50a9fd1771421931606092cf50ec5.writebug)
对数字开头的处理:
首先把数字开头接字母判错,然后在这之后紧接着的无论数字或者字母都加入进去一并判为 Error;而数字开头接数字的则判为常数。
![](https://www.writebug.com/myres/static/uploads/2021/11/15/b73a3b52eefeb943f94bede14cac1f34.writebug)
对关系运算符的处理:
利用 switch 语句,对 >,< 处理时要注意再多读入一个字符,看是否会组成 >=,<=,<>,若不会,则正常输出前面的那一个关系运算符。
![](https://www.writebug.com/myres/static/uploads/2021/11/15/646870c82f6292fe5e284701cb985bd7.writebug)
### 实验结果
![](https://www.writebug.com/myres/static/uploads/2021/11/15/6e84128aa6bb44e1639dff318ea09b68.writebug)
## LL(1)预测分析
### 实验内容
1.根据某一文法编制调试 LL (1 )分析程序, 以便对任意输入的符号串进行分析。
2.构造预测分析表,并利用分析表和一个栈来实现对上述程序设计语言的分析程序。
3.分析法的功能是利用 LL(1)控制程序根据显示栈栈顶内容、向前看符号以及 LL(1)分析表,对输入符号串自上而下的分析过程。
### 实验环境
开发环境:windows10 Visual studio 2015
开发语言:C++
### 部分代码
在 main 函数中调用各个自定义函数
![](https://www.writebug.com/myres/static/uploads/2021/11/15/ee0deeb75f4d531e58c246cf98b2151e.writebug)
![](https://www.writebug.com/myres/static/uploads/2021/11/15/81b6208805d03fc5d02fd1932e3c2804.writebug)
![](https://www.writebug.com/myres/static/uploads/2021/11/15/a6ecd1d1d33c291d0dd897e9b5e590e5.writebug)
![](https://www.writebug.com/myres/static/uploads/2021/11/15/e8dbce7aaf17cb2ad7a4fee4f8e2bccb.writebug)
进入 run()函数,输入待规约字符串后,对 ch 赋值为待规约字符串的首位,并对 point+1 为 1,建栈,先入后出压入#和非终结符 E,取栈顶元素 E 给 X,…一系列输出后,进入循环,当 X 为终结符时,判断是否为 ch,若是,终结符匹配,若否,出错;
else if 中若 X=Vn[0]=E,先判断是否对应分析表中的是否都是 error,若不是,则将 X=E 出栈,对 len 赋值为产生式右端长度-1,并倒序将其压栈,进入下一步骤,然后输出栈内元素,输出规约式(-1),输出所用产生式,输出动作,再取栈顶为下一步循环做准备。后面的循环都和这个原理类似。
![](https://www.writebug.com/myres/static/uploads/2021/11/15/da816c8423a226c29d3a9cab5f3813cd.writebug)
### 实验结果
![](https://www.writebug.com/myres/static/uploads/2021/11/15/45d1579ae9f43696506ab50d3dac9b03.writebug)
![](https://www.writebug.com/myres/static/uploads/2021/11/15/929391aa115b8e3e7fd84470a7dda051.writebug)
## LR 语法分析设计
### 实验内容
对下列文法,用 LR(1)分析法对任意输入的符号串进行分析:
(1) E-> E+T
(2) E->T
(3) T-> T*F
(4) T->F
(5) F-> (E)
(6) F-> i
### 实验环境
开发环境:windows10 Visual studio 2015
开发语言:C++
### 部分代码说明
采用了直接把表对应到程序的方式,然后对栈中元素进行读取分析,根据状态栈和输入串的情况决定下一步做什么,分别进行规约和移进,具体以输入串为 i+i*i#为例子,进行分析。
![](https://www.writebug.com/myres/static/uploads/2021/11/15/8e510d6da0e75e5a5da1e1a003c091f5.writebug)
r 为状态栈,l 为符号栈,Y 为状态栈栈顶元素
以 i+i*i#例,输入该字符串后,状态栈 r 为 0,符号栈 l 为#,输入串为 i+i*i#,则读入[0,i],则进入 Action0();
又因为 ch=i,if(ch==’I’)的语句,输出步骤 1,状态 0,符号#,输入串 i+i*i#,“ACTION[0,i]=S5,状态 5 入栈”,然后将 5 压入状态栈,并将 i 压入符号栈。
此时读入[5,+],则进入 Action5();
又因为 ch=+,输出步骤 2,状态 05,符号#i,符号栈将栈顶元素出栈,并压入 F,输出此时的输入串 +i*i#,“r6:F->i 规约”,并将状态栈顶元素出栈,取得
新的栈顶元素 0,查表 Goto 表进入 Goto(int(Y),‘F)即 Goto(0,F)。
又因为 ch=+,输出步骤 2,状态 05,符号#i,符号栈将栈顶元素出栈,并压入 F,输出此时的输入串 +i*i#,“r6:F->i 规约”,并将状态栈顶元素出栈,取得
新的栈顶元素 0,查表 Goto 表进入 Goto(int(Y),‘F)即 Goto(0,F)。
即将 3 再压入状态栈,输出“,GOTO(0,F)=3 入栈”
![](https://www.writebug.com/myres/static/uploads/2021/11/15/98cba671bf45571b5c6d38a69485da1b.writebug)
### 实验结果
![](https://www.writebug.com/myres/static/uploads/2021/11/15/935c38e7a847358b43c481ef4cef6f3f.writebug)
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
包含词法分析、LL(1)预测分析、LR 语法分析设计,在windows10 Visual studio 2015下使用C语言实现,对部分代码进行了解释,说明了实验内容,实验结果,实验思想,通过这个项目,对编译原理有了进一步的了解。 (1)从 txt 文件中读入字符。 (2)统计行数和列数用于定位。 (3)删除空格类字符,包括回车、制表符空格。 (4)按拼写单词,并用(内码,属性)二元式表示。 (属性值——token 的机内表示) (5)如果发现错误则报告出错 (6)根据需要是否填写标识符表供以后各阶段使用。
资源推荐
资源详情
资源评论
收起资源包目录
100012528-基于C++进行编译原理实验.zip (13个子文件)
ccomplier
编译3.cpp 7KB
bianyi2.txt 84B
LICENSE 1KB
编译1.cpp 5KB
编译2-2.cpp 6KB
bianyi1.txt 27B
编译2-1.cpp 7KB
编译原理实验指导书(李宏芒).pdf 1.2MB
2018211958 计科二班 孙淼 编译原理实验报告与验收ppt
2018211958 计科二班 孙淼 编译原理实验报告.docx 3.61MB
2018211958 计科二班 孙淼 编译原理实验验收ppt.pptx 3.75MB
.keep 1B
README.md 7KB
编译4.cpp 4KB
共 13 条
- 1
资源评论
神仙别闹
- 粉丝: 2666
- 资源: 7637
下载权益
C知道特权
VIP文章
课程特权
开通VIP
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功