实验二、语法分析器(源代码)(共21页).doc
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_05.gif)
《实验二、语法分析器(源代码)(共21页).doc》由会员分享,可在线阅读,更多相关《实验二、语法分析器(源代码)(共21页).doc(21页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、精选优质文档-倾情为你奉上语法分析实验报告一、实验目的: 1. 了解单词(内部编码)符号串中的短语句型结构形成规律。 2. 理解和掌握语法分析过程中语法分析思想(LL,LR)的智能算法化方法。二、实验内容:构造自己设计的小语言的语法分析器: 1. 小语言的语法描述(语法规则)的设计即文法的设计; 2. 把文法形式符号中所隐含的信息内容挖掘出来并用LL或LR的资料形式(分析表)表示出来; 3. 语法分析的数据输入形式和输出形式的确定;4. 语法分析程序各个模块的设计与调试。主要设备和材料:电脑、winxp操作系统、VC语言系统三、实验步骤:1、语法规则 := | | | := var 变量,变量
2、; := 变量 := ; := 标识符运算符 标识符 ; := 变量 |常量 := + | - | * | / | = | = := := if(表达式) thenbegin 赋值语句 |条件语句 | 循环语句end := begin 赋值语句 | 条件语句 | 循环语句 end := while(表达式) begin 赋值语句 | 条件语句 | 循环语句 end := prn 表达式-注1:若if语句、else语句、循环语句中出现begin,后面的end必须出现,即begin与end同对出现-注2:if、while后的(,)表示终结符,而不是定义成分优先的说明符号2、分析表: : =变量常量
3、 , ;运算符 ( )变 量定 义- - - - 赋 值语 句- -条 件语 句- - - - - - 循 环语 句- - - - - - - 输 出语 句-分析表(续):whilevarbeginendifthenprn变 量 定 义- 赋 值 语 句条 件 语 句- - 循 环 语 句- - - 输 出 语 句-3、 调试和测试四、实验总结:本实验在词法分析的基础上,对提取出的标识符进行语法判断。对已有的语法规则运用LL(1)文法判别并进行构造分析表时,遇到的最大困难是:当发生规约冲突时,该如何处理。如对于产生式s-aAb,当对a进行规约时,满足语法规则的(用户输入串中当前要进行规约的标识
4、符)只有有限种,而不满足的却有无限种情况。当发生规约冲突时,如何在这无限种情况中,确定冲突的具体信息,以便用户查找。在反复的尝试和验证中,我们发现发生冲突的用户输入串满足一定的规律,且按这种规律可以把这无限种情况化归为有限类,于是我们找出其中规律并进行划分,然后再对这些有限类冲突进行处理。五、实验心得:通过这次实验有以下几点收获:1 LR(1)的构造使得对理论的知识理解的更加透彻。其中LR(1)分析表构造了很多遍,一直无法得到正确结果,这是恒心的考验。2 在写程序中用类数组来存放单词属性使得对单词各项值的调用更加方便,特别是对出错信息的检测有很大的作用。3 本实验是在词法基础上的更进一步,在词
5、法程序上添加语法程序,更加理解二者之间的关系。词法分析为语法分析提供了词法单元,方便分析,使程序模块化,易于读懂。六、附录:#include #include #include #include #include #include using namespace std;#define Max 655 /最大代码长度#define WordMaxNum 256 /变量最大个数#define DigitNum 256/常量最大个数#define MaxKeyWord32/关键字数量#define MaxOptANum 8/运算符最大个数#define MaxOptBNum 4/运算符最大个数#d
6、efine MaxEndNum 11/界符最大个数typedef struct DisplayTableint Index; /标识符所在表的下标int type;/标识符的类型int line;/标识符所在表的行数char symbol20;/标识符所在表的名称Table;int TableNum = 0; /display表的表项总数char WordWordMaxNum20; /标识符表char DigitWordMaxNum20; /数字表int WordNum = 0; /变量表的下标int DigNum = 0; /常量表的下标bool errorFlag = 0; /错误标志 i
7、nt TableIndex = -1; /display 表的下标索引int beginCount = 0;/遇到begin加1,遇到end减1int ifCount = 0; /遇到if加1Table *table = new TableMax;/关键字const char* const KeyWordMaxKeyWord = and,array, begin,case,char,constant,do,else,end,false,for,if,input,integer,not,of,or,output,packed,procedure,program,read,real,repeat,
8、set, then, to, type, until, var,while, with,prn; / 单目运算const char OptA = +,-,*,/,=,#,;/双目运算符const char *OptB = =,:=,;/ 界符const char End = (, ) , , , ; , . , , , : , , , ; void error(char str20,int nLine, int errorType) errorFlag = 1; cout nError : ; switch(errorType) case 1:cout 第 nLine-1 行 str 变量的长
9、度超过限制!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) /不是关键字tableTableNum.Index = WordNu
10、m;strcpy(WordWordNum+,str);tableTableNum.type = 2; /变量标识符strcpy(tableTableNum.symbol,str);tableTableNum.line = nLine;TableNum +;/*常数*/else if(isdigit(chchIndex) /遇到数字int flag = 0;char str256;int strLen = 0;/数字和小数点while(isdigit(chchIndex) | chchIndex = .)/flag表记小数点的个数,0时为整数,1时为小数,2时出错if(chchIndex = .
11、) flag +;strstrLen + = chchIndex;chIndex +; strstrLen = 0;if(strlen(str) 20) /常量标识符超过规定长度20,报错处理error(str,nLine,3);if(flag = 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.sy
12、mbol,str);tableTableNum.line = nLine;TableNum +;/*运算符*/else/用来区分是不是无法识别的标识符,0为运算符,1为界符int errorFlag;char str3;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
13、 = chchIndex;tableTableNum.symbol1 = 0;tableTableNum.line = nLine;tableTableNum.Index = k;TableNum +;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;tab
14、leTableNum.type = 7;TableNum +;chIndex +;/*其他无法识别字符*/开头的不是字母、数字、运算符、界符if(errorFlag != 0 & errorFlag != 1) char str256;int strLen = -1;strstrLen + = chchIndex;chIndex +;while(*ch != | *ch != 9 | chchIndex != 10)strstrLen + = chchIndex;chIndex +;strstrLen = 0;tableTableNum.type = 8;strcpy(tableTableNu
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验 语法 分析器 源代码 21
![提示](https://www.taowenge.com/images/bang_tan.gif)
限制150内