• 实验三 递归下降分析分析法


     

    【实验目的】 

    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();
    }
    }

  • 相关阅读:
    mysql 批量删除process
    python-argparse
    【声纹识别】matlab-辨别男女声
    python @装饰器
    【机器学习】大数定律,中心极限定律 极大似然估计
    【tensorflow】mnist-精简版模型
    Linux 的内存分页管理
    Python-内建函数
    Python-各种结构解析以及生成器(列表解析,字典解析,集合解析,元组构成的生成器)
    Python-模块之时间模块(time,datetime)
  • 原文地址:https://www.cnblogs.com/ywqtro/p/14036668.html
Copyright © 2020-2023  润新知