语法分析器完整代码1_第1页
语法分析器完整代码1_第2页
语法分析器完整代码1_第3页
语法分析器完整代码1_第4页
语法分析器完整代码1_第5页
已阅读5页,还剩51页未读 继续免费阅读

付费下载

下载本文档

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

文档简介

1、 语法分析实验报告 一、实验目的: 1. 了解单词(内部编码)符号串中的短语句型结构形成规律。 2. 理解和掌握语法分析过程中语法分析思想(LL,LR)的智能算法化方法。 二、实验内容: 构造自己设计的小语言的语法分析器: 1. 小语言的语法描述(语法规则)的设计即文法的设计; 2. 把文法形式符号中所隐含的信息内容挖掘出来并用LL或LR的资料形式(分析表)表示出来; 3. 语法分析的数据输入形式和输出形式的确定; 4. 语法分析程序各个模块的设计与调试。 主要设备和材料:电脑、winxp操作系统、VC语言系统 三、实验分工: 学 号 姓 名 实 验 分 工 0815053 刘俊杰 实验代码设

2、计及编写 0815054 刘康 检查校对代码 0815050 李晓梅 写电子版实验报告 0815048 李姗姗 查找、分析、整理资料 0815066 任梦杰 查找、分析、整理资料 0805036 韩宁宁 后勤服务 0815117 朱永庆 组长助理 0815097 曾文亚 分模块调试 四、实验步骤: 1、语法规则 | :=条件语赋值语句 变量定义语句 程序 | :=; ,变量 var 变量定义语句变量 :=;表达式 变量赋值语句 := :=; 表达式运算符 标识符标识符 |:= = + / 条件语句else 语句语句if | := 条件语句表达式) thenbegin 赋值语句 if语句 if(

3、 end 循环语句 | :=循环语 条件语句 赋值语句 begin 语句else end 句 | := 条件语句 ) begin 赋值语句while( 表达式循环语句| end 循环语句 := - - - 赋 值 句 语 - - - - - 件条 句 语 - - - - - - - 环循 - - - - - - - 句语 出输 -句 -语 分析表(续): while var begin end if then prn 变量 定义 - 赋值 语 句 条件语句 - - - - 语句 环 循 - - - 输句 语 出 - 、调试和测试3 五、源代码(见附录): 六、实验总结: 本实验在词法分析的基础

4、上,对提取出的标识符进行语法判断。对已有的语法规则运用LL(1)文法判别并进行构造分析表时,遇到的最大困难是:当发生规约冲突时,该如何处理。如对于产生式s-aAb,当对a进行规约时,满足语法规则的(用户输入串中当前要进行规约的标识符)只有有限种,而不满足的却有无限种情况。当发生规约冲突时,如何在这无限种情况中,确定冲突的具体信息,以便用户查找。在反复的尝试和验证中,我们发现发生冲突的用户输入串满足一定的规律,且按这种规律可以把这无限种情况化归为有限类,于是我们找出其中规律并进行划分,然后再对这些有限类冲突进行处理。 七、实验心得: 通过这次实验有以下几点收获: 1 LR(1)的构造使得对理论的

5、知识理解的更加透彻。其中LR(1)分析表构造了很多遍,一直无法得到正确结果,这是恒心的考验。 2 在写程序中用类数组来存放单词属性使得对单词各项值的调用更加方便,特别是对出错信息的检测有很大的作用。 3 本实验是在词法基础上的更进一步,在词法程序上添加语法程序,方词法分析为语法分析提供了词法单元,更加理解二者之间的关系。 便分析,使程序模块化,易于读懂。 附录: #include #include #include #include #include #include using namespace std; /最大代码长度 #define Max 655 变量最大个数#define Word

6、MaxNum 256 / #define DigitNum 256 /常量最大个数 关键字数量32 /#define MaxKeyWord #define MaxOptANum 8 /运算符最大个数 / #define MaxOptBNum 4 运算符最大个数#define MaxEndNum 11 / 界符最大个数 typedef struct DisplayTable int Index; /标识符所在表的下标 int type; / 标识符的类型 int line; / 标识符所在表的行数 char symbol20; / 标识符所在表的名称 Table; int TableNum =

7、0; /display表的表项总数 char WordWordMaxNum20; /标识符表 char DigitWordMaxNum20; /数字表 int WordNum = 0; /变量表的下标 int DigNum = 0; /常量表的下标 bool errorFlag = 0; / 错误标志 int TableIndex = -1; /display 表的下标索引 int beginCount = 0;/遇到begin加1,遇到end减1 int ifCount = 0; /遇到 if加1 Table *table = new TableMax; /关键字 and,array, co

8、nst char* KeyWordMaxKeyWord const = egin,case,char,constant,do,else,end, alse, or,if,input,integer, ot,of,or,output, packed,procedure,program, ead, eal, epeat,set, hen, o, ype, %until, var,while, with,prn; / 单目运算 const char OptA = +,-,*,/,=,#,; /双目运算符 const char *OptB = =,:=,; / 界符 const char End =

9、(, ) , , , ; , . , , , : , , , ; void error(char str20,int nLine, int errorType) errorFlag = 1; cout nError : ; switch(errorType) case 1: 潣瑵?第?渠楌敮?尼行 str 变量的长度超过限制!n; break; case 2: 潣瑵?第?渠楌敮?尼行 str 小数点错误!n; break; case 3: 潣瑵?第?渠楌敮?尼行 str 常量的长度超过限制!n; break; /switch /error void Scanner(char ch,int ch

10、Len,int nLine) int chIndex = 0; while(chIndex 20) /标识符超过规定长度,报错处理 error(str,nLine,1); else int i; for(i = 0;i = MaxKeyWord) /不是关键字 tableTableNum.Index = WordNum; strcpy(WordWordNum+,str); tableTableNum.type = 2; / 变量标识符strcpy(tableTableNum.symbol,str); tableTableNum.line = nLine; TableNum +; /*常数*/

11、else if(isdigit(chchIndex) /遇到数字 int flag = 0; char str256; int strLen = 0; /数字和小数点 while(isdigit(chchIndex) | chchIndex = .) /flag表记小数点的个数,0时为整数,1时为小数,2时出错 if(chchIndex = .) flag +; strstrLen + = chchIndex; chIndex +; strstrLen = 0; if(strlen(str) 20) /常量标识符超过规定长度20,报错处理 error(str,nLine,3); if(flag

12、 = 0) 整数tableTableNum.type = 3; / if(flag = 1) 小数tableTableNum.type = 4; / if(flag 1) error(str,nLine,2); tableTableNum.Index = DigNum; strcpy(DigitDigNum +,str); strcpy(tableTableNum.symbol,str); tableTableNum.line = nLine; TableNum +; */ /*运算符else /用来区分是不是无法识别的标识符,0为运算符,1为界符 int errorFlag; char st

13、r3; str0 = chchIndex; str1 = chchIndex + 1; str2 = 0; int i; for( i = 0;i = MaxOptBNum) for( int k = 0;k MaxOptANum; k+) if(OptAk = chchIndex) errorFlag = 0; tableTableNum.type = 5; tableTableNum.symbol0 = chchIndex; tableTableNum.symbol1 = 0; tableTableNum.line = nLine; tableTableNum.Index = k; Tab

14、leNum +; chIndex +; break; /*界符 */ for(int j = 0;j MaxEndNum;j +) if(Endj =chchIndex) errorFlag = 1; tableTableNum.line = nLine; tableTableNum.symbol0 = chchIndex; tableTableNum.symbol1 = 0; tableTableNum.Index = j; tableTableNum.type = 7; TableNum +; chIndex +; /*其他无法识别字符*/ /开头的不是字母、数字、运算符、界符 if(er

15、rorFlag != 0 int strLen = -1; strstrLen + = chchIndex; chIndex +; while(*ch != | *ch != 9 | chchIndex != 10) strstrLen + = chchIndex; chIndex +; strstrLen = 0; tableTableNum.type = 8; strcpy(tableTableNum.symbol,str); tableTableNum.line = nLine; tableTableNum.Index = -2; TableNum +; /*把十进制小数转为16进制*/

16、 void Trans(double x,int p) /把十进制小数转为16进制 int i=0; /控制保留的有效位数 while(ip) if(x=0) /如果小数部分是0 break; /则退出循环 else int k=int(x*16); /取整数部分 x=x*16-int(k); /得到小数部分 if(k=9) coutk; else coutchar(k+55); ; i+; ; ; /*语法错误*/ void Gerror(int errorType,int nIndex) errorFlag = 1; switch(errorType) case 1: cout 第 tab

17、lenIndex.line ?行: = n; tablenIndex.symbol 应该为赋值号:break; case 2: 行:? 第 tablenIndex.line cout n; 应为变量 tablenIndex.symbol break; case 3: : 第 tablenIndex.line ?行 cout n; tablenIndex.symbol 应为逗号 break; case 4: cout 第 tablenIndex.line ?行: tablenIndex.symbol 应为分号 n; break; case 5: cout 第 tablenIndex.line ?

18、行: tablenIndex.symbol 应为运算符 n; break; case 6: ?行 : cout 第 tablenIndex.line n; 应为变量或常量 tablenIndex.symbol break; case 7: 行 潣瑵?第 tableTableIndex.line ? ?琠扡敬湛湉敤嵸献浹潢?尠与 tableTableIndex + 1.symbol n; 之间缺少运算符? break; case 8: tablenIndex.line cout 第 ?: 行( n; tablenIndex + 1 .symbol 应为 break; case 9: 潣瑵?第 t

19、ableTableIndex.line ?行 ?琠扡敬呛扡敬湉敤嵸献浹潢?尠 与 tablenIndex ?崱献浹潢?之间缺少( n; break; case 10: 潣瑵?第 tableTableIndex - 1.line 行: 缺少then endl; break; case 11: 潣瑵?第 tableTableIndex.line 行: ?慴汢孥?摮硥?祳扭汯?应为then n; break; case 12: 潣瑵?第 tableTableIndex.line 行: end 后不能接 tableTableIndex.symbol endl; break; case 13: 潣瑵?第

20、 ?琠扡敬湛湉敤嵸氮湩? 行: ?琠扡敬湛湉敤?崱献浹潢?与 ?慴汢孥慔汢?摮硥?祳扭汯?尼之间缺少变量 n; break; case 14: 潣瑵?第 tablenIndex .line ?行 ?琠扡敬湛湉敤?祳扭汯?后缺少; n; break; case 15: 潣瑵?第 tableTableIndex.line 行: ?慴汢孥?摮硥?祳扭汯?应为) n; break; case 16: 潣瑵?第 tableTableIndex.line 行,begin 后不能接 tableTableIndex.symbol = TableNum) /| ) Gerror(14,TableIndex);

21、/出错信息:该语句缺少分号 return 1; else Gerror(5,TableIndex); /出错信息:此处应为运算符TableIndex +; */ 赋值语句判断/* bool Assign() /赋值语句的判断 TableIndex +; if(strcmp( := , tableTableIndex.symbol) = 0) TableIndex +; else := /出错信息:赋值号应该为 Gerror(1,TableIndex); TableIndex +; ?尽 if(express() 后可以为变量或常量 if(strcmp(;,tableTableIndex.sym

22、bol) = 0) return 1; else if(TableIndex = TableNum) Gerror(14,TableIndex); /出错信息:该语句缺少分号 return 1; else if(tableTableIndex.line != tableTableIndex + 1.line) Gerror(14,TableIndex); /出错信息:该语句缺少分号 return 1; /TableIndex +; else ?尽/ Gerror(6,TableIndex); 出错信息: 后应为变量或常量TableIndex +; return 0; */ /*语句判断 条件、

23、循环、初始化语句的判断bool judge() / /*begin*/ if(strcmp(egin,tableTableIndex.symbol)=0) /匹配begin beginCount +; if(tableTableIndex + 1.type = 7) TableIndex +; 潣瑵?第 tableTableIndex.line 行,begin 后不能接 tableTableIndex.symbol endl; return 1; /*end*/ end if(strcmp(end,tableTableIndex.symbol) = 0) /匹配 beginCount -; i

24、f(TableIndex TableNum) if(tableTableIndex+1.type=7|tableTableIndex+ 1.type = 8) TableIndex +; Gerror(12,TableIndex); return 1; /*else*/ if(strcmp(else,tableTableIndex.symbol) = 0) /匹配else ifCount -; return 1; prn if(strcmp(prn,tableTableIndex.symbol) = 0) /匹配 TableIndex +; = tableTableIndex.type 3)

25、if(tableTableIndex.type = 2 | / prn 后为变量或常量 TableIndex +; /语句结束,“;” if(strcmp(;,tableTableIndex.symbol) = 0) return 1; else ; 出错信息:此处应为Gerror(4,TableIndex);/ /if else Gerror(2,TableIndex);/出错信息:此处应为变量 TableIndex +; /if_prn /*var变量定义*/ if(strcmp(var,tableTableIndex.symbol) = 0)/ var a,b,c; TableIndex

26、 +; if(tableTableIndex.type != 2) if(strcmp(,tableTableIndex.symbol) = 0) Gerror(13,TableIndex); 出错信息:此处应为变量 Gerror(2,TableIndex);/ else TableIndex +; if(strcmp(,tableTableIndex.symbol) !=0) , 出错信息:此处应为Gerror(3,TableIndex); / TableIndex +; while(1) while(strcmp(,tableTableIndex.symbol)=0) TableIndex

27、 = TableIndex + 1; if(tableTableIndex.type !=2) Gerror(2,TableIndex);/ 出错信息:此处应为变量 TableIndex +; TableIndex +; if(strcmp(;,tableTableIndex.symbol)=0) return 1; else ; Gerror(4,TableIndex);/ 出错信息:此处应为分号return 0; /*if语句判断*/ /if语句 else if(strcmp(if,tableTableIndex.symbol) = 0) ifCount +; /if个数加1 if(tableTableIndex +1.type = 2 | tableTableIndex + 1.type = 3) Gerror(9,TableIndex); /出错信息:此处缺少 ) TableIndex +; else if(strcmp(,tableTableIndex + 1.symbol) != 0) Gerror(8,TableIndex);/出错信息:此处应为分号 ( TableIndex = TableIndex + 2; if(express() 匹配if(strcmp(),tableTableIndex.symbol) = 0) /( TableIndex +

温馨提示

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

评论

0/150

提交评论