递归下降的预则分析法

递归下降的预测分析

  1. 消除左递归
  2. 提取公因子
  3. 求first集和follow集
  4. 构造预则分析表

下面以一个支持加法,乘法和括号运算符的计算器文法为例为例子

E->E+T|T
T->T*F|F
F->(E)|id

消除左递归后

E->TE'
E'->+TE'|空
T->FT'
T'->*FT'|空
F->(E)|id

构造出的预则分析表如下

package test;

import java.util.Scanner;

public class PredictAna {
    int p = 0;
    char[] input;

    void E() throws SyntaxException {
        char t = input[p];
        if (t == 'i' || t == '(') {//应用产生式 E -> T E1
            T();
            E1();
        } else throw new SyntaxException();
    }

    void E1() throws SyntaxException {
        char t = input[p];
        if (t == '+') {//应用产生式E1 -> + T E1
            p++;
            T();
            E1();
        } else if (t == '#' || input[p] == ')') ;//应用产生式 E -> 空
        else throw new SyntaxException();
    }

    void T() throws SyntaxException {
        char t = input[p];
        if (t == 'i' || t == '(') {//应用产生式 T -> F T1
            F();
            T1();
        } else throw new SyntaxException();
    }

    void T1() throws SyntaxException {
        char t = input[p];
        if (t == '*') {//应用产生式T1 -> * F T1;
            p++;
            F();
            T1();
        } else if (t == '+' || t == ')' || t == '#') ;//应用产生式 T1 -> 空
        else throw new SyntaxException();
    }

    void F() throws SyntaxException {
        char t = input[p];
        if (t == 'i') p++;
        else if (t == '(') {//应用产生式 F -> ( E )
            p++;
            E();
            if (input[p] != ')') throw new SyntaxException();
            p++;
        } else throw new SyntaxException();
    }

    void test() {//如果没有抛出语法异常则该语句正确否则错误
        p = 0;
        try {
            E();
            System.out.println("success");
        } catch (SyntaxException e) {
            System.out.println("fail");
        }
    }


    public static void main(String[] args) {

        PredictAna predictAna = new PredictAna();
        Scanner in = new Scanner(System.in);
        while (in.hasNext()) {
            String s = in.next() + '#';//末尾加上一个句末指示符
            predictAna.input = s.toCharArray();
            predictAna.test();
        }
    }
}

class SyntaxException extends Exception {
    public SyntaxException() {
        super("语法错误");
    }
}
posted @ 2020-01-02 16:25  开局一把刀  阅读(13)  评论(0)    收藏  举报