代碼針對以下文法:
//E -> E+T | T
//T -> T*F | F
//F -> (E) | id
輸入中的元素需要用空格分開,并以$符號結尾
輸入樣例:
id * id + id $
(由于暗物質的堆積,第一次跑可能會出現玄學錯誤,再跑一次就好了)
以下為代碼:
import java.util.*;
public class LR {
public static void main(String[] args){
int acc = 0;
int now = 0;
Stack s = new Stack();
s.push("0");
System.out.println("請輸入想要分析的運算式(以$結尾):");
Scanner scanner = new Scanner(System.in);
String ins = scanner.nextLine();
String [] str = ins.split(" ");
while(acc==0){
if(s.peek().equals("0")||s.peek().equals("4")||s.peek().equals("6")||s.peek().equals("7")){
if(str[now].equals("id")){
now++;
System.out.println("移進id");
s.push("id");
s.push("5");
}else if(str[now].equals("(")){
now++;
System.out.println("移進( ");
s.push("(");
s.push("4");
}
else {
System.out.println("移進時出現錯誤!");
break;
}
}
else if(s.peek().equals("1")){
if(str[now].equals("+")){
now++;
System.out.println("移進 +");
s.push("+");
s.push("6");
}else if(str[now].equals("$")){
acc = 1;
System.out.println("接受");
}
else {
System.out.println("移進時出現錯誤!");
break;
}
}
else if(s.peek().equals("2")){
if(str[now].equals("*")){
now++;
System.out.println("移進 *");
s.push("*");
s.push("7");
}else if(str[now].equals("+")||str[now].equals(")")||str[now].equals("$")){
System.out.println("按E->T進行歸約");
s.pop();
s.pop();
if(s.peek().equals("0")){
s.push("E");
s.push("1");
}else if(s.peek().equals("4")){
s.push("E");
s.push("8");
}
else{
System.out.println("歸約時出現錯誤!");
}
}else {
System.out.println("移進時出現錯誤!");
break;
}
}
else if(s.peek().equals("3")){
if(str[now].equals("+")||str[now].equals("*")||str[now].equals(")")||str[now].equals("$")){
System.out.println("按T->F進行歸約");
s.pop();
s.pop();
if(s.peek().equals("0")||s.peek().equals("4")){
s.push("T");
s.push("2");
}else if(s.peek().equals("6")){
s.push("T");
s.push("9");
}
else{
System.out.println("歸約時出現錯誤!");
}
}
else{
System.out.println("移進時出現錯誤!");
}
}
else if(s.peek().equals("5")){
if(str[now].equals("+")||str[now].equals("*")||str[now].equals(")")||str[now].equals("$")){
System.out.println("按F->id進行歸約");
s.pop();
s.pop();
if(s.peek().equals("0")||s.peek().equals("4")||s.peek().equals("6")){
s.push("F");
s.push("3");
}else if(s.peek().equals("7")){
s.push("F");
s.push("10");
}
else{
System.out.println("歸約時出現錯誤!");
}
}
else{
System.out.println("移進時出現錯誤!");
}
}
else if(s.peek().equals("8")){
if(str[now].equals("+")){
now++;
System.out.println("移進 +");
s.push("+");
s.push("6");
}else if(str[now].equals(")")){
now++;
System.out.println("移進 )");
s.push(")");
s.push("11");
}
else {
System.out.println("移進時出現錯誤!");
break;
}
}
else if(s.peek().equals("9")){
if(str[now].equals("*")){
now++;
System.out.println("移進 *");
s.push("*");
s.push("7");
}else if(str[now].equals("+")||str[now].equals(")")||str[now].equals("$")){
System.out.println("按E->E+T進行歸約");
s.pop();
s.pop();
s.pop();
s.pop();
s.pop();
s.pop();
if(s.peek().equals("0")){
s.push("E");
s.push("1");
}else if(s.peek().equals("4")){
s.push("E");
s.push("8");
}
else{
System.out.println("歸約時出現錯誤!");
}
}else {
System.out.println("移進時出現錯誤!");
break;
}
}
else if(s.peek().equals("10")){
if(str[now].equals("+")||str[now].equals("*")||str[now].equals(")")||str[now].equals("$")){
System.out.println("按T->T*F進行歸約");
s.pop();
s.pop();
s.pop();
s.pop();
s.pop();
s.pop();
if(s.peek().equals("0")||s.peek().equals("4")){
s.push("T");
s.push("2");
}else if(s.peek().equals("6")){
s.push("T");
s.push("9");
}
else{
System.out.println("歸約時出現錯誤!");
}
}
else{
System.out.println("移進時出現錯誤!");
}
}
else if(s.peek().equals("11")){
if(str[now].equals("+")||str[now].equals("*")||str[now].equals(")")||str[now].equals("$")){
System.out.println("按F->(E)進行歸約");
s.pop();
s.pop();
s.pop();
s.pop();
s.pop();
s.pop();
if(s.peek().equals("0")||s.peek().equals("4")||s.peek().equals("6")){
s.push("F");
s.push("3");
}else if(s.peek().equals("7")){
s.push("F");
s.push("10");
}
else{
System.out.println("歸約時出現錯誤!");
}
}
else{
System.out.println("移進時出現錯誤!");
}
}
}
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/224252.html
標籤:java
上一篇:關于BigDecimal類的常用方法與的舍入方式(用于高精度的浮點運算)
下一篇:網路通信,UDP.TCP協議
