语法分析器-LL(1)语法分析
一丶实验名称
语法分析器
二丶实验目的及要求
通过设计、编制、调试-个典型的语法分析程序(任选有代表性的语法分析方法,如LL(1)、递归下降分析法、LR、 算符优先分析法)等,作为编制语法分析程序的依据,对词法分析器所提供的单词序列进行语法检测和结构分析,实现并进- -步掌握常用的语法分析方法。
三、实验内容
选择对各种常见高级程序设计语言都较为通用的语法结构作为分析对象(例如表达式、if、 while、for 等等),给出其文法规则描述(注意,文法规则的描述要符合所选分析方法的要求,比如用LL(1)分析法,文法必须是LL(1)文法),设计并实现一一个完整的语法分析程序。
输入:源程序以文件的形式输入。
输出:对于输入的源程序,如果输入源程序是给定文法定义的合法程序,则输出“success",如果不是,即输入源程序有错误,则输出“Error”,并且尽可能指出出错位置和原因。
四、实验算法描述
文法规则:
E→TZ
Z→+TZ|ε
T→FY
Y→*FY|ε
F→(E)|i
程序描述(LL(1)文法)
本程序是基于以构建好的某一语法的预测分析表来对用户的输入字符串进行分析,判断输入的字符串是否属于该文法的句子。
基本实现思想:接收用户输入的字符串(字符串以“#”表示结束)后,对用作分析栈的一维数组和存放分析表的二维数组进行初始化。然后取出分析栈的栈顶字符,判断是否为终结符,若为终结符则判断是否为“#”且与当前输入符号一样,则出错,则语法分析结束,输入的字符串为文法的一个句子,否则出错,若不为“#”且与当前输入符号一样则将栈顶符号出栈,当前输入符号从输入字符串中除去,进入下一个字符的分析。若不为“#”且不与当前输入符号一样,则出错。
1.First集和Follow集
FIRST(E)={(,i} FOLLOW(E)={),#}
FIRST(Z)={+,ε} FOLLOW(Z)={),#}
FIRST(T)={(,i} FOLLOW(T)={+,),#}
FIRST(Y)={*,ε} FOLLOW(Y)={+,),#}
FIRST(F)={(,i} FOLLOW(F)={*,+,),#}
2.构建好的预测分析表
i |
+ |
* |
( |
) |
# |
|
E |
→TZ |
→TZ |
synch |
synch |
||
Z |
→+TZ |
→ε |
→ε |
|||
T |
→FY |
synch |
→FY |
synch |
synch |
|
Y |
→ε |
→*FY |
→ε |
→ε |
||
F |
→i |
synch |
synch |
→(E) |
synch |
synch |
LL(1)预测分析表
3.运行结果
输入正确的源程序截图:
输出结果截图
输入错误的源程序截图:
输出结果截图
五、设计技巧和心得体会
这次实验编写了一个语法分析方法的程序。但是在LL (1)分析器的编写中我只达到了最低要求,就是自己手动输入的文法规则然后通过程序将预测分析表构造出来,然后自已编写总控程序根据分析表进行分析。
通过本次试验,我能够设计一个简单的语法分析程序,实现对文法规则进行语法检查和结构分析,进一步掌握常用的语法分析方法。
六、源程序清单(电子版)
import java.util.Stack;public class GramerAnasys {//加入同步符号的LL(1)分析表private String [][] analysisTable = new String[][]{{"TZ","","","TZ","synch","synch"},{"","+TZ","","","ε","ε"},{"FY","synch","","FY","synch","synch"},{"","ε","*FY","","ε","ε"},{"i","synch","synch","(E)","synch","synch"}};//存储终结符private String [] VT = new String[]{"i","+","*","(",")","#"};//存储终结符private String [] VN = new String[]{"E","Z","T","Y","F"};//输入串private StringBuilder strToken = new StringBuilder("i*i)+i");//分析栈private Stack<String> stack = new Stack<String>();//a保存从输入串中读取的一个输入符号,当前符号private String a = null;//X中保存stack栈顶符号private String X = null;//flag标志预测分析是否成功private boolean flag = true;//记录输入串中当前字符的位置private int cur = 0;//记录步数private int count = 0;//输出语法规则protected void print(){System.out.printf("E→TZ \n"+"Z→+TZ|ε \n"+"T→FY \n"+"Y→*FY|ε \n"+"F→(E)|i \n");}//初始化protected void init(){strToken.append("#");stack.push("#");System.out.printf("%-9s %-38s %6s %-20s\n","步骤 ","符号栈 "," 输入串 "," 所用产生式 ");stack.push("E");curCharacter();System.out.printf("%-6d %-20s %6s \n",count,stack.toString(),strToken.substring(cur, strToken.length()));}//读取当前栈顶符号protected String stackPeek(){X = stack.peek();return X;}//返回输入串中当前位置的字母private String curCharacter(){a = String.valueOf(strToken.charAt(cur));return a;}//判断X是否是终结符protected boolean XisVT(){for(int i = 0 ; i < (VT.length - 1); i++){if(VT[i].equals(X)){return true;}}return false;}//查找X在非终结符中分析表中的横坐标protected String VNTI(){int Ni = 0 , Tj = 0;for(int i = 0 ; i < VN.length ; i++){if(VN[i].equals(X)){Ni = i;}}for(int j = 0 ; j < VT.length ; j++){if(VT[j].equals(a)){Tj = j;}}return analysisTable[Ni][Tj];}//判断M[A,a]={X->X1X2...Xk}//把X1X2...Xk推进栈//X1X2...Xk=ε,不推什么进栈protected boolean productionType(){if(VNTI() != ""){return true;}return false;}//推进stack栈protected void pushStack(){stack.pop();String M = VNTI();String ch;for(int i = (M.length() -1) ; i >= 0 ; i--){ch = String.valueOf(M.charAt(i));stack.push(ch);}System.out.printf("%-6d %-20s %6s %-1s->%-12s\n",(++count),stack.toString(),strToken.substring(cur, strToken.length()),X,M);}//总控程序protected void totalControlProgram(){while(flag == true){stackPeek();if(XisVT() == true){if(X.equals(a)){cur++;a = curCharacter();stack.pop();System.out.printf("%-6d %-20s %6s \n",(++count),stack.toString(),strToken.substring(cur, strToken.length()));}else{ERROR();}}else if(X.equals("#")){if(X.equals(a)){flag = false;}else{ERROR();}}else if(productionType() == true){if(VNTI().equals("synch")){ERROR();}else if(VNTI().equals("ε")){stack.pop();System.out.printf("%-6d %-20s %6s %-1s->%-12s\n",(++count),stack.toString(),strToken.substring(cur, strToken.length()),X,VNTI());}else{pushStack();}}else{ERROR();}}}//出现错误protected void ERROR(){System.out.println("Error.输入串出现错误,无法进行分析");System.exit(0);}//打印存储分析表protected void printf(){if(flag == false){System.out.println("********success");}else {System.out.println("********Error");}}public static void main(String[] args) {GramerAnasys gramerAnasys= new GramerAnasys();gramerAnasys.print();gramerAnasys.init();gramerAnasys.totalControlProgram();gramerAnasys.printf();}}
语法分析器-LL(1)语法分析相关推荐
- python编写语法解析器_SLR语法分析器 python实现
一.语法分析器做什么 语法分析是根据某种给定的形式文法对由单词序列(如英语单词序列)构成的输入文本进行分析并确定其语法结构的一种过程. 一个语法分析器从词法分析器获得一个词素序列,并验证这个序列是否可 ...
- 编译原理-5-LL(1)语法分析器
LL(1)语法分析器 1. 什么是LL(1)语法分析器 自顶向下的.递归下降的.预测分析的.适用于LL(1)文法的LL(1)语法分析器 自顶向下构建语法分析树 根节点是文法的起始符号SSS 每个中间节 ...
- ll1语法分析器c语言E-E T,算术表达式的 LL(1)语法分析器
算术表达式的 LL(1)语法分析器 张会霞 (辽宁师范大学 计算机与信息技术学院,辽宁 大连 116000) 摘要:语法分析是编译程序的核心部分,对其进行研究有着重要意义.本文介绍了编译过程语法分析阶 ...
- java实现语法分析器_语法分析 | 语法分析的任务
在之前,我们有对编译器做过一定的介绍,我们认为编译器是具有一定流水线结构的软件系统.它可以分为前端,中端和后端这样的不同的阶段. 编译器前端 对于我们正在研究的前端,我们已经通过词法分析的学习掌握了从 ...
- c语言语法分析源程序,深入浅出编译原理-5-一个简单语法分析器的C语言实现
引言 前面已经介绍了编译器的预处理,词法分析,词法分析器的实现,也在其中说到了语法分析的任务和过程. 语法分析的输入是词法单元序列,然后根据语言的文法表示(展开式),利用有限状态机理论,生成抽象语法树 ...
- java语法分析_语法分析器(java语法分析器)
亲这是一款采用递归下降语法分析器,是一种适合手写语法编译器的方法,且非常简单.递归下降法对语言所用的文法有一些限制,但递归下降是现阶段主流的语法分析方法,因为它可以由开发人员高度控制,在提供错误信息方 ...
- java语言生成语法分析_语法分析器自动生成工具一览
最近打算重做以前的一个留下遗憾的工作,当中的一项小任务就是要求编写一个简易SQL语言的语法分析器. 本科的<编译原理>课程依稀在我脑中留下些许映象.当初的课程大作业是写一个叫Dicuf(貌 ...
- yacc语法分析minipascal_语法分析器 YACC实验报告
课程名称 编译原理课程设计 实验课时 实验项目 基于 YACC 的语法分析器 实验时间 实验目的 1 . 学习基于 YACC 的语法分析器的构造方法. 2 . 学习 C- 的语法结构. 实验环境 Pa ...
- 递归下降文法C语言实验报告,递归下降语法分析器实验报告.doc
递归下降语法分析器实验报告 编译原理实验报告 题目: 递归下降语法分析器 学 院 计算机科学与技术 专 业 xxxxxxxxxxxxxxxx 学 号 xxxxxxxxxxxx 姓 名 宁剑 指导教师 ...
- PHP语法分析器:RE2C BISON 总结
在这之前,我曾经尝试过一个项目,就是将我们的PHP代码自动生成so扩展, 编译到PHP中,我叫它 phptoc. 但是由于各种原因,暂停了此项目. 写这篇文章一是因为这方面资料太少,二是把自己的收获总 ...
最新文章
- [实现]Javascript代码的另一种压缩与加密方法——代码图片转换
- QT 使用全局变量的方法
- mysql查询嵌套where_MySQL-10(where /from 嵌套查询)
- SeqGAN——对抗思想与增强学习的碰撞
- sklearn朴素贝叶斯分类器_朴素贝叶斯原理
- 在 SAP Business Application Studio 里访问 SAP HANA Cloud 实例
- asp.net core系列 71 Web架构分层指南
- php 获取字符串中的url,php使用正则表达式获取字符串中的URL
- python导出项目所依赖的所有的库文件以及安装
- 宁德时代拟再投240亿元扩产宜宾基地
- 判断new出来的对象里面值为null
- 谷歌大脑2017总结(Jeff Dean执笔,干货满满,值得收藏)
- 再谈Bellman-Ford
- 各种语言常用壳的特征
- mac 电脑使用小鹤音形和小鹤双拼
- 【资源分享】一个超级方便的看电子书方法推荐
- RankNet学习思路+损函感悟+\pi \xu 学xi+交叉熵损函详
- OpenJudge NOI题库 1.7 编程基础之字符串
- 机器人的编程语言是什么语言
- VB、WIN32API函数在串口操作模块的运用