编译原理实验三实验报告.doc_第1页
编译原理实验三实验报告.doc_第2页
编译原理实验三实验报告.doc_第3页
编译原理实验三实验报告.doc_第4页
编译原理实验三实验报告.doc_第5页
已阅读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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论