网站建设属于办公费吗,郑州seo方案,域名过期网站还有用吗,移动端网站开发哪家好前面花了两篇文章来介绍词法分析和语法分析#xff0c;接下来才是比较有意思的部分——一个小型类C编译器的设计和实现#xff08;其实是编译原理的课程设计啦#xff01;~#xff09;我用的是python2.7.13PyQt来做的。。。事实上#xff0c;正是从编译原理课程设计开始接下来才是比较有意思的部分——一个小型类C编译器的设计和实现其实是编译原理的课程设计啦~我用的是python2.7.13PyQt来做的。。。事实上正是从编译原理课程设计开始我开始转战python这也算是用python写的第一个程序吧^_^局限性肯定是存在的只要大家从中能get到一点点于自己而言有用的东西我就灰常开森了O(∩_∩)O哈哈~最后欢迎大家批评指正THX~一、 实验目标了解形式语言与自动机理论在计算机中的应用掌握文法的构造方法。了解词法分析的原理并掌握利用语法栈对词法分析的结果进行自上而下的语法分析的方法。了解中间代码的构成形式掌握语法制导的翻译方法和跳转回填的方法。了解8086汇编语言的语法并掌握利用语义分析生成的中间代码进行目标代码生成的方法。了解一遍完成的、简单语言的编译方法。在上述基础上实现一个类C编译器要求读入指定格式的C语言代码并生成8086汇编代码。选择了含过程调用的文法二、开发前提1.开发语言选取python作为本次类C编译器的开发语言解释器为python2.7.13。不同版本语法有一定的差异与C相比如下所示1.1 优点python集成了一些基本的字符串操作具有强大的字符串处理能力。Python中没有变量类型定义的概念变量实现机制实质是封装了的指针通过使用变量来区分变量类型省去了变量类型定义的麻烦python中提供了list类型和dictionary类型变量的处理方法通过使用这两个类可以实现变量的快速索引和查找。提供了turple元组处理方法可以用list来实现数据表。1.2 缺点与相比C而言Python代码更简洁但是执行速度不如C。python没有指针的概念没有变量引用的概念在参数传递时需要通过数组来进行地址传递。Python对开发环境限制较多。综合上述对比以及想学习一门新的编程语言的想法我选择python作为开发语言。2、开发环境pycharm2016 professionalAconoad2解释器为python2.7.13UI界面使用PyQt4(引入工具包其余使用到的库均为python的标准库主要如下import json # 处理格式化数据读入的库
import collections # 定义元组的库
import sys # 系统操作库
import re # 正则表达式处理库
import PyQt # 界面采用库3. C语言语法规则该部分将从目标语言的词法规则语法规则入手介绍对对文法的预处理过程为后来代码的编写打好了基础。PS这里的目标语言就是课程设计中所要求的简易类C语言3.1 词法规则关键字int | void | if | else | while | return标识符 字母字母|数字* 注不与关键字相同数值数字数字*赋值号 算符 | - | * | / | | | | | | | ! 界符 分隔符 注释号 /* */ | //左括号 右括号 左大括号 {右大括号 }字母| a |....| z | A |....| Z |数字0| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |结束符#3.2 语法规则选择了包含过程调用的文法1来进行本次编译器的开发文法1的详细内容详见实验要求PS为了方便我还是贴过来好了在此主要通过原始文法与处理后文法的对照来简要介绍对文法1的处理详见功能模块中文法处理部分【文法1_包含过程调用】 说明 { }中的项表示可重复若干次
Program :: 声明串
声明串 ::声明{声明}
声明 ::int ID 声明类型 | void ID 函数声明 #记下变量类型
声明类型::变量声明 | 函数声明 #填入变量表 声明语句处理模块
变量声明 :: ;
函数声明 ::’ (‘形参’) ‘语句块
形参:: 参数列表 | void #新建一张变量表存储形参和局部变量
参数列表 :: 参数 {, 参数}
参数 :: int ID #填入形参和局部变量类型表 定义函数类名字形参内变
语句块 :: ‘{‘内部声明 语句串’}’
内部声明 :: 空 | 内部变量声明{; 内部变量声明}#内变填入刚刚新生成的函数类
内部变量声明::int ID
语句串 :: 语句{ 语句 }
语句 :: if语句 | while语句 | return语句 | 赋值语句
赋值语句 :: ID 表达式;
return语句 :: return [ 表达式 ] 注[ ]中的项表示可选
while语句 :: while ‘( ‘表达式 ‘)’ 语句块
if语句 :: if ‘(‘表达式’)’ 语句块 [ else 语句块 ]注[ ]中的项表示可选
表达式::加法表达式{ relop 加法表达式 } 注relop- |||||!
加法表达式 :: 项 { 项 | -项}
项 :: 因子 {* 因子 | /因子}
因子 ::num | ‘(‘表达式’)’ |ID FTYPE
FTYPE :: call | 空
call ::’(’实参列表 ’) ’
实参 ::实参列表 | 空
实参列表 :: 表达式{, 表达式}
ID::字母(字母|d数字)*
【程序实例】
int a;
int b;
int program(int a,int b,int c)
{int i;int j;i0; if(a(bc)){ja(b*c1);}else{ja;}while(i100){ij*2;}return i;
}int demo(int a)
{aa2;return a*2;
}void main(void)
{int a;int b;int c;a3;b4;c2;aprogram(a,b,demo(c))return;
}4、8086汇编语言语法规则8086汇编语言属于CISC指令集指令集比较庞大实现的功能较多但指令长短不一。该部分将从8086汇编的代码结构和语法简介两方面来介绍目标代码的语法规则。4.1 代码结构【数据段】
DATA SEGMENT
//该段需要声明程序中所用到的数据
//严格遵循先定义后使用除非采用内存分配方式
DATA ENDS【代码段】
CODE SEGMENTASSUME CS:CODE,DS:DATA // 固定语句,完成代码段和数据段的加载工作PPOCEDURE PROC NEAR //调用子函数的代码段 PPOCEDURE ENDP START: MOV AX,DATA //主函数段MOV DS,AXEND START
CODE ENDS //代码段结束标志 4.2 语法简介8086语言基本指令解释以及针对本次实验的文法所用到的指令和基本语法解释如下1内存操作指令MOV OP1OP2 PO1---OP2 寄存器存储器累加器---寄存器存储器累加器立即数(兼有LOAD和STORE指令的功能)2临时变量存储指令PUSH 压栈POP 出栈3加减运算指令寄存器---寄存器存储器ADD OP1,OP2 OP1--OP1OP2SUB OP1,OP2 OP1--OP1-OP24乘除运算指令MUL OPRD EDX:EAX--EAX*OPRDDIV OPRD EDX:EAX/OPRD 商EAX余数EDX5条件跳转指令CMP OP1OP2 OP1-OP2JZ 等于0跳转JNZ 非0跳转JG 大于跳转JGE 大于等于0跳转JL 小于0跳转JLE 小于等于0跳转二、总体设计该部分设计主要描述了编译器的总体架构首先从编译器的原理和功能模块两部分阐述了整个设计具体如下所示1、实验原理实验中实现的指定文法的类C编译器故首先需要了解编译程序的流程并对整个编译器代码框架作出布局具体如下所示1.1 编译程序编译程序的流程如下图所示多次提到这个流程前边也有——by hallucination1.2 文法处理 整个编译程序执行之前需要对给定的文法进行处理转化为便于计算机识别的形式。此外还需要将转化后的文法变为符合LL(1)的文法具体处理后的文法如下所示文法名对照(肯定要先把推导公式里的汉字转变成英文表示嘛~)ProgramProg 声明串Dstr 声明Decl 声明类型Type变量声明Vari 函数声明Func 形参Vpam 参数列表Pist语句块Bloc 内部声明Kdec 内部变量声明Kdev语句串Lstr 赋值语句Asla 语句Lang return语句Rela表达式Expr while语句Whla if语句Ifla 加法表达式AexpFTYPE:FTYP 因子Fact 项Item Call:Call实参Rpam 实参列表Rist ID:ID中间变量Stem/Ptem/Ltem/Rtem/Atem/Itmp/Ftem/Rltm处理后的文法注左边汉字表示的是未处理的文法右边带标号的字符串表示编译器处理时采用的文法。1.3 功能划分按照编译程序的执行流程将整个编译器划分为如下几个部分来实现类的定义ClassType.py词法分析LEX.py语法分析SynAly.py语义分析SemAly.py目标代码生成CodeGen.py界面生成compiler.py其中语法分析模块调用词法分析的结果并在执行到相应的语义动作时调用语义分析模块语义分析模块在基本块完成时调用目标代码生成模块生成目标代码。2.功能模块在对整个编译器的原理进行分析并完成了文法的处理后开始详细分析整个编译器的执行流程并附加上每个模块的数据流绘制出系统的功能流程图如下所示实际上也对系统的开发模块做了规划整个编译器的工作流程图——by hallucination内容略多。。。。所以功能设计部分就放在下一回再说啦~感谢大家持续关注✿✿ヽ(°▽°)ノ✿