编译原理 C++编译器课程设计报告

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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':

相关文档
最新文档