首页 > 技术文章 > 实验三 递归下降分析分析法

ywqtro 2020-11-25 16:00 原文

 

【实验目的】 

1)掌握自上而下语法分析的要求与特点。 

2)掌握递归下降语法分析的基本原理和方法。 

3)掌握相应数据结构的设计方法。  

【实验内容】 

用递归下降法编写一个语法分析程序,使之与词法分析器结合,能够根据语言的上下文无关文法,识别输入的单词序列是否文法的句子。

【实验要求】 

对下列文法,用递归下降分析法对任意输入的符号串进行分析:

E->TG    G->+TG|-TG   G->ε

T->FS    S->*FS|/FS    S->ε

F->(E)     F->i

【实验结果】 

import java.util.Scanner;

public class DiGui {
    int check=0;
    int num=0;
    String str="";
    Scanner input=new Scanner(System.in);
    String key;
    char[] list;
public void DuQu1() {
    System.out.println("请输入字符串并以#号结束,如:i+i*i#");
    key=input.next();
    list=new char[key.length()];
        for(int i=0;i<key.length();i++) {
            list[i]=key.charAt(i);
        }
        if(list[key.length()-1]!='#') {
            System.out.println("没有以#结束");
            error();
        }
        if(check==0) {
System.out.print("文法               ");
System.out.printf("%-15s","分析串");
System.out.printf("%-16s","分析字符");
System.out.print("剩余串");
System.out.println();
        E(list[num]);
        }
}
public void error() {
    check=1;
    System.out.println("error");
}
public void E(char key) {
    if(check==0) {
        String str1="";
        for(int i=num;i<list.length;i++) {
            str1=str1+list[i];
        }
System.out.print("E->TG       ");
System.out.printf("%-16s",str);
System.out.printf("%-11s",list[num]);
System.out.print(str1);
System.out.println();
    T(list[num]);
    G(list[num]);
    if(list[num]=='#') {
        if(check==0) {
        System.out.println("accept");
        }
    }
    else {
        if(check==0) {
        error();
        }
    }
    }    
}
public void T(char key) {
    if(check==0) {
    String str1="";
    for(int i=num;i<list.length;i++) {
        str1=str1+list[i];
    }
System.out.print("T->FS       ");
System.out.printf("%-16s",str);
System.out.printf("%-11s",list[num]);
System.out.print(str1);
System.out.println();
    F(list[num]);
    S(list[num]);
    }
}
public void G(char key) {
    if(check==0) {
    switch(list[num]) {
    case '+':
        num++;
        String str1="";
        for(int i=num;i<list.length;i++) {
            str1=str1+list[i];
        }
        str=str+"+";
System.out.print("G->+TG      ");
System.out.printf("%-16s",str);
System.out.printf("%-11s",list[num-1]);
System.out.print(str1);
System.out.println();
        T(list[num]);
        G(list[num]);break;
    case '-':
        num++;
        str1="";
        for(int i=num;i<list.length;i++) {
            str1=str1+list[i];
        }
        str=str+"-";
System.out.print("G->-TG      ");
System.out.printf("%-16s",str);
System.out.printf("%-11s",list[num-1]);
System.out.print(str1);
System.out.println();
        T(list[num]);
        G(list[num]);break;
    default:
        str1="";
        for(int i=num;i<list.length;i++) {
            str1=str1+list[i];
        }
System.out.print("G->^        ");
System.out.printf("%-16s",str);
System.out.printf("%-11s",list[num]);
System.out.print(str1);
System.out.println();
        break;
    }
    }
}
public void F(char key) {
    if(check==0) {
    switch(list[num]) {
    case '(':
        num++;
        String str1="";
        for(int i=num;i<list.length;i++) {
            str1=str1+list[i];
        }
        str=str+"(";
System.out.print("F->(E)      ");
System.out.printf("%-16s",str);
System.out.printf("%-11s",list[num-1]);
System.out.print(str1);
System.out.println();
        E(list[num]);
        if(list[num]==')') {
            num++;
            str1="";
            for(int i=num;i<list.length;i++) {
                str1=str1+list[i];
            }
            str=str+")";
System.out.print("            ");
System.out.printf("%-16s",str);
System.out.printf("%-11s",list[num-1]);
System.out.print(str1);
System.out.println();
        break;
        }
        else {
        error();break;
        }
    case 'i':
        num++;
        str1="";
        for(int i=num;i<list.length;i++) {
            str1=str1+list[i];
        }
        str=str+"i";
System.out.print("F->i        ");
System.out.printf("%-16s",str);
System.out.printf("%-11s",list[num-1]);
System.out.print(str1);
System.out.println();
        break;
    default:
        error();break;
    }
    }
}
public void S(char key) {
    if(check==0) {
    switch(list[num]) {
    case '*':
        num++;
        String str1="";
        for(int i=num;i<list.length;i++) {
            str1=str1+list[i];
        }
        str=str+"*";
System.out.print("S->*FS      ");
System.out.printf("%-16s",str);
System.out.printf("%-11s",list[num-1]);
System.out.print(str1);
System.out.println();
        F(list[num]);
        S(list[num]);break;
    case '/':
        num++;
        str1="";
        for(int i=num;i<list.length;i++) {
            str1=str1+list[i];
        }
        str=str+"/";
System.out.print("S->/FS      ");
System.out.printf("%-16s",str);
System.out.printf("%-11s",list[num-1]);
System.out.print(str1);
System.out.println();
        F(list[num]);
        S(list[num]);break;
    default:
        str1="";
        for(int i=num;i<list.length;i++) {
            str1=str1+list[i];
        }
System.out.print("S->^        ");
System.out.printf("%-16s",str);
System.out.printf("%-11s",list[num]);
System.out.print(str1);
System.out.println();
        break;
    }
}
}
public static void main(String[] args) {
    DiGui digui=new DiGui();
    digui.DuQu1();
}
}

 

推荐阅读