编译原理--词法分析程序实验报告
词法分析程序实验报告
1、 实验内容
待分析的简单语言的词法:
关键字:begin if then end (小写)
运算符::= + - * / >
界符:; #
标识符:ID=letter (letter|digit)*
常数:NUM=digit digit*
要求编写词法分析程序,
键盘输入源程序(以#结束),输出单词符号的二元式。
(标识符1,常数2,关键字3,运算符4,界符5)
输入:
begin
x:=9;
if x>0 then x:=2*x+1/3;
end
#
输出:
3 begin
1 x
4 :=
2 9
5 ;
2、基本思想
首先输入字符串,存入一个字符数组中,然后再逐个读入字符,判断如果不为空、结束
符、换行符,则继续进行下面的判断,如果是其中三者中的一个,则读入下一个字符。
3、核心算法
核心算法在本程序中是while循环语句,首先检测当前的字符ch是否是‘#’,如果是就跳出循环,说明字符串分析结束,输出界符标示和字符‘#‘,如果则进入下面的分析。
如果ch是NULL或者换行符,则读入下一个字符,如果不是,继续分析。
如果ch是字母,存入text字符数组中,然后继续读入,直到读入的不是字母或者数字。则text数组中存放的是关键字或者标识符,将text中存放的字符数组和关键字比较,如果是关键字则输出关键字标示,如果不是,则输出标识符标示和字符串。读入下一个字符。
如果ch是数字,存入text字符数组中,然后继续读入,直到读入的不是字母数字。则text中存放的是数字,并输入数字标示和字符串。读入下一个字符。
如果ch是除‘:=’外的运算符,则输出运算符标示和字符。如果ch是‘:’,判断下一个字符是不是‘=’,如果是,则输出运算符标示和‘:=’,如果不是,则输出出错。读入下一个字符。
如果ch是界符,则输出界符标示和字符。读入下一个字符。
4、实验结果
实验结果如下:
begin
x:=9;
if x>0 then x:=2*x+1/3;
end#
运行结果如下:
5、实验心得
在第一次做这个实验的那个下午,做出来的没有现在这样完善,当时只能分析一行代码,现在可以换行输入。
其实这个实验最重要的就是分类比较复杂,分支比较多,如果不注意就会因为分类的问题而出错,把我好这一点就能掌握做好这个程序的精髓。
当然现在这个程序本身也存在着许多不完备的地方,比如不能读文件,而且对于查错也做的不是很好(我只是写了一下出错提示,不能显示哪一行出错了)......
如此而已......
程序源代码如下:#include
#include
#include
#include
#include
#include
char Getchar(char* &p){
char ch;
ch=*(p++);
return ch;
}
void main(){
char expression[100],*pExpression,text[20];
char ch=' ';
int i=0;
scanf("%c",&expression[0]);
while(expression[i]!='#'){
i=i+1;
scanf("%c",&expression[i]);
}//输入源程序串
pExpression=expression;
ch=Getchar(pExpression);
while(ch!='#'){//大循环开始
if(ch==' '||ch=='\t'||ch=='\n') ch=Getchar(pExpression);
else{
if(isalpha(ch)){//开头是字母
for(i=0;i
i=0;
while(isalpha(ch)||isdigit(ch))
{
text[i]=ch;
i++;
ch=Getchar(pExpression);
}
text[i]='\0';
if(!strcmp(text,"begin")||!strcmp(text,"if")||!strcmp(text,"then")||!strcmp(text,"end")) printf("3 类型是关键字 %s\n",text);
else printf("1 类型是标识符 %s\n",text);
}
else{ //是数字
for(i=0;i
text[i]='\0';
i=0;
if(isdigit(ch)){
while(isdigit(ch)){
text[i]=ch;
i++;
ch=Getchar(pExpression);
}
printf("2 类型是常数 %s\n",text);
}
else{//是运算符(除了运算符:=)
if(ch=='+'||ch=='-'||ch=='*'||ch=='/'||ch=='')
{printf("4 类型是运算符 %c\n",ch);ch=Getchar(pExpression);}
else{//是运算符:=
if(ch==':'){ if(Getchar(pExpression)=='=') {printf("4 类型是运算符 :=\n");ch=Getchar(pExpression);}
else { printf("Error =\n"); ch=Getchar(pExpression);} }
else{//是界符
if(ch==';'||ch=='('||ch==')'){printf("5 类型是界符 %c\n",ch);ch=Getchar(pExpression);}
else {printf("Error\n"); ch=Getchar(pExpression);}
}//是界符结束
}//是运算符结束
}
}
}
}//while循环结束
printf("5 类型是界符 #\n");
}//mian函数结束
相关文章
- 编译原理上机报告
- 编译原理实验指导书---20**年修订版
- 词法分析器实验报告
- 语法分析程序的设计与实现
- 20**年编译原理课程设计心得体会 2篇
- 编译原理实验三
- 编译原理课程教学研究
- 编译原理学习导论 [和讯博客]
- 高级语言编译过程可视化研究
编译原理上机报告 组员: 班级: 一.上机题目: 实现一个简单的语言(Core Programming Language,CPL )的编译器(解释器) (或者其他自己想完成的编译器) 二.上机目的 加深编译原理基础知识的理解:词法分析.语法 ...
编译原理实验指导 石家庄经济学院信息工程学院 2014-01-25 "编译原理"是计算机类专业一门理论性和实践性强的专业课程,在本专业的课程体系中处于十分重要的地位,属于必修课.本课程的内容主要介绍高级程序设计语言实现的 ...
杭州电子科技大学 班级:12052312 专业:计算机科学与技术 实 验 报 告 [实验名称] 实验一词法分析实验 一.实验目的 设计.编制并调试一个词法分析程序,加深对词法分析原理的理解. 二.实验内容 2.1 待分析的简单词法 (1)关 ...
语法分析程序的设计与实现 一:实验内容: ................................................................................................... ...
2016编译原理课程设计心得体会 2篇 经过一个星期的编译原理课程设计,本人在刘贞老师的指导下,顺利完成该课程设计.通过该课程设计,收获颇多. 一.对实验原理有更深的理解 通过该课程设计,掌握了什么是编译程序,编译程序工作的基本过程及其各阶 ...
编译原理实验报告 实验名称 由正规文法构造正规式 实验时间 2014-4-30 院系 计算机科学与技术学院 班级 学号 姓名 1. 试验目的 一个文法可以定义某种语言,而一个特定的语言也可以由文法来描述.法与语言之间并不存在一一对应的关系. ...
[摘 要]目前的编译原理课程的教学中存在以下问题:1.教学内容偏重于原理:2.实验内容的语言不合理:3.实践环节太薄弱.针对此做出了如下的改变:1.区分不同层次的学生合理组织教学:2.灵活应用多种教学方法:3.加强学生动手能力. [关键词] ...
文章来源: 转贴www.csdn.net 大学课程为什么要开设编译原理呢?这门课程关注的是编译器方面的产生原理和技术问题,似乎和计算机的基础领域不沾边,可是编译原理却一直作为大学本科的必修课程,同时也成为了研究生入学考试的必考内容.编译原理 ...
高级语言编译过程可视化研究 摘要:针对编译原理教学中存在的知识点多.概念抽象.算法难 于理解的情况,本文设计了一种可视化编译系统,实现了类c 语言 的文法编辑与检查.词法分析.语法分析.语义处理的过程展示. 系统界面布局一致.操作简便,为便 ...