欢迎来到三一办公! | 帮助中心 三一办公31ppt.com(应用文档模板下载平台)
三一办公
全部分类
  • 办公文档>
  • PPT模板>
  • 建筑/施工/环境>
  • 毕业设计>
  • 工程图纸>
  • 教育教学>
  • 素材源码>
  • 生活休闲>
  • 临时分类>
  • ImageVerifierCode 换一换
    首页 三一办公 > 资源分类 > DOC文档下载  

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

    • 资源ID:2353001       资源大小:250KB        全文页数:37页
    • 资源格式: DOC        下载积分:8金币
    快捷下载 游客一键下载
    会员登录下载
    三方登录下载: 微信开放平台登录 QQ登录  
    下载资源需要8金币
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

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

    语法分析实验报告一、实验目的: 1. 了解单词(内部编码)符号串中的短语句型结构形成规律。 2. 理解和掌握语法分析过程中语法分析思想(LL,LR)的智能算法化方法。二、实验内容:构造自己设计的小语言的语法分析器: 1. 小语言的语法描述(语法规则)的设计即文法的设计; 2. 把文法形式符号中所隐含的信息内容挖掘出来并用LL或LR的资料形式(分析表)表示出来; 3. 语法分析的数据输入形式和输出形式的确定;4. 语法分析程序各个模块的设计与调试。主要设备和材料:电脑、winxp操作系统、VC语言系统三、实验分工:学 号姓 名实 验 分 工0815053刘俊杰实验代码设计及编写0815054刘康检查校对代码0815050李晓梅写电子版实验报告0815048李姗姗查找、分析、整理资料0815066任梦杰查找、分析、整理资料0805036韩宁宁后勤服务0815117朱永庆组长助理0815097曾文亚分模块调试四、实验步骤:1、语法规则 <程序> := <变量定义语句> | <赋值语句> | <条件语句> | <循环语句> <变量定义语句> := var 变量,变量; <赋值语句> := 变量 := <表达式>; <表达式> := 标识符运算符 标识符 ; <标识符> := 变量 |常量 <运算符 > := + | - | * | / | >= | <= <条件语句> := <if语句><else语句> <if语句> := if(表达式) thenbegin 赋值语句 |条件语句 | 循环语句end <else语句> := begin 赋值语句 | 条件语句 | 循环语句 end <循环语句> := while(表达式) begin 赋值语句 | 条件语句 | 循环语句 end <输出语句> := prn 表达式-注1:若if语句、else语句、循环语句中出现begin,后面的end必须出现,即begin与end同对出现-注2:if、while后的"(",")"表示终结符,而不是定义成分优先的说明符号2、分析表: : =变量常量 , ;运算符 ( )变 量定 义-> -> -> -> 赋 值语 句->->->-> ->条 件语 句->-> -> -> -> -> -> 循 环语 句-> -> -> -> -> -> -> 输 出语 句->->->分析表(续):whilevarbeginendifthenprn变 量 定 义-> 赋 值 语 句条 件 语 句->->-> -> 循 环 语 句-> -> -> 输 出 语 句->3、 调试和测试五、源代码(见附录):六、实验总结:本实验在词法分析的基础上,对提取出的标识符进行语法判断。对已有的语法规则运用LL(1)文法判别并进行构造分析表时,遇到的最大困难是:当发生规约冲突时,该如何处理。如对于产生式s->aAb,当对a进行规约时,满足语法规则的(用户输入串中当前要进行规约的标识符)只有有限种,而不满足的却有无限种情况。当发生规约冲突时,如何在这无限种情况中,确定冲突的具体信息,以便用户查找。在反复的尝试和验证中,我们发现发生冲突的用户输入串满足一定的规律,且按这种规律可以把这无限种情况化归为有限类,于是我们找出其中规律并进行划分,然后再对这些有限类冲突进行处理。七、实验心得:通过这次实验有以下几点收获:1 LR(1)的构造使得对理论的知识理解的更加透彻。其中LR(1)分析表构造了很多遍,一直无法得到正确结果,这是恒心的考验。2 在写程序中用类数组来存放单词属性使得对单词各项值的调用更加方便,特别是对出错信息的检测有很大的作用。3 本实验是在词法基础上的更进一步,在词法程序上添加语法程序,更加理解二者之间的关系。词法分析为语法分析提供了词法单元,方便分析,使程序模块化,易于读懂。附录:#include <iostream>#include <fstream>#include <string>#include <math.h>#include <ctype.h>#include <cstdlib> using namespace std;#define Max 655 /最大代码长度#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 TableNum = 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 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","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 << " 变量的长度超过限制!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 < chLen) /对输入的字符扫描/*处理空格和tab*/忽略空格和tabwhile(chchIndex = ' ' | chchIndex = 9 ) chIndex +; /*处理换行符*/ /遇到换行符,行数加1while(chchIndex = 10) nLine+;chIndex +;/*标识符*/if( isalpha(chchIndex) /以字母、下划线开头 char str256; int strLen = 0;/是字母、下划线while(isalpha(chchIndex) | chchIndex = '_' ) strstrLen + = chchIndex; chIndex +;while(isdigit(chchIndex)/不是第一位,可以为数字strstrLen + = chchIndex;chIndex +;strstrLen = 0; /字符串结束符if(strlen(str) > 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; /关键字tableTableNum.line = nLine;tableTableNum.Index = i;TableNum +;break; if(i >= MaxKeyWord) /不是关键字tableTableNum.Index = WordNum;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 = '.') 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.symbol,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;i+)/MaxOptBNum)if(strcmp(str,OptBi) = 0) errorFlag = 0; tableTableNum.type = 6; strcpy(tableTableNum.symbol,str); tableTableNum.line = nLine; tableTableNum.Index = i; TableNum +; chIndex = chIndex + 2; break;if(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;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 + = 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进制*/void Trans(double x,int p) /把十进制小数转为16进制int i=0; /控制保留的有效位数while(i<p) if(x=0) /如果小数部分是0 break; /则退出循环 else int k=int(x*16); /取整数部分 x=x*16-int(k); /得到小数部分 if(k<=9) cout<<k; else cout<<char(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 << "第" << 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.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: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 <<"之间缺少变量 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 << endl;break;/*表达式判断*/bool express()while(1 ) if(tableTableIndex.type=2|tableTableIndex.type = 3 ) if(tableTableIndex.type=3&&tableTableIndex+ 1.type = 2 && tableTableIndex.line = tableTableIndex + 1.line) Gerror(7,TableIndex); /出错信息:该处缺少运算符/TableIndex = TableIndex + 2;TableIndex +;if(tableTableIndex.line != tableTableIndex + 1.line)/Gerror(14,TableIndex); /出错信息:该语句缺少分号return 1; TableIndex +;else if(tableTableIndex.type = 5|tableTableIndex.type = 6)Gerror(13,TableIndex);TableIndex +;else Gerror(6,TableIndex); /出错信息:该处应为变量或常量TableIndex +;if(tableTableIndex.type =5| tableTableIndex.type = 6 )TableIndex +;else if(tableTableIndex.type = 7)return 1;else if(TableIndex >= TableNum) /| ) Gerror(14,TableIndex); /出错信息:该语句缺少分号 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.symbol) = 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;/*语句判断*/bool judge() /条件、循环、初始化语句的判断/*begin*/if(strcmp("begin",tableTableIndex.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.type = 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("",tableTableIndex.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,TableIndex);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 +; 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 +; if(strcmp("begin",tableTableIndex .symbol) = 0)beginCount +;if(tableTableIndex + 1.type = 7)Gerror(16,TableIndex);TableIndex +;return 1;Gerror(10,TableIndex);/出错信息:此处缺少"then"return 0;if(strcmp("then",tableTableIndex.symbol) != 0)Gerror(11,TableIndex);/出错信息:此处应为"then"return 0; /if_th

    注意事项

    本文(语法分析器(完整代码)1.doc)为本站会员(laozhun)主动上传,三一办公仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知三一办公(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    备案号:宁ICP备20000045号-2

    经营许可证:宁B2-20210002

    宁公网安备 64010402000987号

    三一办公
    收起
    展开