教学文库网 - 权威文档分享云平台
您的当前位置:首页 > 精品文档 > 互联网资料 >

编译原理 简单样本语言的词法分析器

来源:网络收集 时间:2026-09-12
导读: 昆明理工大学信息工程与自动化学院学生实验报告 ( 2012 —2013 学年 第 1 学期 ) 课程名称:编译原理 开课实验室: 信自楼44 年月 日 一、实验目的及内容 设计、编制、调试一个词法分析子程序-识别单词,加深对词法分析原理的理解。 二、实验原理及基本技

昆明理工大学信息工程与自动化学院学生实验报告

( 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字,全部文档内容请下载后查看。喜欢就下载吧 ……

编译原理 简单样本语言的词法分析器.doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
本文链接:https://www.jiaowen.net/wendang/1933565.html(转载请注明文章来源)
Copyright © 2020-2025 教文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:78024566 邮箱:78024566@qq.com
苏ICP备19068818号-2
Top
× 游客快捷下载通道(下载后可以自由复制和排版)
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
注:下载文档有可能出现无法下载或内容有问题,请联系客服协助您处理。
× 常见问题(客服时间:周一到周五 9:30-18:00)