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 }