资源描述:
《编译原理-C++编译器课程设计报告.doc》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、编译器的设计与分析学号:姓名:李博专业:计算机科学与技术__课程:编译原理指导教师:闫红实验目的本实验设计的小型编译程序涉及到编译前端的三个阶段:词法分析、语法分析和语义分析生成中间代码
((四元式),编译程序的重点放在中间代码生成阶段。编译程序的输出结果包括词法分析后的二元式序
列、变量名表;语法分析后的状态栈分析过程显示;语义分析生成中间代码后的四元式程序。整个程序
分为三个部分:(1)词法分析部分(2)语法分析、语义分析及四元式生成部分(3)输出显示部分实验要求:本程序仅考虑由下面产生式所定义的程序语句:S→ifBthenSelseS
2、whileBdoS
3、beginLend
4、AL→
5、S;L
6、SA→i:=EB→B∧B
7、B∨B
8、~B
9、(B)
10、Iropi
11、i其中,各个非终结符的含义是:S---语句L—语句串A—赋值句B---布尔表达式E---算术表达式各个终结符的含义:i---整型变量或常数,布尔变量或常数;rop---为六种关系运算符的代表;;---起语句分隔作用;:=---赋值符号~--逻辑非运算符;∧----逻辑与运算符;∨---逻辑或运算符;规定程序是由一条语句或由begin和end嵌套起来的复合语句组成的,并且规定的语句末加上#@表示程序结束。下面是符合规定的程序示例:beginA:=A+B*C;C:=A+2;whileABdoifM=NT
12、HENC:=DelsewhileA<=DdoA:=Dend#@实验内容:第一部分:词法分析一.词法分析的功能:输入:所给文法的源程序字符串输出:1.二元组(单词种别,单词符号的属性值)构成的序列2.关键字:{(相当于Pascal语言中的begin),if,else,while,}(相当于Pascal语言中的end)所有的关键字都是小写字母.3.运算符:+,-,*,/,=,<,<=,==,>,>=,<>,&&,
13、
14、,!4.界符:逗号,分号,左圆括号,右圆括号,#5.常数:在这里只涉及到int型常量6.其他单词是标识符(ID)和整形常数(NUM),通过以下正规式定义:ID=letter(le
15、tter
16、digit)*NUM=digitdigit*7.空格由空白,制表符和换行符组成,空格一般用来分隔ID,NUM,运算符,界符和关键字,词法分析阶段通常会被过滤掉。二.词法分析程序设计单词内部码编码号IfSy_if0thenSy_then1elseSy_else2whileSy_while3beginSy_begin4DoSy_do5endSy_end6andop_and39Orop_or40notop_not41+Plus34*Times36:becomes38;Semicolon8(lparent48)rparent49AccAcc-2=rop423.自动机转换图三.程序实现数
17、据结构:structnTab{inttc;intfc;}nTab2[200];intLabel=0;structrWords{charsp[10];intsy;};structrWordsResWords[10]={{"if",Sy_if},{"do",Sy_do},{"else",Sy_else},{"while",Sy_while},{"then",Sy_then},{"begin",Sy_begin},{"end",Sy_end},{"and",op_and},{"or",op_or},{"not",op_not}};structaa{intsy1;intpos;}buf[1000
18、],n,n1,E,sstack[100],ibuf[100],stack[1000];voidReadLine(){charch1;Pline=Line;ch1=cfile.get();while(ch1!=''){*Pline=ch1;Pline++;ch1=cfile.get();}*Pline=' ';Pline=Line;}voidReadch(){if(ch==' '){ReadLine();Lnum++;}ch=*Pline;Pline++;}voidScan(){while(ch!='@'){switch(ch){case'':break;case'a':case'
19、b':case'c':case'd':case'e':case'f':case'g':case'h':case'i':case'j':case'k':case'l':case'm':case'n':case'o':case'p':case'q':case'r':case's':case't':case'u':case'v':case'w':case'x':case'y':case'z':Identifer();break;case'