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 }