Charj: improved type import mechanism and include/using codegen
authorAaron Becker <akbecker@gmail.com>
Fri, 28 May 2010 21:57:49 +0000 (16:57 -0500)
committerAaron Becker <akbecker@gmail.com>
Fri, 28 May 2010 21:57:49 +0000 (16:57 -0500)
src/langs/charj/src/charj/translator/Charj.stg
src/langs/charj/src/charj/translator/CharjSemantics.g
src/langs/charj/src/charj/translator/ClassSymbol.java
src/langs/charj/src/charj/translator/MethodSymbol.java
src/langs/charj/src/charj/translator/SymbolTable.java

index 18363b1b11e844c8505901eea0ed7b5cd4ff1f4b..8f0101bd21d124fadef7d0d8583800c831187659 100644 (file)
@@ -55,11 +55,19 @@ interfaceExtends(ts) ::=
 : public <ts; separator=", public ">
 >>
 
-classDeclaration_h(sym, ident, ext, csds) ::=
+type_preamble_h(sym) ::=
 <<
-<sym.IncludeString>
+<sym.Includes:{include| #include\<<include>\>
+}>
+<sym.Usings:{using| using <using>;
+}>
 <sym.MemberTypeNames:{name| class <name>;
 }>
+>>
+
+classDeclaration_h(sym, ident, ext, csds) ::=
+<<
+<type_preamble_h(sym)>
 <classDeclaration_h_cont(pds = sym.packageNames, sym = sym, ident = ident, ext = ext, csds = csds)>
 >>
 
@@ -84,7 +92,6 @@ class <ident> {
 
 classDeclaration_cc(sym, ident, ext, csds) ::=
 <<
-<sym.IncludeString>
 <classDeclaration_cc_cont(pds = sym.packageNames, sym = sym, ident = ident, ext = ext, csds = csds)>
 >>
 
@@ -120,6 +127,7 @@ chareDeclaration_cc_cont(pds, sym, ident, ext, csds) ::=
 
 chareDeclaration_h(sym, ident, ext, csds) ::=
 <<
+<type_preamble_h(sym)>
 #include "<ident>.decl.h"
 <chareDeclaration_h_cont(pds = sym.packageNames, sym = sym, ident = ident, ext = ext, csds = csds)>
 >>
index 1531a0f3d8062cb4648123be8a9ac09f23e31f96..b441a7b35018e2cb1f870bbe777c00395605d6ef 100644 (file)
@@ -182,7 +182,6 @@ scope ScopeStack;
 field [ClassSymbol type]
     :   ^(VAR_DECLARATOR ^(IDENT arrayDeclaratorList?) variableInitializer?)
     {
-            System.out.println("Found variable: " + $type + " " + $IDENT.text);
             VariableSymbol sym = new VariableSymbol(symtab, $IDENT.text, $type);
             sym.definition = $field.start;
             sym.definitionTokenStream = input.getTokenStream();
index 3e173312367557bdf8eec7f88b7c5f5fa3f1cd7d..3c31254593c25d407a70abb11482bc5e3c0d2e3b 100644 (file)
@@ -8,9 +8,10 @@ public class ClassSymbol extends SymbolWithScope implements Scope {
     public ClassSymbol superClass;
     public List<String> interfaceImpls;
 
-    Map<String, PackageScope> imports = 
+    Map<String, PackageScope> imports =
         new LinkedHashMap<String, PackageScope>();
     List<String> includes = new ArrayList<String>();
+    List<String> usings = new ArrayList<String>();
 
     /** Record of all fields and methods */
     public Map<String, Symbol> members = new LinkedHashMap<String, Symbol>();
@@ -21,7 +22,7 @@ public class ClassSymbol extends SymbolWithScope implements Scope {
     public boolean isPrimitive = false;
 
     public ClassSymbol(
-            SymbolTable symtab, 
+            SymbolTable symtab,
             String name) {
         super(symtab, name);
         type = this;
@@ -31,7 +32,7 @@ public class ClassSymbol extends SymbolWithScope implements Scope {
     }
 
     public ClassSymbol(
-            SymbolTable symtab, 
+            SymbolTable symtab,
             String name,
             ClassSymbol superClass,
             Scope scope) {
@@ -41,11 +42,19 @@ public class ClassSymbol extends SymbolWithScope implements Scope {
 
         // manually add automatic class methods and symbols here
         this.includes.add("charm++.h");
+        this.includes.add("list");
+        this.usings.add("std::list");
+        this.includes.add("string");
+        this.usings.add("std::string");
+        this.includes.add("vector");
+        this.usings.add("std::vector");
+        this.includes.add("map");
+        this.usings.add("std::map");
     }
 
     public Scope getEnclosingScope() {
         // at root?  Then use enclosing scope
-        if ( superClass==null ) { 
+        if ( superClass==null ) {
             return scope;
         }
         return superClass;
@@ -58,7 +67,7 @@ public class ClassSymbol extends SymbolWithScope implements Scope {
     /** Importing a package means adding the package to list of "filters"
      *  used by resolvePackage.  The resolve operation can only see classes
      *  defined in the imported packages.  This method asks the sym tab if
-     *  it is known before looking at corresponding dir on disk to see if it 
+     *  it is known before looking at corresponding dir on disk to see if it
      *  exists.
      *
      *  Return null if this class is not in sym tab and was not found in path.
@@ -67,7 +76,7 @@ public class ClassSymbol extends SymbolWithScope implements Scope {
         if (debug()) System.out.println(
                 "ClassSymbol.importPackage(" + packageName +
                 "): add to " + toString());
-        
+
         PackageScope p = symtab.resolvePackage(packageName);
         if ( p!=null ) {
             imports.put(packageName, p);
@@ -82,7 +91,7 @@ public class ClassSymbol extends SymbolWithScope implements Scope {
         }
 
         if ( p==null && debug() ) System.out.println(
-                "ClassSymbol.importPackage(" + packageName + 
+                "ClassSymbol.importPackage(" + packageName +
                 "): dir not found");
         return p;
     }
@@ -96,13 +105,13 @@ public class ClassSymbol extends SymbolWithScope implements Scope {
         return imports.get(packageName);
     }
 
-    /** To resolve a type in a class, look it up in each imported package 
-     *  including the current package. Classes cannot be defined in the 
+    /** To resolve a type in a class, look it up in each imported package
+     *  including the current package. Classes cannot be defined in the
      *  superclass so don't look upwards for types.
      *
      *  First check to see if we are resolving enclosing class then
      *  look for type in each imported package.  If not found in existing
-     *  packges, walk through imported packages again, trying to load from 
+     *  packges, walk through imported packages again, trying to load from
      *  disk.
      */
     public ClassSymbol resolveType(String type) {
@@ -116,7 +125,7 @@ public class ClassSymbol extends SymbolWithScope implements Scope {
 
         if ( name.equals(type) ) {
             if ( debug() ) System.out.println(
-                    "ClassSymbol.resolveType(" + type + 
+                    "ClassSymbol.resolveType(" + type +
                     "): surrounding class " + name + ":" + members.keySet());
             return this;
         }
@@ -129,8 +138,8 @@ public class ClassSymbol extends SymbolWithScope implements Scope {
             ClassSymbol cs = pkg.resolveType(type);
             if ( cs != null) { // stop looking, found it
                 if ( debug() ) System.out.println(
-                        "ClassSymbol.resolveType(" + type + 
-                        "): found in context " + name + ":" + 
+                        "ClassSymbol.resolveType(" + type +
+                        "): found in context " + name + ":" +
                         members.keySet());
                 return cs;
             }
@@ -152,18 +161,18 @@ public class ClassSymbol extends SymbolWithScope implements Scope {
         }
 
         if ( debug() ) System.out.println(
-                "ClassSymbol.resolveType(" + type + 
+                "ClassSymbol.resolveType(" + type +
                 "): not in context " + name + ":" + members.keySet());
         return null;
     }
 
     public MethodSymbol resolveMethodLocally(
-            String name, 
+            String name,
             int numargs) {
         if (numargs > 0) {
             name += numargs;
         }
-     
+
         return methods.get(name);
     }
 
@@ -178,7 +187,7 @@ public class ClassSymbol extends SymbolWithScope implements Scope {
     }
 
     public Symbol define(
-            String name, 
+            String name,
             Symbol sym) {
         members.put(name, sym);
         if (sym instanceof MethodSymbol) {
@@ -208,12 +217,18 @@ public class ClassSymbol extends SymbolWithScope implements Scope {
         includes.add(includeName);
     }
 
-    public String getIncludeString() {
-        String includeString = "";
-        for (String include : includes) {
-            includeString += "#include <" + include + ">\n";
-        }
-        return includeString;
+    public void getUsings(String usingName) {
+        usings.add(usingName);
+    }
+
+    public List<String> getIncludes()
+    {
+        return includes;
+    }
+
+    public List<String> getUsings()
+    {
+        return usings;
     }
 
     public List<String> getPackageNames()
index ecd87d444d5a4a8b1b55136120e6128993c9bd52..634009a3f9dcc84ee02ed46536fb520ad7944d0a 100644 (file)
@@ -7,8 +7,8 @@ import org.antlr.stringtemplate.language.AngleBracketTemplateLexer;
 import java.util.LinkedHashMap;
 import java.util.Map;
 
-public class MethodSymbol 
-    extends SymbolWithScope 
+public class MethodSymbol
+    extends SymbolWithScope
     implements Scope {
     /** The enclosing class */
     Scope enclosingScope;
@@ -22,13 +22,13 @@ public class MethodSymbol
     public boolean isStatic = false;
     public boolean isCtor = false;
 
-    public MethodSymbol(SymbolTable symtab) 
-    { 
-        super(symtab); 
+    public MethodSymbol(SymbolTable symtab)
+    {
+        super(symtab);
     }
 
     public MethodSymbol(
-            SymbolTable symtab, 
+            SymbolTable symtab,
             String name,
             Scope enclosingScope,
             ClassSymbol retType)
@@ -39,8 +39,8 @@ public class MethodSymbol
     }
 
     public VariableSymbol defineArg(
-            String name, 
-            ClassSymbol type) 
+            String name,
+            ClassSymbol type)
     {
         if ( orderedArgs.get(name)!=null ) {
             return null;
@@ -50,12 +50,12 @@ public class MethodSymbol
         return vs;
     }
 
-    public Scope getEnclosingScope() 
+    public Scope getEnclosingScope()
     {
         return enclosingScope;
     }
 
-    public LocalScope getLocalScope() 
+    public LocalScope getLocalScope()
     {
         return locals;
     }
@@ -65,12 +65,12 @@ public class MethodSymbol
         locals = s;
     }
 
-    public String getScopeName() 
+    public String getScopeName()
     {
-        return SymbolTable.mangle(name);
+        return name;
     }
 
-    public Map createMembers() 
+    public Map createMembers()
     {
         if ( orderedArgs==null ) {
             orderedArgs = new LinkedHashMap();
@@ -78,17 +78,17 @@ public class MethodSymbol
         return orderedArgs;
     }
 
-    public Map getMembers() 
+    public Map getMembers()
     {
         return orderedArgs;
     }
 
-    public String signature() 
+    public String signature()
     {
         return null;
     }
 
-    public String toString() 
+    public String toString()
     {
         StringTemplate st = new StringTemplate(
                 "<if(parent)><parent>.<endif><name>(<args; separator=\",\">)" +
@@ -101,7 +101,7 @@ public class MethodSymbol
         return st.toString();
     }
 
-    public int hashCode() 
+    public int hashCode()
     {
         return name.hashCode() + orderedArgs.size() + enclosingScope.hashCode();
     }
@@ -109,14 +109,14 @@ public class MethodSymbol
     /** Two methods are equals() when they have the same name and
      *  the same number of arguments in the same scope.
      */
-    public boolean equals(Object object) 
+    public boolean equals(Object object)
     {
         return name.equals(((MethodSymbol)object).name) &&
             orderedArgs.size()==((MethodSymbol)object).orderedArgs.size() &&
             enclosingScope == ((MethodSymbol)object).enclosingScope;
     }
 
-    public String getMangledName() 
+    public String getMangledName()
     {
         String mangled = name;
         boolean isCtor = name.equals(enclosingScope.getScopeName());
index fdec096a69db0b6964e6412570099b3aead5d36e..a51c8752c7581d3217d1abc629177271300459fd 100644 (file)
@@ -6,7 +6,7 @@ import java.util.*;
 
 public class SymbolTable {
     public static final String DEFAULT_PACKAGE_NAME = "default";
-    public static final List<String> AUTO_IMPORTS = 
+    public static final List<String> AUTO_IMPORTS =
         new ArrayList<String>() {
             {
                 add("charj.lang");
@@ -14,10 +14,10 @@ public class SymbolTable {
             }
         };
 
-    public static final Set<String> TYPE_NAMES_TO_MANGLE = 
+    public static final Set<String> TYPE_NAMES_TO_MANGLE =
         new HashSet<String>() { {} };
 
-    public static final Set<String> METHOD_NAMES_TO_MANGLE = 
+    public static final Set<String> METHOD_NAMES_TO_MANGLE =
         new HashSet<String>() { {} };
 
     public static Map<String, ClassSymbol> primitiveTypes =
@@ -37,13 +37,14 @@ public class SymbolTable {
     /** Root of the object hierarchy, Charj.lang.Object */
     ClassSymbol objectRoot;
 
-    public SymbolTable(Translator _translator) 
+    public SymbolTable(Translator _translator)
     {
         translator = _translator;
         // define default package
         defaultPkg = new PackageScope(this, DEFAULT_PACKAGE_NAME, null);
         topLevelPackageScopes.put(DEFAULT_PACKAGE_NAME, defaultPkg);
         PackageScope lang = definePackage("charj.lang");
+        PackageScope externals = definePackage("externals");
         addScope(defaultPkg);
         initObjectHierarchy();
     }
@@ -52,7 +53,7 @@ public class SymbolTable {
         return translator.debug();
     }
 
-    protected void initObjectHierarchy() 
+    protected void initObjectHierarchy()
     {
         PackageScope lang = resolvePackage("charj.lang");
         objectRoot = new ClassSymbol(this, "Object", null, lang);
@@ -63,9 +64,9 @@ public class SymbolTable {
         primitiveTypes.put("long",   new ClassSymbol(this, "long",   null, lang));
         primitiveTypes.put("float",  new ClassSymbol(this, "float",  null, lang));
         primitiveTypes.put("double", new ClassSymbol(this, "double", null, lang));
-        primitiveTypes.put("char",   new ClassSymbol(this, "char",   null, lang)); 
-        primitiveTypes.put("short",  new ClassSymbol(this, "short",  null, lang)); 
-        primitiveTypes.put("bool",   new ClassSymbol(this, "bool",   null, lang)); 
+        primitiveTypes.put("char",   new ClassSymbol(this, "char",   null, lang));
+        primitiveTypes.put("short",  new ClassSymbol(this, "short",  null, lang));
+        primitiveTypes.put("bool",   new ClassSymbol(this, "bool",   null, lang));
         for (Map.Entry<String, ClassSymbol> entry : primitiveTypes.entrySet()) {
             ClassSymbol c = entry.getValue();
             lang.define(entry.getKey(), c);
@@ -80,7 +81,7 @@ public class SymbolTable {
     }
 
     /** Given a package like foo or charj.io, define it by breaking it up and
-     *  looking up the packages to left of last id.  Add last id to that 
+     *  looking up the packages to left of last id.  Add last id to that
      *  package.
      */
     public PackageScope definePackage(String packageName) {
@@ -91,7 +92,7 @@ public class SymbolTable {
         if (outerPackage == null) {
             if (debug()) {
                 System.out.println(
-                        " SymbolTable.definePackage(" + packageName + 
+                        " SymbolTable.definePackage(" + packageName +
                         "): defining outer pkg: " + outerPackageName);
             }
             outerPackage = new PackageScope(this,outerPackageName,defaultPkg);
@@ -104,10 +105,10 @@ public class SymbolTable {
             PackageScope p = (PackageScope)enclosingPackage.resolve(pname);
             if (p==null) {
                 if (debug()) System.out.println(
-                        " SymbolTable.definePackage(" + packageName + 
+                        " SymbolTable.definePackage(" + packageName +
                         "): defining inner pkg: " + pname +
                         " in "+enclosingPackage.toString());
-                
+
                 p = new PackageScope(this,pname,enclosingPackage);
                 enclosingPackage.define(pname, p);
             }
@@ -125,7 +126,7 @@ public class SymbolTable {
      */
     public PackageScope resolvePackage(String packageName) {
         if (debug()) System.out.println(
-                " SymbolTable.resolvePackage(" + packageName + 
+                " SymbolTable.resolvePackage(" + packageName +
                 "): examine: " + topLevelPackageScopes.keySet());
         String[] packageNames = packageName.split("[.]");
         String outerPackageName = packageNames[0];
@@ -134,7 +135,7 @@ public class SymbolTable {
 
         if (enclosingPackage == null) {
             if (debug()) System.out.println(
-                    " SymbolTable.resolvePackage(" + packageName + 
+                    " SymbolTable.resolvePackage(" + packageName +
                     "): outer package " +
                     outerPackageName + " not found in top level " +
                     topLevelPackageScopes.keySet());
@@ -172,31 +173,6 @@ public class SymbolTable {
         scopes.add(s);
     }
 
-    // TODO:  shouldn't we include the arguments and do all mangling here?
-    public static String mangle(String methodName) {
-        if (METHOD_NAMES_TO_MANGLE.contains(methodName)) {
-            return "cj" + methodName;
-        }
-        return methodName;
-    }
-
-    public static String unmangle(String methodName) {
-        // this is not perfect because perhaps someone makes a method called
-        // mtoString() etc.
-        String unmangled = methodName.substring(2, methodName.length());
-        if (METHOD_NAMES_TO_MANGLE.contains(unmangled)) {
-            return unmangled;
-        }
-        return methodName;
-    }
-
-    public static String getCharjTypeName(String className) {
-        if (SymbolTable.TYPE_NAMES_TO_MANGLE.contains(className)) {
-            return "cj"+className;
-        }
-        return className;
-    }
-
     public String toString() {
         return scopes.toString();
     }