《实验安排+词法分析程序设计与实现》由会员分享,可在线阅读,更多相关《实验安排+词法分析程序设计与实现(14页珍藏版)》请在金锄头文库上搜索。
1、实验一 词法分析程序设计与实现一、实验目的:加深对词法分析器的工作过程的理解;加强对词法分析方法的掌握;能够采用一种编程语言实现简单的词法分析程序;能够使用自己编写的分析程序对简单的程序段进行词法分析。二、实验内容:自定义一种程序设计语言,或者选择已有的一种高级语言(C 语言),编制它的词法分析程序。词法分析程序的实现可以采用任何一种编程工具。三、实验要求:1. 对单词的构词规则有明确的定义;2. 编写的分析程序能够正确识别源程序中的单词符号;3. 识别出的单词以的形式保存在符号表中;4. 词法分析中源程序的输入以.c 格式,分析后的符号表保存在.txt 文件中。5. *对于源程序中的词法错误
2、,能够做出简单的错误处理,给出简单的错误提示,保证顺利完成整个源程序的词法分析;6. 实验报告要求用自动机或者文法的形式对词法定义做出详细说明,说明词法分析程序的工作过程,说明错误处理的实现*。四、实验学时:6 学时五、实验步骤:1. 定义目标语言的可用符号表和构词规则;2. 依次读入源程序符号,对源程序进行单词切分和识别,直到源程序结束;3. 对正确的单词,按照它的种别以的形式保存在符号表中;4. *对不正确的单词,做出错误处理*。六、选作实验学生可以根据自身的情况完善词法分析程序的错误处理功能(实验要求 5&6) ,如对错误的单词给出准确的位置和错误类型提示。七、作业提交时间第 8 周实验
3、课结束后提交词法分析程序() 。八、提示1. char Scanin100,Scanout100; /用于接收输入输出文件名FILE *fin,*fout; /用于指向输入输出文件的指针2. /下面定义保留,为简化程序,使用字符指针数组保存所有保留字。/如果想增加保留字,可继续添加,并修改保留字数目#define keywordSum 8char *keywordkeywordSum= if,else,for,while,do,int,read,write;3. /下面定义纯单分界符,如需要可添加char singleword50=+-*();,:;4. /下面定义双分界符的首字符char d
4、oubleword10= . VAR:;| ,| INTEGER | ; | := IFTHENELSE WHILEDO BEGINEND |+|- |*|/ |() | 0| | |=| A|B|C|D|E|F|G|H|I|J|K|L|M|N|O|P|Q|R|S|T|U|V|W|X|Y|Z 1|2|3|4|5|6|7|8|9 |0 要求和提示: 词法分析阶段,可以打开任意位置和名称的源文件进行词法分析,可以进行非法字符和数字后边跟字母的错误判断,如果没有错误则提示“词法分析正确完成!” ,并且可以选择输出 token.txt(token 文件)string.txt(符号表)两个文件; 1词法
5、分析程序的主要任务如下: 组织源程序的输入,识别出源程序中的各个基本语法单位(也称为单词或语法符号),按规则转换成二元式的形式; 删除无用的空白字符、回车符、及其它非实质性符号; 删除注解行; 为后面的语法和语义分析提供二元式链表; 单词 编码 单词 编码 标识符 1 17 END 4 = 18 IF 5 19 THEN 6 = 20 ELSE 7 ; 21 WHILE 8 22 DO 9 := 23 INTEGER 10 , 24 + 11 ( 25 - 12 ) 26 * 13 / 14 1) 对标识符的长度控制在 8 个字符(包括 8 个)以内,超过的做截断处理; 2) 数字不大于 65
6、535,否则报错; 3) 能跳过源程序中的空白格:两个单词之间的任何空格,制表符,回车,换行都是白空格,除了用来分隔单词以外,没有意义; 4) 能跳过注释: a) 接连出现的/*到下一次接连出现的 */之间的任何文字都是注释(多行); b) 从某行接连出现的/到该行的结尾的任何文字都是注释(单行)。 3.怎样编写词法分析程序: 1) 预处理:把源文件一个字符一个字符的读入词法分析程序设置的输入字符结构体数组中(输入缓冲区),读入过程要删除注释,删除多余的白空格; 2) 从源程序字符数组中获得单词, 编码为二元式. : 二元式采用结构体数组存储, 把单词类型和词元记录下来。 分解单词的方法: 1
7、) Case 多路转换语句根据单词的特点直接编写; 2) 通过描述单词的正规文法得到相应的有穷自动机,通过 case 多路转换语句完成有穷自动机的处理流程。 3编写词法分析程序要注意的问题: 1) 检查词法是否有错误 检查是否有非法字符:如 , &, ! 检查标志符和数字是否满足限制条件 检查注释符号是否配对 2) 符分隔单词 能够区分两个单词的符号为界符 有些界符不是单词:如白空格 有些界符仅仅用来分隔:如; 有些界符本身还是源程序不可缺少的单词,如(, ), +, /, 等等 有些界符包含两个字符:如, =等等 3) 输出词法错误 如果有错误,需要报告词法错误的原因。并且要能够越过错误,分
8、解下一个单词,直到源程序结束。 4) 输出的二元式流保存在二元式结构体数组中。#include #include #include #include #include #include using namespace std;bool isLetter(char ch)if (ch=A else return false;bool isDigit(char ch)if (ch=0 else return false;bool isP(char ch)if(ch=+|ch=*|ch=-|ch=/) return true;/ch=:|ch=,|ch=|ch=;|ch=(|ch=)else ret
9、urn false;bool isJ(char ch)if(ch=,|ch=;|ch=.|ch=(|ch=)|ch=|ch=|ch=|ch=:|ch=|ch=|ch=|ch=#) return true;/else return false;bool isBlank(char ch)if(ch= |ch=t) return true;else return false;int main()string src,ste,s;char ch0,ch,ch12;char ktt4820=and,begin,const,div,do,else,end,function,if,integer,not,o
10、r,procedure,program,read,real,then,type,var,while,write,标识符,无符号数,;,:,.,(,),.,+,-,+,-,*,/,=,=,:=,#;int pos=0;FILE *fp;fp=fopen(d:in.txt,r);ch0=fgetc(fp);while(ch0!=EOF)/if(ch0!=t)src+=ch0; src+=ch0;ch0=fgetc(fp);src+=#;coutste;break;if(j=21)ste=ste+|+21;/ coutste;break;coutste;break;cout #include cha
11、r *process1(); void printend(int,char); void process(); void processb(); int issymbol(char); int iskeyword(char *); int kwnum=0,valnum=0,symbolnum=0,digitnum=0,othernum=0; char keywords20010,val20030,symbol2002,digit20010,other20020; int main() char words100; clrscr(); strcpy(words,process1(); proce
12、ss(words, ; ); printend(kwnum, k ); printend(valnum, v ); printend(symbolnum, s ); printend(digitnum, d ); printend(othernum, o ); printf( nPress any key to continue.n ); getch(); return 0; void printend(int number,char sign) int i; if(number) for(i=1;i , , ! , % , & , | , , , ; for(;i 30;i+) if (symbol=signi) return 1; return 0;