LL(1)文法的语法分析java实现

 java代码如下:

package 文法分析器;

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.util.*;
/*
 *(1)产生式集合
 *(2)first和follower集合
 **/

public class Grammar_Analysis {
    //first集合
    public static HashMap<String, HashSet<String>> first = new HashMap<>();

    //firstX集合,指任意符号串的first集合
    public static HashMap<String, HashSet<String>> firstX = new HashMap<>();

    //follower集合
    public static HashMap<String, HashSet<String>> follower = new HashMap<>();

    //文法的开始符
    public static String start = "S";

    //存储非终结符的集合
    public static HashSet<String> VnSet = new HashSet<>();

    //存储终结符的集合
    public static HashSet<String> VtSet = new HashSet<>();

    //存储每个非终结符的产生式
    public static HashMap<String, ArrayList<String>> outputSet = new HashMap<>();

    //分析表
    public static String[][] analysis_table;

    //分析栈
    public static Stack<String> Ana_stack = new Stack<>();

    //记录动作
    public static String active = "";

    //记录分析步数
    public static int index = 0;

    //源程序
    public static String source = "id = id * id $";

    //文件路径
    public static String PATH = "D:\\程序\\Maven\\maven-project\\编译原理\\src\\main\\java\\文法分析器\\readin.txt";
    public static int rows = 33;
    public static String PATH1 = "D:\\程序\\Maven\\maven-project\\编译原理\\src\\main\\java\\文法分析器\\readin1.txt";
    public static int rows1 = 8;

    public static String getSource_PATH = "D:\\程序\\Maven\\maven-project\\编译原理\\src\\main\\java\\文法分析器\\source.txt";

    //读入文件
    public static String[] grammar = getSource();

    public static String[] getSource() {
        FileInputStream inputStream = null;
        BufferedReader bufferedReader = null;
        String str;
        String[] grammar = new String[rows];
        int num = 0;
        try {
            inputStream = new FileInputStream(PATH);
            bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
            while ((str = bufferedReader.readLine()) != null) {
                grammar[num] = str;
                num++;
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (inputStream != null) {
                    inputStream.close();
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
            try {
                if (bufferedReader != null) {
                    bufferedReader.close();
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        return grammar;
    }

    //初始化
    public static void Init() {
        for (String s : grammar) {
            String[] str = s.split("->");//通过“->”分隔文法
            String left = str[0];
            //判断outputSet中是否有左部,若有,通过get方法得到,若没有,新建一个ArrayList
            ArrayList<String> list;
            if (outputSet.containsKey(left)) {
                list = outputSet.get(left);
            } else {
                list = new ArrayList<>();
            }
            list.add(str[1]);
            outputSet.put(left, list);
        }

        for (String left : VnSet) {
            HashSet<String> element = new HashSet<>();
            follower.put(left, element);
        }

        //求非终结符的first集
        for (String left : VnSet) {//遍历所有左部(非终结符)
            getFirst(left);
        }

        //求每个产生式的firstX集
        for (String left : VnSet) {
            ArrayList<String> right = outputSet.get(left);
            for (String Generational : right) {
                getFirstX(Generational);
            }
        }

        //求非终结符的follower集
        getFollower();

        //构造分析表
        create_analysis_table();

        //初始化栈
        Ana_stack.push("$");
        Ana_stack.push(start);
    }

    //构造分析表
    private static void create_analysis_table() {
        //终结符数组
        Object[] VtArray = VtSet.toArray();
        //非终结符数组
        Object[] VnArray = VnSet.toArray();

        //初始化预测分析表
        analysis_table = new String[VnArray.length + 1][VtArray.length + 1];
        analysis_table[0][0] = "分析表";
        //初始化分析表
        //初始化首行
        for (int i = 0; i < VtArray.length; i++)
            analysis_table[0][i + 1] = (Objects.equals(VtArray[i].toString(), "@")) ? "$" : VtArray[i].toString();
        //初始化首列
        for (int i = 0; i < VnArray.length; i++)
            analysis_table[i + 1][0] = VnArray[i].toString();
        //初始化分析表,全部置为error
        for (int i = 0; i < VnArray.length; i++) {
            for (int j = 0; j < VtArray.length; j++) {
                analysis_table[i + 1][j + 1] = "error";
            }
        }

        
  • 4
    点赞
  • 47
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值