要求





代码


import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Stack; public class SLRFX { private List<String> wf = new ArrayList<String>();
private HashMap<String,List<String>> follow = new HashMap<String, List<String>>();
private String[][] table = new String[12][9];
private Stack<String> stateStack = new Stack<String>();
private Stack<String> charStack = new Stack<String>(); public SLRFX(){
init();
} /**
* 初始化
*/
private void init(){
wf.add("S->E");
wf.add("E->E+T");
wf.add("E->T");
wf.add("T->T*F");
wf.add("T->F");
wf.add("F->(E)");
wf.add("F->i");
List<String> Sfl = new ArrayList<String>();
List<String> Efl = new ArrayList<String>();
List<String> Tfl = new ArrayList<String>();
List<String> Ffl = new ArrayList<String>();
Sfl.add("#");
Efl.add("#");
Efl.add(")");
Efl.add("+");
Tfl.add("#");
Tfl.add(")");
Tfl.add("+");
Tfl.add("*");
Ffl.addAll(Tfl);
follow.put("S",Sfl);
follow.put("E",Efl);
follow.put("T",Tfl);
follow.put("F",Ffl);
for (int i = 0; i < 12; i++) {
for (int j = 0; j < 9; j++) {
table[i][j] = "";
}
}
table[0][0] = "s5";
table[0][3] = "s4";
table[0][6] = "1";
table[0][7] = "2";
table[0][8] = "3";
table[1][1] = "s6";
table[1][5] = "acc";
table[2][1] = "r2";
table[2][2] = "s7";
table[2][4] = "r2";
table[2][5] = "r2";
table[3][1] = "r4";
table[3][2] = "r4";
table[3][4] = "r4";
table[3][5] = "r4";
table[4][0] = "s5";
table[4][3] = "s4";
table[4][6] = "8";
table[4][7] = "2";
table[4][8] = "3";
table[5][1] = "r6";
table[5][2] = "r6";
table[5][4] = "r6";
table[5][5] = "r6";
table[6][0] = "s5";
table[6][3] = "s4";
table[6][7] = "9";
table[6][8] = "3";
table[7][0] = "s5";
table[7][3] = "s4";
table[7][8] = "10";
table[8][1] = "s6";
table[8][4] = "s4";
table[9][1] = "r1";
table[9][2] = "s7";
table[9][4] = "r1";
table[9][5] = "r1";
table[10][1] = "r3";
table[10][2] = "r3";
table[10][4] = "r3";
table[10][5] = "r3";
table[11][1] = "r5";
table[11][2] = "r5";
table[11][4] = "r5";
table[11][5] = "r5";
} /**
* 展示文法的信息
*/
private void showTips(){
System.out.println("输入的文法:");
for (String s : wf) {
System.out.println(s);
}
System.out.println("VT:+\t*\t(\r)\ti\t#");
System.out.println("VN:E\tT\tF");
System.out.println("\ti\t+\t*\t(\t)\t#\tE\tT\tF");
for (int i = 0; i < 12; i++) {
System.out.print(i);
for (int j = 0; j < 9; j++) {
System.out.print("\t" + table[i][j]);
}
System.out.println();
}
} /**
* 删除字符串的第一个字符
* @param str
* @return
*/
private String deleteFirstChar(String str){
String[] strings = str.split("||");
String newStr = "";
for (int i = 1; i < strings.length; i++) {
newStr += strings[i];
}
return newStr;
} /**
* 分析过程
* @param jz
*/
private void fx(String jz){
List<String> stateStr = new ArrayList<String>();
List<String> charStr = new ArrayList<String>();
stateStack.push("0");
stateStr.add("0");
charStack.push("#");
charStr.add("#");
String sr = jz;
boolean isok = false;
int bz = 1;
System.out.println("步骤\t\t状态栈\t\t符号栈\t\t输入串\t\tACTION\t\tGOTO\t\t动作");
while (!isok){
int topState = Integer.valueOf(stateStack.peek()).intValue();
char nowChar = sr.charAt(0);
String what = table[topState][getIndex(nowChar)];
if (what.startsWith("s")){
//移进
String[] split = what.split("||");
stateStack.push(split[1]);
stateStr.add(split[1]);
charStack.push(nowChar + "");
charStr.add(nowChar + "");
System.out.println(bz + "\t\t" + stateStr.toString() + "\t\t" + charStr + "\t\t" + sr +
"\t\t" + what + "\t\t\t\t" + "0" + "\t\t移进");
//输入串要减少
sr = deleteFirstChar(sr);
}else if (what.startsWith("r")){
//规约
String[] split = what.split("||");
String[] css = wf.get(Integer.valueOf(split[1])).split("->");
String VT = css[0];
int popNum = css[1].length();
//出栈
for (int i = 0; i < popNum; i++) {
stateStack.pop();
stateStr.remove(stateStr.size()-1);
charStack.pop();
charStr.remove(charStr.size()-1);
}
int newTopState = Integer.valueOf(stateStack.peek()).intValue();
String newState = table[newTopState][getIndex(VT.charAt(0))];
stateStack.push(newState);
stateStr.add(newState);
charStack.push(VT);
charStr.add(VT);
System.out.println(bz + "\t\t" + stateStr.toString() + "\t\t" + charStr.toString() + "\t\t" +sr +
"\t\t" + what + "\t\t\t\t" + newState + "\t\t规约");
}else if (what.equals("acc")){
isok = true;
System.out.println(bz + "\t\t" + stateStr.toString() + "\t\t" + charStr.toString() + "\t\t" +sr +
"\t\t" + "acc" + "\t\t\t\t" + "0" + "\t\t接受");
}else {
System.err.println("分析错误!输入的句子不符合语法!");
System.exit(-1);
}
bz++;
}
System.out.println("分析完成!");
} private int getIndex(char t){
switch (t){
case 'i':return 0;
case '+':return 1;
case '*':return 2;
case '(':return 3;
case ')':return 4;
case '#':return 5;
case 'E':return 6;
case 'T':return 7;
case 'F':return 8;
}
return -1;
} public void run(String jz){
showTips();
fx(jz);
} }

测试代码:


public class TestSLR { public static void main(String[] args) {
SLRFX slrfx = new SLRFX();
slrfx.run("i+i*i#");
} }

结果



SLR(1)语法分析(JAVA实现)的更多相关文章

  1. Jsoup代码解读之四-parser

    Jsoup代码解读之四-parser 作为Java世界最好的HTML 解析库,Jsoup的parser实现非常具有代表性.这部分也是Jsoup最复杂的部分,需要一些数据结构.状态机乃至编译器的知识.好 ...

  2. Spark案例分析

    一.需求:计算网页访问量前三名 import org.apache.spark.rdd.RDD import org.apache.spark.{SparkConf, SparkContext} /* ...

  3. Atitit 表达式原理 语法分析 原理与实践 解析java的dsl  递归下降是现阶段主流的语法分析方法

    Atitit 表达式原理 语法分析 原理与实践 解析java的dsl  递归下降是现阶段主流的语法分析方法 于是我们可以把上面的语法改写成如下形式:1 合并前缀1 语法分析有自上而下和自下而上两种分析 ...

  4. Atitit.注解and属性解析(2)---------语法分析 生成AST attilax总结 java .net

    Atitit.注解and属性解析(2)---------语法分析 生成AST  attilax总结  java .net 1. 应用场景:::因为要使用ui化的注解 1 2. 使用解释器方式来实现生成 ...

  5. java编写简单的语法分析预测程序

    编译原理课程中,编了一个简单的语法分析预测程序,这个程序时根据固定的文法得到预测分析表,然后编写程序来判断表达式是否会正确推到出来. 前提是程序没有左递归符合LL(1)文法: 文法如下: E→TE' ...

  6. Java 实现《编译原理》简单-语法分析功能-LL(1)文法 - 程序解析

    Java 实现<编译原理>简单-语法分析功能-LL(1)文法 - 程序解析 编译原理学习,语法分析程序设计 (一)要求及功能 已知 LL(1) 文法为: G'[E]: E→TE' E'→+ ...

  7. 用Java写编译器(1)- 词法和语法分析

    词法和语法分析器构建 ANTLR简介 ANTLR全称ANother Tool for Languate Recognition,是基于LL(*)算法实现的语法分析器生成器和词法分析器生成器,由旧金山大 ...

  8. SLR,语法分析表的构建

    太累了,感觉不会再爱了.执行了跟编译原理上的一模一样的例子,输出了正确结果 #include <stdio.h> #include <malloc.h> #include &l ...

  9. java通过正则进行语法分析实现表达式的逻辑判断和复杂计算实现

    首先功能展示: 相关功能实现,实现功能类似js,弱语言类型: 1.核销语法解析使用正则校验和匹配实现处理,每一行是一个完整表达式 2.有系统变量使用,内置的变量可直接获取值进行相关逻辑和条件计算 3. ...

随机推荐

  1. 解决js中对象中属性是数组中对应元素,不能使用点数组元素(.数组[i])来获取value值来循环,属性不能是数组元素array[i]的问题

    数据类型 //示例 var tags1avg= ['rg2_crt_001_001_avg', 'rg2_crt_001_002_avg', 'rg2_crt_001_003_avg', 'rg2_c ...

  2. php 正则金额验证

    $money_reg = '/^[1-9]\d*|^[1-9]\d*.\d+[1-9]$/';if(!preg_match($money_reg, $money)){ $this->ajaxEr ...

  3. rsync未授权访问漏洞复现

    rsync未授权访问漏洞简介 rsync是Linux/Unix下的一个远程数据同步工具,可通过LAN/WAN快速同步多台主机间的文件和目录,默认运行在873端口.由于配置不当,导致任何人可未授权访问r ...

  4. phpstudy搭建网站只能访问首页,其他路由访问404

    今天博主遇到了一个很奇葩的问题,电脑下载了一个phpstudy搭建网站,框架用的是tp,但是除了输入域名能访问,其他页面都访问不了 经过博主的疯狂问大佬,以及百度,终于解决了这个问题 这次出现问题的原 ...

  5. 神秘、常用、多变的Binder

    今天说说神秘又常用又多变的Binder~ Binder是什么 Binder通信过程和原理 在Android中的应用 Binder优势 Binder是什么 先借用神书<Android开发艺术探索& ...

  6. H5时代leaflet中还在用DivIcon?

    前段时间写了篇<leaflet如何加载10万数据>的文章,有同学反应其中的Canvas-Markers插件不支持DivIcon.我们今天就来聊一聊,为什么这个插件不支持DivIcon,以及 ...

  7. guitar pro系列教程(八):Guitar Pro编写使用的快捷符号

    上一节我们一起讨论了Guitar Pro的乐谱音乐符号的添加,在我们使用Guitar Pro写谱的时候,输入乐谱用鼠标点击是不是很麻烦而且又浪费时间呢,效果还不一定好,但是如果让我们结合键盘是不是就会 ...

  8. 一个定时任务管理器,基于Go语言和beego框架开发

    链接 https://github.com/lisijie/webcron 安装说明 系统需要安装Go和MySQL. 获取源码 $ go get github.com/lisijie/webcron ...

  9. hashmap(有空可以看看算法这本书中对于这部分的实现,很有道理)

    //转载:https://baijiahao.baidu.com/s?id=1618550070727689060&wfr=spider&for=pc 1.为什么用HashMap? H ...

  10. C语言讲义——变量(variable)

    变量(variable) 变量用于存放数据 变量是供程序操作的存储区的名字 变量有类型,该类型决定了变量占用内存的大小 字节→ C语言有以下6种简单变量类型: 类型细分: 变量在内存中需要占据空间,内 ...