语法分析器(完整代码)1.doc

上传人:laozhun 文档编号:2353001 上传时间:2023-02-15 格式:DOC 页数:37 大小:250KB
返回 下载 相关 举报
语法分析器(完整代码)1.doc_第1页
第1页 / 共37页
语法分析器(完整代码)1.doc_第2页
第2页 / 共37页
语法分析器(完整代码)1.doc_第3页
第3页 / 共37页
语法分析器(完整代码)1.doc_第4页
第4页 / 共37页
语法分析器(完整代码)1.doc_第5页
第5页 / 共37页
点击查看更多>>
资源描述

《语法分析器(完整代码)1.doc》由会员分享,可在线阅读,更多相关《语法分析器(完整代码)1.doc(37页珍藏版)》请在三一办公上搜索。

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

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

3、in 赋值语句 | 条件语句 | 循环语句 end := prn 表达式-注1:若if语句、else语句、循环语句中出现begin,后面的end必须出现,即begin与end同对出现-注2:if、while后的(,)表示终结符,而不是定义成分优先的说明符号2、分析表: : =变量常量 , ;运算符 ( )变 量定 义- - - - 赋 值语 句- -条 件语 句- - - - - - 循 环语 句- - - - - - - 输 出语 句-分析表(续):whilevarbeginendifthenprn变 量 定 义- 赋 值 语 句条 件 语 句- - 循 环 语 句- - - 输 出 语 句

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

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

6、55 /最大代码长度#define WordMaxNum 256 /变量最大个数#define DigitNum 256/常量最大个数#define MaxKeyWord32/关键字数量#define MaxOptANum 8/运算符最大个数#define MaxOptBNum 4/运算符最大个数#define MaxEndNum 11/界符最大个数typedef struct DisplayTableint Index; /标识符所在表的下标int type;/标识符的类型int line;/标识符所在表的行数char symbol20;/标识符所在表的名称Table;int TableNu

7、m = 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减1int ifCount = 0; /遇到if加1Table *table = new TableMax;/关键字const char* const Key

8、WordMaxKeyWord = and,array, begin,case,char,constant,do,else,end,false,for,if,input,integer,not,of,or,output,packed,procedure,program,read,real,repeat,set, then, to, type, 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:cout 第 nLine-1 行 str 变量的长度超过限制!n; break; case 2:cout 第 nLine-1 行 str 小数点错误!n; break;case 3:cout 第 nLine-1 行 str 常量的长度超过限制!n;break;/switch/errorvoid Scanner(char ch,int chLen,

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

11、(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 = 0)tableTableNum.type = 3

12、; /整数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 str3;str0 = chchIndex;str1 = chchIndex + 1;s

13、tr2 = 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;TableNum +;chIndex +;break;/*界符*/for(int j = 0;j MaxEndNum;

14、j +)if(Endj =chchIndex)errorFlag = 1;tableTableNum.line = nLine;tableTableNum.symbol0 = chchIndex;tableTableNum.symbol1 = 0;tableTableNum.Index = j;tableTableNum.type = 7;TableNum +;chIndex +;/*其他无法识别字符*/开头的不是字母、数字、运算符、界符if(errorFlag != 0 & errorFlag != 1) char str256;int strLen = -1;strstrLen + = c

15、hchIndex;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进制*/void Trans(double x,int p) /把十进制小数转为16进制int i=0; /控制保留的

16、有效位数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 第 tablenIndex.line 行: tablenIndex.symbol 应该为赋值号:= n;break; case 2:cout

17、第 tablenIndex.line 行: tablenIndex.symbol 应为变量 n;break;case 3:cout 第 tablenIndex.line 行: tablenIndex.symbol 应为逗号 n;break; case 4:cout 第 tablenIndex.line 行: tablenIndex.symbol 应为分号 n;break;case 5:cout 第 tablenIndex.line 行: tablenIndex.symbol 应为运算符 n;break;case 6:cout 第 tablenIndex.line 行: tablenIndex.

18、symbol 应为变量或常量 n;break;case 7:cout 第 tableTableIndex.line 行 tablenIndex.symbol 与tableTableIndex + 1.symbol 之间缺少运算符 n;break;case 8:cout 第 tablenIndex.line 行: tablenIndex + 1 .symbol 应为( n;break;case 9:cout 第 tableTableIndex.line 行 tableTableIndex.symbol 与 tablenIndex + 1.symbol 之间缺少( n;break;case 10:

19、cout 第 tableTableIndex - 1.line 行: 缺少then endl;break;case 11: cout 第 tableTableIndex.line 行:tablenIndex.symbol 应为then n; break;case 12:cout 第 tableTableIndex.line 行: end 后不能接 tableTableIndex.symbol endl; break;case 13:cout 第 tablenIndex.line 行: tablenIndex - 1.symbol 与 tableTableIndex.symbol 之间缺少变量

20、n;break;case 14:cout 第 tablenIndex .line 行 tablenIndex .symbol 后缺少; n;break;case 15:cout 第 tableTableIndex.line 行:tablenIndex.symbol 应为) n;break;case 16:cout 第 tableTableIndex.line 行,begin 后不能接 tableTableIndex.symbol = TableNum) /| ) Gerror(14,TableIndex); /出错信息:该语句缺少分号 return 1;else Gerror(5,TableI

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

22、ror(14,TableIndex); /出错信息:该语句缺少分号 return 1;else if(tableTableIndex.line != tableTableIndex + 1.line)Gerror(14,TableIndex); /出错信息:该语句缺少分号return 1;/TableIndex +;else Gerror(6,TableIndex); /出错信息::=后应为变量或常量 TableIndex +;return 0;/*语句判断*/bool judge() /条件、循环、初始化语句的判断/*begin*/if(strcmp(begin,tableTableInde

23、x.symbol)=0) /匹配begin beginCount +; if(tableTableIndex + 1.type = 7)TableIndex +;cout 第 tableTableIndex.line 行,begin 后不能接 tableTableIndex.symbol endl;return 1;/*end*/if(strcmp(end,tableTableIndex.symbol) = 0) /匹配endbeginCount -;if(TableIndex TableNum)if(tableTableIndex+1.type=7|tableTableIndex+ 1.ty

24、pe = 8)TableIndex +;Gerror(12,TableIndex);return 1; /*else*/if(strcmp(else,tableTableIndex.symbol) = 0) /匹配else ifCount -; return 1;if(strcmp(prn,tableTableIndex.symbol) = 0)/匹配prn TableIndex +; if(tableTableIndex.type = 2 | tableTableIndex.type = 3) / prn 后为变量或常量TableIndex +; /语句结束,“;”if(strcmp(;,t

25、ableTableIndex.symbol) = 0)return 1; else Gerror(4,TableIndex);/出错信息:此处应为; /ifelse Gerror(2,TableIndex);/出错信息:此处应为变量 TableIndex +; /if_prn/*var变量定义*/if(strcmp(var,tableTableIndex.symbol) = 0)/ var a,b,c;TableIndex +;if(tableTableIndex.type != 2)if(strcmp(,tableTableIndex.symbol) = 0)Gerror(13,TableI

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

27、dex +;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(st

28、rcmp(,tableTableIndex + 1.symbol) != 0)Gerror(8,TableIndex);/出错信息:此处应为分号(TableIndex = TableIndex + 2;if(express()if(strcmp(),tableTableIndex.symbol) = 0) /(匹配 TableIndex +; if(strcmp(begin,tableTableIndex .symbol) = 0)beginCount +;if(tableTableIndex + 1.type = 7)Gerror(16,TableIndex);TableIndex +;return 1;Gerror(10,TableIndex);/出错信息:此处缺少thenreturn 0;if(strcmp(then,tableTableIndex.symbol) != 0)Gerror(11,TableIndex);/出错信息:此处应为thenreturn 0; /if_th

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 建筑/施工/环境 > 项目建议


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号