编译原理语法分析器实验报告(共6页).doc

上传人:飞****2 文档编号:6769912 上传时间:2022-02-10 格式:DOC 页数:7 大小:206.50KB
返回 下载 相关 举报
编译原理语法分析器实验报告(共6页).doc_第1页
第1页 / 共7页
编译原理语法分析器实验报告(共6页).doc_第2页
第2页 / 共7页
点击查看更多>>
资源描述

《编译原理语法分析器实验报告(共6页).doc》由会员分享,可在线阅读,更多相关《编译原理语法分析器实验报告(共6页).doc(7页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、精选优质文档-倾情为你奉上西安邮电大学编译原理实验报告学院名称:计算机学院学生姓名:高宏伟实验名称:语法分析器的设计与实现班 级:计科1405班学号:时间:2017年5月12日 一 实验目的1. 熟悉语法分析的过程2. 理解相关文法分析的步骤3. 熟悉First集和Follow集的生成二 实验要求对于给定的文法,试编写调试一个语法分析程序:要求和提示: 1) 可选择一种你感兴趣的语法分析方法(LL(1)、算符优先、递归下降、 SLR(1)等)作为编制语法分析程序的依据。 2) 对于所选定的分析方法,如有需要,应选择一种合适的数据结构,以构造 所给文法的机内表示。 3) 能进行分析过程模拟。如输

2、入一个句子,能输出与句子对应的语法树,能 对语法树生成过程进行模拟;能够输出分析过程每一步符号栈的变化情况。 设计一个由给定文法生成First集和Follow集并进行简化的算法动态模拟三 实验内容1. 文法: E-TE E-+TE|T-FT T-*FT|F-(E)|i: 2. 程序描述(LL(1)文法) 本程序是基于已构建好的某一个语法的预测分析表来对用户的输入字符串进行分析,判断输入的字符串是否属于该文法的句子。 基本实现思想:接收用户输入的字符串(字符串以“#”表示结束)后,对用做分析栈的一维数组和存放分析表的二维数组进行初始化。然后取出分析栈的栈顶字符,判断是否为终结符,若为终结符则判断

3、是否为“#”且与当前输入符号一样,若是则语法分析结束,输入的字符串为文法的一个句子,否则出错若不为“#”且与当前输入符号一样则将栈顶符号出栈,当前输入符号从输入字符串中除去,进入下一个字符的分析。若不为“#”且不与当前输入符号一样,则出错。3. 判断是否LL(1)文法 要判断是否为LL(1)文法,需要输入的文法G有如下要求: 具有相同左部的规则的SELECT集两两不相交,即: SELECT(A?) SELECT(A?)= ? 如果输入的文法都符合以上的要求,则该文法可以用LL(1)方法分析。 算法描述如下: 把第一条产生式的SELECT(0)集放到一个临时数组temp中 for(i=1;i=产

4、生式总数-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集然后通过程序将预测分析表构造出来

5、,然后自己编写总控程序根据分析表进行分析。通过本次试验,我能够设计一个简单的语法分析程序,实现对词法分析程序所提供的单词序列进行语法检查和结构分析,进一步掌握常用的语法分析方法。还能选择最有代表性的语法分析方法,如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

6、_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 StringBuilde

7、r(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

8、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.

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

10、.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()

11、 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

12、 (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=栈顶符

13、号 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() i

14、f (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(); else pushStack(); else ERROR(); /出现错误 private void ERROR() System.out.println(输入串出现错误,无法进行分析); System.exit(0); /打印存储分析表 private void printf() if (!flag) System.out.println(*分析成功啦!*); else System.out.println(*分析失败了*); 专心-专注-专业

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 应用文书 > 教育教学

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知得利文库网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com