⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 parse.java

📁 编译原理大作业---tiger编译器 包括semant,translate,mipsframe,regalloc等所有phase 懂的人自会知道
💻 JAVA
字号:
package Parse;import Canon.*;public class Parse {   public ErrorMsg.ErrorMsg errorMsg;   public Absyn.Exp absyn;   public int dflag;   public String fn;   // per le statistiche finali   public int nDFrag, nPFrag, nFrags, nIstrPrimaCanon, blockCounter=0;   public java.io.FileOutputStream os=null;   public java.io.PrintStream ps=null;   public Parse(String filename,int flagdebug,int filewrite) {      fn = filename;      dflag = flagdebug; // flag per stampa debug      java.io.InputStream inp = null;      try { inp = new java.io.FileInputStream(fn); }      catch (Exception e) {         System.out.println("> File sorgente non trovato\n");         Main.usage();         System.exit(0);      }      errorMsg = new ErrorMsg.ErrorMsg(fn);      if (dflag==1) System.out.println("\nInizio analisi sintattica...\n");      Grm parser = new Grm(new Yylex(inp,errorMsg), errorMsg, dflag);      /* open input files, etc. here */      try { parser./*debug_*/parse(); }      catch (Throwable e) {         // e.printStackTrace();         // throw new Error(e.toString());      }      finally {         try { inp.close(); }         catch (java.io.IOException e) {}      }      absyn = parser.parseResult;      if (errorMsg.num_error>0) {         // stampa gli errori lessicali         if (errorMsg.num_error==1) System.out.println("\n1 errore trovato.");         else System.out.println("\n" + errorMsg.num_error + " errori trovati." );         System.out.println("\nNon procedo oltre...");         System.exit(0); // in caso di errori sintattici/lessicali il parser termina      }      // FINDESCAPE cerca le variabili escape      if (dflag==1) System.out.println("\n\nRicerca variabili escape...\n");      //FindEscape.FindEscape fe = new FindEscape.FindEscape(absyn,dflag);      FindEscape.FindEscape.traverseAbsyn(absyn, dflag);      if (dflag==1) {         System.out.println("\nRisultato del parser = " + absyn);         // stampa l'albero della sintassi astratta         System.out.println("\nAlbero della sintassi astratta\n");         // Per la stampa a video         Absyn.Print pr = new Absyn.Print((java.io.PrintStream)System.out);         // stampo l'albero con un "indentatura" di 2 spazi.         pr.prExp(absyn,0);      }      // eventuale stampa su file      if (filewrite==1) {         // apre il file         try {            os = new java.io.FileOutputStream("Tree_Sintax");            ps = new java.io.PrintStream(os);            ps.println("\n> Albero della sintassi astratta del file : " + fn + "\n");         }         catch(java.io.IOException e) {            System.out.println("> Errore in scrittura su file : Tree_Sintax\n");            System.exit(0);         }         Absyn.Print prFile = new Absyn.Print(ps);         // scrive l'albero su file         prFile.prExp(absyn,0);         // chiude il file (i due stream)         try {            // prima di chiudere stampa un paio di newline            ps.print("\n\n");            ps.close();            os.close();         }         catch (java.io.IOException e) { System.out.println("ERRORE CHIUSURA FILE sintassi"); }      }      // ANALISI SEMANTICA      // crea il livello di base da passare a Semant      Mips.MipsFrame f = new Mips.MipsFrame("Main");      Translate.Level level= new Translate.Level(f);      if (dflag==1) {         System.out.println("\nLivello iniziale: " + level);         System.out.println("\nInizio analisi semantica...\n");      }      Semant.Semant s = new Semant.Semant(errorMsg,level,dflag);      // crea un ExpTy per salvare l'analisi semantica (i tipi) e l'albero del codice intermedio      Semant.ExpTy prg=null;      try { prg=s.transProg(absyn); }      catch (Error e) {         System.out.println("Errore in: " + e);         e.printStackTrace();      }      if (errorMsg.num_error==1) System.out.println("\n1 errore semantico trovato.");      else if (errorMsg.num_error>1) System.out.println("\n" + errorMsg.num_error + " errori semantici trovati." );      // STAMPA ALBERO CODICE INTERMEDIO      Tree.Print prCI=null;      if (errorMsg.num_error==0) {         if (dflag==1) System.out.println("\nAlbero del codice intermedio");         // per la stampa su file         if (filewrite==1) {            // apre il file            try {               os = new java.io.FileOutputStream("Tree_CI");               ps = new java.io.PrintStream(os);               ps.println("\n> Albero del codice intermedio del file : " + fn + "\n");            }            catch (java.io.IOException e) {               System.out.println("> Errore in scrittura su file : Tree_CI\n");               System.exit(0);            }            prCI = new Tree.Print((java.io.PrintStream)System.out,ps,dflag);         }         else prCI = new Tree.Print((java.io.PrintStream)System.out,dflag);         // salva la lista dei frags in fr         Translate.Frag fr = s.trans.getResult();         // scorre e stampa la lista dei frag         prCI.prFrags(fr);         // salva il numero totale di frag, il numero di datafrag, e il numero di procfrag         // (per le statistiche finali)         nPFrag = prCI.getNumPFrag();         nDFrag = prCI.getNumDFrag();         nFrags = prCI.getNumDFrag()+prCI.getNumPFrag();         nIstrPrimaCanon = prCI.getNumIstrPrimaCanon();         if (filewrite==1) {            // chiude il file (i due stream)           try {              // prima di chiudere stampa un newline              ps.print("\n");              ps.close();              os.close();           }           catch (java.io.IOException e) { System.out.println("ERRORE CHIUSURA FILE CI non canonizzato"); }         }         // FASE DI CANONIZZAZIONE         if (dflag==1) System.out.println("\nAlbero del codice intermedio canonizzato\n");         // crea la Stmlistlist         StmListList stmlistlist = null;         StmListList temp = null;         // PASSO BASE (il primo ProcFrag)         // scorre datafrag per trovare il primo ProcFrag         while (fr instanceof Translate.DataFrag) { fr = fr.next; }         Translate.ProcFrag pf = (Translate.ProcFrag)fr;         // LINEARIZZA (Canon.linearize)         Tree.StmList lin = Canon.linearize(pf.body);         // CREA I BLOCCHI (Canon.BasicBlocks)         BasicBlocks bblocks = new BasicBlocks(lin);         // ORDINA E METTE INSIEME I BLOCCHI (Canon.TraceSchedule)         TraceSchedule ts = new TraceSchedule(bblocks);         blockCounter+= ts.getNumBlock();         stmlistlist = new StmListList(ts.stms,null);         temp = stmlistlist;         fr = fr.next;         // PASSO ITERATO         // scorre la lista dei Frags e per ogni ProcFrag trovato lo canonizza e lo aggiunge a stmlistlist         while (fr!=null) {            if (fr instanceof Translate.ProcFrag) {               // salva il ProcFrag               pf = (Translate.ProcFrag)fr;               // LINEARIZZA (Canon.linearize)               lin = Canon.linearize(pf.body);               // CREA I BLOCCHI (Canon.BasicBlocks)               bblocks = new BasicBlocks(lin);               // ORDINA E METTE INSIEME I BLOCCHI (Canon.TraceSchedule)               ts = new TraceSchedule(bblocks);               blockCounter+= ts.getNumBlock();               temp.tail = new StmListList(ts.stms,null);               temp = temp.tail;            }            fr = fr.next;         }         // STAMPA LA STMLISTLIST         // per la stampa su file         if (filewrite==1) {            // apre il file            try {               os = new java.io.FileOutputStream("Tree_CI_Canon");               ps = new java.io.PrintStream(os);               ps.println("\n> Albero del codice intermedio del file: " + fn + "\n");            }            catch (java.io.IOException e) {               System.out.println("> Errore in scrittura su file: Tree_CI_Canon \n");              System.exit(0);            }            prCI = new Tree.Print((java.io.PrintStream)System.out,ps,dflag);         }         else prCI = new Tree.Print((java.io.PrintStream)System.out,dflag);         // stampa a video e file         prCI.prStmlistlist(stmlistlist);         if (filewrite==1) {            // chiude il file (i due stream)            try {               // prima di chiudere stampa un newline               ps.print("\n");               ps.close();               os.close();            }            catch (java.io.IOException e) {System.out.println("ERRORE CHIUSURA FILE CI canonizzato");}         }         System.out.println("\nCompilazione (produzione del codice intermedio canonizzato) effettuata con successo.\n");         if (filewrite==1) {            System.out.println("L'albero della sintassi astratta e' stato salvato in: Tree_Sintax");            System.out.println("L'albero del codice intermedio e' stato salvato in: Tree_CI");            System.out.println("L'albero del codice intermedio canonizzato e' stato salvato in: Tree_CI_Canon\n");         }         // STATISTICHE FINALI         if (dflag==1) {            System.out.println("-----   STATISTICHE   -----\n");            System.out.println("> Numero Data Frags = " + nDFrag);            System.out.println("> Numero Proc Frags = " + nPFrag);            System.out.println("> Numero frags totali = " + nFrags + "\n");            System.out.println("> Numero di istruzioni CI prima della canonizzazione: " + nIstrPrimaCanon);            System.out.println("\n> Numero di blocchi prodotti: " + blockCounter);            System.out.println("> Numero di tracce  prodotte: " + prCI.getNumTrace());            System.out.println("> Numero di istruzioni CI prodotte: " + prCI.getNumIstr() + "\n");         }      } // errorMsg!=0   } // costruttore Parse} // classe Parse

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -