在Java中实现消除立即左递归

时间:2017-03-06 01:28:13

标签: java parsing recursion context-free-grammar left-recursion

我正在使用java来实现一个通用代码来解决语法中的左递归问题,所以我的代码工作如下我正在读取这样的输入,因为每行都转到下一行:

E
E+T|T
T
T*F|F
F
(E)|id|number

并且所需的输出应该像这样:

E->[TE']
T->[FT']
F->[(E), id, number]
E'->[+TE', !]
T'->[*FT', !]

我编写了代码,它将输入存储在Arraylists中以迭代它们并产生输出:

    import java.io.BufferedReader;
    import java.io.FileReader;
    import java.io.IOException;
    import java.util.ArrayList;

    public class IleftRecursion {
          //storing each line in its corresponding Arraylist
        static ArrayList<String> leftRules = new ArrayList<>();
        static ArrayList<String> rightRules = new ArrayList<>();
        public static void read_file(String file) throws IOException {
            FileReader in = new FileReader(file);
            BufferedReader br = new BufferedReader(in);
            String line;
            while ((line = br.readLine()) != null) {
                leftRules.add(line);
                rightRules.add(br.readLine());
            }
            br.close();

        }

        public static void ss() {

            for (int i = 0; i < leftRules.size(); i++) {
                for (int j = 1; j <= i - 1; j++) {
                             //splitting inputs on bars "|" to iterate through them
                    for (String x : rightRules.get(i).split("\\|")) {
                        if (x.contains(leftRules.get(j))) {
                            String f = "";
                            String ff = "";
                            for (int k=0; k<rightRules.get(k).split("\\|").length;k++) {

                                f = x;
                                f = f.replaceAll(leftRules.get(i), rightRules.get(k).split("\\|")[k]);

                                ff += f;

                            }
                            rightRules.remove(i);
                            rightRules.add(i, ff);
                        }


                    }
                }
                //Recursive or Not boolean
                boolean isRec = false;

                for (String z : rightRules.get(i).split("\\|")) {
                    if (z.startsWith(leftRules.get(i))) {
                        isRec = true;
                        break;
                    }
                }

                if (isRec) {
                    String a = "";
                    String b = "";
                    for (String s : rightRules.get(i).split("\\|")) {

                        if (s.startsWith(leftRules.get(i))) {
                            b += s.replaceAll(leftRules.get(i), "") + leftRules.get(i) + "',";
                        } else {
                            a += s + leftRules.get(i) + "'";


                        }
                    }
                    b += "!";

                    if(a.length()>=1)
                    a.substring(1, a.length() - 1);
                    rightRules.add(i, a);
                    rightRules.add(i + 1, b);
                    leftRules.add(leftRules.get(i) + "'");
                }

            }
        }

        public static void main(String[] args) throws IOException {
            read_file("Sample.in"); 
            ss();
            for (int i=0;i<leftRules.size();i++)
            {
                System.out.print(leftRules.get(i)+"->");
                System.out.println("["+rightRules.get(i)+"]");
            }

        }


    }

我多次调试代码试图找出为什么我得到这样的输出

E->[TE']
T->[+TE',!]
F->[T]
E'->[T*F]

缺少一条规则,而且并非所有以正确的方式生成的新作品,但我无法修复,任何人都可以帮助我完成这项工作吗?

0 个答案:

没有答案