Charj : fixed namespace generation issues
authorMinas Charalambides <charala1@illinois.edu>
Sun, 23 May 2010 05:10:09 +0000 (00:10 -0500)
committerMinas Charalambides <charala1@illinois.edu>
Sun, 23 May 2010 05:10:09 +0000 (00:10 -0500)
            including the class related header file is issued before
            entering a namespace

src/langs/charj/src/charj/translator/Charj.g
src/langs/charj/src/charj/translator/Charj.stg
src/langs/charj/src/charj/translator/CharjEmitter.g
src/langs/charj/src/charj/translator/CharjSemantics.g
src/langs/charj/src/charj/translator/ClassSymbol.java

index 3e929c34136cca9c43bf5724d0a89b152b026ec5..3547067638df15180879f44fa3b2d8cc196731c4 100644 (file)
@@ -129,7 +129,8 @@ compilationUnit
     ;
 
 packageDeclaration
-    :   'package'^ qualifiedIdentifier ';'!  
+    :   'package' IDENT ('.' IDENT)+ ';'  
+        ->  ^('package' IDENT+)
     ;
 
 importDeclaration
index 5286fefa68f4e3a7c41e0fede0dfe5ca3bea86cc..22c46f5c6560e591cfbd01be77b833658f99da71 100644 (file)
@@ -49,7 +49,6 @@ charjSource_cc(pd, ids, tds, debug) ::=
 <pd>
 <tds>
 <if(debug)>/* \</CHARJ_SOURCE> */<endif>
-
 >>
 
 importDeclaration_cc_h(inc_id, use_id) ::= 
@@ -74,7 +73,16 @@ interfaceExtends(ts) ::=
 classDeclaration_h(sym, ident, ext, csds) ::=
 <<
 <sym.IncludeString>
-<sym.NamespaceOpeningString>
+<classDeclaration_h_cont(pds = sym.packageNames, sym = sym, ident = ident, ext = ext, csds = csds)>
+>>
+
+classDeclaration_h_cont(pds, sym, ident, ext, csds) ::=
+<<
+<if(first(pds))>namespace <first(pds)>
+{
+    <classDeclaration_h_cont(pds = rest(pds), sym = sym, ident = ident, ext = ext, csds = csds)>
+};
+<else>
 <if(ext)>
 class <ident> : public <ext> {
 <else>
@@ -83,14 +91,23 @@ class <ident> {
 
     <csds; separator="\n">
 };
-<sym.NamespaceClosingString>
-
+<endif>
 >>
 
+
 classDeclaration_cc(sym, ident, ext, csds) ::=
 <<
 <sym.IncludeString>
-<sym.NamespaceOpeningString>
+<classDeclaration_cc_cont(pds = sym.packageNames, sym = sym, ident = ident, ext = ext, csds = csds)>
+>>
+
+classDeclaration_cc_cont(pds, sym, ident, ext, csds) ::=
+<<
+<if(first(pds))>namespace <first(pds)>
+{
+    <classDeclaration_cc_cont(pds = rest(pds), sym = sym, ident = ident, ext = ext, csds = csds)>
+};
+<else>
 <if(ext)>
 class <ident>: public <ext> {
 <else>
@@ -99,32 +116,48 @@ class <ident> {
 
     <csds; separator="\n">
 };
-<sym.NamespaceClosingString>
-
+<endif>
 >>
 
+
 chareDeclaration_cc(sym, ident, ext, csds) ::=
 <<
-
 #include "<ident>.decl.h"
-<sym.NamespaceOpeningString>
-<if(ext)>/* superclass: <ext> */<endif>
+<chareDeclaration_cc_cont(pds = sym.packageNames, sym = sym, ident = ident, ext = ext, csds = csds)>
+#include "<ident>.def.h"
+>>
+
+chareDeclaration_cc_cont(pds, sym, ident, ext, csds) ::=
+<<
+<if(first(pds))>namespace <first(pds)>
+{
+    <chareDeclaration_cc_cont(pds = rest(pds), sym = sym, ident = ident, ext = ext, csds = csds)>
+};
+<else><if(ext)>/* superclass: <ext> */<endif>
 class <ident>: public CBase_<ident> {
     <csds; separator="\n">
 };
-<sym.NamespaceClosingString>
-#include "<ident>.def.h"
+<endif>
 >>
 
 chareDeclaration_h(sym, ident, ext, csds) ::=
 <<
 #include "<ident>.decl.h"
-<sym.NamespaceOpeningString>
+<chareDeclaration_h_cont(pds = sym.packageNames, sym = sym, ident = ident, ext = ext, csds = csds)>
+>>
+
+chareDeclaration_h_cont(pds, sym, ident, ext, csds) ::=
+<<
+<if(first(pds))>namespace <first(pds)>
+{
+    <chareDeclaration_h_cont(pds = rest(pds), sym = sym, ident = ident, ext = ext, csds = csds)>
+};
+<else>
 <if(ext)>/* superclass: <ext> */<endif>
 class <ident>: public CBase_<ident> {
     <csds; separator="\n">
 };
-<sym.NamespaceClosingString>
+<endif>
 >>
 
 chareDeclaration_ci(sym, chareType, arrayDim, ident, ext, csds) ::=
@@ -134,17 +167,24 @@ module <ident> {
 <if(ext)>
     extern module <ext>;
 <endif>
-    <sym.NamespaceOpeningString>
-    <chareType><if(arrayDim)> [<arrayDim>]<endif> <ident><if(ext)> : <ext><endif> {
-        <csds; separator="\n">
-    }
-    <sym.NamespaceClosingString>
 }
 
 <if(debug)>/* \</typeDeclaration> */<endif>
 
 >>
 
+chareDeclaration_ci_cont(pds, sym, chareType, arrayDim, ident, ext, csds) ::=
+<<
+<if(first(pds))>namespace <first(pds)>
+{
+    <chareDeclaration_ci_cont(pds = rest(pds), sym = sym, chareType = chareType, arrayDim = arrayDim, ident = ident, ext = ext, csds = csds)>
+};
+<else>
+<chareType><if(arrayDim)> [<arrayDim>]<endif> <ident><if(ext)> : <ext><endif> {
+        <csds; separator="\n">
+};
+<endif>
+>>
 
 funcMethodDecl_h(modl, gtpl, ty, id, fpl, adl, block) ::=
 <<
index e284d2514e3dd272efb315a52d7113966314759f..abc702bd56dc4de949162be285525be42eceeaa9 100644 (file)
@@ -85,19 +85,18 @@ charjSource[SymbolTable symtab, OutputMode m]
     :   ^(CHARJ_SOURCE (p=packageDeclaration)? 
         (i+=importDeclaration)* 
         (t=typeDeclaration))
-        -> {emitCC()}? charjSource_cc(
-            pd={$p.st}, ids={$i}, tds={$t.st}, debug={debug()})
-        -> {emitCI()}? charjSource_ci(pd={$p.st}, ids={$i}, tds={$t.st}, debug={debug()})
-        -> {emitH()}? charjSource_h(
-            pd={$p.st}, ids={$i}, tds={$t.st}, debug={debug()})
+        -> {emitCC()}? charjSource_cc(pd={$p.names}, ids={$i}, tds={$t.st}, debug={debug()})
+        -> {emitCI()}? charjSource_ci(pd={$p.names}, ids={$i}, tds={$t.st}, debug={debug()})
+        -> {emitH()}? charjSource_h(pd={$p.names}, ids={$i}, tds={$t.st}, debug={debug()})
         ->
     ;
 
 packageDeclaration
-@init { 
-    List<String> names = null; 
-}
-    :   ^('package' qualifiedIdentifier)
+returns [List names]
+    :   ^('package' (ids+=IDENT)+)
+        {
+            $names = $ids;
+        }
         ->
     ;
     
index 95379949c1ef3cc08d57efba7505c49581a27273..a8f04a1f2ad69735769671aa0f6858a90259e870 100644 (file)
@@ -95,8 +95,11 @@ packageDeclaration
 @init { 
     List<String> names = null; 
 }
-    :   ^('package' qualifiedIdentifier)  {
-            String packageName = $qualifiedIdentifier.text;
+    :   ^('package' (ids+=IDENT)+)  
+        {
+            String packageName = "";
+            for(Object o : $ids) packageName += '.' + ((CharjAST)o).getText();
+            packageName = packageName.substring(1);
             PackageScope ps = symtab.resolvePackage(packageName);
             if (ps == null) {
                 ps = symtab.definePackage(packageName);
@@ -104,7 +107,7 @@ packageDeclaration
             }
             currentPackage = ps;
             $ScopeStack::current = ps;
-            $qualifiedIdentifier.start.symbol = ps;
+//            $qualifiedIdentifier.start.symbol = ps; ----- commented out while dealing with the namespaces issue (Minas)
         }
     ;
     
index fd4c2033bfa0d77ad6346102e85df297cb77936e..95e5931ee80903a9bd04f13e4a03e6911d7d1000 100644 (file)
@@ -257,6 +257,15 @@ public class ClassSymbol extends SymbolWithScope implements Scope {
         return includeString;
     }
 
+    public List<String> getPackageNames()
+    {
+        List<String> list = new ArrayList<String>();
+        String namespace = "";
+        for(Scope currentScope = scope; currentScope != null; currentScope = currentScope.getEnclosingScope())
+            list.add(currentScope.getScopeName());
+        return list;
+    }
+
     public String getNamespaceOpeningString() {
         Scope currentScope = scope;
         String namespace = "";