Added separate cc/ci emitters, modified driver, added antlr3.1 option
[charm.git] / src / langs / charj / src / charj / translator / Translator.java
1 /***
2 ***/
3
4 package charj.translator;
5
6 import org.antlr.runtime.*;
7 import org.antlr.runtime.tree.*;
8 import org.antlr.stringtemplate.*;
9 import java.io.*;
10
11 enum OutputMode {
12     cc, ci
13 }
14
15 public class Translator {
16
17     public static final String ccTemplateFile = "src/charj/translator/CharjCC.stg";
18     public static final String ciTemplateFile = "src/charj/translator/CharjCI.stg";
19     public static boolean debug = true;
20     public static boolean errorCondition = false;
21
22     public static String translate(String filename) throws Exception {
23
24         ANTLRFileStream input = new ANTLRFileStream(filename);
25             
26         CharjLexer lexer = new CharjLexer(input);
27         String output = translationPass(lexer, OutputMode.cc);
28         input.seek(0);
29         output += translationPass(lexer, OutputMode.ci);
30         
31         return output;
32     }
33
34     public static String translationPass(CharjLexer lexer, OutputMode m) throws
35         RecognitionException, IOException, InterruptedException
36     {
37         // Use lexer tokens to feed tree parser. Note that the parser is a
38         // rewriter, so a TokenRewriteStream is needed
39         TokenRewriteStream tokens = new TokenRewriteStream(lexer);
40         CharjParser parser = new CharjParser(tokens);
41         CharjParser.charjSource_return r = parser.charjSource();
42
43         // Create node stream for emitters
44         CommonTree t = (CommonTree)r.getTree();
45         CommonTreeNodeStream nodes = new CommonTreeNodeStream(t);
46         nodes.setTokenStream(tokens);
47
48         String output = null;
49         if (m == OutputMode.cc) {
50             output = "\nCC File\n-----------------------\n" + generateCC(nodes);
51         } else if (OutputMode.ci == m) {
52             output = "\nCI File\n-----------------------\n" + generateCI(nodes);
53         }
54         return output;
55     }
56
57     public static String generateCC(CommonTreeNodeStream nodes) throws
58         RecognitionException, IOException, InterruptedException
59     {
60         CharjCCEmitter emitter = new CharjCCEmitter(nodes);
61         StringTemplateGroup templates = getTemplates(ccTemplateFile);
62         emitter.setTemplateLib(templates);
63         StringTemplate st = (StringTemplate)emitter.charjSource().getTemplate();
64         return st.toString();
65     }
66
67     public static String generateCI(CommonTreeNodeStream nodes) throws
68         RecognitionException, IOException, InterruptedException
69     {
70         CharjCIEmitter emitter = new CharjCIEmitter(nodes);
71         StringTemplateGroup templates = getTemplates(ciTemplateFile);
72         emitter.setTemplateLib(templates);
73         StringTemplate st = (StringTemplate)emitter.charjSource().getTemplate();
74         return st.toString();
75     }
76
77     public static StringTemplateGroup getTemplates(String templateFile)
78     {
79         StringTemplateGroup templates = null;
80         try {
81             ClassLoader loader = Thread.currentThread().getContextClassLoader();
82             InputStream istream = loader.getResourceAsStream(templateFile);
83             BufferedReader reader = new BufferedReader(new InputStreamReader(istream));
84             templates = new StringTemplateGroup(reader);
85             reader.close();
86         } catch(IOException ex) {
87             error("Failed to load template file", ex); 
88         }
89         return templates;
90     }
91     
92     public static void error(String sourceName, String msg, CommonTree node) 
93     {
94         errorCondition = true;
95         String linecol = ":";
96         if ( node!=null ) {
97             CommonToken t = (CommonToken)node.getToken();
98             linecol = "line " + t.getLine() + ":" + t.getCharPositionInLine();
99         }
100         System.err.println(sourceName + ": " + linecol + " " + msg);
101         System.err.flush();
102     }
103
104
105     public static void error(String sourceName, String msg) {
106         error(sourceName, msg, (CommonTree)null);
107     }
108
109
110     public static void error(String msg) {
111         error("charj", msg, (CommonTree)null);
112     }
113
114
115     public static void error(String msg, Exception e) {
116         error(msg);
117         e.printStackTrace(System.err);
118     }
119 }