improved code generation and fixed emitter symbol table problem
authorAaron Becker <abecker3@illinois.edu>
Tue, 16 Dec 2008 21:44:19 +0000 (21:44 +0000)
committerAaron Becker <abecker3@illinois.edu>
Tue, 16 Dec 2008 21:44:19 +0000 (21:44 +0000)
src/langs/charj/src/charj/lang/Chare.cj
src/langs/charj/src/charj/translator/CharjEmitter.g
src/langs/charj/src/charj/translator/PackageScope.java
src/langs/charj/src/charj/translator/Symbol.java
src/langs/charj/src/charj/translator/SymbolWithScope.java
src/langs/charj/src/charj/translator/Translator.java
src/langs/charj/src/charj/translator/VariableSymbol.java
src/langs/charj/tests/fib.cj

index 8cbcb59195bb1b26a494c1cbe35fe4a17971f105..8df90d6b2792b13e62430d5f36df490d25247449 100644 (file)
@@ -1,5 +1,5 @@
 package charj.lang;
 
-class Chare {
+class _Charj_Chare {
     
-}
\ No newline at end of file
+}
index 3542bd0e25506d294da5a6714118b78b74b8f9a9..ae3dfae78347af2387e321812232cc7582b930e3 100644 (file)
@@ -18,14 +18,23 @@ package charj.translator;
 }
 
 @members {
-    OutputMode m_mode;
-    boolean m_messageCollectionEnabled = false;
-    private boolean m_hasErrors = false;
-    List<String> m_messages;
+    SymbolTable symtab_ = null;
 
-    private boolean emitCC() { return m_mode == OutputMode.cc; }
-    private boolean emitCI() { return m_mode == OutputMode.ci; }
-    private boolean emitH() { return m_mode == OutputMode.h; }
+    PackageScope currentPackage_ = null;
+    ClassSymbol currentClass_ = null;
+    MethodSymbol currentMethod_ = null;
+    LocalScope currentLocalScope_ = null;
+
+    Translator translator_;
+
+    OutputMode mode_;
+    boolean messageCollectionEnabled_ = false;
+    private boolean hasErrors_ = false;
+    List<String> messages_;
+
+    private boolean emitCC() { return mode_ == OutputMode.cc; }
+    private boolean emitCI() { return mode_ == OutputMode.ci; }
+    private boolean emitH() { return mode_ == OutputMode.h; }
 
     /**
      *  Switches error message collection on or off.
@@ -41,9 +50,9 @@ package charj.translator;
      *  @param newState  <code>true</code> if error messages should be collected.
      */
     public void enableErrorMessageCollection(boolean newState) {
-        m_messageCollectionEnabled = newState;
-        if (m_messages == null && m_messageCollectionEnabled) {
-            m_messages = new ArrayList<String>();
+        messageCollectionEnabled_ = newState;
+        if (messages_ == null && messageCollectionEnabled_) {
+            messages_ = new ArrayList<String>();
         }
     }
     
@@ -58,8 +67,8 @@ package charj.translator;
      */
      @Override
     public void emitErrorMessage(String message) {
-        if (m_messageCollectionEnabled) {
-            m_messages.add(message);
+        if (messageCollectionEnabled_) {
+            messages_.add(message);
         } else {
             super.emitErrorMessage(message);
         }
@@ -73,7 +82,7 @@ package charj.translator;
      *           list may be empty if no error message has been emited.
      */
     public List<String> getMessages() {
-        return m_messages;
+        return messages_;
     }
     
     /**
@@ -83,7 +92,7 @@ package charj.translator;
      *           least one error message.
      */
     public boolean hasErrors() {
-        return m_hasErrors;
+        return hasErrors_;
     }
 
     /**
@@ -102,9 +111,10 @@ package charj.translator;
 }
 
 // Starting point for parsing a Charj file.
-charjSource[OutputMode m]
+charjSource[SymbolTable symtab, OutputMode m]
 @init {
-    this.m_mode = m;
+    this.symtab_ = symtab;
+    this.mode_ = m;
     String closingBraces = "";
 }
     :   ^(CHARJ_SOURCE (p=packageDeclaration)? 
index 02f5572bc5cf53f29d83a38c7c2ae2f48b5ce6c9..1f99a4663e4df60cf7555367bda1bdb18e068aed 100644 (file)
@@ -13,8 +13,7 @@ public class PackageScope extends SymbolWithScope {
     public PackageScope(
             SymbolTable symtab, 
             String name, 
-            Scope enclosingScope) 
-    {
+            Scope enclosingScope) {
         super(symtab, name);
         this.enclosingScope = enclosingScope;
     }
@@ -30,8 +29,7 @@ public class PackageScope extends SymbolWithScope {
      *  in package io which is in package charj.  Next time, File will
      *  be found.
      */
-    public ClassSymbol resolveType(String type) 
-    {
+    public ClassSymbol resolveType(String type) {
         if (debug()) System.out.println(
                 " PackageScope.resolveType(" + type + 
                 "): examine " + toString());
@@ -49,21 +47,18 @@ public class PackageScope extends SymbolWithScope {
         return null;
     }
 
-    public Map<String, Symbol> getMembers() 
-    {
+    public Map<String, Symbol> getMembers() {
         return members;
     }
 
-    public String getFullyQualifiedName() 
-    {
+    public String getFullyQualifiedName() {
         if ( name.equals(SymbolTable.DEFAULT_PACKAGE_NAME) ) {
             return null;
         }
         return super.getFullyQualifiedName();
     }
 
-    public String toString() 
-    {
+    public String toString() {
         return "PackageScope[" + name + "]: " + members.keySet();
     }
 }
index 4a07d7093300cfa11db70db4e013896a087e3b86..d79958eca2c74e3d2c145faab99f363d5ff6dec8 100644 (file)
@@ -23,29 +23,25 @@ public class Symbol {
     /** To print definition, we need to know where tokens live */
     public TokenStream definitionTokenStream;
 
-    public Symbol(SymbolTable _symtab) 
-    {
+    public Symbol(SymbolTable _symtab) {
         symtab = _symtab;
     }
 
     public Symbol(
             SymbolTable _symtab, 
             String _name, 
-            ClassSymbol _type) 
-    {
+            ClassSymbol _type) {
         this(_symtab);
         name = _name;
         type = _type;
     }
 
     /** Just in case we need to do some name mangling */
-    public String getMangledName() 
-    {
+    public String getMangledName() {
         return name;
     }
 
-    public boolean debug()
-    {
+    public boolean debug() {
         return symtab.translator.debug();
     }
 
index d6775ebb3c08de058d4ad11cbe4c217ff7a50de5..bf4a28aaa8ad47c99aa397f1e6803d63390799f2 100644 (file)
@@ -7,21 +7,18 @@ public abstract class SymbolWithScope
     extends Symbol 
     implements Scope {
 
-    public SymbolWithScope(SymbolTable symtab) 
-    {
+    public SymbolWithScope(SymbolTable symtab) {
         super(symtab);
     }
 
     public SymbolWithScope(
             SymbolTable symtab, 
-            String name) 
-    {
+            String name) {
         super(symtab, name, null);
     }
 
     /** Find any symbol matching name; won't look on disk for classes though */
-    public Symbol resolve(String name) 
-    {
+    public Symbol resolve(String name) {
         Symbol s = null;
         
         // in this scope?
@@ -30,8 +27,7 @@ public abstract class SymbolWithScope
         }
 
         // if not, check any enclosing scope
-        if ( s==null && getEnclosingScope() != null ) 
-        {
+        if ( s==null && getEnclosingScope() != null ) {
             return getEnclosingScope().resolve(name);
         }
 
@@ -41,16 +37,14 @@ public abstract class SymbolWithScope
     /** Scopes other other package and class don't know how to resolve types
      *  (e.g., MethodSymbol).  Look to enclosing scope.
      */
-    public ClassSymbol resolveType(String type) 
-    {
+    public ClassSymbol resolveType(String type) {
         if ( getEnclosingScope()!=null ) {
             return getEnclosingScope().resolveType(type);
         }
         return null;
     }
 
-    public VariableSymbol resolveVariable(String name) 
-    {
+    public VariableSymbol resolveVariable(String name) {
         Symbol s = getMembers().get(name);
         if (debug()) System.out.println(
                 "SymbolWithScope.resolveVariable(" + name + 
@@ -79,8 +73,7 @@ public abstract class SymbolWithScope
 
     public MethodSymbol resolveMethod(
             String name, 
-            int numargs) 
-    {
+            int numargs) {
         if (debug()) System.out.println(
                 "SymbolWithScope.resolveMethod(" + name + "," + numargs +
                 "): examine " + this.getClass().getName() + "=" + toString());
@@ -114,16 +107,14 @@ public abstract class SymbolWithScope
     /** By default, pass up responsibility in scope hierarchy until we
      *  find a class.
      */
-    public boolean isMethod(String name) 
-    {
+    public boolean isMethod(String name) {
         if ( getEnclosingScope()!=null ) {
             return getEnclosingScope().isMethod(name);
         }
         return false;
     }
 
-    public Symbol remove(String name) 
-    {
+    public Symbol remove(String name) {
         Symbol s = (Symbol)getMembers().get(name);
         if ( s==null && getEnclosingScope() != null) {
             return getEnclosingScope().remove(name);
@@ -136,8 +127,7 @@ public abstract class SymbolWithScope
 
     public Symbol define(
             String name, 
-            Symbol sym) 
-    {
+            Symbol sym) {
         // check for error
         Map members = getMembers();
         if ( members == null ) {
@@ -151,21 +141,18 @@ public abstract class SymbolWithScope
     }
 
     /** create the member list; we're about to add stuff */
-    protected Map<String, Symbol> createMembers() 
-    {
+    protected Map<String, Symbol> createMembers() {
         return getMembers();
     }
 
     /** Scope defaults to just the symbol name; method f's scope is f by 
      *  default. 
      */
-    public String getScopeName() 
-    {
+    public String getScopeName() {
         return name;
     }
 
-    public String getFullyQualifiedName() 
-    {
+    public String getFullyQualifiedName() {
         String parent = null;
         if ( getEnclosingScope()!=null ) {
             parent = getEnclosingScope().getFullyQualifiedName();
index 2949e0a347d0504bb83dda1ef1f964fa1ee50214..9ceb66dc2dd82c228ad1d0cca2f049020d209d73 100644 (file)
@@ -127,7 +127,7 @@ public class Translator {
         StringTemplateGroup templates = getTemplates(templateFile);
         emitter.setTemplateLib(templates);
         StringTemplate st = 
-            (StringTemplate)emitter.charjSource(m).getTemplate();
+            (StringTemplate)emitter.charjSource(m_symtab, m).getTemplate();
         return st.toString();
     }
 
index a0ae312760669bc04a9342f7958a895498403118..4f6d17e42f3c0aa47a81cb4b299dd846ceba411f 100644 (file)
@@ -11,13 +11,11 @@ public class VariableSymbol extends Symbol {
     public VariableSymbol(
             SymbolTable symtab,
             String name,
-            ClassSymbol type) 
-    {
+            ClassSymbol type) {
         super(symtab, name, type);
     }
 
-    public String toString() 
-    {
+    public String toString() {
         StringBuffer buf = new StringBuffer();
         if ( scope!=null ) {
             buf.append(scope.getScopeName());
index d152f8f3b49d38d96cc25fbd93e557ed2ab4637d..eb083bef757f0b6031a88292cc9a303e2cf8d1f3 100644 (file)
@@ -1,5 +1,5 @@
 package tests;
-import charj.lang.Chare;
+import charj.lang.*;
 
 public class Fib extends Chare {
     Fib parent_;
@@ -33,4 +33,4 @@ public class Fib extends Chare {
            }
            parent.passUp(partialResult_); // replace with passUp(partialResult_)@parent;
        }
-}
\ No newline at end of file
+}