编译原理词法分析.docx_第1页
编译原理词法分析.docx_第2页
编译原理词法分析.docx_第3页
编译原理词法分析.docx_第4页
编译原理词法分析.docx_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

班级:信1101-2班姓名:徐梦迪学号:20113024实验一 词法分析一、实验目的 通过设计编制调试一个具体的词法分析程序,加深对词法分析原理的理解。并掌握在对程序设计语言源程序进行扫描过程中将其分解为各类单词的词法分析方法。二、实验要求编制一个读单词过程,源程序为一个文件,读取该文件,识别出各个具有独立意义的单词,即基本保留字、标识符、常数、运算符、界符五大类。并依次输出各个单词的内部编码及单词符号自身值。单词的内部编码如下:1、保留字:if、int、for、while、do、return、break、continue;单词种别码为1;2、标识符:除保留字外的以字母开头,后跟字母、数字的字符序列;单词种别码为2;3、常数为无符号整形数;单词种别码为3;4、运算符包括:+、-、*、/、=;单词种别码为4;5、分隔符包括:,、;、(、); 单词种别码为5。三、实验环境:VC+6.0四、实验内容:实验内容是进行词法分析,词法分析器的功能是输入源程序,输出单词符号。词法分析器的单词符号常常表示成以下的二元式(单词种别码,单词符号的属性值)。本实验中,采用的是一类符号一种种别码的方式。2、各类单词的文法| + | - | * | / | = , | ; | ( | ) | | 3、模块结构参照教材图2.5词法分析过程GETSYM。五、实验步骤1、准备(1) 课本有关章节;(2) 编制好程序;(3) 准备多组测试数据。2、程序思路:在词法分析中,自文件头开始扫描源程序字符,一旦发现符合“单词”定义的源程序字符串时,将它翻译成固定长度的单词内部表示,并填入适当的信息表。经过词法分析后,源程序字符串(源程序的外部表示)被翻译成具有等长信息的单词串(源程序的内部表示),并产生两个表格:常数表和标识符表,它们分别包含了源程序中的所有常数和所有标识符。(1) 定义部分:定义常量、变量、数据结构。(2) 初始化:从文件将源程序全部输入到字符缓冲区中。(3) 取单词前:去掉多余空白。(4) 取单词:利用实验一的成果读出单词的每一个字符,组成单词,分析类型。(5) 显示结果。3、设计程序:(1) 模块设计:将程序分成合理的多个模块(函数),每个模块做具体的同一事情。此程序分为三个模块,读单词、取单词与分析单词。(2) 写出(画出)设计方案:模块关系简图、流程图、全局变量、函数接口等。主程序的框图即此试验的过程可以参照课本P18的程序框图,词法分析的框图可以参照课本P19的程序框图,取单词的过程可以参照课本P20的程序框图。(3) 编程时注意编程风格:空行的使用、注释的使用、缩进的使用等。六、实验代码:/ 词法分析.cpp : Defines the entry point for the console application./#include stdafx.h#include #include #include #include #include using namespace std;ifstream fp(file.txt,ios:in);char cbuffer;char *key8=if,int,for,while,do,return,break,continue; /保留字,单词种别码为1; char *lableconst80; /标识符,单词种别码为2;int constnum=40; /常数为无符号整形数,单词种别码为3; char *arithmetic13=+ , - , * , / , = ; /运算符,单词种别码为4 char *border6= , , ; , , , ( , ); /分隔符包括,单词种别码为5 int lableconstnum=0; int linenum=1; int search(char searchchar,int wordtype) int i=0,t=0; switch (wordtype) case 1: for (i=0;i=7;i+) /保留字 if (strcmp(keyi,searchchar)=0)return(i+1); return 0; case 2: for (i=0;i=lableconstnum;i+) if (strcmp(searchchar,lableconsti)=0) /判断标识符 return(i+1); lableconsti-1=(char *)malloc(sizeof(searchchar); strcpy(lableconsti-1,searchchar); return(i+1); case 3: for (t=40;t=constnum;t+) /常数 if (strcmp(searchchar,lableconstt)=0)/判断常数 return(t+1); lableconstt-1=(char *)malloc(sizeof(searchchar);/为新的元素分配内存空间 strcpy(lableconstt-1,searchchar);/为数组赋值lableconst指针数组名 constnum+; /常数个数自加 return(t); case 4: for (i=0;i=4;i+) /运算符 if (strcmp(arithmetici,searchchar)=0)return(i+1); return(0); case 5: for (i=0;i=5;i+) /分界符 if (strcmp(borderi,searchchar)=0)return(i+1); return(0); default:cout错误!; char alphaprocess(char buffer) /字符处理过程 int atype; int i=-1; char alphatp20; while (isalpha(buffer)|(isdigit(buffer) /这两个函数分别是判字符和判数字函数位于ctype.h中 alphatp+i=buffer; fp.get(buffer); alphatpi+1=0;/在末尾添加字符串结束标志 if (atype=search(alphatp,1) coutlinenum: linenum String= alphatpttt保留字,单词种别码为1endl; else atype=search(alphatp,2); /标识符 coutlinenum: linenum String= alphatpttt标识符,单词种别码为2endl; return(buffer);char digitprocess(char buffer) /数字处理过程 int i=-1; char digittp20; int dtype; while (isdigit(buffer) digittp+i=buffer; fp.get(buffer); digittpi+1=0; dtype=search(digittp,3); coutlinenum: linenum String= digittpttt常 数,单词种别码为3endl; return(buffer);char otherprocess(char buffer) /分界符、运算符 int i=-1; char othertp20; int otype,otypetp; othertp0=buffer; othertp1=0; if (otype=search(othertp,4) fp.get(buffer); othertp1=buffer; othertp2=0; if (otypetp=search(othertp,3) /判断该运算符 coutlinenum: linenum String= othertpttt运算符,单词种别码为4endl; fp.get(buffer); goto out; if (otype=search(othertp,5) /分界符 coutlinenum: linenum String= othertpttt分界符,单词种别码为5endl; fp.get(buffer); goto out; if (buffer!=n)&(buffer!= ) cout错误!,字符非法tttbufferendl; fp.get(buffer); out: return(buffer);void main() int i; for (i=0;i=50;i+) lableconsti= ;/用于保存标识符 if (!fp) cout文件打开错误!endl; else fp.get (cbuffer); while (!fp.eof() if(cbuffer=n) linenum+; fp.get(cbuffer); else if (isalpha(cbuffer) cbuffer=alphaprocess(cbuffer); else if (isdigit(cbuffer) cbuffer=digitprocess(cbuffer); else cbuffer=otherprocess(cbuffer); coutendl; cout完成n; getchar();七、实验结果:若文件如下图所示,则实验结果如下图所示(linenum是第几行的意思):若文件如下图所示,则实验结果如下图所示(当扫描到未定义的字符或者字符串时,将显示 :错误!,字符非法):八、实验总结:此次实验总体分为三个部分,读单词、取单词与分析单词,分开分别执行。按照程序的思路,自文件头开始扫描源程序字符,它一行行的扫描,一个个的取单词,先调用读单词的程序,再调用分析单词的程序,直到结束。在分析单词的过程,它主要完成的任务有:滤空格,识别保留字、标识符、常数、运算符、界符五大类,

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论