资源描述:
《编译原理实验报告——词法分析器(内含源代码).docx》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库。
1、编译原理实验(一)——词法分析器一.实验描述运行环境:vc++2008对某特定语言A,构造其词法规则。该语言的单词符号包括:1该程序能识别的单词符号及类别说明表单词类别PROGRAM0NOT1BEGIN2IF3END4THEN5VAR6ELSE7INT8WHILE9AND10DO11OR12标识符13常数14+15-16(17)18,19;20=21<22>23*24**25>=26<=27!=282状态转换图3程序流程:词法分析作成一个子程序,由另一个主程序调用,每次调用返回一个单词对应的二元组,输出标识符表、常数表由主程序来完成。一.实验目的通过动手实践,使学生对
2、构造编译系统的基本理论、编译程序的基本结构有更为深入的理解和掌握;使学生掌握编译程序设计的基本方法和步骤;能够设计实现编译系统的重要环节。同时增强编写和调试程序的能力。二.实验任务编制程序实现要求的功能,并能完成对测试样例程序的分析。一.实验原理charset[1000],str[500],strtaken[20];//set[]存储代码,strtaken[]存储当前字符charsign[50][10],constant[50][10];//存储标识符和常量定义了一个Analyzer类classAnalyzer{public:Analyzer();//构造函数~Ana
3、lyzer();//析构函数intIsLetter(charch);//判断是否是字母,是则返回1,否则返回0。intIsDigit(charch);//判断是否为数字,是则返回1,否则返回0。voidGetChar(char*ch);//将下一个输入字符读到ch中。voidGetBC(char*ch);//检查ch中的字符是否为空白,若是,则调用GetChar直至ch进入一个非空白字符。voidConcat(char*strTaken,char*ch);//将ch中的字符连接到strToken之后。intReserve(char*strTaken);//对strTa
4、ken中的字符串查找保留字表,若是一个保留字返回它的数码,否则返回0。voidRetract(char*ch);//将搜索指针器回调一个字符位置,将ch置为空白字符。voidinput();//向存放输入结果的字符数组输入一句语句。voiddisplay();//输出一些程序结束字符显示样式intanalyzerSubFun();//词法分析器子程序,为了实现词法分析的主要功能。二.代码实现//cifa.cpp:定义控制台应用程序的入口点。//#include"stdafx.h"#include"stdio.h"#include"string.h"#include"i
5、ostream"usingnamespacestd;charset[1000],str[500],strtaken[20];//set[]存储代码,strtaken[]存储当前字符charsign[50][10],constant[50][10];//存储标识符和常量//intWords[500][10];charch;//当前读入字符intsr,to=0;//数组str,strtaken的指针intst=0,dcount=0;intid=0;staticintline=1;inth,l;typedefstructWords/*放置二元组*/{intnum;charl
6、etters[20];}DS;DSWords[500];typedefstructwords{charword[20];inttype;}WORDS;WORDSwords[]={{"program",0},{"not",1},{"begin",2},{"end",3},{"if",4},{"then",5},{"var",6},{"else",7},{"int",8},{"while",9},{"and",10},{"do",11},{"or",12},{"+",15},{"-",16},{"(",17},{")",18},{",",19},{";",20},{"="
7、,21},{"<",22},{">",23},{"*",24},{"**",25},{">=",26},{"<=",27},{"!=",28}};typedefstructkeytable/*放置关键字*/{charname[20];intkind;}KEYTABLE;KEYTABLEkeyword[]={/*设置关键字*/{"program",0},{"not",1},{"begin",2},{"end",3},{"if",4},{"then",5},{"var",6},{"else",7},{"int",8},{"while",9},{"and"