我是靠谱客的博主 迷人小松鼠,最近开发中收集的这篇文章主要介绍【编译技术】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推导结束");
        }
    }

}

最后

以上就是迷人小松鼠为你收集整理的【编译技术】LL(1)实现递归下降分析法的全部内容,希望文章能够帮你解决【编译技术】LL(1)实现递归下降分析法所遇到的程序开发问题。

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

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

评论列表共有 0 条评论

立即
投稿
返回
顶部