Charj : renamed PupRoutineCreator.java to AstModifier.java
authorMinas Charalambides <charala1@illinois.edu>
Mon, 31 May 2010 21:02:39 +0000 (16:02 -0500)
committerMinas Charalambides <charala1@illinois.edu>
Mon, 31 May 2010 21:05:07 +0000 (16:05 -0500)
            AstModifier.java is used in CharjASTModifier.g for
            general transformations on the incoming AST, which
            includes adding the necessary PUP nodes.

            Also, it alters the incoming modifier list for class
            scope definitions, so as to split the various types of
            modifiers into separate subtrees.

src/langs/charj/src/charj/translator/AstModifier.java [moved from src/langs/charj/src/charj/translator/PupRoutineCreator.java with 72% similarity]
src/langs/charj/src/charj/translator/Charj.g
src/langs/charj/src/charj/translator/Charj.stg
src/langs/charj/src/charj/translator/CharjASTModifier.g
src/langs/charj/src/charj/translator/CharjEmitter.g
src/langs/charj/src/charj/translator/CharjSemantics.g

similarity index 72%
rename from src/langs/charj/src/charj/translator/PupRoutineCreator.java
rename to src/langs/charj/src/charj/translator/AstModifier.java
index 5863e44eb55bfbd39a0dd5b7493b343b42920a7c..a2eec5534b1cfde8db598604c96cf383a8331bc2 100644 (file)
@@ -3,13 +3,14 @@ package charj.translator;
 import org.antlr.runtime.tree.CommonTree;
 import org.antlr.runtime.Token;
 import org.antlr.runtime.CommonToken;
+import java.util.*;
 
-class PupRoutineCreator
+class AstModifier
 {
     private CharjAST pupNode;
     private CharjAST initNode;
 
-    PupRoutineCreator()
+    AstModifier()
     {
         createPupNode();
         createInitNode();
@@ -40,7 +41,8 @@ class PupRoutineCreator
         initNode.addChild(createNode(CharjParser.FORMAL_PARAM_LIST, "FORMAL_PARAM_LIST"));
         initNode.addChild(createNode(CharjParser.BLOCK, "BLOCK"));
 
-        initNode.getChild(0).addChild(createNode(CharjParser.PRIVATE, "private"));
+        initNode.getChild(0).addChild(createNode(CharjParser.ACCESS_MODIFIER_LIST, "ACCESS_MODIFIER_LIST"));
+        initNode.getChild(0).getChild(0).addChild(createNode(CharjParser.PRIVATE, "private"));
     }
 
     private void createPupNode()
@@ -53,7 +55,8 @@ class PupRoutineCreator
         pupNode.addChild(createNode(CharjParser.FORMAL_PARAM_LIST, "FORMAL_PARAM_LIST"));
         pupNode.addChild(createNode(CharjParser.BLOCK, "BLOCK"));
 
-        pupNode.getChild(0).addChild(createNode(CharjParser.PUBLIC, "public"));
+        pupNode.getChild(0).addChild(createNode(CharjParser.ACCESS_MODIFIER_LIST, "ACCESS_MODIFIER_LIST"));
+        pupNode.getChild(0).getChild(0).addChild(createNode(CharjParser.PUBLIC, "public"));
 
         pupNode.getChild(3).addChild(createNode(CharjParser.FORMAL_PARAM_STD_DECL, "FORMAL_PARAM_STD_DECL"));
         pupNode.getChild(3).getChild(0).addChild(createNode(CharjParser.REFERENCE_TYPE, "REFERENCE_TYPE"));
@@ -83,7 +86,7 @@ class PupRoutineCreator
                     type = p.getType();
                     break;
                 case CharjParser.OBJECT_VAR_DECLARATION:
-                    type = p.getChild(0).getType();
+                    type = p.getChild(1).getType();
                     break;
                 case CharjParser.FUNCTION_METHOD_DECL:
                 case CharjParser.BLOCK:
@@ -104,13 +107,13 @@ class PupRoutineCreator
                             proxyVarPup(idNode);
                             break;
                         default:
-                            System.out.println("PupRoutineCreator.varPup: unknown type " + idNode);
+                            System.out.println("AstModifier.varPup: unknown type " + idNode);
                             break;
                     }
                     return;
             }
         }
-        System.out.println("PupRoutineCreator.varPup: could not pup variable " + idNode);
+        System.out.println("AstModifier.varPup: could not pup variable " + idNode);
     }
 
     protected void primitiveVarPup(CharjAST idNode)
@@ -149,7 +152,7 @@ class PupRoutineCreator
         initNode.getChild(4).getChild(index).getChild(0).addChild(idNode.dupNode());
         initNode.getChild(4).getChild(index).getChild(0).addChild(createNode(CharjParser.NEW, "new"));
         initNode.getChild(4).getChild(index).getChild(0).getChild(1).addChild(createNode(CharjParser.QUALIFIED_TYPE_IDENT, "QUALIFIED_TYPE_IDENT"));
-        initNode.getChild(4).getChild(index).getChild(0).getChild(1).getChild(0).addChild(idNode.getParent().getParent().getParent().getChild(0).getChild(0).getChild(0).dupTree());
+        initNode.getChild(4).getChild(index).getChild(0).getChild(1).getChild(0).addChild(idNode.getParent().getParent().getParent().getChild(1).getChild(0).getChild(0).dupTree());
         initNode.getChild(4).getChild(index).getChild(0).getChild(1).addChild(createNode(CharjParser.ARGUMENT_LIST, "ARGUMENT_LIST"));
 
         // add stuff to the pup routine
@@ -186,4 +189,67 @@ class PupRoutineCreator
         pupNode.getChild(4).getChild(index).getChild(1).getChild(0).getChild(0).addChild(createNode(CharjParser.ARGUMENT_LIST, "ARGUMENT_LIST"));
     }
 
+    protected void arrangeModifiers(CharjAST modlistNode)
+    {
+        CharjAST accessList = createNode(CharjParser.ACCESS_MODIFIER_LIST, "ACCESS_MODIFIER_LIST");
+        CharjAST localList = createNode(CharjParser.LOCAL_MODIFIER_LIST, "LOCAL_MODIFIER_LIST");
+        CharjAST charjList = createNode(CharjParser.CHARJ_MODIFIER_LIST, "CHARJ_MODIFIER_LIST");
+        CharjAST otherList = createNode(CharjParser.CHARJ_MODIFIER_LIST, "OTHER_MODIFIER_LIST");
+
+
+        Iterator<CharjAST> iter = modlistNode.getChildren().iterator();
+        
+        while(iter.hasNext())
+        {
+            CharjAST mod = iter.next();
+            iter.remove();
+
+            switch(mod.getType())
+            {
+                case CharjParser.PUBLIC:
+                case CharjParser.PRIVATE:
+                case CharjParser.PROTECTED:
+                    accessList.addChild(mod.dupNode());
+                    break;
+                case CharjParser.ENTRY:
+                    charjList.addChild(mod.dupNode());
+                    break;
+                case CharjParser.FINAL:
+                case CharjParser.STATIC:
+                case CharjParser.VOLATILE:
+                    localList.addChild(mod.dupNode());
+                    break;
+                case CharjParser.ABSTRACT:
+                case CharjParser.NATIVE:
+                    otherList.addChild(mod.dupNode());
+                    break;
+            }
+        }
+
+       if(accessList.getChildren() == null)
+           accessList.addChild(createNode(CharjParser.PRIVATE, "private"));
+
+       modlistNode.addChild(accessList);
+       if(localList.getChildren() != null) modlistNode.addChild(localList);
+       if(charjList.getChildren() != null) modlistNode.addChild(charjList);
+       if(otherList.getChildren() != null) modlistNode.addChild(otherList);
+    }
+
+    protected void fillPrivateModifier(CharjAST declNode)
+    {
+        CharjAST modlist = createNode(CharjParser.MODIFIER_LIST, "MODIFIER_LIST");
+        modlist.addChild(createNode(CharjParser.ACCESS_MODIFIER_LIST, "ACCESS_MODIFIER_LIST"));
+        modlist.getChild(0).addChild(createNode(CharjParser.PRIVATE, "private"));
+        
+        ArrayList<CharjAST> list = new ArrayList<CharjAST>();
+        list.addAll(declNode.getChildren());
+
+        declNode.getChildren().clear();
+
+        declNode.addChild(modlist);
+
+        for(CharjAST c : list)
+            declNode.addChild(c);
+    }
+
 }
index 8e5c93c0d2067c1f4c66aa4fb851afd16a758ede..71a538635593a49a8923cfdb287d509a448ffa38 100644 (file)
@@ -164,7 +164,6 @@ tokens {
     INTERFACE_TOP_LEVEL_SCOPE;
     IMPLEMENTS_CLAUSE;
     LABELED_STATEMENT;
-    LOCAL_MODIFIER_LIST;
     CHARJ_SOURCE;
     METHOD_CALL;
     ENTRY_METHOD_CALL;
@@ -189,6 +188,10 @@ tokens {
     VAR_DECLARATOR;
     VAR_DECLARATOR_LIST;
     ARROW;
+    LOCAL_MODIFIER_LIST;
+    ACCESS_MODIFIER_LIST;
+    CHARJ_MODIFIER_LIST;
+    OTHER_MODIFIER_LIST;
 }
 
 @header {
index 0f277a4201a6b52c13f9dc61ce54f769c7e7a6b1..5b6dee12fd43eff3ccad38d1e8cd00e83b8833be 100644 (file)
@@ -172,38 +172,38 @@ chareDeclaration_ci_cont(pds, sym, chareType, arrayDim, ident, ext, csds) ::=
 
 funcMethodDecl_h(modl, gtpl, ty, id, fpl, adl, block) ::=
 <<
-<if(first(modl))><modl; separator=" ">: <endif><ty><gtpl> <id><fpl><adl>;
+<modl><ty><gtpl> <id><fpl><adl>;
 >>
 
 
 funcMethodDecl_ci(modl, gtpl, ty, id, fpl, adl, block) ::=
 <<
-entry <ty><gtpl> <id><fpl><adl>;
+<modl><ty><gtpl> <id><fpl><adl>;
 >>
 
 
 funcMethodDecl_cc(sym, modl, gtpl, ty, id, fpl, adl, block) ::=
 <<
-<ty><gtpl> <sym.Name>::<id><fpl><adl>
+<modl><ty><gtpl> <sym.Name>::<id><fpl><adl>
 <block>
 >>
 
 
 ctorDecl_ci(modl, gtpl, id, fpl, block) ::=
 <<
-entry void<gtpl> <id><fpl>;
+<modl>void<gtpl> <id><fpl>;
 >>
 
 
 ctorDecl_h(modl, gtpl, id, fpl, block) ::=
 <<
-<if(modl)><modl; separator=" ">: <endif><id><fpl>;
+<modl><endif><id><fpl>;
 >>
 
 
 ctorDecl_cc(modl, gtpl, id, fpl, block) ::=
 <<
-<id>::<id><fpl>
+<modl><id>::<id><fpl>
 <block>
 >>
 
@@ -226,7 +226,7 @@ embed_cc(str, blk) ::=
 
 class_var_decl(modl, type, declList) ::=
 <<
-<if(modl)><modl>:<else>public:<endif> <type> <declList>;
+<modl><type> <declList>;
 >>
 
 
@@ -254,17 +254,20 @@ var_id_decl(id, adl) ::=
 >>
 
 
-mod_list(mods) ::=
+mod_list_cc(accmods, localmods, charjmods, othermods) ::=
 <<
-<if(mods)><mods; separator=" "><endif>
+<if(localmods)><localmods; separator=" "> <endif><if(othermods)><othermods; separator=" "> <endif>
 >>
 
-
-local_mod_list(mods) ::=
+mod_list_h(accmods, localmods, charjmods, othermods) ::=
 <<
-<if(mods)><mods; separator=" "><endif>
+<if(accmods)><accmods; separator=" ">: <endif><if(othermods)><othermods; separator=" "> <endif>
 >>
 
+mod_list_ci(accmods, localmods, charjmods, othermods) ::=
+<<
+<if(charjmods)><charjmods; separator=" "> <endif>
+>>
 
 local_var_decl(modList, type, declList) ::=
 <<
index d1fe39684a9d39c0b8ea21093bf4c82fbd7538a6..16c7185979b51211619d275cf7dacc0d34052785 100644 (file)
@@ -26,7 +26,7 @@ package charj.translator;
     LocalScope currentLocalScope = null;
     Translator translator;
 
-    PupRoutineCreator puper = new PupRoutineCreator();
+    AstModifier astmod = new AstModifier();
 }
 
 // Replace default ANTLR generated catch clauses with this action, allowing early failure.
@@ -63,9 +63,9 @@ importDeclarations returns [List<CharjAST> packageNames]
 typeDeclaration[List<CharjAST> imports] returns [ClassSymbol sym]
     :   ^(TYPE (CLASS | chareType) IDENT (^('extends' parent=type))? (^('implements' type+))? classScopeDeclaration*)
         {
-            $TYPE.tree.addChild(puper.getPupRoutineNode());
-            $TYPE.tree.addChild(puper.getInitRoutineNode());
-            puper = new PupRoutineCreator();
+            $TYPE.tree.addChild(astmod.getPupRoutineNode());
+            $TYPE.tree.addChild(astmod.getInitRoutineNode());
+            astmod = new AstModifier();
         }
     |   ^(INTERFACE IDENT (^('extends' type+))?  interfaceScopeDeclaration*)
     |   ^(ENUM IDENT (^('implements' type+))? enumConstant+ classScopeDeclaration*)
@@ -87,10 +87,26 @@ classScopeDeclaration
     :   ^(FUNCTION_METHOD_DECL m=modifierList? g=genericTypeParameterList? 
             ty=type IDENT f=formalParameterList a=arrayDeclaratorList? 
             b=block?)
-    |   ^(PRIMITIVE_VAR_DECLARATION modifierList? simpleType variableDeclaratorList)
-    |   ^(OBJECT_VAR_DECLARATION modifierList? objectType variableDeclaratorList)
+        {
+            if($m.tree == null)
+                astmod.fillPrivateModifier($FUNCTION_METHOD_DECL.tree);
+        }
+    |   ^(PRIMITIVE_VAR_DECLARATION m = modifierList? simpleType variableDeclaratorList)
+        {
+            if($m.tree == null)
+                astmod.fillPrivateModifier($PRIMITIVE_VAR_DECLARATION.tree);
+        }
+    |   ^(OBJECT_VAR_DECLARATION m = modifierList? objectType variableDeclaratorList)
+        {
+            if($m.tree == null)
+                astmod.fillPrivateModifier($OBJECT_VAR_DECLARATION.tree);
+        }
     |   ^(CONSTRUCTOR_DECL m=modifierList? g=genericTypeParameterList? IDENT f=formalParameterList 
             b=block)
+        {
+            if($m.tree == null)
+                astmod.fillPrivateModifier($CONSTRUCTOR_DECL.tree);
+        }
     ;
     
 interfaceScopeDeclaration
@@ -114,7 +130,7 @@ variableDeclarator
 variableDeclaratorId
     :   ^(IDENT arrayDeclaratorList?)
         {
-            puper.varPup($IDENT);
+            astmod.varPup($IDENT);
         }
     ;
 
@@ -145,12 +161,15 @@ bound
 
 modifierList
     :   ^(MODIFIER_LIST modifier+)
+        {
+            astmod.arrangeModifiers($MODIFIER_LIST.tree);
+        }
     ;
 
 modifier
     :   PUBLIC
-    |   PROTECTED
     |   PRIVATE
+    |   PROTECTED
     |   ENTRY
     |   ABSTRACT
     |   NATIVE
index b6a342d5475d24f6d8bc945644bb7ace622e9c50..c6c33b66af149d615b2c59bfaecf8a970c833731 100644 (file)
@@ -182,26 +182,21 @@ enumConstant
     ;
 
 classScopeDeclaration
-@init {
-  boolean entry = false;
-  List<String> modList = new ArrayList<String>();
+@init
+{
+    boolean entry = false;
 }
     :   ^(FUNCTION_METHOD_DECL m=modifierList? g=genericTypeParameterList? 
             ty=type IDENT f=formalParameterList a=arrayDeclaratorList? 
             b=block?)
-        { 
-            if ($m.st != null) {
-                // determine whether this is an entry method
-                entry = listContainsToken($m.start.getChildren(), ENTRY);
-                for(Object o : $m.names) {
-                    if (o.equals("entry")) continue;
-                    else modList.add(o.toString());
-                }
-            }
+        {
+            // determine whether it's an entry method
+            if($m.start != null)
+                entry = listContainsToken($m.start.getChildren(), CHARJ_MODIFIER_LIST);
         }
         -> {emitCC()}? funcMethodDecl_cc(
                 sym={currentClass},
-                modl={modList}, 
+                modl={$m.st}, 
                 gtpl={$g.st}, 
                 ty={$ty.st},
                 id={$IDENT.text}, 
@@ -209,7 +204,7 @@ classScopeDeclaration
                 adl={$a.st},
                 block={$b.st})
         -> {emitH()}? funcMethodDecl_h(
-                modl={modList}, 
+                modl={$m.st}, 
                 gtpl={$g.st}, 
                 ty={$ty.st},
                 id={$IDENT.text}, 
@@ -238,30 +233,25 @@ classScopeDeclaration
             declList={$variableDeclaratorList.st})
         ->
     |   ^(CONSTRUCTOR_DECL m=modifierList? g=genericTypeParameterList? IDENT f=formalParameterList b=block)
-        { 
-            // determine whether this is an entry method
-            if ($m.st != null) {
-                entry = listContainsToken($m.start.getChildren(), ENTRY);
-                for(Object o : $m.names) {
-                    if (o.equals("entry")) continue;
-                    else modList.add(o.toString());
-                }
-            }
+        {
+            // determine whether it's an entry method
+            if($m.start != null)
+                entry = listContainsToken($m.start.getChildren(), CHARJ_MODIFIER_LIST);
         }
         -> {emitCC()}? ctorDecl_cc(
-                modl={modList},
+                modl={$m.st},
                 gtpl={$g.st}, 
                 id={$IDENT.text}, 
                 fpl={$f.st}, 
                 block={$b.st})
         -> {emitCI() && entry}? ctorDecl_ci(
-                modl={modList},
+                modl={$m.st},
                 gtpl={$g.st}, 
                 id={$IDENT.text}, 
                 fpl={$f.st}, 
                 block={$b.st})
         -> {emitH()}? ctorDecl_h(
-                modl={modList},
+                modl={$m.st},
                 gtpl={$g.st}, 
                 id={$IDENT.text}, 
                 fpl={$f.st}, 
@@ -331,43 +321,87 @@ throwsClause
     ;
 
 modifierList
-returns [List<String> names]
-    :   ^(MODIFIER_LIST (m+=modifier)+)
-        {
-          $names = new ArrayList<String>();
-          for(Object o : $m) $names.add(o.toString());
-        }
-        -> mod_list(mods={$m})
+    :   ^(MODIFIER_LIST accessModifierList? localModifierList? charjModifierList? otherModifierList?)
+        ->  {emitCC()}? mod_list_cc(accmods = {$accessModifierList.names}, localmods = {$localModifierList.names}, charjmods = {$charjModifierList.names}, othermods = {$otherModifierList.names})
+        ->  {emitH()}? mod_list_h(accmods = {$accessModifierList.names}, localmods = {$localModifierList.names}, charjmods = {$charjModifierList.names}, othermods = {$otherModifierList.names})
+        ->  {emitCI()}? mod_list_ci(accmods = {$accessModifierList.names}, localmods = {$localModifierList.names}, charjmods = {$charjModifierList.names}, othermods = {$otherModifierList.names})
+        ->
     ;
 
 modifier
-@init {
-$st = %{$start.getText()};
-}
-    :   PUBLIC
-    |   PROTECTED
-    |   PRIVATE
-    |   ENTRY
-    |   ABSTRACT
-    |   NATIVE
+    :   accessModifier
     |   localModifier
-        -> {$localModifier.st}
+    |   charjModifier
+    |   otherModifier
     ;
 
+accessModifierList
+returns [List names]
+    :   ^(ACCESS_MODIFIER_LIST (m+=accessModifier)+)
+        {
+            $names = $m;
+        }
+    ;
 localModifierList
+returns [List names]
     :   ^(LOCAL_MODIFIER_LIST (m+=localModifier)+)
-        -> local_mod_list(mods={$m})
+        {
+            $names = $m;
+        }
     ;
 
+charjModifierList
+returns [List names]
+    :   ^(CHARJ_MODIFIER_LIST (m+=charjModifier)+)
+        {
+            $names = $m;
+        }
+    ;
+
+otherModifierList
+returns [List names]
+    :   ^(OTHER_MODIFIER_LIST (m+=otherModifier)+)
+        {
+            $names = $m;
+        }
+    ;
+    
 localModifier
-@init {
-$st = %{$start.getText()};
+@init
+{
+    $st = %{$start.getText()};
 }
     :   FINAL
     |   STATIC
     |   VOLATILE
     ;
 
+accessModifier
+@init
+{
+    $st = %{$start.getText()};
+}
+    :   PUBLIC
+    |   PROTECTED
+    |   PRIVATE
+    ;
+
+charjModifier
+@init
+{
+    $st = %{$start.getText()};
+}
+    :   ENTRY
+    ;
+
+otherModifier
+@init
+{
+    $st = %{$start.getText()};
+}
+    :   ABSTRACT
+    |   NATIVE
+    ;
     
 type
     :   simpleType
index 079c9130f219092e39cf64bcd0d5caead6ebbc37..9c65ff12311a8831ad278c490455c73384cfd776 100644 (file)
@@ -238,29 +238,53 @@ bound
     ;
 
 modifierList
-    :   ^(MODIFIER_LIST modifier+)
+    :   ^(MODIFIER_LIST accessModifierList? localModifierList? charjModifierList? otherModifierList?)
     ;
 
 modifier
-    :   PUBLIC
-    |   PROTECTED
-    |   ENTRY
-    |   PRIVATE
-    |   ABSTRACT
-    |   NATIVE
+    :   accessModifier
     |   localModifier
+    |   charjModifier
+    |   otherModifier
     ;
 
 localModifierList
     :   ^(LOCAL_MODIFIER_LIST localModifier+)
     ;
 
+accessModifierList
+    :   ^(ACCESS_MODIFIER_LIST accessModifier+)
+    ;
+
+charjModifierList
+    :   ^(CHARJ_MODIFIER_LIST charjModifier+)
+    ;
+
+otherModifierList
+    :   ^(OTHER_MODIFIER_LIST otherModifier+)
+    ;
+    
 localModifier
     :   FINAL
     |   STATIC
     |   VOLATILE
     ;
 
+accessModifier
+    :   PUBLIC
+    |   PROTECTED
+    |   PRIVATE
+    ;
+
+charjModifier
+    :   ENTRY
+    ;
+
+otherModifier
+    :   ABSTRACT
+    |   NATIVE
+    ;
+
 type
     :   simpleType
     |   objectType