【编译技术】LL(1)实现递归下降分析法

本代码是针对以下文法的

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

以下是该文法的first集合,follow集合与预测分析表

//E->TE'        first(E) = { (, id }    follow(E) = { ) }
//E'->+TE'|e    first(E') = { +, e }    follow(E') = { ) }
//T->FT'        first(T) = { (, id }    follow(T) = { +, ) }
//T'->*FT'|e    first(T') = { *, e }    follow(T') = { +, ) }
//F->(E)|id     first(F) = { (, id }    follow(F) = { *, +, ) }

//预测分析表
//      +           *           (           )           id
//E                             E->TE'                  E->TE'
//E'    E'->+TE'                            E'->e
//T                             T->FT'                  T->FT'
//T'    T'->e       T'->*FT'                T'->e
//F                             F->(E)                  F->id

输入格式:串中的终止符需要以空格分开,并以$符号结尾

输入样例:
id + id * id $
.
.
.
.
以下为代码

import java.util.*;

public class LL1 {
    static String [] str = null;
    static int now = 0;

    //所有函数,失败返回0,成功返回1
    static int E(){
        if(now>=str.length){
            System.out.println("错误:E推导时出错,缺少 ( 或 id");
            return 0;
        }
        else if(str[now].equals("(")||str[now].equals("id")){
            System.out.println("执行:E->TE'");
            return T()*E1();
        }
        System.out.println("错误:E推导时出错,此时只有 ( 或 id 能够被匹配");
        return 0;
    }


    static int E1(){
        if(now>=str.length){
            System.out.println("错误:E'推导时出错,缺少 + 或 )");
            return 0;
        }
        else if(str[now].equals("+")){
            System.out.println("执行:E'->+TE'");
            now++;
            return T()*E1();
        }
        else if(str[now].equals("$")){
            System.out.println("执行:E'->e");
            return 1;
        }
        System.out.println("错误:E'推导时出错,此时只有 + 或 ) 能够被匹配");
        return 0;
    }


    static int T(){
        if(now>=str.length){
            System.out.println("错误:T推导时出错,缺少 ( 或 id");
            return 0;
        }
        else if(str[now].equals("(")||str[now].equals("id")){
            System.out.println("执行:T->FT'");
            return F()*T1();
        }
        System.out.println("错误:T推导时出错,此时只有 ( 或 id 能够被匹配");
        return 0;
    }


    static int T1(){
        if(now>=str.length){
            System.out.println("错误:T'推导时出错,缺少 +, * 或 )");
            return 0;
        }
        else if(str[now].equals("*")){
            System.out.println("执行:T'->*FT'");
            now++;
            return F()*T1();
        }
        else if(str[now].equals("+")){
            System.out.println("执行:T'->e");
            return 1;
        }
        else if(str[now].equals("$")){
            System.out.println("执行:T'->e");
            return 1;
        }
        System.out.println("错误:T'推导时出错,此时只有 +,* 或 ) 能够被匹配");
        return 0;
    }


    static int F(){
        if(now>=str.length){
            System.out.println("错误:F推导时出错,缺少 ( 或 id");
            return 0;
        }
        else if(str[now].equals("id")){
            System.out.println("执行:F->id");
            now++;
            return 1;
        }
        else if(str[now].equals("(")){
            System.out.println("执行:F->(E)");
            now++;
            int ttt = E();
            if(ttt==0){
                return 0;
            }
            else if(str[now].equals(")")){
               now++;
               return 1;
            }
            else{
                System.out.println("错误:F推导时出错,缺少 )");
                return 0;
            }
        }
        System.out.println("错误:F推导时出错,此时只有 ( 或 id 能够被匹配");
        return 0;
    }

    public static void main(String[] args){
        Scanner scanner = new Scanner(System.in);
        String ins = scanner.nextLine();
        str = ins.split(" ");
        int t = E();
        if(t==0){
            System.out.println("\n推导因错误而终止");
        }
        else{
            System.out.println("\n推导结束");
        }
    }

}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值