2016-09-27 16 views
-1

我一直在尋找一個java編譯器的任務,要求查找語法的第一個。我已經準備好並完成了。所有的工作已經完成,但我有一個問題。我的第一個是製作重複。例如我的輸出的一部分是這樣的java編譯器,找到後續產生重複項

NonTerminal  First 
    P   int void         
    L   int void         
    D   int void         
    Vd   int void         
    Ts   int void         
    Fn   int void         
    Ps   int void void 

Ps int void void void第二個void是重複的。我將如何去除這些重複?虐待粘貼我的主要編譯器代碼是一切發生在下面。 我懷疑我不得不在findFirst方法中進行一些修改,因爲那是所有的操作都發生了,但我不知道該怎麼做。

package compilerproject; 
import java.io.BufferedReader; 
import java.io.BufferedWriter; 
import java.io.File; 
import java.io.FileNotFoundException; 
import java.io.FileOutputStream; 
import java.io.FileReader; 
import java.io.IOException; 
import java.io.OutputStreamWriter; 
import java.security.KeyStore.Entry; 
import java.util.ArrayList; 
import java.util.Arrays; 
import java.util.HashMap; 
import java.util.List; 
import java.util.Map; 

public class Compiler { 

    public static void main(String[] args) { 

     List<Grammar> gList = getGrammar(); 
     Map<String, List<String>> fList = firstList(gList); 
     //firstlist returns a hash map LHS and RHS 
     //save it into fList which is a map of Strings and List so u can use it in findFirst method 
     printFirstList(fList, gList); 
     ParserLibrary idList = new ParserLibrary(); 

    } 

    public static List<String> findFirst(String v, List<Grammar> l) 
    { 
     List<String> First = new ArrayList<String>(); 

     for(int i = 0; i < l.size(); i++) 
     { 

      if(v.equals(l.get(i).term)) 
      { 


       String [] s = l.get(i).prod.split(" "); 

       if(!isNonTerm(s[0]))// is a terminal 
       { 
        First.add(s[0]); 
       } 

    // if the rhs is a terminal 
+1

不要期望其他人調試你的代碼,特別是當它是240行,不可編譯,沒有任何意見時,你期望它做什麼。 – SubOptimal

+0

只有3個方法,我解釋了程序的功能和我想要的功能。寒意,我新嘗試 – lupejuares

+0

你的代碼做什麼? – jcool

回答

-1

這會使用Set而不是List來節省一些麻煩。 我保持列表爲返回類型,但改變了其餘的。

public static List<String> findFirst(String v, List<Grammar> l) { 
    Set<String> first = new TreeSet<>(); 

    Set<String> done = new HashSet<>(); 
    done.add(v); 

    Grammer previous = null; 
    for (Grammar gr : l) { 
     if (v.equals(gr.term)) { 
      String s = gr.prod.split(" ")[0]; 
      if (!isNonTerm(s)) { // is a terminal 
       first.add(s); 
      } 

      // if the rhs is a terminal 
      if (s.equalsIgnoreCase("empty") && previous != null) { 
       String[] stemp = previous.prod.split(" "); 

       if (v.equalsIgnoreCase(stemp[0]) && stemp.length > 1 
         && done.add(stemp[1])) { 
        first.addAll(findFirst(stemp[1], l)); // <--------- Here it happened 
       } 
       //if the rhs is empty , then get the previous grammar 
       //split it. 
       //find the first of it and ad it to the first list 
      } 
      if (!v.equals(s) && isNonTerm(s) && done.add(s)) { 
       first.addAll(findFirst(s, l)); 
      } 
     } 
     previous = gr;  
    } 
    return new ArrayList<String>(first); 
} 

我仍然沒有找到完全清楚的代碼。所以你可以使用Set,你可能會發現一個更簡單的公式。要移除滾動條,我將左大括號放在同一行上。

爲了防止無限遞歸,我添加了「顯然」不需要的集合done

+0

我在看集,看來這是解決這個問題的最簡單的方法。我只是想了解你所做的改變。他們看起來與我之前所做的不同 – lupejuares