编译原理 简单样本语言的词法分析器
昆明理工大学信息工程与自动化学院学生实验报告
( 2012 —2013 学年 第 1 学期 )
课程名称:编译原理 开课实验室: 信自楼44 年月 日
一、实验目的及内容
设计、编制、调试一个词法分析子程序-识别单词,加深对词法分析原理的理解。
二、实验原理及基本技术路线图(方框原理图或程序流程图)
对给定的程序通过词法分析器弄够识别一个个单词符号,并以二元式(单词种别码,单词符号的属性值)显示。而本程序则是通过对给定路径的文件的分析后以单词符号和文字提示显示。
三、所用仪器、材料(设备名称、型号、规格等或使用软件)
WINDOWS下的VISUAL C++6.0;
四、实验方法、步骤(或:程序代码或操作过程)
#include <iostream> #include<string> using namespace std;
#define MAX 22 char ch =' ';
string key[15]={"begin","end","if","then","else","while","write","read", "do", "call","const","char","until","procedure","repeat"}; int Iskey(string c){ //关键字判断 int i;
for(i=0;i<MAX;i++) {
if(key[i].compare(c)==0) return 1; } return 0; }
int IsLetter(char c) { //判断是否为字母
if(((c<='z')&&(c>='a'))||((c<='Z')&&(c>='A'))) return 1; else return 0; }
int IsDigit(char c){ //判断是否为数字 if(c>='0'&&c<='9') return 1; else return 0; }
void analyse(FILE *fpin){ string arr="";
while((ch=fgetc(fpin))!=EOF) { arr="";
if(ch==' '||ch=='\t'||ch=='\n'){}
else if(IsLetter(ch)){
while(IsLetter(ch)||IsDigit(ch)) {
if((ch<='Z')&&(ch>='A')) ch=ch+32; arr=arr+ch; ch=fgetc(fpin); }
fseek(fpin,-1L,SEEK_CUR);
if (Iskey(arr)){cout<<arr<<"\t$关键字"<<endl;} else cout<<arr<<"\t$普通标识符"<<endl; }
else if(IsDigit(ch)){
while(IsDigit(ch)||ch=='.'&&IsDigit(fgetc(fpin))){ arr=arr+ch; ch=fgetc(fpin); }
fseek(fpin,-1L,SEEK_CUR);
cout<<arr<<"\t$无符号实数"<<endl; }
else switch(ch){ case'+':
case'-' : case'*' : case'=' :
case'/' :cout<<ch<<"\t$运算符"<<endl;break; case'(' : case')' : case'[' :
case']' : case';' : case'.' : case',' : case'{' :
case'}' :cout<<ch<<"\t$界符"<<endl;break; case':' :{ch=fgetc(fpin);
if(ch=='=') cout<<":="<<"\t$运算符"<<endl; else {cout<<"="<<"\t$运算符"<<endl;; fseek(fpin,-1L,SEEK_CUR);} }break; case'>' :{ch=fgetc(fpin);
if(ch=='=') cout<<">="<<"\t$运算符"<<endl; if(ch=='>')cout<<">>"<<"\t$输入控制符"<<endl; else {cout<<">"<<"\t$运算符"<<endl; fseek(fpin,-1L,SEEK_CUR);} }break;
case'<' :{ch=fgetc(fpin);
if(ch=='=')cout<<"<="<<"\t$运算符"<<endl;
else if(ch=='<')cout<<"<<"<<"\t$输出控制符"<<endl; else if(ch=='>') cout<<"<>"<<"\t$运算符"<<endl; else{cout<<"<"<<"\t$运算符"<<endl; fseek(fpin,-1L,SEEK_CUR);} }break;
default : cout<<ch<<"\t$无法识别字符"<<endl; } } }
void main(){ char in_fn[30]; FILE * fpin;
cout<<"请输入源文件名(包括路径和后缀名):"; for(;;){
cin>>in_fn;
if((fpin=fopen(in_fn,"r"))!=NULL) break;
else cout<<"文件路径错误!请输入源文件名(包括路径和后缀名):"; }
cout<<"\n********************分析如下*********************"<<endl; analyse(fpin);
fclose(fpin); }
五、实验过程原始记录( 测试数据、图表、计算等) 源程序为:
# include<stdio.h> int main() {
double r,s,h,v; printf("r,h=?"); scanf("%lf,%lf",&r,&h); s=3.1415926*r*r; v=s*h;
printf("r=%.2f,s=%.2f,h=%.2f,v=%.2f\n\n",r,s,h,v); return 0; }
-5-
六、实验结果、分析和结论(误差分析与数据处理、成果总结等。其中,绘制曲线图时必须用计算纸或程序运行结果、改进、收获)
词法分析器主要特点是不依靠语法,而只依靠词法,即处理一个单词时不依赖于外部单词的信息,因此词法分析器一般都很简单。语法分析时,调用词法分析器,根据已知文法利用递归向下分析,检查语法错误。在分析时,一是把词法分析器当成语法分析的一部分,另一种是把词法分析器当成编译程序的独立部分。在前一种情况下,词法分析器不断地被语法分析器调用,每调用一次词法分析器将从源程序的字符序列拼出一个单词,并将其Token值返回给语法分析器。后一种情况则不同,词法分析器不是被语法分析器不断地调用,而是一次扫描全部单词完成编译器的独立一遍任务。这次实验刚开始我的时候我是对照课本先把代码输入,编译的时候只有很少的错误,很快我就把错误修改正确,在连接的时候,有错误,我还没讲要分析的文件名写入,写入后运行正确。这从实验学到了很多知识,对词法分析器有了很多了解。
注:教师必须按照上述各项内容 …… 此处隐藏:958字,全部文档内容请下载后查看。喜欢就下载吧 ……
相关推荐:
- [互联网资料]2022年厦门大学机电工程系824机械设计
- [互联网资料]东南大学2022年硕士研究生拟录取名单公
- [互联网资料]能源调研报告(精选多篇)
- [互联网资料]初三英语下学期 中考英语 语法填空训练
- [互联网资料]2022内蒙古选调生行测常识备考:新事物
- [互联网资料]自驾必备!在新西兰租什么样的车自驾游
- [互联网资料]佛教素食菜谱44页未完
- [互联网资料]盈利能力分析外文翻译
- [互联网资料]2022年南昌航空大学音乐学院736马克思
- [互联网资料]优选外贸跟单实习报告总结(精品版)
- [互联网资料]银行新员工培训总结
- [互联网资料]2_year_visa_new_guidance_190316
- [互联网资料]天津市五校宝坻一中静海一中杨村一中芦
- [互联网资料]2007--2008学年第一学期高三数学宁波市
- [互联网资料]Chromatic framework for vision in ba
- [互联网资料]幼儿园大班上学期美术教案《心愿树》含
- [互联网资料]2022年华中农业大学信息学院820微型计
- [互联网资料]硬盘坏道的表现 __硬盘使用久了
- [互联网资料]江苏省2016年会计从业资格考试《会计基
- [互联网资料]公共场所卫生监督试卷全解
- 高级英语第一册所有修辞方法及例子总结
- 综合交通枢纽规划与城市发展
- 沃尔玛的企业文化案例分析
- 美国Thanksgiving Day 感恩节 介绍
- PEP六年级英语上册Unit6How do you fee
- 最齐全的中国大型商场购物中心名单
- 数据结构实验报告八—哈夫曼编译码
- 杭州市余杭区人民政府(通知)
- 七年级语文成语运用专项训练
- 微观经济学第三章 消费者行为 课后习题
- 对_钱学森之问_的思考
- Excel_三级联动_下拉菜单
- 办公用品需求计划申请表
- 对外汉语教材必须要知道的发展史
- 挑战杯大学生学术科技作品竞赛作品申报
- 举办民办教育培训机构应具备下列条件
- 太阳能路灯项目设计方案
- 2013年八年级上最新人教版新教材Unit3I
- 【历史】 6-4 《近代科学之父牛顿》 课
- 高中生物《第四章 第二节 探讨加酶洗衣




