




已阅读5页,还剩2页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
西安邮电大学编译原理实验报告学院名称:计算机学院学生姓名:高宏伟实验名称:语法分析器的设计与实现班 级:计科1405班学号:时间:2017年5月12日 一 实验目的1. 熟悉语法分析的过程2. 理解相关文法分析的步骤3. 熟悉First集和Follow集的生成二 实验要求对于给定的文法,试编写调试一个语法分析程序:要求和提示: 1) 可选择一种你感兴趣的语法分析方法(LL(1)、算符优先、递归下降、 SLR(1)等)作为编制语法分析程序的依据。 2) 对于所选定的分析方法,如有需要,应选择一种合适的数据结构,以构造 所给文法的机内表示。 3) 能进行分析过程模拟。如输入一个句子,能输出与句子对应的语法树,能 对语法树生成过程进行模拟;能够输出分析过程每一步符号栈的变化情况。 设计一个由给定文法生成First集和Follow集并进行简化的算法动态模拟三 实验内容1. 文法: E-TE E-+TE|T-FT T-*FT|F-(E)|i: 2. 程序描述(LL(1)文法) 本程序是基于已构建好的某一个语法的预测分析表来对用户的输入字符串进行分析,判断输入的字符串是否属于该文法的句子。 基本实现思想:接收用户输入的字符串(字符串以“#”表示结束)后,对用做分析栈的一维数组和存放分析表的二维数组进行初始化。然后取出分析栈的栈顶字符,判断是否为终结符,若为终结符则判断是否为“#”且与当前输入符号一样,若是则语法分析结束,输入的字符串为文法的一个句子,否则出错若不为“#”且与当前输入符号一样则将栈顶符号出栈,当前输入符号从输入字符串中除去,进入下一个字符的分析。若不为“#”且不与当前输入符号一样,则出错。3. 判断是否LL(1)文法 要判断是否为LL(1)文法,需要输入的文法G有如下要求: 具有相同左部的规则的SELECT集两两不相交,即: SELECT(A?) SELECT(A?)= ? 如果输入的文法都符合以上的要求,则该文法可以用LL(1)方法分析。 算法描述如下: 把第一条产生式的SELECT(0)集放到一个临时数组temp中 for(i=1;i=产生式总数-1;i+) 求temp的长度length if i指向的当前产生式的左部等于上一条产生式的左部 then 把SELECT(i)并入到temp数组中 If temp的长度小于length加上SELECT (i)的长度 返回0 else 把temp清空 把SELECT (i)存放到temp中 结果返回1;4. 构建好的预测分析表5. 语法分析流程图四 实验结果正确运行结果:错误运行结果:五 设计技巧和心得体会这次实验编写了一个语法分析方法的程序,但是在LL(1)分析器的编写中我只达到了最低要求,就是自己手动输入的select集,first集,follow集然后通过程序将预测分析表构造出来,然后自己编写总控程序根据分析表进行分析。通过本次试验,我能够设计一个简单的语法分析程序,实现对词法分析程序所提供的单词序列进行语法检查和结构分析,进一步掌握常用的语法分析方法。还能选择最有代表性的语法分析方法,如LL(1) 语法分析程序、算符优先分析程序和LR分析分析程序。六 源代码package com.LL1;import java.util.ArrayDeque;import java.util.Deque;/* * LL1文法分析器,已经构建好预测分析表,采用Deque实现 * Created by HongWeiPC on 2017/5/12. */public class LL1_Deque /预测分析表 private String analysisTable = new String TE, , , TE, , , , +TE, , , , , FT, , , FT, , , , , *FT, , , , i, , , (E), , ; /终结符 private String VT = new Stringi, +, *, (, ), #; /非终结符 private String VN = new StringE, E, T, T, F; /输入串strToken private StringBuilder strToken = new StringBuilder(i*i+i); /分析栈stack private Deque stack = new ArrayDeque(); /shuru1保存从输入串中读取的一个输入符号,当前符号 private String shuru1 = null; /X中保存stack栈顶符号 private String X = null; /flag标志预测分析是否成功 private boolean flag = true; /记录输入串中当前字符的位置 private int cur = 0; /记录步数 private int count = 0; public static void main(String args) LL1_Deque ll1 = new LL1_Deque(); ll1.init(); ll1.totalControlProgram(); ll1.printf(); /初始化 private void init() strToken.append(#); stack.push(#); System.out.printf(%-8s %-18s %-17s %sn, 步骤 , 符号栈 , 输入串 , 所用产生式 ); stack.push(E); curCharacter(); System.out.printf(%-10d %-20s %-20sn, count, stack.toString(), strToken.substring(cur, strToken.length(); /读取当前栈顶符号 private void stackPeek() X = stack.peekFirst(); /返回输入串中当前位置的字母 private String curCharacter() shuru1 = String.valueOf(strToken.charAt(cur); return shuru1; /判断X是否是终结符 private boolean XisVT() for (int i = 0; i (VT.length - 1); i+) if (VTi.equals(X) return true; return false; /查找X在非终结符中分析表中的横坐标 private String VNTI() int Ni = 0, Tj = 0; for (int i = 0; i VN.length; i+) if (VNi.equals(X) Ni = i; for (int j = 0; j X1X2.Xk /把X1X2.Xk推进栈 /X1X2.Xk=,不推什么进栈 private boolean productionType() return VNTI() != ; /推进stack栈 private void pushStack() stack.pop(); String M = VNTI(); String ch; /处理TE FT *FT特殊情况 switch (M) case TE: stack.push(E); stack.push(T); break; case FT: stack.push(T); stack.push(F); break; case *FT: stack.push(T); stack.push(F); stack.push(*); break; case +TE: stack.push(E); stack.push(T); stack.push(+); break; default: for (int i = (M.length() - 1); i = 0; i-) ch = String.valueOf(M.charAt(i); stack.push(ch); break; System.out.printf(%-10d %-20s %-20s %s-%sn, (+count), stack.toString(), strToken.substring(cur, strToken.length(), X, M); /总控程序 private void totalControlProgram() while (flag) stackPeek(); /读取当前栈顶符号 令X=栈顶符号 if (XisVT() if (X.equals(shuru1) cur+; shuru1 = curCharacter(); stack.pop(); System.out.printf(%-10d %-20s %-20s n, (+count), stack.toString(), strToken.substring(cur, strToken.length(); else ERROR(); else if (X.equals(#) if (X.equals(shuru1) flag = false; else ERROR(); else if (productionType() if (VNTI().equals() ERROR(); else if (VNTI().equals() stack.pop(); System.out.printf(%-10d %-20s %-20s %s-%sn, (+count), stack.toString(), strToken.substring(cur, strToken.length(), X, VNTI(); els
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 艺人经纪合同范本
- 指南针数学题目及答案
- 互联网广告市场数据监测
- 2025年宪法期末考试试题及答案
- 2025年手卫生规范考试题库(附答案)
- 2025年审计舞弊试题分析及答案
- 2025年山西省朔州市事业单位工勤技能考试题库及答案
- 2025年山东省医疗卫生系统招聘卫生法律法规+医学检验训练题及答案
- CN223011311U 一种铜带表面刷洗处理设备 (瑞安市五星铜业股份有限公司)
- CN120273893A 甲醇泵和甲醇燃料温度控制系统 (湖北文理学院)
- GB/T 18847-2002聚氯乙烯覆膜金属板
- 广州越秀区卫生局事业单位考试真题
- 基因工程制药-课件
- 基础教育改革与发展中的热点问题课件
- 流动式起重机械检验记录表
- 蛛网膜下腔出血的个案护理
- 大学信息与网络安全保密管理办法
- 音乐《上学歌》课件
- 防止电力电力建设施工安全事故三十项重点要求考试题
- 绿色校园创建资料
- 污水处理池 (有限空间)作业安全告知牌及警示标志
评论
0/150
提交评论