基于Java实现一个简单的YACC
资源下载地址:https://download.csdn.net/download/sheziqiong/86918785
资源下载地址:https://download.csdn.net/download/sheziqiong/86918785
实现一个简单的YACC
使用LL(1)分析法,按照cfg.txt中的语法对input.txt的输入流进行句法分析,并将结果打印在output.txt文件中。
Content description
读入cfg.txt,分析产生式,并产生对应的LL(1)预测分析表PPT。
cfg具体样例参见.
输入文件input.txt包含待分析的字符流,样例如下:
i+i*i$
输出文件output.txt包含cfg,输入字符流,以及分析后的推导序列,样例如下:
CFG:
S->TE
E->+TE
E->`
T->FY
Y->*FY
Y->`
F->i
F->(S)Input stream of Characters:
i+i*i$Output derivations:
S->TE
T->FY
F->i
Y->`
E->+TE
T->FY
F->i
Y->*FY
F->i
Y->`
E->`
success!
Ideas/Methods
LL(1)分析法。
对cfg.txt中的产生式逐个分析,通过first和follow函数构造PPT。
建立分析栈,根据栈顶和读头下的字符查询PPT,操作栈,打印推导序列。
Assumptions
Cfg.txt包含:
合法的,已消除左递归的,分开的上下文无关文法;
所有出现的终结符和非终结符。
以S为开始符,以$为结束符,以`为空串,每段以空行分隔。
样例如下:
S->TE
E->+TE
E->`
T->FY
Y->*FY
Y->`
F->i
F->(S)i,+,*,(,),$S,E,T,Y,F
Description of important Data Structures
产生式:
public class Production {public Character left;public String right;
分别保存左部和右部。
预测分析表:
public class ParsingTable {private ArrayList<Production> productions = new ArrayList<Production>();ArrayList<Character> terminals = new ArrayList<Character>();ArrayList<Character> nonTerminals = new ArrayList<Character>();private int numOfTerminals;private int numOfNonTerminals;Production[][] table;
包含所有的产生式,终结符和非终结符,产生对应的预测分析表,由parser继承。
实现了first,follow函数,处理cfg的初始化。
文件IO:
实现了readfile,clearfile,writefile,getCFG函数,负责文件的输入输出和cfg的读入。
分析器:
public class Parser extends ParsingTable {//输入流private StringBuffer stringBuffer = new StringBuffer();
继承ParsingTable,负责句法分析。
Description of core Algorithms
根据CFG构造PPT,根据PPT通过parser分析输入流。
Use cases on running
参见的样例。
Problems occurred and related solutions
构造PPT中,每当填入产生式时,判断是否已有产生式
如果已有,说明不是LL(1)文法,退出parse打印错误:
"Failure:PPT构造冲突,cfg不是LL(1)文法!"
分析时,若无法在PPT中找到对应的产生式,打印错误:
"Failure: 无法找到对应的产生式!"
当分析栈空,仍有待分析的输入字符,打印错误:
"Failure: 仍有未处理的输入字符!"
Your feelings and comments
LL(1)属于相对简单的文法,比起LR(1)分析法,少了状态和预测符的判断。
但是,first函数和follow函数的计算就比较复杂,即便理解如何求解依然容易逻辑混乱。
资源下载地址:https://download.csdn.net/download/sheziqiong/86918785
资源下载地址:https://download.csdn.net/download/sheziqiong/86918785
基于Java实现一个简单的YACC相关推荐
- 我的Serverless实战—基于Serverless搭建一个简单的WordPress个人博客图文详解-JJZ
文正在参与 "100%有奖 | 我的Serverless 实战"征稿活动 活动链接:https://marketing.csdn.net/p/15940c87f66c68188cf ...
- python相关毕设题目_基于java的一个有创意的web毕设题目
基于java的一个有创意的web毕设题目 一个有创意的web毕设题目 本课题将结合基于Java Web技术的名师一对一课程预约系统,根据本课题的最终目标,在线用户注册.相关信息发布.在线咨询.预约试听 ...
- 基于Java设计一个短链接生成系统
相信大家在生活中会收到很多短信,而这些短信都有一个特点是链接很短.这些链接背后的原理是什么呢?怎么实现的?小编今天就带你们详细了解一下 我们知道,短信有些是有字数限制的,直接放一个带满各种参数的链接, ...
- 基于JAVAvue开发一个简单音乐播放器计算机毕业设计源码+数据库+lw文档+系统+部署
基于JAVAvue开发一个简单音乐播放器计算机毕业设计源码+数据库+lw文档+系统+部署 基于JAVAvue开发一个简单音乐播放器计算机毕业设计源码+数据库+lw文档+系统+部署 本源码技术栈: 项目 ...
- 如何用Java设计一个简单的窗口界面(学习中.1)
如何用Java设计一个简单的窗口界面 一.前言 二.简单了解 1.Swing简介 2.框架(frame) 3.层次 三.步骤 1.打开eclipse,依次创建项目,包,类. 2.代码 2.1最简单的可 ...
- java编写存钱_用Java编写一个简单的存款
package desposit.money; public class DespositMoney { public static void main(String[] args) { Custom ...
- 用java写一个简单的区块链(下)
用java写一个简单的区块链(下) 2018年03月29日 21:44:35 java派大星 阅读数:725 标签: 区块链java 更多 个人分类: 区块链 版权声明:本文为博主原创文章,转载请标明 ...
- 如何复制java卡,使用java做一个简单的集卡程序
使用java做一个简单的集卡程序 本次设想的是要集齐4张卡,每张卡的概率都是25%,如果每个用户集齐需要多少次才能集合完毕 public class Test { public static void ...
- java写一个搜索引擎_搜索引擎—-Java实现一个简单的网络爬虫
Java实现一个简单的爬虫程序. package SearchCrawler;import java.util.*;import java.net.*;import java.io.*;import ...
最新文章
- 关于Page翻页效果--Page View Controller
- 比较好的中文分词方案汇总推荐
- Swift2.0语言教程之函数的返回值与函数类型
- 数学之美系列十七 -- 谈谈搜索引擎作弊问题(Search Engine Anti-SPAM)
- Linux man 使用详解(转)
- Centos下Nodejs+npm环境-部署记录
- 基于JAVA+SpringMVC+Mybatis+MYSQL的在线招聘网站
- 开奖|八大福利,康康你中奖了没?
- Linux升级ssh、ssl
- 手机上有没有学python的软件-如何优雅的在手机上进行Python编程
- 使用自定义功能构建Mamdani系统
- 巧用 Cowrie 部署 SSH 蜜罐,让黑客攻击无处遁形!
- linux登录认证过程,Linux的SSH免密登录认证过程研究
- 人类一败涂地human fall flat游戏通关图文攻略
- 英伟达发布527.37显卡驱动,支持《极品飞车:不羁》《漫威暗夜之子》
- windows故障转移群集 文件服务器,为服务器故障转移群集中的 IIS Windows FTP - Windows Server | Microsoft Docs...
- 关于 js 闭包的理解
- 大文件MD5计算 C语言 (从OpenSSL库中分离算法:三)
- python提取html表格_python html提取表格数据库数据库
- Matlab GUI编程技巧(十):ui figure函数创建可视化图窗
热门文章
- 29岁还适合转行软件测试么?好学么?
- 【2048】游戏实验
- 人性的弱点的自我窥视
- windows系统中 dockerfile COPY failed: stat /var/lib/docker/tmp/docker-builder
- 一文带你入门flink sql
- 中国有句俗语叫“三天打鱼两天晒网”。如果从1990年1月1日起开始执行“三天打鱼两天晒网”。如何判断在以后的某一天中是“打鱼”还是“晒网”?
- 使用gazebo的官方模型库文件
- 缺氧游戏超级计算机在哪里研究,缺氧小人属性选择指南
- C++ Primer Plus(第6版) 第3章编程练习
- PostgreSQL自定义排序