编译原理实验三实验报告

上传人:lcm****20 文档编号:45087362 上传时间:2018-06-15 格式:DOC 页数:19 大小:361KB
返回 下载 相关 举报
编译原理实验三实验报告_第1页
第1页 / 共19页
编译原理实验三实验报告_第2页
第2页 / 共19页
编译原理实验三实验报告_第3页
第3页 / 共19页
编译原理实验三实验报告_第4页
第4页 / 共19页
编译原理实验三实验报告_第5页
第5页 / 共19页
点击查看更多>>
资源描述

《编译原理实验三实验报告》由会员分享,可在线阅读,更多相关《编译原理实验三实验报告(19页珍藏版)》请在金锄头文库上搜索。

1、实 验 报 告第 1 页专业_软件工程_ 班级_2_ 姓名_71 李飞强 77 欧艺欣 81 吴文浩 89张泰鑫_ 组别:第四组实验日期:2014 年 3 月 26 日 报告退发 (订正 、 重做) 课程 编译原理 实验名称 递归下降的预测分析 一、实验目的1. 学会用语法图来形式化地描述一门简单的语言;2. 掌握递归下降的预测分析;3. 掌握词法分析。二、实验环境Visual Studio 或 GCC 或 Eclipse三、实验内容、步骤和结果分析实验内容: 请基于递归下降的分析方法(教材 P55 页),编写一个“语法图.doc”所对应语言的 语法分析器。该语法分析器能读入一个源代码文件(如

2、“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,/标志符ASSIG

3、N,/赋值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,BOO

4、L,;/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();v

5、oid program();void statement();void definition();void term();void factor();void expression();void match(int t); void main()fopen_s(getToken();program();if(isPass)printf(“Yn“);else printf(“Nn“);fclose(fp);/*lexical*/int getKeyWord(char * str)for(int i=0;i=A if (lookahead.tokenType.equals(type) lookah

6、ead = 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:定义 /* boolid=expression;*/ public void definition() d

7、o 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(); mat

8、ch(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()

9、 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.LeftB

10、race); 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(Token

11、Type.SEMICOLON); else /* expression:式子 -term()-(-|-term()- );*/ private void expression() term(); while (lookahead.isOr() / 如果是|就继续循环处理 match(TokenType.OR); term(); /* term:项 Factor(); While(match( */ private void term() factor(); while (lookahead.isAnd() / 判断是 factor(); /* -(-expression-)-* -true-*

12、 -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*/ p

13、ublic 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(ch

14、ar) 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 Tok

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

最新文档


当前位置:首页 > 行业资料 > 其它行业文档

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