编译原理语法分析器实验报告

上传人:桔**** 文档编号:507634651 上传时间:2023-12-02 格式:DOC 页数:7 大小:196.50KB
返回 下载 相关 举报
编译原理语法分析器实验报告_第1页
第1页 / 共7页
编译原理语法分析器实验报告_第2页
第2页 / 共7页
编译原理语法分析器实验报告_第3页
第3页 / 共7页
编译原理语法分析器实验报告_第4页
第4页 / 共7页
编译原理语法分析器实验报告_第5页
第5页 / 共7页
点击查看更多>>
资源描述

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

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

2、。 3) 能进行分析过程模拟。如输入一个句子,能输出与句子对应的语法树,能 对语法树生成过程进行模拟;能够输出分析过程每一步符号栈的变化情况。 设计一个由给定文法生成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)集放到一个临时数组

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

5、集然后通过程序将预测分析表构造出来,然后自己编写总控程序根据分析表进行分析。通过本次试验,我能够设计一个简单的语法分析程序,实现对词法分析程序所提供的单词序列进行语法检查和结构分析,进一步掌握常用的语法分析方法。还能选择最有代表性的语法分析方法,如LL(1) 语法分析程序、算符优先分析程序和LR分析分析程序。六 源代码package com.LL1;import java.util.ArrayDeque;import java.util.Deque;/* * LL1文法分析器,已经构建好预测分析表,采用Deque实现 * Created by HongWeiPC on 2017/5/12. *

6、/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 =

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

8、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 %-20

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

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

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

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

当前位置:首页 > 办公文档 > PPT模板库 > 总结/计划/报告

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