📄 parse.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 + -