文档库 最新最全的文档下载
当前位置:文档库 › 武汉理工大学编译原理课设

武汉理工大学编译原理课设

武汉理工大学编译原理课设
武汉理工大学编译原理课设

二---十进制的语法分析及语义分析程序设计

----算符优先分析法1.系统描述

1.1目的

通过设计、编制、调试一个FOR循环语句的语法及语义分析程序,加深对语法及语义分析原理的理解,并实现词法分析程序对单词序列的词法检查和分析。

1.2算符优先分析方法原理:

算符优先分析方法是根据算符之间的优先关系而设计的一种自下而上的分析方法。算符优先分析的基本思想是只规定算符之间的优先关系,也就是只考虑终结符之间的优先关系。算符优先分析过程是自下而上的归约过程,所谓的算符优先分析就是定义算符之间(确切地说,终结符之间)的某种优先关系,借助于这种优先关系寻找“可归约串”和进行归约。

该文法必须满足以下条件:

文法它的任一产生式的右部都不含两个相继(并列)的非终结符,即不含如下产生式右部:…QR…;

首先求出该文法的优先关系表,在程序中用2维数组表示,-1表示小于或者等于,大于为1,其它为0表示错误。

在输入一串字符串以后进行按照文法一步一步的进行规约,我所进行的是直接规约到文法的符号而不是规约到N。

数据结构使用的是链表,用一个STRUCT来表示一个元素,其中包含符号和下一个符号的指针。

2.翻译方法概述

2.1语法分析

采用递归下降方法,为对应文法中的每个非终结符编写一个递归过程,每个过程的功能是识别由该非终结符推出的串。若输入串是给定文法的句子,则从文法的开始符号出发一定能推导出与输入的单词串完全相同的句子。

语法分析是编译过程的一个逻辑阶段。语法分析的任务是在的基础上将单词序列组合成各类语法短语,如“程序”,“语句”,“表达式”等等。语法分析程序判断源程序在结构上是否正确.源程序的结构由上下文无关文法描述.语法分析程序可以用YACC等工具自动生成。

语法分析是编译程序的核心部分,其主要任务是确定语法结构,检查语法错误,报告错误的性质和位置,并进行适当的纠错工作。语法分析的主要工作:是识别由词法分析给出的单词序列是否是给定的正确句子(程序)。语法分析常用的方法:自顶向下的语法分析和自底向上的语法分析两大类。此次设计中语法分析中主要通过递归下降分析法对语法分析处理过程进行控制,使输出的三地址表示的翻译的工作有条不紊的进行,同时识别语法分析中的语法错误。

递归下降法主要采用自顶向下方法,即从文法的开始符号开始进行分析,逐渐推导的往下构造语法树,使其树叶正好构造出所给定的源程序串。自顶向下方法的关键是确定在推导过程中选择候选式的问题。当进行推导时,一个非终结符可能对应多个产生式,这样我们就无法事先知道应该用哪个产生式,因此实用都作了一些限制。以便在任何情况下都能确定应该用的产生式。

自顶向下的主要思想是从开始符出发导出句型并一个符号一个符号地与给定终结符串进行匹配。如果全部匹配成功,则表示开始符号可推导出给定的终结符串。因此判定给定终结符号串是正确句子。

在语法分析的同时可由语法分析程序调用相应的语义子程序进行语义处理,完成附加在所使用的产生式上的语义规则描述,并生成四元式的中间代码形式。

2.2语义分析

语义分析是编译过程的一个逻辑阶段,语义分析的任务是对结构上正确的源程序进行上下文有关性质的审查,进行类型审查。语义分析是审查源程序有无语义错误,为代码生成阶段收集类型信息。比如语义分析的一个工作是进行类型审查,审查每个算符是否具有语言规范允许的运算对象,当不符合语言规范时,编译程序应报告错误。如有的编译程序要对实数用作数组下标的情况报告错误。又比如某些某些程序规定运算对象可被强制,那么当二目运算施于一整型和一实型对象时,编译程序应将整型转换为实型而不能认为是源程序的错误。

2.3中间代码生成

中间代码,也称中间语言,是复杂性介于源程序语言和机器语言的一种表示形式。为了使编译程序有较高的目标程序质量,或要求从编译程序逻辑结构上把与机器无关和与机器有关的工作明显的分开来时,许多编译程序都采用了某种复杂性介于源程序语言和机器语言之间的中间语言。中间代码(语言)是一种特殊结构的语言,编译程序所使用的中间代码有多种形式。按其结构分常见的有逆波兰式(后缀式)、三地址代码(三元式、四元式)和树形表示(抽象语法树)、DAG 表示。

2.4属性文法

对于文法的每个产生式都配备了一组属性的计算规则,称为语义规则。所谓语法制导的翻译指的是在语法分析过程中,完成这些语义规则描述的动作,从而实现语义处理。一个属性文法包含一个上下文无关文法和一系列语义规则,这些语义规则附在文法的每个产生式上。本系统中所使用FOR循环语句的文法包括FOR语句本身,赋值表达式和布尔表达式。

3.算法描述

首先建立一个符号栈S,既用它寄存终结符,也用它寄存非终结符。以下给出分析算法,其中k代表符号栈S的深度。

k:=1; S[k]:=’#’;

REPEAT

把下一个输入符号读进a中;

IF S[k]属于firstVT THEN j:= k ELSE j:=k-1;

WHILE S[j]>a DO

BEGIN

REPEAT

Q:=S[j];

IF S[j-1] 属于firstVT THEN j:=j-1 ELSE j:=j-2

UNTIL S[j]

把S[j+1]…S[k]归约为某个N;

K:=j+1;

S[k]:=N

END OF WHILE;

IF S[j]

BEGIN k:=k+1; S[k]:=a END

ELSE ERROR //出错

UNTIL a=’#’

在这个程序的设计中主要先显示语法分析所需要通道的文法,然后再进行词法分析,词法分析成功后再进行语义分析并生成中间代码,否则就提示语义分析出错并不进行语义分析生成中间代码。

4.文法及属性文法的描述

对于文法的每个产生式都配备了一组属性的计算规则,称为语义规则。所谓语法制导的翻译指的是在语法分析过程中,完成这些语义规则描述的动作,从而实现语义处理。一个属性文法包含一个上下文无关文法和一系列语义规则,这些语义规则附在文法的每个产生式上。形式上讲,属性文法是一个三元组 :A=(G,V,F),其中:

G:是一个上下文无关文法;

V:有穷的属性集,每个属性与文法的一个终结符或非终结符相连,这些属性代表与文法符号相关信息;F:关于属性的属性断言或一组属性的计算规则(称为语义规则) 。断言或语义规则与一个产生式相联,只引用该产生式左端或右端的终结符或非终结符相联的属性。

5. 系统的详细设计

5.1 文法设计

在程序的主界面中首先列出在词法分析中需要用到的几个文法: 直接输入根据已知文法构造的算符优先关系矩阵。

输入已知文法的FIRSTVT和LASTVT集合,由程序自动生成该文法的算符优先关系矩阵。

S → A.A|A

A → 0A

A → 1A

A → 0

A → 1

确定文法的机内表示形式;

确定优先关系矩阵的存放方式。

5.2程序流程图设计

5.3 用例分析

(1)运行结果:

(2)归约成功的图:

(3)归约失败的图

6.心得体会

通过对二---十进制语法分析及语义分析的程序设计(算符优先发),让我加深对语法及语义分析原理的理解,在设计过程中虽然遇到了很多的困难,从一开始设计二进制的文法开始,再到后来设计语法分析程序,都有很多考虑不周的情况。在编程过程中,我还参考了同学的程序,查阅了很多资料,上网查找了有关材料,才写出了的,所以,这次课程设计也不是那么简单,总的来说,通过此次课程设计,学会了很多东西。

7. 参考文献

[1]张素琴、吕映芝、蒋维杜、戴桂兰等.编译原理(第2版).清华大学出版社.2005年2月

[2]《编译原理》主编:张幸儿.科学出版社 .1999年4月

[3]《程序设计语言编译原理》(第3版).陈火旺、刘春林等.国防工业出版

社.2003年

[4]《编译原理与技术》(第二版)主编:陈意云 .中国科学技术大学出版社.2002年1月

8. 源程序清单

/****************************************/

/* 算符优先分析程序*/

/****************************************/

#include

#include

#include

#include

#include "malloc.h"

void push(char pchar); //入栈函数

char pop(void); //出栈函数

int CharToInt(char ch); //将字符转为数字,以得到算符优先值

void GoBreakTo(); //归约

void dosome(void); //开始识别

double getValue(); //转化为十进制

//存储算符优先关系表,大于为1,小于或等于为-1,其它为0表示出错

const int table[4][4] = {

{ 0, -1, -1, 1 },

{ 1, -1, -1, 1 },

{ 1, -1, -1, 1 },

{ -1, -1, -1, -1, }

};

void display()

{

char sign[4] = { '.', '0', '1', '#' };

printf("文法如下:\n");

printf("S →A.A|A\nA →0A\nA →1A\nA →0\nA →1\n");

printf("*********************************\n");

printf(" | . | 0 | 1 | # |\n");

printf("*********************************\n");

for (int i = 0; i < 4; i++)

{

printf("%c", sign[i]);

for (int j = 0; j < 4; j++)

if (table[i][j] == 1)

printf("| >\t");

else if (table[i][j] == -1)

printf("| <\t");

else printf("| null\t");

printf("|\n");

}

printf("*********************************\n");

printf("请输入二进制字符串,以'#'结束\n");

printf("例如:10.01#\n");

}

int right; //设置开关项,当出错时为0

struct Lchar

{

char char_ch;

struct Lchar *next;

}LLchar, *p, *h, *temp, *top, *base;

void main(void)

{

char ch;

right = 1;

display();

//初始化栈顶栈底

base = (Lchar*)malloc(sizeof(LLchar));

base->next = NULL;

base->char_ch = '#';

top = base;

h = (Lchar*)malloc(sizeof(LLchar));

h->next = NULL;

p = h;

do{ //输入待比较字符串,以'#'结束ch = getchar();

putchar(ch);

if (ch == '.' ||

ch == '0' ||

ch == '1' ||

ch == '#')

{

temp = (Lchar*)malloc(sizeof(LLchar));

temp->char_ch = ch;

temp->next = NULL;

p->next = temp;//尾插法建立字符串链表

p = temp;

}

else

{

printf("\n字符串输入错误,请重新输入字符串:\n");

system("pause");

return;

}

} while (ch != '#'); //输入待比较字符串,以'#'结束

dosome(); //开始识别

if (right)

{

printf("\n%f", getValue());

printf("\n归约成功!\n");

}

else

printf("\n归约失败!\n");

system("pause");

}

int size_of_array(char a[])

{

int i = 0, count = 0;

while (a[i] != '#')

{

count++;

i++;

}

return count;

}

double getValue()

{

char num[30];

int n=0,dot,length;//dot记录小数点的位置

double value=0;

p = h->next;

while (p != NULL)

{

num[n] = p->char_ch;

n++;

p = p->next;

}

length = size_of_array(num);

n = 0;

while (num[n] != '.'&&num[n]!='#')

n++;

dot = n;

if (dot < length)

{

for (n = 0; n < dot; n++)

value = value + pow(2, dot - n - 1)*(num[n] - 48);

for (n = dot + 1; n < length; n++)

value = value + pow(2, dot - n)*(num[n] - 48);

}

else

{

for (n = 0; n < length; n++)

value = value + pow(2, length - n - 1)*(num[n] - 48);

}

return value;

}

void push(char pchar)//入栈

{

temp = (Lchar*)malloc(sizeof(LLchar));

temp->char_ch = pchar;

temp->next = top;

top = temp;

}

char pop(void)//出栈

{

char c;

c = top->char_ch;

if (top->char_ch != '#')

top = top->next;

return c;

}

int CharToInt(char ch) //将字符转为数字,以得到算符优先值{

int t;

switch (ch)

{

case '.':t = 0; break;

case '0':t = 1; break;

case '1':t = 2; break;

case '#':t = 3;

}

return t;

}

void GoBreakTo(){

char top_char;

char below_top1_char;

char below_top2_char;

top_char = pop();

if (top_char == '0' || top_char == '1')

{

push('A');

}

if (top_char == 'A')

{

below_top1_char = pop();

if (below_top1_char == '0' || below_top1_char == '1') push('A');

else if (below_top1_char == '#')

push('S');

else if (below_top1_char == '.')

{

below_top2_char = pop();

if (below_top2_char == 'A')

push('S');

else

right = 0;

}

else

right = 0;

}

}

void dosome(void)

{

int i, j, step=0;

char current_char; //当前符号

char stack_char; //符号栈

p = h->next;

printf("\n[步骤]\t[符号栈]\t[剩余输入串]\t[移进或归约]\t"); while (1)

{

current_char = p->char_ch;

temp = top;

if (temp->char_ch == 'S'){

break;

}

while (temp->char_ch == 'A')

{

temp = temp->next;

}

stack_char = temp->char_ch;

i = CharToInt(stack_char);

j = CharToInt(current_char);

printf("\n%d\t", ++step);

temp = top; //打印栈

while (1)

{

printf("%c", temp->char_ch);

if (temp->char_ch == '#')

break;

temp = temp->next;

}

printf("\t\t");

temp = p; //打印待比较的字符

while (1)

{

printf("%c", temp->char_ch);

if (temp->char_ch == '#')

break;

temp = temp->next;

}

printf("\t\t");

if (table[i][j] < 0)

printf("移进\t");

if (table[i][j] > 0)

printf("归约\t");

if (table[i][j] == 0) //算符优先值为空

{

printf("\n%c与%c无算符优先关系,不是算符优先文法", stack_char, current_char);

right = 0;

break;

}

else //算符优先值不为空

{

if (table[i][j] < 0) //算符优先值为-1,移进

{

if (current_char == '#') //待比较字符为空

{

if (stack_char == '#')

{

right = 1;

break;

}

else

{

printf("\n无法继续归约,不是算符优先文法");

right = 0;

break;

}

}

push(current_char);

p = p->next;

}

else //算符优先值为1,归约

GoBreakTo();

}

}

}

编译原理课程设计

《编译原理》课程设计大纲 课程编号: 课程名称:编译原理/Compiler Principles 周数/学分:1周/1学分 先修课程:高级程序设计语言、汇编语言、离散数学、数据结构 适用专业:计算机科学与技术专业、软件工程专业 开课学院,系或教研室:计算机科学与技术学院 一、课程设计的目的 课程设计是对学生的一种全面综合训练,是与课堂听讲、自学和练习相辅相成的必不可少的一个教学环节。通常,设计题中的问题比平时的练习题要复杂,也更接近实际。编译原理这门课程安排的课程设计的目的是旨在要求学生进一步巩固课堂上所学的理论知识,深化理解和灵活掌握教学内容,选择合适的数据逻辑结构表示问题,然后编制算法和程序完成设计要求,从而进一步培养学生独立思考问题、分析问题、解决实际问题的动手能力。 要求学生在上机前应认真做好各种准备工作,熟悉机器的操作系统和语言的集成环境,独立完成算法编制和程序代码的编写。 设计时间: 开发工具: (1) DOS环境下使用Turbo C; (2) Windows环境下使用Visual C++ 。 (3) 其它熟悉语言。 二、课程设计的内容和要求 设计题一:算术表达式的语法分析及语义分析程序设计。 1.目的

通过设计、编制、调试一个算术表达式的语法及语义分析程序,加深对语法及语义分析原理的理解,并实现词法分析程序对单词序列的词 法检查和分析。 2.设计内容及要求: 算术表达式的文法: 〈无符号整数〉∷= 〈数字〉{〈数字〉} 〈标志符〉∷= 〈字母〉{〈字母〉|〈数字〉} 〈表达式〉∷= [+|-]〈项〉{〈加法运算符〉〈项〉} 〈项〉∷= 〈因子〉{〈乘法运算符〉〈因子〉} 〈因子〉∷= 〈标志符〉|〈无符号整数〉|‘(’〈表达式〉‘)’ 〈加法运算符〉∷= +|- 〈乘法运算符〉∷= *|/ (1) 分别选择递归下降法、算符优先分析法(或简单优 先法)完成以上任务,中间代码选用逆波兰式。 (2) 分别选择LL(1)、LR法完成以上任务,中间代码选 用四元式。 (3) 写出算术表达式的符合分析方法要求的文法,给出 分析方法的思想,完成分析程序设计。 (4) 编制好分析程序后,设计若干用例,上机测试并通 过所设计的分析程序。 设计题二:简单计算器的设计 1.目的 通过设计、编制、调试一个简单计算器程序,加深对语法及语 义分析原理的理解,并实现词法分析程序对单词序列的词法检 查和分析。 2.设计内容及要求 算术表达式的文法:

编译原理课程设计LL(1)文法 do while 三地址输出 报告加代码

学号: 课程设计 题目编译原理 学院计算机科学与技术 专业计算机科学与技术 班级 姓名 指导教师 2 年月日

课程设计任务书 学生姓名:专业班级: 指导教师:工作单位: 题目: DO-WHILE循环语句的翻译程序设计(LL(1)法、输出三地址表示)初始条件: 理论:学完编译课程,掌握一种计算机高级语言的使用。 实践:计算机实验室提供计算机及软件环境。如果自己有计算机可以在其上进行设计。 要求完成的主要任务:(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求) (1)写出符合给定的语法分析方法的文法及属性文法。 (2)完成题目要求的中间代码三地址表示的描述。 (3)写出给定的语法分析方法的思想,完成语法分析和语义分析程序设计。 (4)编制好分析程序后,设计若干用例,上机测试并通过所设计的分析程序。 (5)设计报告格式按附件要求书写。课程设计报告书正文的内容应包括: 1 系统描述(问题域描述); 2 文法及属性文法的描述; 3 语法分析方法描述及语法分析表设计; 4 按给定的题目给出中间代码形式的描述及中间代码序列的结构设计; 5 编译系统的概要设计; 6 详细的算法描述(流程图或伪代码); 7 软件的测试方法和测试结果; 8 研制报告(研制过程,本设计的评价、特点、不足、收获与体会等); 9 参考文献(按公开发表的规范书写)。 时间安排: 设计安排一周:周1、周2:完成系统分析及设计。 周3、周4:完成程序调试及测试。 周5:撰写课程设计报告。 设计验收安排:设计周的星期五第1节课开始到实验室进行上机验收。 设计报告书收取时间:设计周的次周星期一上午10点。 指导教师签名: 2011年 12月 23日 系主任(或责任教师)签名: 2011年 12月 23日

编译原理实验报告实验一编写词法分析程序

编译原理实验报告实验名称:实验一编写词法分析程序 实验类型:验证型实验 指导教师:何中胜 专业班级:13软件四 姓名:丁越 学号: 电子邮箱: 实验地点:秋白楼B720 实验成绩: 日期:2016年3 月18 日

一、实验目的 通过设计、调试词法分析程序,实现从源程序中分出各种单词的方法;熟悉词法分析 程序所用的工具自动机,进一步理解自动机理论。掌握文法转换成自动机的技术及有穷自动机实现的方法。确定词法分析器的输出形式及标识符与关键字的区分方法。加深对课堂教学的理解;提高词法分析方法的实践能力。通过本实验,应达到以下目标: 1、掌握从源程序文件中读取有效字符的方法和产生源程序的内部表示文件的方法。 2、掌握词法分析的实现方法。 3、上机调试编出的词法分析程序。 二、实验过程 以编写PASCAL子集的词法分析程序为例 1.理论部分 (1)主程序设计考虑 主程序的说明部分为各种表格和变量安排空间。 数组 k为关键字表,每个数组元素存放一个关键字。采用定长的方式,较短的关键字 后面补空格。 P数组存放分界符。为了简单起见,分界符、算术运算符和关系运算符都放在 p表中 (编程时,还应建立算术运算符表和关系运算符表,并且各有类号),合并成一类。 id和ci数组分别存放标识符和常数。 instring数组为输入源程序的单词缓存。 outtoken记录为输出内部表示缓存。 还有一些为造表填表设置的变量。 主程序开始后,先以人工方式输入关键字,造 k表;再输入分界符等造p表。 主程序的工作部分设计成便于调试的循环结构。每个循环处理一个单词;接收键盘上 送来的一个单词;调用词法分析过程;输出每个单词的内部码。 ⑵词法分析过程考虑 将词法分析程序设计成独立一遍扫描源程序的结构。其流程图见图1-1。 图1-1 该过程取名为 lexical,它根据输入单词的第一个字符(有时还需读第二个字符),判断单词类,产生类号:以字符 k表示关键字;i表示标识符;c表示常数;p表示分界符;s表示运算符(编程时类号分别为 1,2,3,4,5)。 对于标识符和常数,需分别与标识符表和常数表中已登记的元素相比较,如表中已有 该元素,则记录其在表中的位置,如未出现过,将标识符按顺序填入数组id中,将常数 变为二进制形式存入数组中 ci中,并记录其在表中的位置。 lexical过程中嵌有两个小过程:一个名为getchar,其功能为从instring中按顺序取出一个字符,并将其指针pint加1;另一个名为error,当出现错误时,调用这个过程, 输出错误编号。 2.实践部分

武汉理工大学

姓名考生编号录取专业录取类型初试成绩复试总成绩第一年基本奖学金等级备注 成绩 王彬 1.04974E+14 机械工程学术型一等推免 黄海涛 1.04974E+14 机械工程学术型一等推免 席小婷 1.04974E+14 机械工程学术型一等推免 黄浪 1.04974E+14 机械工程学术型一等推免 余嵌 1.04974E+14 机械工程学术型一等推免 张奥 1.04974E+14 机械工程学术型一等推免 魏来 1.04974E+14 机械工程学术型一等推免 胡力文 1.04974E+14 机械工程学术型一等推免 宋丹丹 1.04974E+14 机械工程学术型一等推免 吕银雷 1.04974E+14 机械工程学术型一等推免 郑伟民 1.04974E+14 机械工程学术型一等推免 康伟 1.04974E+14 机械工程学术型一等推免 唐自豪 1.04974E+14 机械工程学术型一等推免 李庆玲 1.04974E+14 机械工程学术型一等推免 杨铮 1.04974E+14 机械工程学术型一等推免 唐建生 1.04974E+14 机械工程学术型一等推免 周奇 1.04974E+14 机械工程学术型一等推免 史登辉 1.04974E+14 机械工程学术型一等推免 贺卉娟 1.04974E+14 机械工程学术型一等推免 马国锋 1.04974E+14 机械工程学术型一等推免 印世杰 1.04974E+14 机械工程学术型一等推免 徐东辉 1.04974E+14 机械工程学术型一等推免 胡娜 1.04974E+14 机械工程学术型一等推免 肖雄 1.04974E+14 机械工程学术型一等推免 姜晓帅 1.04974E+14 机械工程学术型一等推免 颜甜莉 1.04974E+14 机械工程学术型一等推免 付亚为 1.04974E+14 机械工程学术型一等推免 冷丽姣 1.04974E+14 机械工程学术型一等推免 郑桂东 1.04974E+14 机械工程学术型一等推免 郑佳文 1.04974E+14 机械工程学术型一等推免 赵晨 1.04974E+14 机械工程学术型一等推免 徐芳 1.04974E+14 机械工程学术型一等推免 孙静明 1.04974E+14 机械工程学术型一等推免 徐伟 1.04974E+14 机械工程学术型一等推免 严才根 1.04974E+14 机械工程学术型一等推免 杜兆勇 1.04974E+14 机械工程学术型一等推免 刘路 1.04974E+14 机械工程学术型一等推免 陈端滢 1.04974E+14 机械工程学术型一等推免 姚亮 1.04974E+14 机械工程学术型一等推免 卫军 1.04974E+14 机械工程学术型一等推免

编译原理课程设计报告_LL(1)分析过程模拟

课程设计(论文)任务书 软件学院学院软件工程专业07-1班 一、课程设计(论文)题目LL(1)分析过程模拟 二、课程设计(论文)工作自 2010 年 6 月 22日起至 2010 年 6月 28 日止。 三、课程设计(论文) 地点: 四、课程设计(论文)内容要求: 1.本课程设计的目的 (1)使学生掌握LL(1)模块的基本工作原理; (2)培养学生基本掌握LL(1)分析的基本思路和方法; (3)使学生掌握LL(1)的调试; (4)培养学生分析、解决问题的能力; (5)提高学生的科技论文写作能力。 2.课程设计的任务及要求 1)基本要求: (1)分析LL(1)模块的工作原理; (2)提出程序的设计方案; (3)对所设计程序进行调试。 2)创新要求: 在基本要求达到后,可进行创新设计,如改算法效率。 3)课程设计论文编写要求 (1)要按照书稿的规格打印誊写课程设计论文 (2)论文包括目录、绪论、正文、小结、参考文献、附录等 (3)课程设计论文装订按学校的统一要求完成 4)答辩与评分标准: (1)完成原理分析:20分; (2)完成设计过程(含翻译):40分; (3)完成调试:20分;

(4)回答问题:20分。 5)参考文献: (1)张素琴,吕映芝,蒋维杜,戴桂兰.编译原理(第2版).清华大学出版社 (2)丁振凡.《Java语言实用教程》北京邮电大学出版社 6)课程设计进度安排 内容天数地点 构思及收集资料2图书馆 编程与调试4实验室 撰写论文1图书馆、实验室 学生签名: 2009 年6 月22 日 课程设计(论文)评审意见 (1)完成原理分析(20分):优()、良()、中()、一般()、差();(2)设计分析(20分):优()、良()、中()、一般()、差();(3)完成调试(20分):优()、良()、中()、一般()、差();(4)翻译能力(20分):优()、良()、中()、一般()、差();(5)回答问题(20分):优()、良()、中()、一般()、差();(6)格式规范性及考勤是否降等级:是()、否() 评阅人:职称: 年月日

编译原理

致谢: 2005级周朝丽、丛志环、张云华、周娇、陈亮、陶锌、张世强等同学不仅对讲义的进一步完善提出了宝贵的意见和建议,而且提出的许多富有探讨性的问题,不仅令我进一步思考,同时也令讲义的许多内容进一步丰富,在此,本人、现在已经看到、未来将会看到该讲义的人对各位的“答疑解惑”表示由衷的谢意! 参考书目: 1.编译原理,Alfred V. Aho, Ravi Sethi, Jeffrey D. Ullman著,李建中,姜守旭译。机械工 业出版社,2003 Compilers Principles, Techniques, and Tools(英文版名字) 2.编译原理及实践,(美)Kenneth C. Louden著,冯博琴等译。机械工业出版社,2000 Compiler Construction: Principles and Practice (英文版名字) 3.编译原理习题与解析(第2版)/伍春香编著-.--北京:清华大学出版社,2006 4.编译原理=Compiling Principle/周经野,张继福主编-.--武汉:武汉理工大学出版社,2003 5.程序设计语言编译方法. 肖军模编著. 大连理工大学出版社,2000。 6.程序设计语言编译原理/陈火旺等编.--北京:国防工业出版社,1984 7.编译方法/金成植编.--北京:高等教育出版社,1984 8.编译原理/蒋立源主编.--西安:西北工业大学出版社,1993.8 9.编译原理和技术/陈意云, 马万里编译.--安徽:中国科学技术大学出版社,1989.12 10.编译原理及其习题解答/何炎祥...[等]编著-.--武汉:武汉大学出版社,2004。 11.形式语言与自动机理论 12.FORTRAN语言程序设计,谭浩强、田淑清编著,高等教育出版社,1987年5月。 13.PASCAL程序设计,郗曼丽编著,陕西科学技术出版社。 14.讲义的一些部分来源于互联网上的多种资源,其链接难以一一提供,在此,谨向大家 致以真诚地敬意和诚挚的谢意,感谢大家通过互联网提供的极为有益的帮助和指导。 1

编译原理结课论文

目录

1.绪论 概述 “编译原理”是一门研究设计和构造编译程序原理课程,是计算机各专业的一门重要的专业课。编译原理这门课程蕴含着计算机学科中解决问题的思路和解决问题的方法,对应用软件和系统软件的设计与开发有一定的启发和指导作用。“编译原理”是一门实践性很强的课程,要掌握这门课程中的思想,就必须要把所学到的知识应用于实践当中。而课程设计是将理论与实践相互联系的一种重要方式。 设计目的 课程设计是对学生的一种全面综合素质训练,是与课堂听讲、自学和练习相辅相成的必不可少的一个教学环节。通常,设计题中的问题比平时的练习题要复杂很多,但也更接近实际。编译原理这门课程安排的课程设计的目的是旨在要求学生进一步巩固课堂上所学的理论知识,深化理解和灵活掌握教学内容,选择合适的数据逻辑结构解决问题,然后编制算法和程序完成设计要求,从而进一步培养学生独立思考问题、分析问题、解决实际问题的能力。 设计题目及要求 基于这个学期所学习的内容以及自己所掌握到的知识,本次我所要设计的题目是赋值语句的四元式生成。

要求: (1)设计语法制导生成赋值语句的四元式的算法; (2)编写代码并上机调试运行通过; (3)输入一赋值语句; (4)输出相应的表达式的四元式; 2.背景知识 语法制导翻译方法 语法制导翻译的方法就是为每个产生式配上一个翻译子程序(称语义动作或语义子程序),并在语法分析的同时执行这些子程序。语义动作是为产生式赋予具体意义的手段,它一方面指出了一个产生式所产生的符号串的意义,另一方面又按照这种意义规定了生成某种中间代码应做哪些基本动作。在语法分析的过程中,当一个产生式获得匹配(对于自顶向下分析)或用于规约(对于自底向上分析)时,此产生式相应的语义子程序就进入工作,完成既定的翻译任务。语法制导翻译分为自底向上语法制导翻译和自顶向下语法制导翻译。 属性文法 属性文法是编译技术中用来说明程序语言语义的工具,也是当前实际应用中比较流行的一种语义描述方法。属性是指与文法符号的类型和值等有关的一些信息,在编译中用属性描述处理对象的特征。属性文法是一种

编译原理实验报告

编译原理实验报告 班级 姓名: 学号: 自我评定:

实验一词法分析程序实现 一、实验目的与要求 通过编写和调试一个词法分析程序,掌握在对程序设计语言的源程序进行扫描的过程中,将字符形式的源程序流转化为一个由各类单词符号组成的流的词法分析方法。 二、实验内容 根据教学要求并结合学生自己的兴趣和具体情况,从具有代表性的高级程序设计语言的各类典型单词中,选取一个适当大小的子集。例如,可以完成无符号常数这一类典型单词的识别后,再完成一个尽可能兼顾到各种常数、关键字、标识符和各种运算符的扫描器的设计和实现。 输入:由符合或不符合所规定的单词类别结构的各类单词组成的源程序。 输出:把单词的字符形式的表示翻译成编译器的内部表示,即确定单词串的输出形式。例如,所输出的每一单词均按形如(CLASS,VALUE)的二元式编码。对于变量和常数,CLASS字段为相应的类别码;VALUE字段则是该标识符、常数的具体值或在其符号表中登记项的序号(要求在变量名表登记项中存放该标识符的字符串;常数表登记项中则存放该常数的二进制形式)。对于关键字和运算符,采用一词一类的编码形式;由于采用一词一类的编码方式,所以仅需在二元式的CLASS字段上放置相应的单词的类别码,VALUE字段则为“空”。另外,为便于查看由词法分析程序所输出的单词串,要求在CLASS字段上放置单词类别的助记符。 三、实现方法与环境 词法分析是编译程序的第一个处理阶段,可以通过两种途径来构造词法分析程序。其一是根据对语言中各类单词的某种描述或定义(如BNF),用手工的方式(例如可用C语言)构造词法分析程序。一般地,可以根据文法或状态转换图构造相应的状态矩阵,该状态矩阵同控制程序便组成了编译器的词法分析程序;也可以根据文法或状态转换图直接编写词法分析程序。构造词法分析程序的另外一种途径是所谓的词法分析程序的自动生成,即首先用正规式对语言中的各类单词符号进行词型描述,并分别指出在识别单词时,词法分析程序所应进行的语义处理工作,然后由一个所谓词法分析程序的构造程序对上述信息进行加工。如美国BELL实验室研制的LEX就是一个被广泛使用的词法分析程序的自动生成工具。 总的来说,开发一种新语言时,由于它的单词符号在不停地修改,采用LEX等工具生成的词法分析程序比较易于修改和维护。一旦一种语言确定了,则采用手工编写词法分析程序效率更高。 四、实验设计 1)题目1:试用手工编码方式构造识别以下给定单词的某一语言的词法分析程序。 语言中具有的单词包括五个有代表性的关键字begin、end、if、then、else;标识符;整型常数;六种关系运算符;一个赋值符和四个算术运算符。参考实现方法简述如下。 单词的分类:构造上述语言中的各类单词符号及其分类码表。 表I 语言中的各类单词符号及其分类码表 单词符号类别编码类别码的助记符单词值

编译原理课后答案

第二章 2.3叙述由下列正规式描述的语言 (a) 0(0|1)*0 在字母表{0, 1}上,以0开头和结尾的长度至少是2的01 串 (b) ((ε|0)1*)* 在字母表{0, 1}上,所有的01串,包括空串 (c) (0|1)*0(0|1)(0|1) 在字母表{0, 1}上,倒数第三位是0的01串 (d) 0*10*10*10* 在字母表{0, 1}上,含有3个1的01串 (e) (00|11)*((01|10)(00|11)*(01|10)(00|11)*)* 在字母表{0, 1}上,含有偶数个0和偶数个1的01串 2.4为下列语言写正规定义 C语言的注释,即以 /* 开始和以 */ 结束的任意字符串,但它的任何前缀(本身除外)不以 */ 结尾。 [解答] other → a | b | … other指除了*以外C语言中的其它字符 other1 → a | b | … other1指除了*和/以外C语言中的其它字符 comment → /* other* (* ** other1 other*)* ** */ (f) 由偶数个0和偶数个1构成的所有0和1的串。 [解答]由题目分析可知,一个符号串由0和1组成,则0和1的个数只能有四种情况: x 偶数个0和偶数个1(用状态0表示); x 偶数个0和奇数个1(用状态1表示); x 奇数个0和偶数个1(用状态2表示); x 奇数个0和奇数个1(用状态3表示);所以, x 状态0(偶数个0和偶数个1)读入1,则0和1的数目变为:偶数个0和奇数个1(状态1) x 状态0(偶数个0和偶数个1)读入0,则0和1的数目变为:奇数个0和偶数个1(状态2) x 状态1(偶数个0和奇数个1)读入1,则0和1的数目变为:偶数个0和偶数个1(状态0) x 状态1(偶数个0和奇数个1)读入0,则0和1的数目变为:奇数个0和奇数个1(状态3) x 状态2(奇数个0和偶数个1)读入1,则0和1的数目变为:奇数个0和奇数个1(状态3) x 状态2(奇数个0和偶数个1)读入0,则0和1的数目变为:偶数个0和偶数个1(状态0) x 状态3(奇数个0和奇数个1)读入1,则0和1的数目变为:奇数个0和偶数个1(状态2) x 状态3(奇数个0和奇数个1)读入0,则0和1的数目变为:偶数个0和奇数个1(状态1) 因为,所求为由偶数个0和偶数个1构成的所有0和1的串,故状态0既为初始状态又为终结状态,其状态转换图: 由此可以写出其正规文法为: S0 → 1S1 | 0S2 | ε S1 → 1S0 | 0S3 | 1 S2 → 1S3 | 0S0 | 0 S3 → 1S2 | 0S1 在不考虑S0 →ε产生式的情况下,可以将文法变形为: S0 = 1S1 + 0S2 S1 = 1S0 + 0S3 + 1 S2 = 1S3 + 0S0 + 0 S3 = 1S2 + 0S1 所以: S0 = (00|11) S0 + (01|10) S3 + 11 + 00 (1) S3 = (00|11) S3 + (01|10) S0 + 01 + 10 (2) 解(2)式得: S3 = (00|11)* ((01|10) S0 + (01|10)) 代入(1)式得: S0 = (00|11) S0 + (01|10) (00|11)*((01|10) S0 + (01|10)) + (00|11) => S0 = ((00|11) + (01|10) (00| 11)*(01|10))S0 + (01|10) (00|11)*(01|10) + (00|11) => S0 = ((00|11)|(01|10) (00|11)*(01|10))*((00|1

武汉理工大学网络教育学院

武汉理工大学网络教育学院介绍 网络教育报名专业: 专业层次学习期限学分工程造价专升本 2.5-5年 市场营销专升本 2.5-5年 机电一体化技术高起专 2.5-5年 工程造价高起专 2.5-5年 国际经济和贸易高起专 2.5-5年 市场营销高起专 2.5-5年 计算机信息管理高起专 2.5-5年 计算机信息管理高起专 2.5-5年 无机非金属材料工程专升本 2.5-5年 电子信息工程专升本 2.5-5年 电气工程及其自动化专升本 2.5-5年 无机非金属材料工程技术高起专 2.5-5年 电子信息工程技术高起专 2.5-5年 电气自动化技术高起专 2.5-5年 物流管理专升本,高起专 2.5-5年

土木工程专升本 2.5-5年汽车运用和维修高起专 2.5-5年汽车服务工程专升本 2.5-5年建筑工程技术高起专 2.5-5年建筑工程管理高起专 2.5-5年计算机使用技术高起专 2.5-5年计算机科学和技术专升本 2.5-5年机械设计制造及其自动化专升本 2.5-5年机械设计和制造高起专 2.5-5年会计学专升本 2.5-5年会计高起专 2.5-5年工商企业管理高起专 2.5-5年工商管理专升本 2.5-5年工程管理专升本 2.5-5年法学专升本 2.5-5年法律事务高起专 2.5-5年电子商务高起专,专升本 2.5-5年道路桥梁和渡河工程专升本 2.5-5年道路桥梁工程技术高起专 2.5-5年专业相关的课程设置: 专业介绍(专升本) 汽车服务工程专业

本专业培养具有扎实的汽车产品及技术基础,必要的国际贸易、工商管理理论知识,具有一定的现代信息技术和网络技术知识,具备“懂技术,善经营,会服务”的能力素质,能够适应汽车产品设计服务、汽车生产服务、汽车销售服务、汽车技术服务、汽车保险、汽车运输服务、物流经营等领域工作的高级复合型人才。 主要课程:机械设计基础B、汽车构造、汽车运用工程、汽车服务工程、汽车维修工程、物流工程、交通运输学、汽车服务系统规划、汽车营销和策划、汽车电器设备、汽车电子控制系统等。 计算机科学和技术专业 本专业培养计算机科学和技术领域研究和使用高级人才。本专业培养计划和国际接轨,通过培养计划实施及理论、抽象、设计实验等教育过程,使学生不仅具有坚实的专业知识,而且具有从事计算机科学技术研究和使用、适应本学科飞速发展、涉足广泛学科领域的能力。 主要课程:高级语言程序设计、离散数学、汇编语言程序设计、计算机组成原理、计算机系统结构、数据结构、操作系统、编译原理、计算机网络、电路原理、系统分析和控制、信号处理原理、模拟电子技术等。 法学专业 法学专业主要培养系统掌握法学知识,熟悉我国法律和党的相关政策,能在国家机关、企事业单位和社会团体、特别是能在立法机关、行政机关、检察机关、审判机关、仲裁机构和法律服务机构从事法律工作的高级专门人才。 主要课程:法理学、中国法制史、宪法学、行政法和行政诉讼法、物权法、侵权行为法、民法学、商法学、知识产权法、经济法学、刑法学、民事诉讼法学、

《编译原理》课程实验报告(词法分析)完整版

《编译原理》课程实验报告 题目词法分析 专业计算机 指导教师签名 华东理工大学信息学院计算机系 2013年4月10日

一.实验序号:《编译原理》第一次实验 二.实验题目:词法分析 三.实验日期:2013.3.27-2013.4.10 四.实验环境(操作系统,开发语言) 操作系统:Windows 开发语言:C 五.实验要求 ●修改词法: 1)将标识符的词法改为“以大写字母或小写字母开头,后面可以跟大写字母 或小写字母或数字或下划线”。 把while ((isalpha(buffer))||(isdigit(buffer)))改成while ((isalpha(buffer))||(isdigit(buffer))||buffer==’_’) 2)将<条件>中的表示相等关系的单词“=”改为“= =” char *relation[6]={"<","<=","=",">",">=","<>"}; 把其中的=改成==即可 3)将原来无小数的数改为可以有小数的数 把while (isdigit(buffer))改成while (isdigit(buffer)||buffer==’.’) ●用C语言开发词法分析程序。读入用PL/0语言编写的测试用例源程序, 将识别出的一个个单词组成单词流依序同时输出到屏幕和文件中。 六.实验步骤 1)根据修改词法后的PL/0语言编写测试用例源程序。 2)用C语言编写词法分析程序。读入PL/0语言的测试用例源程序,进行 词法分析,将识别出的一个个单词组成单词流依序同时输出到屏幕和文 件中。 3)设立断点,单步运行词法分析程序,依次单个输出单词。分析和理解词 法分析程序,解释词法分析程序中的数据和变量变化的原因和输出结果。 七.实验结果(测试用例源程序,运行结果部分截图,词法分析函数主要部分源程序 PL0程序: const a=6,b=81; var x,y; procEdure p; procedure q; x:=2; begin

武汉理工大学校园网络使用说明

武汉理工大学校园网络使用说明 电脑 一、更改网络适配器设置。 (1)点击开始菜单-----控制面板-----网络和internet-----查看网络状态和任务-----更改适配器设置,右键点击连接到校园网的网络连接,选择属性(因现在的计算机多配置有几块网卡,所以请选择与校园网连接的网卡进行配置) (2)双击对话框中的internet协议版本4(TCP/IPv4)选项

(3)同时选择自动获取IP地址、自动获取DNS服务器地址,并确定。 二、连接网络 有线网络:接入先将计算机的网卡与墙上的网络接口连接起来 无线网络:找到武汉理工大学无线网信号:WHUT-WLAN(教学办公区)或WHUT-WLAN-DORM(学生宿舍区) 手机、平板 直接连接无线网信号:WHUT-WLAN(教学办公区)或WHUT-WLAN-DORM (学生宿舍区) 三、登录认证 1、教学办公区 在浏览器中输入任意外网地址,在弹出的页面中输入用户名和密码登录即可以上网。 用户名:校园卡卡号 密码:理工电子身份证密码(默认是身份证号的后六位,若最后一位是X,则去掉X后取后六位,如果都不对,带上校园卡到网络信息中心重置)

如果登录页面无法正常弹出,也可以直接在浏览器中输入认证网址:http://172.30.16.33 教学办公区启用了无感知认证(终端自动识别认证),用户首次成功登录校园网后,系统自动完成MAC地址绑定,七天内在教学办公区使用校园网,无需认证,即可直接上网,七天后需再认证一次。自动绑定了MAC的无感知认证,用户可以登录自服务(https://www.wendangku.net/doc/8216795706.html,)解除绑定或关闭绑定功能。 2、宿舍区 按学校规定,宿舍区网络需付费使用。 缴费步骤: (1)电子账户充值 访问校内主页:https://www.wendangku.net/doc/8216795706.html,,通过电子账户充值或圈存机将费用转入电子账户。 (2)交费 登录通用缴费平台,按操作提示缴纳网费。具体操作流程可参见平台的“校园网缴费流程及常见问题处理”文档。(提示:在缴费支付确认中,输入的密码为校园卡的查询密码,可能与上网密码不一致,如果不对,请带上校园卡到一卡通服务中心修改)。 缴费成功后,即可在宿舍区使用校园网,用户名和密码与教学办公区一样,使用方式也和教学办公区一样。

编译原理课程设计

先简要分析一下语法分析的大致流程: 当有句子要进行处理时,首先要对其进行词法分析来分解出该句子中的每个符号,然后将该句子按照算符优先算法压入归约栈中,如果可以顺利归约,则说明这是一个合法的句子,否则该句子非法。 这里有一个需要考虑的地方,就是如何进行归约。由于文法已经给定,所以我们考虑设计一个文法表,文法表中的内容就是可归约串的种别码的顺序,比如v=E可以表示为9,1,13。这样的话当我们要进行一次归约时,只用按顺序存储最左素短语中符号的种别码,然后拿这个种别码序列与文法表进行匹配,就可知道当前归约需要执行哪些操作。 还有一点需要注意,就是如何对一个表达式进行求值。这里需要我们设计一个二元组的变量名表,这个变量名表可以根据变量的名称来返回变量的数据。变量名表的具体设计见详细设计部分。 由于是简化分析,所以这个程序只考虑整数的处理。 有了上面的分析,可以构造出算符优先分析算法的流程图,如下图所示。

详细设计 (1)词法分析部分 由于词法分析的内容在课程设计1中已经介绍,并且这次的状态转换图与课程设计1中的非常相似,所以这里就不过多介绍。(2)优先关系表 在程序中我们用一个二维数组priTable[][]来存储算符间的优先关系。priTable[a][b]=1表示a>b; 。priTable[a][b]=0表示a=b; 。priTable[a][b]=-1表示a

编译原理课程设计词法分析(有代码)

《编译原理》课程 实验报告 题目词法分析 专业计算机科学与技术 班级2013级计双班 学号2013708033 姓名刘畅 指导老师郑瑶 石河子大学信息学院计算机系 2014 年11 月20 日

一. 实验序号:《编译原理》词法分析实验 二. 实验题目:词法分析 三. 实验日期: 2014年11月20日 四. 实验环境(操作系统,开发语言) 操作系统:Windows 开发语言:C 五. 实验要求 1)将标识符的词法改为“以大写字母或小写字母开头或下划线开头,后面 可以跟大写字母或小写字母或数字或下划线”。 2)将<条件>中的表示相等关系的单词“=”改为“= =”;增加用于识别自增、 自减、关系运算符、逻辑运算符及逗号运算符的相关语句。 3)将原来无小数的数改为可以识别整数和小数的数。 4)增加识别字符常量和字符串常量的识别。 5)或按C语言要求编写一个完整的用于识别C语言中各类单词的词法分析 程序。 六. 实验步骤 1)用PL/0语言编写测试用例源程序。用C语言编写词法分析程序。 2)运行词法分析程序,读入PL/0语言的测试用例源程序,进行词法分析。 3)设立断点,单步运行词法分析程序,依次单个输出单词。分析和理解词 法分析程序,解释词法分析程序中的数据和变量变化的原因和输出结果。 4)根据上述“实验要求”修改词法分析程序,同时也应修改PL/0语言测试 用例源程序中的相应的单词。 5)运行修改后的词法分析程序,读入修改后的PL/0语言测试用例源程序, 进行词法分析。 七. 实验结果(测试用例源程序,运行结果截图) 测试用例源程序: const c1=5.61,c2=20,c3='S',c4="abc"; var num1,num2,count,sum1,sum2; procedure func1; var y1,y2; begin y1:=1; y2:=x2 end;

编译原理实验报告总结

学年第学期《编译原理》实验报告 学院(系):计算机科学与工程学院 班级:11303070A 学号:11303070*** 姓名:无名氏 指导教师:保密式 时间:2016 年7 月

目录 1.实验目的 (1) 2.实验内容及要求 (1) 3.实验方案设计 (1) 3.1 编译系统原理介绍 (1) 3.1.1 编译程序介绍 (2) 3.1.2 对所写编译程序的源语言的描述 (2) 3.2 词法分析程序的设计 (3) 3.3 语法分析程序设计 (4) 3.4 语义分析和中间代码生成程序的设计 (4) 4. 结果及测试分析 (4) 4.1软件运行环境及限制 (4) 4.2测试数据说明 (5) 4.3运行结果及功能说明 (5) 5.总结及心得体会 (7)

1.实验目的 根据Sample语言或者自定义的某种语言,设计该语言的编译前端。包括词法分析,语法分析、语义分析及中间代码生成部分。 2.实验内容及要求 (1)词法分析器 输入源程序,输出对应的token表,符号表和词法错误信息。按规则拼单词,并转换成二元形式;滤掉空白符,跳过注释、换行符及一些无用的符号;进行行列计数,用于指出出错的行列号,并复制出错部分;列表打印源程序;发现并定位词法错误; (2)语法分析器 输入token串,通过语法分析,寻找其中的语法错误。要求能实现Sample 语言或自定义语言中几种最常见的、基本的语法单位的分析:算术表达式、布尔表达式、赋值语句、if语句、for语句、while语句、do while语句等。 (3)语义分析和中间代码生成 输入token串,进行语义分析,修改符号表,寻找其中的语义错误,并生 成中间代码。要求能实现Sample语言或自定义语言中几种最常见的、基本的语法单位的分析:算术表达式、布尔表达式、赋值语句、if语句、for语句、while 语句、do while语句等。 实验要求:功能相对完善,有输入、输出描述,有测试数据,并介绍不足。3.实验方案设计 3.1 编译系统原理介绍 编译器逐行扫描高级语言程序源程序,编译的过程如下: (1).词法分析 识别关键字、字面量、标识符(变量名、数据名)、运算符、注释行(给人看的,一般不处理)、特殊符号(续行、语句结束、数组)等六类符号,分别归类等待处理。 (2).语法分析 一个语句看作一串记号(Token)流,由语法分析器进行处理。按照语言的文法检查判定是否是合乎语法的句子。如果是合法句子就以内部格式保存,否则报错。直至检查完整个程序。 (3).语义分析 语义分析器对各句子的语法做检查:运算符两边类型是否相兼容;该做哪些类型转换(例如,实数向整数赋值要"取整");控制转移是否到不该去的地方;是

武汉理工大学编译原理实验报告

武汉理工大学 学生实验报告书 实验课程名称编译原理课程实验 开课学院计算机科学与技术学院指导老师姓名饶文碧 学生姓名徐强国 学生专业班级软件 1602 2018 —2019 学年第1 学期

实验课程名称:编译原理

依次输入关键字,自定义标识符 BBBJKJL KJKJ4234,整数 3432,特 殊符号和其他符号:. {} []。 二、实验结果及分析(包括结果描述、实验现象分析、影响因素讨论、综合分析和结论等)输出为:

三、实验小结、建议及体会 通过这次的词法分析实验,我遇到了不少问题。对于输入字符串的直接处理,首先是分类情况的不完整(起初忽略了对关键字的判断),造成输出结果与预想有很大偏差。总结下:作为编译的第一步,词法分析将高级语言一步步分解,然后转化为自己的语言,这是一个严谨有十分有趣的过程。

核心代码: struct word //存储关键字,特殊符号 { int code; char T[max]; }; word important[5]; //结构体变量存储关键字 word num; //结构体变量存储数字 word identifier; //结构体变量存储标识符 word special_symbol[7]; //结构体变量存储特殊符号 int function(word* a, word b, word c, word* d, char* input, int k) { char getword[max]; int j = 0; if (input[j] == ' ') // 判断空格 { k = k + j + 1; function(a, b, c, d, input + j + 1, k); } else if (input[j] == '=' || input[j] == '+' || input[j] == ',' || input[j] == '(' || input[j] == ')') //判断特殊符号 { if (input[j] == '*') { getword[j] = input[j]; j = j + 1; if (input[j] == '*') { } else { } else { } getword[j] = input[j]; cout << '(' << d[3].code << ',' << d[3].T << ')' << endl; j = j - 1; cout << '(' << d[2].code << ',' << d[2].T << ')' << endl; getword[j] = input[j]; for (int i = 0; i < 7; i++) { if (i == 3) continue;

编译原理-课程设计报告-简单编译器实现-精品

课程设计 题目:简单编译器实现 学院:信息工程学院计算机系专业:计算机科学与技术班级:计科1103班 组长: 小组成员: 指导教师: 2014 年12 月19 日

目录 1 概述 (3) 1.1源、目标语言简介 (3) 1.2实现平台与运行平台简介 (3) 1.3其它 (4) 2简单词法分析器的设计与实现 (4) 2.1 基础理论说明 (4) 2.2 需求分析 (4) 2.3 概要设计 (5) 2.4 详细设计 (5) 2.5 测试数据与结果 (7) 2.6 心得体会 (7) 3 简单语法分析器设计与实现 (8) 3.1 基础理论说明 (8) 3.2 需求分析 (8) 3.3 概要设计 (8) 3.4 详细设计 (8) 3.5 测试数据与结果 (9) 3.6 心得体会 (10) 4 中间代码产生器的设计与实现 (10) 4.1 基础理论说明 (10) 4.2 需求分析 (10) 4.3 概要设计 (10) 4.4 详细设计 (11) 4.5 测试数据与结果 (12) 4.6 心得体会 (12) 附录: (14) 附录A:主要源程序与系统截图 (14) 附录B:任务分配表及个人完成的程序模块 (33) 附录C:小组讨论与研发记录 (34)

编译程序的工作过程一般可以分为五个阶段:词法分析、语法分析、语义分析与中间代码产生、优化、目标代码生成。每一个阶段在功能上是相对独立的,它一方面从上一个阶段获取分析的结果来进行分析,另一方面由将结果传递给下一个阶段。由编译程序的五个阶段就对应了编译系统的结构。 其中词法分析器利用超前搜索、状态转换等方法,将源程序转化成为一个一个的单词符号二元式。一般程序语言的单词符号包括关键字、运算符、常数、标识符和界符。语法分析器将这些单词符号作为输入,对它进行语法分析。语法分析分为两种方法:自上而下分析法和自下而上分析法。针对不同程序语言的语法规则可以采取不同的分析方法,当然两种方法也可以同时使用。语法分析器把语法单元作为输入供语义分析器使用。一般的语义分析器主要采用的是语法制导方法,即在语法分析的同时进行语法分析,并产生一定的语义动作,来生成中间代码。上面三个过程可以与硬件无关,而接下来的优化器和目标代码生成器是针对某一种处理器而言的。代码优化是将语义分析生成的中间代码进行优化,产生执行效率更高的代码。目标代码生成器最终生成可以在某种机器上运行的机器语言或者汇编语言。在整个编译过程中还包括对表格的操作和对错误的处理,这些也都是非常重要的环节。 1.1源、目标语言简介 使用C语言做简单语法分析器,C语言是一门高级计算机编程语言,设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言 1.2实现平台与运行平台简介 在win32环境下进行编译,Win32是指Microsoft Windows操作系统的32位环境,是目前使用最多的操作系统。 实验环境:需要TC、VC++ 6.0等开发工具作为本次试验的环境。

编 译 原 理 实 验 报 告

编译原理实验报告 课程:编译原理 系别:计算机系 班级:11网络 姓名:王佳明 学号:110912049 教师:刘老师 实验小组:第二组 1

实验一熟悉C程序开发环境、进行简单程序的调试 实验目的: 1、初步了解vc++6.0环境; 2、熟悉掌握调试c程序的步骤: 实验内容: 1、输入下列程序,练习Turbo C 程序的编辑、编译、运行。 #include main() { printf(“Programming is fun.\n”); } 2、分析程序,预测其运行结果,并上机检测你的预测。 #include main() { printf(“*\n”); printf(“* * *\n”); printf(“* * * * *\n”); printf(“* * * * * * *\n”); } 3、下面是一个加法程序,程序运行时等待用户从键盘输入两个整数,然后求出它们的和并输出。观察运行结果(程序输出),上机验证该程序。 #include main() { int a,b,c; printf(“Please input a,b:”); scanf(“%d,%d”,&a,&b); c=a+b; printf(“%d+%d=%d\n”,a,b,c); } 2

实验二词法分析器 一、实验目的: 设计、编制、调试一个词法分析子程序-识别单词,加深对词法分析原理的理解。 二、实验要求: 1.对给定的程序通过词法分析器弄够识别一个个单词符号,并以二元式(单词种别码,单词符号的属性值)显示。而本程序则是通过对给定路径的文件的分析后以单词符号和文字提示显示。 2.本程序自行规定: (1)关键字"begin","end","if","then","else","while","write","read", "do", "call","const","char","until","procedure","repeat" (2)运算符:"+","-","*","/","=" (3)界符:"{","}","[","]",";",",",".","(",")",":" (4)其他标记如字符串,表示以字母开头的标识符。 (5)空格、回车、换行符跳过。 在屏幕上显示如下: ( 1 , 无符号整数) ( begin , 关键字) ( if , 关键字) ( +, 运算符) ( ;, 界符) ( a , 普通标识符) 三、使用环境: Windows下的visual c++6.0; 四、调试程序: 1.举例说明文件位置:f:、、11.txt目标程序如下: begin x:=9 if x>0 then x:=x+1; while a:=0 do 3

相关文档
相关文档 最新文档