




已阅读5页,还剩14页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
实 验 报 告 第 1 页专业_软件工程_ 班级_2_ 姓名_71李飞强77欧艺欣81吴文浩 89张泰鑫_ 组别:第四组实验日期:2014年 3 月 26 日 报告退发 (订正 、 重做) 课程 编译原理 实验名称 递归下降的预测分析 一、实验目的1. 学会用语法图来形式化地描述一门简单的语言;2. 掌握递归下降的预测分析;3. 掌握词法分析。二、实验环境Visual Studio 或 GCC 或Eclipse三、实验内容、步骤和结果分析实验内容:请基于递归下降的分析方法(教材P55页),编写一个“语法图.doc”所对应语言的语法分析器。该语法分析器能读入一个源代码文件(如“test.c”文件所示),并判断其中的源代码是否符合“语法图.doc”的规定。如果符合,打印出Yes;如果不符合,打印出No。(所用编程语言不限)C语言版:#include#include#include#define MaxIdLen 20 /标志符的最大长度#define KeyWordsCount 5 /该语言拥有的关键字个数#define BoolValueCount 2/bool类型可能取值的个数#define SymTypeCount 17/symType个数 enum SymType/枚举OR ,/或AND,/与LP,/左括号RP,/右括号ID,/标志符ASSIGN,/赋值LB,/左大括号RB,/右大括号COMMA,/逗号SEMICOLON,/分号UNDEFINED,/未定义BOOLVALUE,/bool类型的值IF,/ifELSE,/elseWHILE,/whilePRINTF,/printfBOOL,/bool;enum boolValueTRUE, FALSE,;/关键字static char * keywordsKeyWordsCount = if,else,while,printf,bool,;/关键字对应类别static int keyTypeKeyWordsCount = IF,ELSE,WHILE,PRINTF,BOOL,;/static char * boolvalueBoolValueCount=true,false,;static int boolValueTypeBoolValueCount=TRUE,FALSE,; char ch= ; /当前字符char idMaxIdLen+1;/当前符号串int token;/当前记号(的类型)int value;/当前记号的值FILE * fp;/用来打开要识别的源代码文件int lineNum=1;/要识别的代码行数bool isPass = false ;/判断识别的代码是否全部合法 void getToken();void program();void program();void statement();void definition();void term();void factor();void expression();void match(int t); void main() fopen_s(&fp,D:test.c,r);getToken();program();if(isPass)printf(Yn);else printf(Nn);fclose(fp);/*lexical*/ int getKeyWord(char * str)for(int i=0;iKeyWordsCount;i+)if(strcmp(str,keywordsi)=0) return keyTypei;return UNDEFINED;int getBoolValue(char* str) for(int i=0;i=A&ch=a&ch=0&ch=9;void nextChar() ch = fgetc(fp); void getToken() while(ch= |ch=t|ch=r|ch=n)if(ch = n)lineNum+; nextChar();if(isLetter(ch)int index=0;idindex+ = ch;nextChar();while(isLetter(ch) | isDigit(ch)if(indexMaxIdLen)idindex+ = ch;nextChar();else/coutidentifier is too long. + type);if (lookahead.tokenType.equals(type) lookahead = lexer.getToken(); else error(NO);/ 否则报错private void error(String str) / out.println(str);System.out.println(str);System.exit(-1);/* * program:程序 definition-statement- */public void program() definition();/定义statement();/ 声明/ definition:定义/* * bool-id-=-expression-; */public void definition() do match(TokenType.BOOLEAN);match(TokenType.ID);match(TokenType.EQUAL);expression();match(TokenType.SEMICOLON);/ 匹配分号 while (lookahead.isBoolean();/ statement:声明public void statement() if (lookahead.isIf() / -if-(-expression-)-statement-match(TokenType.IF);match(TokenType.LeftP);expression();match(TokenType.RightP);statement();if (lookahead.isElse() /缺陷:如果用全部代码测试时,程序走到这里停止了,while循环后的语句将不能执行!match(TokenType.ELSE);statement(); else else if (lookahead.isWhile() match(TokenType.WHILE);match(TokenType.LeftP);expression();match(TokenType.RightP);statement(); else if (lookahead.isPrint() match(TokenType.PRINT);match(TokenType.LeftP);expression();while (lookahead.isComma() match(TokenType.COMMA);expression();match(TokenType.RightP);match(TokenType.SEMICOLON); else if (lookahead.isSemicolon() / ;match(TokenType.SEMICOLON); else if (lookahead.isLeftBrace() match(TokenType.LeftBrace);statement(); while (!lookahead.isRightBrace() | lookahead.isId() )/必须加入lookahead.isId()否则a = false;运行不出来(语法图缺陷吧!) statement(); match(TokenType.RightBrace); else if (lookahead.isId() / id = expression;/System.out.println(+);match(TokenType.ID);match(TokenType.EQUAL);expression();match(TokenType.SEMICOLON); else /* * expression:式子 -term()-(-|-term()-); */private void expression() term();while (lookahead.isOr() / 如果是|就继续循环处理match(TokenType.OR);term();/* * term:项 Factor(); While(match(&) Factor(); */private void term() factor();while (lookahead.isAnd() / 判断是&就继续进行match(TokenType.AND);factor();/* * -(-expression-)- * -true- * -false- * -id- */private void factor() if (lookahead.isTrue() match(TokenType.TRUE); else if (lookahead.isLeftP() match(TokenType.LeftP);expression();match(TokenType.RightP); else if (lookahead.isFalse() match(TokenType.FALSE); else if (lookahead.isId() match(TokenType.ID); else/* * 获取下一个Token */public Token getToken() int value = 0;char cur;while (true) if (index = src.length()return Token.EOF;else / 取下一字符cur = next();/ 如果下一个字符是空白,继续读取字符if (this.isBlank(cur)continue;else if (this.isAlpha(cur) / 字符缓冲 区StringBuilder buffer = new StringBuilder();buffer.append(cur);while (isAlpha(char) peek() buffer.append(next();if (buffer.toString().equals(KeyWord.BOOLEAN) return new Token(TokenType.BOOLEAN, buffer.toString(); else if (buffer.toString().equals(KeyWord.FALSE) return new Token(TokenType.FALSE, buffer.toString(); else if (buffer.toString().equals(KeyWord.TRUE) return new Token(TokenType.TRUE, buffer.toString(); else if (buffer.toString().equals(KeyWord.IF) return new Token(TokenType.IF, buffer.toString(); else if (buffer.toString().equals(KeyWord.WHILE) return new Token(TokenType.WHILE, buffer.toString(); else if (buffer.toString().equals(KeyWord.PRINT) return new Token(TokenType.PRINT, buffer.toString(); else return new Token(TokenType.ID, buffer.toString(); else if (cur = ,) return Token.COMMA; else if (cur = () return Token.LeftP; else if (cur = ) return Token.RightP; else if (cur = | & next() = |) return Token.OR;/ 或者 else if (cur = & & next() = &) return Token.AND;/ 且 else if (cur = =) return Token.EQUAL; else if (cur = ;) return Token.SEMICOLON;/ 分号 else if (cur = ) / 左大括号return Token.LeftBrace; else if (cur = ) return Token.RightBrace; else if (cur = n) line+; else this.error();运行这个测试代码的截图:String src = boolean a = true;boolean b = false;boolean c =
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025代购代销合同范本品牌商品区域代理销售协议
- 2025年快递运输服务质量保障合同
- 2025版陕西能源企业员工劳动合同标准文本
- 2025年生态修复项目土方清运及施工配套服务合同
- 法律风险防范机制-洞察及研究
- 重难点解析北师大版8年级数学上册期末试卷及答案详解【考点梳理】
- 五年级数学(小数四则混合运算)计算题专项练习及答案汇编
- 重难点解析冀教版七年级下册期末测试卷附答案详解(黄金题型)
- 专升本每日一练试卷附答案详解(研优卷)
- 年产14.9万套工业知识图谱终端项目可行性研究报告
- 人教PEP版(2024)新四年级上册 教材解读
- 纪念中国人民抗日战争暨世界反法西斯战争胜利80周年
- 2025四川省高级人民法院招聘聘用制审判辅助人员30人考试备考题库及答案解析
- 加气块砌筑知识培训课件
- 智慧养老服务与管理课件
- 2025年湖南安全技术职业学院招聘考试笔试试题(含答案)
- 配电带电作业工考试试卷与答案
- 2025年河南省机关事业单位工勤技能岗位等级考试(兽医防治员·高级技师/一级)(综合评审技能)历年参考题库含答案详解(5卷)
- 2025年职业技能鉴定考试(地勘钻探工)历年参考题库含答案详解(5套)
- 医院感控知识培训
- 2025年治安管理处罚法知识竞赛试卷及答案
评论
0/150
提交评论