编译原理词法分析器语法分析器实验报告

时间:2025-04-05

编译技术

班 级 网络 0802 学 号

姓 名 叶晨舟 指导老师 朱 玉 全

2011年 7 月 4 日

一、目的

编译技术是理论与实践并重的课程,而其实验课要综合运用一、二年级所学的多门课程的内容,用来完成一个小型编译程序。从而巩固和加强对词法分析、语法分析、语义分析、代码生成和报错处理等理论的认识和理解;培养学生对完整系统的独立分析和设计的能力,进一步培养学生的独立编程能力。

二、任务及要求

基本要求:

1.词法分析器 产生下述小语言的单词序列

这个小语言的所有的单词符号,以及它们的种别编码和内部值如下表:

对于这个小语言,有几点重要的限制:

首先,所有的关键字(如IF﹑WHILE等)都是“保留字”。所谓的保留字的意思是,用户不得使用它们作为自己定义的标示符。例如,下面的写法是绝对禁止的:

IF(5)=x 其次,由于把关键字作为保留字,故可以把关键字作为一类特殊标示符来处理。也就是说,对于关键字不专设对应的转换图。但把它们(及其种别编码)预先安排在一张表格中(此表叫作保留字表)。当转换图识别出一个标识符时,就去查对这张表,确定它是否为一个关键字。

再次,如果关键字、标识符和常数之间没有确定的运算符或界符作间隔,则必须至少用一个空白符作间隔(此时,空白符不再是完全没有意义的了)。例如,一个条件语句应写为

IF i>0 i= 1; 而绝对不要写成

IFi>0 i=1;

因为对于后者,我们的分析器将无条件地将IFI看成一个标识符。

这个小语言的单词符号的状态转换图,如下图:

2.语法分析器 能识别由加+ 减- 乘* 除/ 乘方^ 括号()操作数所组成的

算术表达式,其文法如下:

E→E+T|E-T|T T→T*F|T/F|F F→P^F|P p→(E)|i

使用的算法可以是:预测分析法;递归下降分析法;算符优先分析法;

LR分析法等。

3.中间代码生成器 产生上述算术表达式的中间代码(四元式序列)

三、实现过程

给出各题目的详细算法描述,数据结构和函数说明,流程图。

1、词法分析器的流程图

2、语法分析器主程序图

3、中间代码生成器流程图:

四、源程序

词法分析器:

#include<string.h> #include<malloc.h>

#include<iostream> using namespace std;

typedef struct table //分析表存储结构 {

char m[100]; }table;

table M[100][100]; //定义分析表

typedef struct stacknode //定义栈内元素节点 (带头结点(为空)的) {

char data;

struct stacknode *next; }stackk;

void initlink(stackk *&s) //初始化新栈 {

s=(stackk *)malloc(sizeof(stackk)); s->next=NULL; }

void poplink(stackk *&s) //顶元素出栈 {

stackk *p;char v;

if(s->next!=NULL) {

p=s->next;

v=p->data; s->next=p->next; } free(p); }

void pushlink(stackk *&s,char x) //新 元 素 入 栈 {

stackk *p;

p=(stackk *)malloc(sizeof(stackk)); p->data=x;

p->next=s->next; s->next=p; }

void display(stackk *s) //打印 现实显示 栈内元素 {

int i=0,j; char st[100]; p=s->next;

while(p!=NULL) {

st[i++]=p->data; p=p->next; } for(j=i-1;j>=0;j--) printf("%c",st[j]);

for(j=0;j<16-i;j++) //打印 对齐格式 printf("%c",' '); }

char gettop(stackk *s) //返 回 栈 顶 元 素 值 {

if(s->next==NULL) return 0; else

return s->next->data; }

int find(char c,char array[]) //查找函数, { int i;

int flag=0;

for(i=0;i<100;i++) {

if(c==array[i]) flag=1; }

return flag; }

int location(char c,char array[]) //定位函数,指出字符所在位置 { int i;

for(i=0;i<100;i++) {

if(c==array[i])

} }

void error() //出错函数定义 {

printf("%15c出错!\n",' '); }

void analyse(char Vn[],char Vt[]) {

int i,j,m,p,q,length,t,h; char w,X; char str[100]; opt0:

scanf("%s",str);

for(i=0;i<strlen(str);i++) {

if(!find(str[i],Vt)) {

printf("输入字符串有误!请重新输入!"); goto opt0; break; } }

stackk *st; initlink(st);

pushlink(st,'#'); pushlink(st,Vn[0]); //#与识别符号入栈 j=0;

h=1; w=str[0];

printf("步骤%-12c分析栈%-24c剩余输入串%-12c所用产生式\n",' ',' ',' '); opt1:

printf("%-16d",h); //显示步骤 h++;

display(st); //显示分析栈中内容 X=gettop(st); //上托栈顶符号放入X poplink(st);

for(int k=0;k<14+j;k++) //打印对齐格式

printf("%c",' ');

for(t=j;t<strlen(str);t++)

{

printf("%c",str[t]); //显示剩余字符串 }

if(find(X,Vt)&& X!='#') //分析栈的栈顶元素和剩余输入串的第一个元素相 …… 此处隐藏:6558字,全部文档内容请下载后查看。喜欢就下载吧 ……

编译原理词法分析器语法分析器实验报告.doc 将本文的Word文档下载到电脑

    精彩图片

    热门精选

    大家正在看

    × 游客快捷下载通道(下载后可以自由复制和排版)

    限时特价:7 元/份 原价:20元

    支付方式:

    开通VIP包月会员 特价:29元/月

    注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
    微信:fanwen365 QQ:370150219