001 /* Copyright 2000, 2001, Compaq Computer Corporation */ 002 003 package javafe.reader; 004 005 import java.io.IOException; 006 007 import javafe.ast.CompilationUnit; 008 import javafe.ast.PrettyPrint; // Debugging methods only 009 010 import javafe.genericfile.*; 011 012 import javafe.parser.Lex; 013 import javafe.parser.Parse; 014 import javafe.parser.PragmaParser; 015 016 import javafe.util.FileCorrelatedReader; 017 018 /** 019 * A SrcReader is a {@link Reader} that reads in a {@link 020 * CompilationUnit} from a source file (.java files) using the 021 * <code>javafe.parser</code> package. 022 * 023 * <p> SrcReaders do not cache the results of their reading. 024 */ 025 026 public class SrcReader extends Reader 027 { 028 /*************************************************** 029 * * 030 * Creation: * 031 * * 032 **************************************************/ 033 034 //@ invariant readLex != null; 035 //@ spec_public 036 private Lex readLex; 037 038 //@ invariant readParser != null; 039 //@ spec_public 040 private Parse readParser; 041 042 public SrcReader() { 043 this(null); 044 } 045 046 // p can be null 047 public SrcReader(PragmaParser p) { 048 readLex = new Lex(p, true); 049 readParser = new Parse(); 050 } 051 052 053 /*************************************************** 054 * * 055 * Reading: * 056 * * 057 **************************************************/ 058 059 /** 060 * Attempt to read and parse a CompilationUnit from *source* target. 061 * Any errors encountered are reported via javafe.util.ErrorSet. 062 * Null is returned iff an error was encountered.<p> 063 * 064 * 065 * By default, we attempt to read only a spec (e.g., specOnly is set 066 * in the resulting CompilationUnit) to save time. If avoidSpec is 067 * true, we always return a non-spec (if the file is a .java file).<p> 068 * 069 * 070 * The result of this function is not cached.<p> 071 * 072 * Target must be non-null.<p> 073 */ 074 public CompilationUnit read(GenericFile target, boolean avoidSpec) { 075 javafe.util.Info.out("[parsing " 076 + (avoidSpec ? "" : "spec from ") 077 + target.getHumanName() + "]"); 078 try { 079 FileCorrelatedReader input = new FileCorrelatedReader(target); 080 readLex.restart(input); 081 } catch (IOException e) { 082 javafe.util.ErrorSet.error("I/O error: " + e.getMessage()); 083 return null; 084 } 085 if (avoidSpec && !target.getLocalName().endsWith(".java")) avoidSpec = false; 086 CompilationUnit result = 087 readParser.parseCompilationUnit(readLex, !avoidSpec); 088 readLex.close(); 089 return result; 090 } 091 092 093 /*************************************************** 094 * * 095 * Test methods: * 096 * * 097 **************************************************/ 098 099 //@ requires \nonnullelements(args); 100 public static void main(String[] args) { 101 if (args.length != 1) { 102 System.err.println("SrcReader: <source filename>"); 103 System.exit(1); 104 } 105 106 GenericFile target = new NormalGenericFile(args[0]); 107 SrcReader reader = new SrcReader(); 108 109 CompilationUnit cu = reader.read(target, true); 110 if (cu != null) 111 PrettyPrint.inst.print( System.out, cu ); 112 } 113 }