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

上传人:ni****g 文档编号:552384841 上传时间:2022-09-19 格式:DOC 页数:38 大小:316KB
返回 下载 相关 举报
语法分析器(完整代码)1_第1页
第1页 / 共38页
语法分析器(完整代码)1_第2页
第2页 / 共38页
语法分析器(完整代码)1_第3页
第3页 / 共38页
语法分析器(完整代码)1_第4页
第4页 / 共38页
语法分析器(完整代码)1_第5页
第5页 / 共38页
点击查看更多>>
资源描述

《语法分析器(完整代码)1》由会员分享,可在线阅读,更多相关《语法分析器(完整代码)1(38页珍藏版)》请在金锄头文库上搜索。

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,int nLine)int chIndex = 0; while(chIndex 20) /标识符超过规定长度,报错处理error(str,nLine,1); elseint i; for(i = 0;i MaxKeyWord; i+) /与关键字匹配/是关键字,写入table表中 if(strcmp(str, KeyWordi) = 0) strcpy(tableTableNum.symbol,str);tableTableNum.type = 1;

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 大杂烩/其它

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号