001         package com.croftsoft.apps.compiler.mini;
002    
003         import java.io.*;
004    
005         import java_cup.runtime.Symbol;
006    
007         import com.croftsoft.apps.compiler.mini.code.*;
008         import com.croftsoft.apps.compiler.mini.node.*;
009         import com.croftsoft.apps.compiler.mini.parse.*;
010    
011         /*********************************************************************
012         * Mini programming language translator.
013         *
014         * <P>
015         *
016         * Built using the
017         *
018         * CUP Parser Generator for Java
019         * (<A HREF="http://www.cs.princeton.edu/~appel/modern/java/CUP/">
020         * http://www.cs.princeton.edu/~appel/modern/java/CUP/</A>)
021         *
022         * and
023         *
024         * JLex: A Lexical Analyzer Generator for Java
025         * (<A HREF="http://www.cs.princeton.edu/~appel/modern/java/JLex/">
026         * http://www.cs.princeton.edu/~appel/modern/java/JLex/</A>).
027         *
028         * @version
029         *   1999-04-26
030         * @author
031         *   <A HREF="http://www.alumni.caltech.edu/~croft/">David W. Croft</A>
032         *********************************************************************/
033    
034         public class  Mini
035         //////////////////////////////////////////////////////////////////////
036         //////////////////////////////////////////////////////////////////////
037         {
038    
039         private static final boolean  DO_DEBUG_PARSE = false;
040    
041         //////////////////////////////////////////////////////////////////////
042         //////////////////////////////////////////////////////////////////////
043    
044         public static void  main ( String [ ]  args )
045           throws Exception
046         //////////////////////////////////////////////////////////////////////
047         {
048           Reader  reader = new InputStreamReader ( System.in );
049           PrintStream  printStream = System.out;
050           String  outputFilename = "MiniProgram";
051    
052           if ( args.length > 0 )
053           {
054             reader = new FileReader ( args [ 0 ] );
055           }
056    
057           if ( args.length > 1 )
058           {
059             printStream
060               = new PrintStream ( new FileOutputStream ( args [ 1 ] ) );
061           }
062    
063           if ( args.length > 0 )
064           {
065             String  filename = args.length > 1 ? args [ 1 ] : args [ 0 ];
066    
067             int  index = filename.lastIndexOf ( '.' );
068    
069             if ( index < 0 )
070             {
071               outputFilename = filename;
072             }
073             else
074             {
075               outputFilename = filename.substring ( 0, index );
076             }
077           }
078    
079           translate ( reader, printStream, outputFilename );
080         }
081    
082         public static void  translate (
083           Reader  reader, PrintStream  printStream, String  outputFilename )
084           throws Exception
085         //////////////////////////////////////////////////////////////////////
086         {
087           ProgramMiniNode  programMiniNode = parse ( reader );
088    
089           MiniNodeCodeVisitor  miniNodeCodeVisitor
090             = new JavaSourceMiniNodeCodeVisitor (
091             printStream, outputFilename );
092    
093           programMiniNode.generate ( miniNodeCodeVisitor );
094         }
095    
096         public static ProgramMiniNode  parse ( InputStream  inputStream )
097         //////////////////////////////////////////////////////////////////////
098         {
099           return parse ( new MiniScanner ( inputStream ) );
100         }
101    
102         public static ProgramMiniNode  parse ( Reader  reader )
103         //////////////////////////////////////////////////////////////////////
104         {
105           return parse ( new MiniScanner ( reader ) );
106         }
107    
108         public static ProgramMiniNode  parse ( MiniScanner  miniScanner )
109         //////////////////////////////////////////////////////////////////////
110         {
111           MiniParser  parser = new MiniParser ( miniScanner );
112    
113           Symbol  parseTree = null;
114    
115           try
116           {
117             if ( DO_DEBUG_PARSE )
118             {
119               parseTree = parser.debug_parse ( );
120             }
121             else
122             {
123               parseTree = parser.parse ( );
124             }
125           }
126           catch ( Exception  ex )
127           {
128             ex.printStackTrace ( );
129           }
130    
131           return ( ProgramMiniNode ) parseTree.value;
132         }
133    
134         //////////////////////////////////////////////////////////////////////
135         //////////////////////////////////////////////////////////////////////
136         }