编译原理实验课程设计
-词法语法分析综合设计
1 概述
通过C++实现词法语法综合分析,可以通过用户输入判断用户所需要实现的功能,做出相对应的操作。
2 实验目标

  1. 理解并掌握词法,语法分析的原理与方法。
  2. 能够使用某种语言实现词法,语法分析程序。
  3. 对编译的基本概念,原理和方法有完整和清楚的理解,并能正确而熟练的运用。
    3 实验算法描述
    3.1 实验要求
    在程序开始位置输入对应功能字母编码,通过键盘字母选择,进行词法分析、语法分析、综合分析
    在综合设计中,采用词法分析程序作为语法分析程序子程序的方法,实现词法、语法分析。
    词法分析、语法分析、综合分析通过键盘字母选择
    输入数据:程序段。
    输出结果:词法分析结果和语法分析结果和综合分析结果,包括错误列表。
    图1 主函数界面

3.2 本实验概述
本次实验采用C++、C语言编写词法语法分析器,要求通过字母调用之前做的两次手动实验。通过输入数字母a,实现C++语言子集符号的识别,即,词法分析。通过输入字母b,对之前输入的单词符号进行语法分析。通过输入数字母c,实现对语法和词法的综合分析。在输出abc以外的字母给予错误提示。其中对于语法分析本实验采用递归下降法。
4 技术分析
4.1 词法语法分析
本次实验主要用到的是一些基本c++、c语言的语法,如简单的判断语句if 和分支语句switch。
4.1.1词法分析
词法分析是编译程序进行编译时第一个要进行的任务,主要是对源程序进行编译预处理(去除注释、无用的回车换行找到包含的文件等)之后,对整个源程序进行分解,分解成一个个单词,对于一个具体的源程序而言,在扫描字符串时识别出一个单词,若这个单词的类型是关键字、标识符等就一此文字形式输出,每次调用词法分析程序,它都能够自动的继续扫描下去,形成下一个单词,制单源程序结束。我们把这些单词有且只有五类,分别是标识符、保留字、常数、运算符、界符。词法分析面向的对象是单个的字符,目的是把它们组成有效的单词(字符串);而语法的分析则是利用词法分析的结果作为输入来分析是否符合语法规则并且进行语法制导下的语义分析,最后产生四元组(中间代码),进行优化(可有可无)之后最终生成目标代码。可见词法分析是所有后续工作的基础,如果这一步出错,比如明明是‘<=’却被拆分成‘<’和‘=’就会对下文造成不可挽回的影响。因此,在进行词法分析的时候一定要定义好这五种符号的集合。下面构造的一个C++、C语言子集。
第一类:标识符 letter(letter | digit)* 无穷集
第二类:常数 (digit)+ 无穷集
第三类:关键字"void",“main”,“break”,“include”,“begin”,“end”,“if”,“else”,“while”,“switch”
第四类:分界符 ‘/’、‘//’、 { } " " ’ 等
第五类:运算符 <、<=、>、>=、=、+、-、
、/、^、等
概括的说,词法分析器在其工作过程中,一般应完成下列的任务:
(1) 识别出源程序中的各个单词符号,并将其转换成内部编码形式:
(2) 删除无用的空白字符、回车字符以及其他非实质性字符;
(3) 删除注释;
(4) 进行词法检查,报告所发现的错误

4.1.2语法分析:
语法分析是编译过程的一个逻辑阶段。语法分析的任务是在词法分析的基础上将单词序列组合成各类语法短语,如“程序”,“语句”,“表达式”等等.语法分析程序判断源程序在结构上是否正确.源程序的结构由上下文无关文法描述.语法分析程序可以用YACC等工具自动生成。完成语法分析任务的程序称为语法分析器,或语法分析程序。按照源语言的语法规则,从词法分析的结果中识别出相应的语法范畴,同时进行语法检查。
语法分析器的功能是按照源语言的语法规则,从词法分析的结果中识别出相应的语法范畴,同时进行语法检查。
给定文法G和字符串( ∈VT*),检查、判定 ∈L(G)?即检查、判定是否是文法G所能产生的合法的句子,同时报告和处理语法错误。
语法分析方法有自上而下语法分析方法(本实验使用该方法)
自上而下语法分析方法,即给定文法G和源程序串r。从G的开始符号S出发,通过反复使用产生式对句型中的非终结符进行替换(推导),逐步推导出r 。
分析的主旨是选择产生式的合适的侯选式进行推导,逐步使推导结果与src匹配.在定义部分,将语法分析中first follow文法和集合分分别存入数组,在后面输出时直接输出即可。
(1)语法分析的文法如下:

(2)语法树分析示例:



(3)预测分析表

(4)First和Follow集合

4.1.3综合分析
对于综合分析,通过调用词法和语法完成操作,实现对输入的内容进行语法词法两次分析并输出结果,技术上就是将词法语法分析函数作为子程序来使用。
5 设计与实现
5.1 设计思路
5.1.1分析:
1.主函数:在考虑主函数的时候并没有把全部的代码都放在一个.cpp里,这样看起来也会比较的麻烦,所以对于单独复杂但是重要的功能是一.h的文件加载在主函数的头文件中的,这样降低了耦合度,使得后期对单一功能进行修改变得简单,给后期维护带来了极大的便利。
2.在语法分析器的设计过程中由于手动输入较为麻烦,此部分设计为输入一个.txt的文件名,对文件里面的程序内容进行一一的分析,
3.在综合分析的函数中,通过对词法语法的函数实现中综合分析,把输入的内容同时做语法、词法分析并输出。同时将输入的内容以文件的形式存储起来,便于后期的查找,当我们输入复杂的内容时,若多次输入是一件很繁琐的事情,这个时候不就可以直接打开我们写入内容存储的那个的文件,进行复制即可,方便快捷。
如下以流程图的方式介绍设计完整思路。
主函数流程图:

B功能模块流程图:

C功能模块流程图:
词法分析流程图
词法分析状态转换图
语法分析我们在本实验中是给定了文法对其进行分析的,我们给定的文法是LL1文法,也就是说,整个程序的文法是固定的,在输入部分输入我们需要分析的串,对其进行分析,并判断他的合法性。主要也是用简单的C/C++语言输出语句、if条件语句进行分析的。当然我们的侧重点是对语法进行分析功能的实现,编程技术不是重难点,所以代码设计相对简单。
语法分析中内部主流程序如下流程图所示

①函数E()语法分析流程图如下:
②、对函数T()语法分析流程图如下:
③、对函数F()语法分析流程图如下:
④、对函数G()语法分析流程图如下:
⑤、对函数S()语法分析流程图如下:

⑧printYC()
综合分析功能流程图:
5.2 实现方法
本实验采用C++、C编码,其中主要编写了以下几个函数及功能:
//词法分析核心函数
void analyze(FILE *fpin) //对输入串进行分析
bool isKey(char * token)//判断是否为关键字
bool isDigit(char digit) //判断是否为数字

//语法分析核心函数
void printFF()//输出FIRST FOLLOW集合
void printYC()//输出语法预测分析表
void printWF()//输出文法
void T()//被调函数T()
void E()//被调函数E()
void G()//被调函数E()
void F()//被调函数F()
void S()//被调函数S()
在主函数中,我们把语法词法两个功能加载成.h的文件导入在头文案中,
主函数如下:
#include
#include <stdlib.h>
#include “cffx.h”
#include “yffx.h”
int main(){
printf(“请选择执行的操作:(a 或 b 或 c)\n”);
cout<<" a.词法分析\n b.语法分析\n c.综合分析\n"<<endl;
char num;
switch(num=getchar()){
case ‘a’:{ char input[30];
FILE fpin;
cout<<“请输入文件名字:\n”<<endl;
for(;

编译原理实验课程设计相关推荐

  1. 编译原理java课程设计_编译原理课程设计词法分析

    一.课程设计任务及要求 1.1.目的 通过使用一个通用的能够自动根据正规表达式生成词法分析程序的工具程序设计一个简单语言的词法分析器,使学生充分理解课程理论内容和工具软件的使用技巧,掌握所涉及的典型数 ...

  2. c语言词法分析器实验原理,词法分析器的设计与实现 编译原理实验报告.doc

    词法分析器的设计与实现 编译原理实验报告 中北大学软件学院 实 验 报 告 专 业 软件工程 课程名称 编译原理 学 号 姓 名 辅导教师 张静 成绩 实验日期2015.5.19实验时间14:00~1 ...

  3. 词法分析程序的设计(编译原理实验一)

    词法分析程序的设计(编译原理实验一) 一.实验内容 ​ 编制一个能够分析三种整数.标识符.主要运算符和主要关键字的词法分析程序. 二.实验要求 编写程序,识别如下单词符号 标识符 <字母> ...

  4. 通信原理matlab实验课程设计,通信原理matlab课程设计报告

    通信原理matlab课程设计报告 1 目录 一问题描述-----------------------------------------3 二实验原理------------------------- ...

  5. 《编译原理》课程标准

    XX大学软件学院 <编译原理>课程标准 制定人:张晨光 课程代码: 773033 课程名称(中文 / 英文):编译原理 / Compiler Principle 学时( 实验学时 )/ 学 ...

  6. 《编译原理》课程教学大纲

    <编译原理>课程教学大纲 课程编号:773033 课程名称(中/英文):编译原理 / Compiler Principle 课程类型: 模块课 总 学 时:5学时/周 讲课学时:4学时/周 ...

  7. 编译原理--实验2 语法分析

    文章目录 前言 1.1实验目的 1.2 实验任务 1.3 实验内容 1.3.1 实验要求 1.3.2 输入格式 1.3.3 输出格式 1.3.4 样例 1.4 程序 1.4.1 程序流程图 1.4.2 ...

  8. 编译原理上机实习c语言小子集编译程序的实现报告,合肥工业大学编译原理实验报告(完整代码版)...

    <合肥工业大学编译原理实验报告(完整代码版)>由会员分享,可在线阅读,更多相关<合肥工业大学编译原理实验报告(完整代码版)(58页珍藏版)>请在人人文库网上搜索. 1.计算机与 ...

  9. 编译原理实验c语言cfg文法,编译原理

    地址在符号表中引入指针previous,来连接上一个符号的首地址运行时存储空间组织活动记录用于管理函数变量的信息栈式存储过程进入和返回通过变更top和sp指针,实现活动记录的栈式处理静态链实现局部变量 ...

  10. html解析器编译原理,编译原理实验报告词法分析器(内含源代码).docx

    编译原理实验报告词法分析器(内含源代码) 编译原理实验(一) --词法分析器 实验描述 运行环境:vc++2008 对某特定语言A ,构造其词法规则. 该语言的单词符号包括: 1该程序能识别的单词符号 ...

最新文章

  1. java fseek_转到C中的二进制文件的某个点(使用fseek),然后从该位置读取(使用fread)...
  2. 李开复预测:未来20年 AI将深刻影响五大产业
  3. 一张小票看透支付清结算架构
  4. 我喜欢的JavaScript编程风格
  5. Window服务器可安装的live messager最新版本-20090826
  6. “是男人就下100层”
  7. SQL、NoSQL、NewSQL,论开源之路谁主沉浮
  8. android 透明主题 crash,Android 8.0 的填坑(透明的activity崩溃)
  9. 【MySQL笔记】MySql5安装图解教程
  10. C语言内联函数的作用
  11. 从零开始学习makefile(8) gcc -MM的作用
  12. EGE基础:键盘输入篇
  13. “醉牛前端”重新起航!
  14. The 2018 ACM-ICPC Asia Shenyang Regional Contest
  15. Wps日期时间格式转文本、科学计数法转数字
  16. 微信小程序开发者问题集锦
  17. php生成word文件
  18. Qt5.2编译时出现/usr/bin/ld: cannot find -lxxx 错误
  19. ORA-02396:超出最大空闲时间,请重新连接
  20. idea如何配置jdk环境_idea配置jdk环境变量

热门文章

  1. 简述算法和程序的区别并举例说明
  2. snmp No Such Instance currently exists at this OID
  3. 电商运营数据分析常用分析指标--交易数据指标、品类分析数据指标与内容分析数据指标
  4. 将一个大写英文字母转换为小写输出 (12 分) - PTA
  5. jmeterweb登陆测试_JMeter (2) —— JMeter与WebDriver测试用户登陆以CAS SSO为例(101 Tutorial)...
  6. 益而优有机核桃油给宝宝安全放心的油!
  7. 抖音GIF表情包制作教程 如何制作QQ动态表情包
  8. 前后端鉴权之session-cookie
  9. c语言中余数恒等于1,恒等于符号怎么打就是“≡”符号在windows里怎么打出来具体到搜狗里怎么打,麻烦说细点儿...
  10. C语言---用筛选法求100以内的素数