语法分析 java_SLR(1)语法分析(JAVA实现)

要求

574f7943436f908b2f2c21446486cb19.png

802f09bf3c57b68416d5c135a4df76d7.png

8688d4da4cf100dc624c616edd38b176.png

代码

import java.util.ArrayList;

import java.util.HashMap;

import java.util.List;

import java.util.Stack;

public class SLRFX {

private List wf = new ArrayList();

private HashMap> follow = new HashMap>();

private String[][] table = new String[12][9];

private Stack stateStack = new Stack();

private Stack charStack = new Stack();

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 Sfl = new ArrayList();

List Efl = new ArrayList();

List Tfl = new ArrayList();

List Ffl = new ArrayList();

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 stateStr = new ArrayList();

List charStr = new ArrayList();

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#");

}

}

结果

fcc64c407d386d61631e1e8f12852567.png

cb2b2ab5405b5d94b4fd50f2f58574e1.png


版权声明:本文为weixin_39551611原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。