资源下载地址: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相关推荐

  1. 我的Serverless实战—基于Serverless搭建一个简单的WordPress个人博客图文详解-JJZ

    文正在参与 "100%有奖 | 我的Serverless 实战"征稿活动 活动链接:https://marketing.csdn.net/p/15940c87f66c68188cf ...

  2. python相关毕设题目_基于java的一个有创意的web毕设题目

    基于java的一个有创意的web毕设题目 一个有创意的web毕设题目 本课题将结合基于Java Web技术的名师一对一课程预约系统,根据本课题的最终目标,在线用户注册.相关信息发布.在线咨询.预约试听 ...

  3. 基于Java设计一个短链接生成系统

    相信大家在生活中会收到很多短信,而这些短信都有一个特点是链接很短.这些链接背后的原理是什么呢?怎么实现的?小编今天就带你们详细了解一下 我们知道,短信有些是有字数限制的,直接放一个带满各种参数的链接, ...

  4. 基于JAVAvue开发一个简单音乐播放器计算机毕业设计源码+数据库+lw文档+系统+部署

    基于JAVAvue开发一个简单音乐播放器计算机毕业设计源码+数据库+lw文档+系统+部署 基于JAVAvue开发一个简单音乐播放器计算机毕业设计源码+数据库+lw文档+系统+部署 本源码技术栈: 项目 ...

  5. 如何用Java设计一个简单的窗口界面(学习中.1)

    如何用Java设计一个简单的窗口界面 一.前言 二.简单了解 1.Swing简介 2.框架(frame) 3.层次 三.步骤 1.打开eclipse,依次创建项目,包,类. 2.代码 2.1最简单的可 ...

  6. java编写存钱_用Java编写一个简单的存款

    package desposit.money; public class DespositMoney { public static void main(String[] args) { Custom ...

  7. 用java写一个简单的区块链(下)

    用java写一个简单的区块链(下) 2018年03月29日 21:44:35 java派大星 阅读数:725 标签: 区块链java 更多 个人分类: 区块链 版权声明:本文为博主原创文章,转载请标明 ...

  8. 如何复制java卡,使用java做一个简单的集卡程序

    使用java做一个简单的集卡程序 本次设想的是要集齐4张卡,每张卡的概率都是25%,如果每个用户集齐需要多少次才能集合完毕 public class Test { public static void ...

  9. java写一个搜索引擎_搜索引擎—-Java实现一个简单的网络爬虫

    Java实现一个简单的爬虫程序. package SearchCrawler;import java.util.*;import java.net.*;import java.io.*;import ...

最新文章

  1. 关于Page翻页效果--Page View Controller
  2. 比较好的中文分词方案汇总推荐
  3. Swift2.0语言教程之函数的返回值与函数类型
  4. 数学之美系列十七 -- 谈谈搜索引擎作弊问题(Search Engine Anti-SPAM)
  5. Linux man 使用详解(转)
  6. Centos下Nodejs+npm环境-部署记录
  7. 基于JAVA+SpringMVC+Mybatis+MYSQL的在线招聘网站
  8. 开奖|八大福利,康康你中奖了没?
  9. Linux升级ssh、ssl
  10. 手机上有没有学python的软件-如何优雅的在手机上进行Python编程
  11. 使用自定义功能构建Mamdani系统
  12. 巧用 Cowrie 部署 SSH 蜜罐,让黑客攻击无处遁形!
  13. linux登录认证过程,Linux的SSH免密登录认证过程研究
  14. 人类一败涂地human fall flat游戏通关图文攻略
  15. 英伟达发布527.37显卡驱动,支持《极品飞车:不羁》《漫威暗夜之子》
  16. windows故障转移群集 文件服务器,为服务器故障转移群集中的 IIS Windows FTP - Windows Server | Microsoft Docs...
  17. 关于 js 闭包的理解
  18. 大文件MD5计算 C语言 (从OpenSSL库中分离算法:三)
  19. python提取html表格_python html提取表格数据库数据库
  20. Matlab GUI编程技巧(十):ui figure函数创建可视化图窗

热门文章

  1. 29岁还适合转行软件测试么?好学么?
  2. 【2048】游戏实验
  3. 人性的弱点的自我窥视
  4. windows系统中 dockerfile COPY failed: stat /var/lib/docker/tmp/docker-builder
  5. 一文带你入门flink sql
  6. 中国有句俗语叫“三天打鱼两天晒网”。如果从1990年1月1日起开始执行“三天打鱼两天晒网”。如何判断在以后的某一天中是“打鱼”还是“晒网”?
  7. 使用gazebo的官方模型库文件
  8. 缺氧游戏超级计算机在哪里研究,缺氧小人属性选择指南
  9. C++ Primer Plus(第6版) 第3章编程练习
  10. PostgreSQL自定义排序