new, way better build system, tests, and template output
[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 public class Translator {
12
13     public static final String templateFile = "src/charj/translator/Charj.stg";
14     public static boolean debug = true;
15     public static boolean errorCondition = false;
16
17     public static String translate(InputStream io) throws Exception {
18         StringTemplateGroup templates = null;
19         try {
20             ClassLoader loader = Thread.currentThread().getContextClassLoader();
21             InputStream istream = loader.getResourceAsStream(templateFile);
22             BufferedReader reader = new BufferedReader(new InputStreamReader(istream));
23             templates = new StringTemplateGroup(reader);
24             reader.close();
25         } catch(IOException ex) {
26             error("Failed to load template file", ex); 
27         }
28
29         // Parse input, creating an AST
30         ANTLRInputStream input = new ANTLRInputStream(io);
31         CharjLexer lexer = new CharjLexer(input);
32         
33         // Use lexer tokens to feed tree parser. Note that the parser is a
34         // rewriter, so a TokenRewriteStream is needed
35         TokenRewriteStream tokens = new TokenRewriteStream(lexer);
36         CharjParser parser = new CharjParser(tokens);
37         CharjParser.charjSource_return r = parser.charjSource();
38
39         // Walk tree, modifying input buffer
40         CommonTree t = (CommonTree)r.getTree();
41         CommonTreeNodeStream nodes = new CommonTreeNodeStream(t);
42         nodes.setTokenStream(tokens);
43         CharjEmitter emitter = new CharjEmitter(nodes);
44         emitter.setTemplateLib(templates);
45         emitter.charjSource();
46
47         return tokens.toString();
48     }
49
50     
51     public static void error(String sourceName, String msg, CommonTree node) 
52     {
53         errorCondition = true;
54         String linecol = ":";
55         if ( node!=null ) {
56             CommonToken t = (CommonToken)node.getToken();
57             linecol = "line " + t.getLine() + ":" + t.getCharPositionInLine();
58         }
59         System.err.println(sourceName + ": " + linecol + " " + msg);
60         System.err.flush();
61     }
62
63
64     public static void error(String sourceName, String msg) {
65         error(sourceName, msg, (CommonTree)null);
66     }
67
68
69     public static void error(String msg) {
70         error("charj", msg, (CommonTree)null);
71     }
72
73
74     public static void error(String msg, Exception e) {
75         error(msg);
76         e.printStackTrace(System.err);
77     }
78 }