编译原理 C++编译器课程设计报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
编译器的设计与分析
学号: 1233050143 姓名:李博
专业:计算机科学与技术 __ 课程:编译原理
指导教师:闫红
实验目的
本实验设计的小型编译程序涉及到编译前端的三个阶段:词法分析、语法分析和语义分析生成中间代码
((四元式),编译程序的重点放在中间代码生成阶段。编译程序的输出结果包括词法分析后的二元式序
列、变量名表;语法分析后的状态栈分析过程显示;语义分析生成中间代码后的四元式程序。整个程序
分为三个部分:(1)词法分析部分(2)语法分析、语义分析及四元式生成部分(3)输出显示部分
实验要求:
本程序仅考虑由下面产生式所定义的程序语句:
S →if B then S else S | while B do S | begin L end | A
L →S;L | S
A →i:= E
B →B∧B|B∨B|~B|(B)|I rop i|i
其中,各个非终结符的含义是:
S---语句
L—语句串
A—赋值句
B---布尔表达式
E---算术表达式
各个终结符的含义:
i---整型变量或常数,布尔变量或常数;
rop---为六种关系运算符的代表;
;---起语句分隔作用;
:=---赋值符号
~--逻辑非运算符;
∧----逻辑与运算符;
∨---逻辑或运算符;
规定程序是由一条语句或由begin和end嵌套起来的复合语句组成的,并且规定的语句末加上#@表示程序结束。下面是符合规定的程序示例:begin
A:=A+B*C;
C:=A+2;
while A while A>B do if M=N THEN C:=D else while A<=D do A:=D end#@ 实验内容: 第一部分:词法分析 一.词法分析的功能: 输入:所给文法的源程序字符串 输出:1.二元组(单词种别,单词符号的属性值)构成的序列 2.关键字: { (相当于Pascal语言中的begin) , if ,else , while , }(相当于 Pascal语言中的end ) 所有的关键字都是小写字母. 3.运算符: + , - , * , / , = , < , <= , == , > , >= ,<> , && ,|| , ! 4.界符: 逗号,分号,左圆括号, 右圆括号, # 5.常数: 在这里只涉及到int型常量 6.其他单词是标识符(ID)和整形常数(NUM),通过以下正规式定义: ID = letter(letter|digit)* NUM = digit digit * 7.空格由空白,制表符和换行符组成,空格一般用来分隔ID,NUM,运算符,界符和关键字,词法分析阶段通常会被过滤掉。 二.词法分析程序设计 3.自动机转换图 三.程序实现数据结构:struct nTab { int tc; int fc; }nTab2[200]; int Label = 0; struct rWords { char sp[10]; int sy; }; struct rWords ResWords[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}}; struct aa { int sy1; int pos; }buf[1000],n,n1,E,sstack[100],ibuf[100],stack[1000]; void ReadLine( ) { char ch1; Pline = Line; ch1 = cfile.get(); while( ch1 != '\n') { *Pline = ch1; Pline ++; ch1 = cfile.get(); } *Pline = '\0'; Pline = Line; } void Readch( ) { if (ch == '\0') { ReadLine( ); Lnum ++; } ch = *Pline; Pline ++; } void Scan ( ) { while (ch != '@') { switch(ch) { case ' ':break; case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': case 'g': case 'h': case 'i': case 'j': case 'k': case 'l':