better package resolution, added proper package scoping to symbol table.
authorAaron Becker <abecker3@illinois.edu>
Fri, 25 Jul 2008 00:21:56 +0000 (00:21 +0000)
committerAaron Becker <abecker3@illinois.edu>
Fri, 25 Jul 2008 00:21:56 +0000 (00:21 +0000)
switched from c++-style :: syntax to java-style . syntax

12 files changed:
src/langs/charj/src/charj/translator/Charj.g
src/langs/charj/src/charj/translator/CharjEmitter.g
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/PackageScope.java
src/langs/charj/src/charj/translator/Scope.java
src/langs/charj/src/charj/translator/SymbolTable.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/Hello.cj

index 2ea190e00ef9cf67df329164694c3a41932331fd..d69970a341b8a78a19933471b9898420e3487365 100644 (file)
@@ -315,7 +315,8 @@ charjSource
 compilationUnit
     :   packageDeclaration? 
         importDeclaration* 
-        typeDecls*
+        typeDecls
+        //typeDecls*
     ;
 
 typeDecls
index d0fc158bb9a0cbd39a27c5352300ec28344f884e..f555a91afc27b5f00b6c9e69b9436936c2cb248f 100644 (file)
@@ -107,7 +107,10 @@ charjSource[OutputMode m]
     this.m_mode = m;
     String closingBraces = "";
 }
-    :   ^(CHARJ_SOURCE (p=packageDeclaration)? (i+=importDeclaration)* (t+=typeDeclaration)*)
+    :   ^(CHARJ_SOURCE (p=packageDeclaration)? 
+        (i+=importDeclaration)* 
+        (t=typeDeclaration))
+        //(t+=typeDeclaration)*)
         {
             // construct string of }'s to close namespace 
             if ($p.st != null) {
@@ -120,10 +123,10 @@ charjSource[OutputMode m]
             }
         }
         -> {emitCC()}? charjSource_cc(
-            pd={$p.st}, ids={$i}, tds={$t}, cb={closingBraces})
-        -> {emitCI()}? charjSource_ci(pd={$p.st}, ids={$i}, tds={$t})
+            pd={$p.st}, ids={$i}, tds={$t.st}, cb={closingBraces})
+        -> {emitCI()}? charjSource_ci(pd={$p.st}, ids={$i}, tds={$t.st})
         -> {emitH()}? charjSource_h(
-            pd={$p.st}, ids={$i}, tds={$t}, cb={closingBraces})
+            pd={$p.st}, ids={$i}, tds={$t.st}, cb={closingBraces})
         ->
     ;
 
@@ -143,8 +146,8 @@ packageDeclaration
 importDeclaration
     :   ^(IMPORT STATIC? qualifiedIdentifier DOTSTAR?)
         -> {(emitCC() || emitH())}? importDeclaration_cc_h(
-            inc_id={$qualifiedIdentifier.text.replaceAll("[.]","/")},
-            use_id={$qualifiedIdentifier.text.replaceAll("[.]","::")})
+            inc_id={$qualifiedIdentifier.text.replace(".","/")},
+            use_id={$qualifiedIdentifier.text.replace(".","::")})
         ->
     ;
     
index bc5a2dc34184acf7fcd1e4ba411dcb7958570aac..4618b7e9efd9445e29d914aa191199a39d53a2ea 100644 (file)
@@ -130,10 +130,13 @@ charjSource[SymbolTable _symtab] returns [ClassSymbol cs]
     symtab = _symtab;
     currentScope = symtab.getDefaultPkg();
 }
+    // TODO: go back to allowing multiple type definitions per file, check that
+    // there is exactly one public type and return that one.
     :   ^(CHARJ_SOURCE 
         (p=packageDeclaration)? 
         (i+=importDeclaration)* 
-        (t+=typeDeclaration)*)
+        (t=typeDeclaration))
+        //(t+=typeDeclaration)*)
         { $cs = null; }
     ;
 
@@ -142,6 +145,12 @@ packageDeclaration
     List<String> names = null; 
 }
     :   ^(PACKAGE qualifiedIdentifier)  {
+            String packageName = $qualifiedIdentifier.text;
+            PackageScope ps = symtab.resolvePackage(packageName);
+            if (ps == null) {
+                ps = symtab.definePackage(packageName);
+                symtab.addScope(ps);
+            }
             names =  java.util.Arrays.asList(
                     $qualifiedIdentifier.text.split("[.]"));
         }
@@ -198,45 +207,16 @@ classTopLevelScope
     ;
     
 classScopeDeclarations
-@init { boolean entry = false; }
     :   ^(CLASS_INSTANCE_INITIALIZER block)
     |   ^(CLASS_STATIC_INITIALIZER block)
     |   ^(FUNCTION_METHOD_DECL m=modifierList g=genericTypeParameterList? 
             ty=type IDENT f=formalParameterList a=arrayDeclaratorList? 
             tc=throwsClause? b=block?)
-        { 
-            // determine whether this is an entry method
-            entry = listContainsToken($m.start.getChildren(), ENTRY);
-//            CharjAST modList = (CharjAST)$m.start;
-//            for (CharjAST mod : (List<CharjAST>)modList.getChildren()) {
-//                if (mod.token.getType() == ENTRY) {
-//                    entry = true;
-//                }
-//            }
-        }
     |   ^(VOID_METHOD_DECL m=modifierList g=genericTypeParameterList? IDENT 
             f=formalParameterList t=throwsClause? b=block?)
-        { 
-            // determine whether this is an entry method
-            CharjAST modList = (CharjAST)$m.start;
-            for (CharjAST mod : (List<CharjAST>)modList.getChildren()) {
-                if (mod.token.getType() == ENTRY) {
-                    entry = true;
-                }
-            }
-        }
     |   ^(VAR_DECLARATION modifierList type variableDeclaratorList)
     |   ^(CONSTRUCTOR_DECL m=modifierList g=genericTypeParameterList? IDENT f=formalParameterList 
             t=throwsClause? b=block)
-        { 
-            // determine whether this is an entry method
-            CharjAST modList = (CharjAST)$m.start;
-            for (CharjAST mod : (List<CharjAST>)modList.getChildren()) {
-                if (mod.token.getType() == ENTRY) {
-                    entry = true;
-                }
-            }
-        }
     |   d=typeDeclaration
     ;
     
index 1f849bc7064792e8319eb9bbfdb3b8aead37d122..097540dcfe9f51e0416142dcb7852794ef1908af 100644 (file)
@@ -89,7 +89,7 @@ public class ClassSymbol extends SymbolWithScope implements Scope {
         }
 
         if ( symtab.translator.findPackage(packageName) != null ) {
-            p = symtab.definePkg(packageName);
+            p = symtab.definePackage(packageName);
             imports.put(packageName, p);
         }
 
@@ -127,7 +127,7 @@ public class ClassSymbol extends SymbolWithScope implements Scope {
         return name;
     }
 
-    /** Using the list of imports, resolve a package name like charj::lang.
+    /** Using the list of imports, resolve a package name like charj.lang.
      *  There may be many packages defined and visible to the symbol table
      *  but this class can only see those packages in the implicit or explicit
      *  import list.
@@ -147,10 +147,11 @@ public class ClassSymbol extends SymbolWithScope implements Scope {
      */
     public ClassSymbol resolveType(String type) 
     {
-        if ( debug() ) System.out.println(
+        if (debug()) System.out.println(
                 "ClassSymbol.resolveType(" + type + "): context is " + name +
                 ":" + members.keySet());
-        if ( type==null ) {
+
+        if (type == null) {
             return null;
         }
 
@@ -243,7 +244,7 @@ public class ClassSymbol extends SymbolWithScope implements Scope {
             parent = scope.getFullyQualifiedName();
         }
         if ( parent!=null ) {
-            return parent+"::"+name;
+            return parent+"."+name;
         }
         return name;
     }
index 9f7a0b9baa9e1523a00e9e92ac9813ce68365367..ecd87d444d5a4a8b1b55136120e6128993c9bd52 100644 (file)
@@ -91,7 +91,7 @@ public class MethodSymbol
     public String toString() 
     {
         StringTemplate st = new StringTemplate(
-                "<if(parent)><parent>::<endif><name>(<args; separator=\",\">)" +
+                "<if(parent)><parent>.<endif><name>(<args; separator=\",\">)" +
                 "<if(locals)>{<locals; separator=\",\">}<endif>",
                 AngleBracketTemplateLexer.class);
         st.setAttribute("parent", enclosingScope.getScopeName());
index 939d148f775c2cf96a87d7b6fee318ccdd8376e1..eeccdda79e03e1d12d426a481f7847b0b4d3e151 100644 (file)
@@ -26,8 +26,8 @@ public class PackageScope extends SymbolWithScope {
 
     /** See if type is already defined in this package.  If not, look
      *  for type on the disk in same package.  For example, first time
-     *  mantra::io::File fails to resolve.  Load from disk and put File
-     *  in package io which is in package mantra.  Next time, File will
+     *  charj.io.File fails to resolve.  Load from disk and put File
+     *  in package io which is in package charj.  Next time, File will
      *  be found.
      */
     public ClassSymbol resolveType(String type) 
index d214ec9b1bfa225680c2ed3e987fa79faa55c584..d876b47f2ecacbd0e63ac4e342a7eef3f27ecf22 100644 (file)
@@ -15,8 +15,6 @@ public interface Scope {
 
     public String getFullyQualifiedName();
 
-    public String getFullyQualifiedJavaName();    
-
     /** Return a Map of all contained members */
     public Map<String, Symbol> getMembers();
 
index f697c4d28fbe872ff5590ba31e693e8ed7f209a4..7c23bcd4c63e8065f26a280a00c8c709bb9143e2 100644 (file)
@@ -9,7 +9,7 @@ public class SymbolTable {
     public static final List<String> AUTO_IMPORTS = 
         new ArrayList<String>() {
             {
-                add("charj::lang");
+                add("charj.lang");
                 add(DEFAULT_PACKAGE_NAME);
             }
         };
@@ -31,7 +31,7 @@ public class SymbolTable {
     /** This is the list of all scopes created during symbol table building. */
     public List scopes = new ArrayList();
 
-    /** Root of the object hierarchy, Charj::Object */
+    /** Root of the object hierarchy, Charj.Object */
     ClassSymbol objectRoot;
 
     public SymbolTable(Translator _translator) 
@@ -40,8 +40,7 @@ public class SymbolTable {
         // define default package
         defaultPkg = new PackageScope(this, DEFAULT_PACKAGE_NAME, null);
         topLevelPackageScopes.put(DEFAULT_PACKAGE_NAME, defaultPkg);
-        // define mantra::lang
-        PackageScope lang = definePkg("charj::lang");
+        PackageScope lang = definePackage("charj.lang");
         addScope(defaultPkg);
     }
 
@@ -51,7 +50,7 @@ public class SymbolTable {
 
     protected void initObjectHierarchy() 
     {
-        PackageScope lang = resolvePackage("charj::lang");
+        PackageScope lang = resolvePackage("charj.lang");
         objectRoot = new ClassSymbol(this, "Object", null, lang);
         objectRoot.define("EOF", new VariableSymbol(this,"EOF",null));
         lang.define("Object", objectRoot);
@@ -61,20 +60,20 @@ public class SymbolTable {
         return objectRoot.resolveType(type);
     }
 
-    /** Given a package like foo or charj::io, define it by breaking it up and
+    /** 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 
      *  package.
      */
-    public PackageScope definePkg(String packageName) 
+    public PackageScope definePackage(String packageName) 
     {
-        String[] packageNames = packageName.split("::");
+        String[] packageNames = packageName.split("[.]");
         String outerPackageName = packageNames[0];
         PackageScope outerPackage = (PackageScope)defaultPkg.resolve(
                 outerPackageName);
         if ( outerPackage == null ) {
             if ( debug() ) {
                 System.out.println(
-                        " SymbolTable.definePkg(" + packageName + 
+                        " SymbolTable.definePackage(" + packageName + 
                         "): defining outer pkg: " + outerPackageName);
             }
             outerPackage = new PackageScope(this,outerPackageName,defaultPkg);
@@ -87,7 +86,7 @@ public class SymbolTable {
             PackageScope p = (PackageScope)enclosingPackage.resolve(pname);
             if ( p==null ) {
                 if ( debug() ) System.out.println(
-                        " SymbolTable.definePkg(" + packageName + 
+                        " SymbolTable.definePackage(" + packageName + 
                         "): defining inner pkg: " + pname +
                         " in "+enclosingPackage.toString());
                 
@@ -111,7 +110,7 @@ public class SymbolTable {
         if ( debug() ) System.out.println(
                 " SymbolTable.resolvePackage(" + packageName + 
                 "): examine: " + topLevelPackageScopes.keySet());
-        String[] packageNames = packageName.split("::");
+        String[] packageNames = packageName.split("[.]");
         String outerPackageName = packageNames[0];
         PackageScope enclosingPackage = topLevelPackageScopes.get(
                 outerPackageName);
index 340607d259f684f66c16499fcc83fa74369cd83c..d6775ebb3c08de058d4ad11cbe4c217ff7a50de5 100644 (file)
@@ -170,21 +170,10 @@ public abstract class SymbolWithScope
         if ( getEnclosingScope()!=null ) {
             parent = getEnclosingScope().getFullyQualifiedName();
         }
-        if ( parent!=null ) {
-            return parent + "::" + name;
-        }
-        return name;
-    }
-
-    public String getFullyQualifiedJavaName() 
-    {
-        String parent = null;
-        if ( getEnclosingScope()!=null ) {
-            parent = getEnclosingScope().getFullyQualifiedJavaName();
-        }
         if ( parent!=null ) {
             return parent + "." + name;
         }
         return name;
     }
+
 }
index 77be0517ceb031f8d2566c02ad144031e1f847ff..bf8a497e7f64b07c8637d024e8433437df91dfbd 100644 (file)
@@ -172,7 +172,7 @@ public class Translator {
 
     public File findPackage(String packageName)
     {
-        String packageDir = packageName.replaceAll("::", "/");
+        String packageDir = packageName.replace(".", "/");
         File p = new File(packageDir);
         if ( debug() ) System.out.println(
                 " [charj] findPackage " + packageName + 
@@ -220,7 +220,7 @@ public class Translator {
         try {
             String packageDir = ".";
             if ( packageName!=null ) {
-                packageDir = packageName.replaceAll("::", "/");
+                packageDir = packageName.replace(".", "/");
             }
             String fullName = packageDir + "/" + typeName + ".cj";
                
@@ -234,7 +234,7 @@ public class Translator {
 
             if (debug()) System.out.println(
                     " \tloadType(" + typeName + "): parsing " + 
-                    packageName + "::" + typeName);
+                    packageName + "." + typeName);
             
             ANTLRInputStream fs = new ANTLRInputStream(
                     cl.getResourceAsStream(fullName));
index 3be712fe728a157ce17fc2e5c370e88ba8b3ab0a..a0ae312760669bc04a9342f7958a895498403118 100644 (file)
@@ -21,7 +21,7 @@ public class VariableSymbol extends Symbol {
         StringBuffer buf = new StringBuffer();
         if ( scope!=null ) {
             buf.append(scope.getScopeName());
-            buf.append("::");
+            buf.append(".");
         }
         buf.append(name);
         return buf.toString();
index 0966a15a2c28fa5ec4436cebff6cf2ee73ce31d4..1cb3fba005841cbccfbfc58c1e08e0cbcc651704 100644 (file)
@@ -1,4 +1,4 @@
-package tests.Hello;
+package tests;
 //import charj.lang.someObject;
 
 public class Hello {