实验二--语法分析程序的设计-.doc_第1页
实验二--语法分析程序的设计-.doc_第2页
实验二--语法分析程序的设计-.doc_第3页
实验二--语法分析程序的设计-.doc_第4页
实验二--语法分析程序的设计-.doc_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

实验二 语法分析程序的设计姓名: 学号: 专业班级一、实验目的通过设计、编制、调试一个典型的语法分析程序,实现对词法分析程序所提供的单词序列进行语法检查和结构分析,进一步掌握常用的语法分析中预测分析方法。二、实验内容设计一个文法的预测分析程序,判断特定表达式的正确性。三、实验要求1、 给出文法如下:GE E-T|E+T; T-F|T*F; F-i|(E);2、 根据该文法构造相应的LL(1)文法及LL(1)分析表,并为该文法设计预测分析程序,利用C语言或C+语言或Java语言实现;3、 利用预测分析程序完成下列功能:1) 手工将测试的表达式写入文本文件,每个表达式写一行,用“;”表示结束;2) 读入文本文件中的表达式;3) 调用实验一中的词法分析程序搜索单词;4) 把单词送入预测分析程序,判断表达式是否正确(是否是给出文法的语言),若错误,应给出错误信息;5) 完成上述功能,有余力的同学可以进一步完成通过程序实现对非LL(1)文法到LL(1)文法的自动转换(见实验二附加资料1)。四、实验环境PC微机DOS操作系统或 Windows 操作系统Turbo C 程序集成环境或 Visual C+ 程序集成环境五、实验步骤1、 分析文法,将给出的文法转化为LL(1)文法;2、 学习预测分析程序的结构,设计合理的预测分析程序;3、 编写测试程序,包括表达式的读入和结果的输出;4、 测试程序运行效果,测试数据可以参考下列给出的数据。六、测试数据 输入数据:编辑一个文本文文件expression.txt,在文件中输入如下内容:10;1+2;(1+2)*3+(5+6*7);(1+2)*3+4;1+2+3+(*4+5);(a+b)*(c+d);(ab3+de4)*5)+1;正确结果:(1)10;输出:正确(2)1+2;输出:正确(3)(1+2)*3+(5+6*7);输出:正确(4)(1+2)*3+4输出:错误(5)1+2+3+(*4+5)输出:错误(6)(a+b)*(c+d)输出:正确(7)(ab3+de4)*5)+1输出:错误七、源代码import java.util.*;import java.io.*;public class test2 static String key_word = main, if, then, while, do, int,else ;static String cal_word = +, -, *, /, , , , (,), , , =, !=, !, =, =, T|E+T; T-F|T*F; F-i|(E); */static String gram = E-TA, A-+TA, A-, T-FB, B-*FB,B-, F-P, F-(E) ;static String followE = ), # ;static String followEA = ), # ;static String followT = +, ), # ;static String followTB = +, ), # ;static String followF = *, +, ), # ;static String firstE = i, ( ;static String firstEA = +, ;static String firstT = i, ( ;static String firstTB = *, ;static String firstF = i, ( ;static String list = , i, +, *, (, ), # , E, TA, null, null, TA, null, null , A, null, +TA, null, null, , , T, FB, null, null, FB, null, null , B, null, , *FB, null, , , F, i, null, null, (E), null, null ;public static void scan(String infile,String outfile, Stack word, Stack expression)throws Exception java.io.File file = new java.io.File(infile);Scanner input = new Scanner(file);java.io.PrintWriter output = new PrintWriter(outfile);int count = 0;wordcount.push(#);while (input.hasNext() String tmp = input.next();int i = 0;while (i tmp.length() if (tmp.charAt(i) = 1) /检查十进制数字String num = ;while (tmp.charAt(i) = 0) num += tmp.charAt(i);i+;if (i = tmp.length()break;output.println();wordcount.push(i);expressioncount.push(num);if (i + 2 tmp.length()/ 检查十六进制数字if (tmp.charAt(i) = 0 & tmp.charAt(i + 1) = x) i += 2;String num = ;while (tmp.charAt(i) = 0) | (tmp.charAt(i) = a) num += tmp.charAt(i);i+;if (i = tmp.length()break;output.println();wordcount.push(i);expressioncount.push(num);if (i + 1 tmp.length()/ 检查八进制数字if (tmp.charAt(i) = 0) i+;String num = ;while (tmp.charAt(i) = 0) num += tmp.charAt(i);i+;if (i = tmp.length()break;output.println();wordcount.push(i);expressioncount.push(num);/ 检查关键字和变量if (i tmp.length() if (i = a& tmp.charAt(i) = a & tmp.charAt(i) = z) tmp_word += tmp.charAt(i);i+;if (i = tmp.length()break;boolean is_keyword = false;for (int j = 0; j key_word.length; j+) if (tmp_word.equals(key_wordj) output.println();wordcount.push(key_wordj);expressioncount.push(key_wordj);is_keyword = true;break;if (!is_keyword) output.println();wordcount.push(i);expressioncount.push(tmp_word);/ 检查运算符以及;if (i tmp.length() if (i + 1 tmp.length() if (tmp.charAt(i + 1) = =) for (int j = 0; j cal_word.length; j+) if (cal_wordj.equals( + tmp.charAt(i)+ tmp.charAt(i + 1) output.println();wordcount.push(cal_wordj);expressioncount.push(-);if (wordcount.peek() = ;) wordcount.pop();wordcount.push(#);count+;wordcount.push(#);i += 2;break;for (int j = 0; j cal_word.length; j+) if (cal_wordj.equals( + tmp.charAt(i) output.println();wordcount.push(cal_wordj);expressioncount.push(cal_wordj);if (wordcount.peek() = ;) wordcount.pop();wordcount.push(#);count+;wordcount.push(#);i+;break;input.close();output.close();public static void main(String args) throws Exception String infile = D:/expression.txt;String outfile = D:/result2.txt;Stack tmpword = new Stack20;Stack expression = new Stack20;for (int i = 0; i tmpword.length; i+) tmpwordi = new Stack();expressioni = new Stack();test1.scan(infile, outfile, tmpword, expression); int i = 0;while (tmpwordi.size() 2)String tmp = expressioni.toArray(new String0);printArray(tmp);isLL1(tmpwordi);i+;public static void printArray(String s)for (int i = 0; i s.length; i+)System.out.print(si);System.out.println();public static void isLL1(Stack tmpword)String input = tmpword.toArray(new String0);int inputCount = 0;Stack status = new Stack();status.push(inputinputCount+);status.push(E);boolean flag = true;boolean result = true;while (flag) if (isVt(status.peek()if (status.peek().equals(inputinputCount)status.pop();inputCount+;elseflag = false;result = false;else if (status.peek().equals(#)if (status.peek().equals(inputinputCount)flag = false;elseflag = false;result = false;else if (listindexInList(status.peek(), inputinputCount)0indexInList(status.peek(), inputinputCount)1 != null)int a = indexInList(status.peek(), inputinputCount);if (lista0a1.endsWith()status.pop();elsestatus.pop();for (int i = lista0a1.length() - 1; i = 0; i-)status.push( + lista0a1.charAt(i);elseflag = false;result = false;if (result)System.out.println(正确);elseSystem.out.println(错误);public static boolean isVt(String s) /判断

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论