我是靠谱客的博主 结实金鱼,最近开发中收集的这篇文章主要介绍实验二 递归下降分析法(Java实现和代码详解)实验要求测试表达式源程序测试截图,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

实验要求

实现文法如下:

P→bSe                //<程序>→ begin<语句串>end

S→AS1                //<语句串>→ <语句>{;<语句>}

S1→S|e                

A→i=E;                 //<赋值语句>→ ID=<表达式>

E→TE'                  

E'→+TE’|-TE’|e     //<表达式>→ <项>{+<项> | -<项>} 

T→FT'                   

T'→*FT’|/FT’|e       //<项>→ <因子>{*<因子> | /<因子>}

F→(E)|i                  //<因子>→ (<表达式>) |ID

测试表达式

输入: bi=i+i*(i/i-i);i=i+i;e# 

输出  success

输入  i=i+i*ie #

输出  error

源程序

import java.io.*;

public class Exp2 {
    public static String txt = null;//存储测试表达式
    public static int p = 0;//读取表达式的指针
    public static int m = 0;//测试表达式的长度
    public static boolean SIGN = true;//判断表达式是否正确的记号

    public static void main(String[] args) throws IOException {
        System.out.println("请输入一个语句,以#号结束语句(直接输入#号退出)");
        SIGN = true;
        p = 0;
        BufferedReader buf = new BufferedReader(new InputStreamReader(System.in));//定义输入流
        txt = buf.readLine().replaceAll(" ", "");//去掉所有空格,包括首尾和中间
        m= txt.length();
        if(txt.charAt(0) == '#'){//如果直接输入#号
            buf.close();//关闭流对象
            System.exit(0);//程序正常结束
        }
        P();
        if(p == m-1 && txt.charAt(p) == '#')//如果读完测试表达式后且没有出错
            System.out.println("success!");
        buf.close();
    }

    private static void P() {//P--→bSe,<程序>--→ begin<语句串>end
        if(txt.charAt(p) == 'b'){
            p++;
        }
        else {
            System.out.println("error1!");
            SIGN = false;
        }
        S();
        if(SIGN) {
            if(txt.charAt(p) == 'e'){
                p++;
            }
            else {
                System.out.println("error2!");
                SIGN = false;
            }
        }
    }

    private static void S() {//S--→AS1
        if(SIGN) {
            A();
            S1();
        }
    }

    private static void S1() {//S1--→S|空
        if(SIGN) {
            if(txt.charAt(p) == 'i'){//如果读到的字符属于S的First集
                S();
            }else if(txt.charAt(p)!='#' && txt.charAt(p)!='e'){//如果读到的字符不属于S1的Follow集
                System.out.println("error3!");
                SIGN = false;
            }
        }
    }

    private static void A() {//A--→i=E;
        if(SIGN) {
            if(txt.charAt(p) == 'i'){
                p++;
                if(txt.charAt(p) == '='){
                    p++;
                } else {//如果i后面跟着的不是 =
                    System.out.println("error4!");
                    SIGN = false;
                }
                E();
                if(txt.charAt(p) == ';'){
                    p++;
                } else {//如果E后面不是以;结束
                    System.out.println("error5!");
                    SIGN = false;
                }
            }
            else {//如果不是以 i开头
                System.out.println("error6!");
                SIGN = false;
            }
        }
    }

    private static void E() {//E--→TE'
        if(SIGN) {
            T();
            E1();
        }
    }

    private static void E1() {//E'--→+TE’|-TE’|空
        if(SIGN) {
            if(txt.charAt(p) == '+' || txt.charAt(p) == '-'){
                p++;
                T();
                E1();
            }else if(txt.charAt(p)!='#' && txt.charAt(p)!=';' && txt.charAt(p)!=')'){//如果读到的字符不属于E1的Follow集
                System.out.println("error7!");
                SIGN = false;
            }
        }
    }

    private static void T() {//T--→FT'
        if(SIGN)
        {
            F();
            T1();
        }
    }

    private static void T1() {//T'--→*FT’|/FT’|空
        if(SIGN) {
            if(txt.charAt(p) == '*' || txt.charAt(p) == '/'){
                p++;
                F();
                T1();
            }else if(txt.charAt(p)!='#' && txt.charAt(p)!=';' && txt.charAt(p)!=')' && txt.charAt(p)!='+' && txt.charAt(p)!='-'){
                //如果读到的字符不属于T1的Follow集
                System.out.println("error8!");
                SIGN = false;
            }
        }
    }

    private static void F() {//F--→(E)|i
        if(SIGN) {
            if(txt.charAt(p) == '('){
                p++;
                E();
                if(txt.charAt(p) == ')'){
                    p++;
                } else if(txt.charAt(p) == '#'){//如果括号没有配对上
                    System.out.println("error9!");
                    SIGN = false;
                }
            }else if (txt.charAt(p) == 'i'){
                p++;
            }else {//如果因子既不是表达式也不是i
                System.out.println("error10!");
                SIGN = false;
            }
        }
    }

}

测试截图

 

 

最后

以上就是结实金鱼为你收集整理的实验二 递归下降分析法(Java实现和代码详解)实验要求测试表达式源程序测试截图的全部内容,希望文章能够帮你解决实验二 递归下降分析法(Java实现和代码详解)实验要求测试表达式源程序测试截图所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(47)

评论列表共有 0 条评论

立即
投稿
返回
顶部