Small changes to finalize some array work
authorJonathan Lifflander <jliffl2@illinois.edu>
Mon, 7 Jun 2010 20:38:02 +0000 (15:38 -0500)
committerJonathan Lifflander <jliffl2@illinois.edu>
Mon, 7 Jun 2010 20:38:02 +0000 (15:38 -0500)
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
src/langs/charj/src/charj/translator/Translator.java
src/langs/charj/tests/unit/Template.cj

index 9c1752abdc5f7276c6574c4616d159010e077f04..5266339cadd25b072788c29248a1030685dcc6d0 100644 (file)
@@ -215,14 +215,13 @@ embed_cc(str, blk) ::=
 >>
 
 
-class_var_decl(modl, type, declList, domainExps) ::=
+class_var_decl(modl, type, declList) ::=
 <<
 <if(modl)>
 <modl>:
 <else>
-public:
+public: 
 <endif>
-<domainExps; separator="; ">
 <type> <declList>;
 >>
 
@@ -241,7 +240,7 @@ var_decl(id, initializer) ::=
 
 var_decl_id(id, domainExp) ::=
 <<
-<id><if(domainExp)> <domainExp><endif>
+<id><if(domainExp)>(<domainExp>)<endif>
 >>
 
 
@@ -265,7 +264,6 @@ local_mod_list(mods) ::=
 
 local_var_decl(modList, type, declList, domainExps) ::=
 <<
-<domainExps>
 <if(modList)>
 <modList> <type> <declList>
 <else>
@@ -409,10 +407,10 @@ arguments(exprs) ::=
 <exprs; separator=", ">
 >>
 
-range_constructor(range, others) ::=
+range_constructor(range, others, len) ::=
 <<
 <if(range)>
-(new Domain(<range>)<if(others)>, <others; separator=", "><endif>)
+Domain\<<len>\>(<range>)<if(others)>, <others; separator=", "><endif>
 <else>
 <endif>
 >>
\ No newline at end of file
index 939a1b1cbb7b627fa6320d6ba74a12c27f6bad56..0406c7033abf669d14f648d9993cfb5722145b58 100644 (file)
@@ -257,29 +257,22 @@ classScopeDeclaration
                 fpl={$f.st}, 
                 block={$b.st})
         ->
-    |   ^(PRIMITIVE_VAR_DECLARATION modifierList? simpleType (^(vdl=VAR_DECLARATOR_LIST (^(VAR_DECLARATOR (^(IDENT de+=(domainExpression[null])?)) variableInitializer[null]?))+)))
+    |   ^(PRIMITIVE_VAR_DECLARATION modifierList? simpleType variableDeclaratorList[null, false])
         -> {emitCC() || emitH()}? class_var_decl(
             modl={$modifierList.st},
             type={$simpleType.st},
-            domainExps={$de},
-            declList={$vdl})
+            declList={$variableDeclaratorList.st})
         ->
-//(^(VAR_DECLARATOR_LIST variableDeclarator+))
-    |   ^(OBJECT_VAR_DECLARATION modifierList? objectType variableDeclaratorList[$objectType.st])
-
-       // {
-           //     /*List<StringTemplate> stlist = new ArrayList<StringTemplate>();
-           //     for (CharjAST domain : $variableDeclaratorList.domains) {
-           //         //stlist.add(domain.st);
-        //         System.out.println(domain.toString());
-        //     }*/
-           // }
-
+    |   ^(OBJECT_VAR_DECLARATION modifierList? objectType variableDeclaratorList[$objectType.st, false])
+        /*{
+            if ($currentClass != null) {
+                $currentClass.members.put(
+            }
+        }*/
         -> {emitCC() || emitH()}? class_var_decl(
             modl={$modifierList.st},
             type={$objectType.st},
             declList={$variableDeclaratorList.st})
-            //domainExps={$variableDeclaratorList.domains})
         ->
     |   ^(CONSTRUCTOR_DECL m=modifierList? g=genericTypeParameterList? IDENT f=formalParameterList b=block)
         { 
@@ -314,31 +307,35 @@ interfaceScopeDeclaration
         -> template(t={$text}) "/*interfaceScopeDeclarations-not implemented */ <t>"
     |   ^(VOID_METHOD_DECL modifierList? genericTypeParameterList? IDENT formalParameterList)
         -> template(t={$text}) "/*interfaceScopeDeclarations-not implemented */ <t>"
-    |   ^(PRIMITIVE_VAR_DECLARATION modifierList? simpleType variableDeclaratorList[$simpleType.st])
+    |   ^(PRIMITIVE_VAR_DECLARATION modifierList? simpleType variableDeclaratorList[$simpleType.st, false])
         -> template(t={$text}) "/*interfaceScopeDeclarations-not implemented */ <t>"
-    |   ^(OBJECT_VAR_DECLARATION modifierList? objectType variableDeclaratorList[$objectType.st])
+    |   ^(OBJECT_VAR_DECLARATION modifierList? objectType variableDeclaratorList[$objectType.st, false])
         -> template(t={$text}) "/*interfaceScopeDeclarations-not implemented */ <t>"
     ;
 
-variableDeclaratorList[StringTemplate obtype]
-    :   ^(VAR_DECLARATOR_LIST (var_decls+=variableDeclarator[obtype])+ )
+variableDeclaratorList[StringTemplate obtype, boolean output]
+    :   ^(VAR_DECLARATOR_LIST (var_decls+=variableDeclarator[obtype, output])+ )
         -> var_decl_list(var_decls={$var_decls})
     ;
 
-variableDeclarator[StringTemplate obtype]
-    :   ^(VAR_DECLARATOR id=variableDeclaratorId initializer=variableInitializer[obtype]?)
-        -> var_decl(id={$id.st}, initializer={$initializer.st})
+variableDeclarator[StringTemplate obtype, boolean output]
+    :   ^(VAR_DECLARATOR id=variableDeclaratorId[output] initializer=variableInitializer[obtype, output]?)
+        -> {$output}? var_decl(id={$id.st}, initializer={$initializer.st})
+        -> {!$output}? var_decl(id={$id.st})
+        ->
     ;
     
-variableDeclaratorId
-    :   ^(IDENT domainExpression[null]?)
-        -> var_decl_id(id={$IDENT.text}, domainExp={$domainExpression.st})
+variableDeclaratorId[boolean output]
+    :   ^(IDENT de=domainExpression[null]?)
+        -> {$output}? var_decl_id(id={$IDENT.text}, domainExp={$de.st})
+        -> {!$output}? var_decl_id(id={$IDENT.text})
+        ->
     ;
 
-variableInitializer[StringTemplate obtype]
+variableInitializer[StringTemplate obtype, boolean output]
     :   arrayInitializer
         -> {$arrayInitializer.st}
-    |   newExpression[obtype]
+    |   newExpression[obtype, output]
         -> {$newExpression.st}
     ;
 
@@ -351,17 +348,19 @@ rangeItem
 
 rangeExpression
     :   ^(RANGE_EXPRESSION (ri+=rangeItem)*)
-        -> template(t={$ri}) "new Range(<t; separator=\",\">)"
+        -> template(t={$ri}) "Range(<t; separator=\",\">)"
     ;
 
-rangeList
+rangeList returns [int len]
     :   (r+=rangeExpression)*
+        { $len = $r.size(); }
         -> template(t={$r}) "<t; separator=\", \">"
+        
     ;
 
 domainExpression[List<StringTemplate> otherParams]
     :   ^(DOMAIN_EXPRESSION rl=rangeList)
-        -> range_constructor(range={$rl.st}, others={$otherParams}
+        -> range_constructor(range={$rl.st}, others={$otherParams}, len={$rl.len})
 
     ;
 
@@ -371,7 +370,7 @@ domainExpression[List<StringTemplate> otherParams]
     ;*/
     
 arrayInitializer
-    :   ^(ARRAY_INITIALIZER variableInitializer[null]*)
+    :   ^(ARRAY_INITIALIZER variableInitializer[null, false]*)
         -> template(t={$text}) "/* arrayInitializer-not implemented */ <t>"
     ;
 
@@ -509,12 +508,12 @@ formalParameterList
     ;
     
 formalParameterStandardDecl
-    :   ^(FORMAL_PARAM_STD_DECL lms=localModifierList? t=type vdid=variableDeclaratorId)
+    :   ^(FORMAL_PARAM_STD_DECL lms=localModifierList? t=type vdid=variableDeclaratorId[true])
         -> formal_param_decl(modList={$lms.st}, type={$t.st}, declID={$vdid.st})
     ;
     
 formalParameterVarargDecl
-    :   ^(FORMAL_PARAM_VARARG_DECL localModifierList? type variableDeclaratorId)
+    :   ^(FORMAL_PARAM_VARARG_DECL localModifierList? type variableDeclaratorId[true])
         -> template(t={$text}) "/*formal parameter varargs not implemented*/ <t>"
     ;
     
@@ -543,18 +542,16 @@ blockStatement
 
 
 localVariableDeclaration
-    :   ^(PRIMITIVE_VAR_DECLARATION localModifierList? simpleType vdl=(^(VAR_DECLARATOR_LIST (^(VAR_DECLARATOR (^(IDENT de+=domainExpression[null]?)) variableInitializer[null]?))+)))
+    :   ^(PRIMITIVE_VAR_DECLARATION localModifierList? simpleType vdl=variableDeclaratorList[null, true])
         -> local_var_decl(
             modList={null},
             type={$simpleType.st},
-            domainExps={$de},
-            declList={$vdl})
-    |   ^(OBJECT_VAR_DECLARATION localModifierList? objectType vdl=(^(VAR_DECLARATOR_LIST (^(VAR_DECLARATOR (^(IDENT de+=domainExpression[null]?)) variableInitializer[null]?))+)))
+            declList={$vdl.st})
+    |   ^(OBJECT_VAR_DECLARATION localModifierList? objectType vdl=variableDeclaratorList[$objectType.st, true])
         -> local_var_decl(
             modList={null},
             type={$objectType.st},
-            domainExps={$de},
-            declList={$vdl})
+            declList={$vdl.st})
     ;
 
 
@@ -617,6 +614,8 @@ parenthesizedExpression
 expression
     :   ^(EXPR expr)
         -> {$expr.st}
+    |   domainExpression[null]
+        -> {$domainExpression.st}
     ;
 
 expr
@@ -727,7 +726,7 @@ primaryExpression
         -> template(pe={$pe.st}, ex={$ex.st}) "<pe>[<ex>]"
     |   literal
         -> {$literal.st}
-    |   newExpression[null]
+    |   newExpression[null, false]
         -> {$newExpression.st}
     |   'this'
         -> {%{$start.getText()}}
@@ -749,9 +748,11 @@ arrayTypeDeclarator
         -> template(t={$text}) "<t>"
     ;
 
-newExpression[StringTemplate obtype]
+newExpression[StringTemplate obtype, boolean output] returns [StringTemplate initArray]
     :   ^(NEW_EXPRESSION arguments? domainExpression[$arguments.args])
-        -> template(domain={$domainExpression.st},type={$obtype}) "new <type><domain>"
+        -> {$output}? template(domain={$domainExpression.st},type={$obtype}) "new <type>(<domain>)"
+        -> {!$output}? template() ""
+        ->
     ;
 
 /*newExpression
@@ -776,8 +777,8 @@ arguments returns [List<StringTemplate> args]
 @init {
     $args = new ArrayList<StringTemplate>();
 }
-    :   ^(ARGUMENT_LIST (ex+=(e=expression { $args.add($e.st); }))*)
-        -> arguments(exprs={$ex})
+    :   ^(ARGUMENT_LIST (e=expression { $args.add($e.st); } )*)        
+        ->  arguments(exprs={$args})
     ;
 
 literal
index bbcad449cc36e3e7a0aa489ee0971649c4b2c0cd..50810c78ef4962a155aaaf814020cc25103fa28d 100644 (file)
@@ -124,9 +124,9 @@ scope ScopeStack; // top-level type scope
             // JL: Need to fill the templateArgs in ClassSymbol, and push this down
             // to the class subtree
         }
-    |   ^('class' i2=IDENT (^('extends' type))? (^('implements' type+))? classScopeDeclaration*)
+    |   ^('class' i2=IDENT (^('extends' type))? (^('implements' type+))? 
         {
-            /*Scope outerScope = $ScopeStack[-1]::current;
+            Scope outerScope = $ScopeStack[-1]::current;
             $sym = new ClassSymbol(symtab, $i2.text, null, outerScope);
             outerScope.define($sym.name, $sym);
             currentClass = $sym;
@@ -134,8 +134,9 @@ scope ScopeStack; // top-level type scope
             $sym.definitionTokenStream = input.getTokenStream();
             $i2.symbol = $sym;
             $ScopeStack::current = $sym;
-            importPackages($sym, $imports);*/
+            importPackages($sym, $imports);
         }
+            classScopeDeclaration*)
     |   ^('interface' IDENT (^('extends' type+))?  interfaceScopeDeclaration*)
     |   ^('enum' IDENT (^('implements' type+))? enumConstant+ classScopeDeclaration*)
     |   ^(chareType IDENT (^('extends' type))? (^('implements' type+))? classScopeDeclaration*)
@@ -158,10 +159,15 @@ classScopeDeclaration
             b=block?)
     |   ^(VOID_METHOD_DECL m=modifierList? g=genericTypeParameterList? IDENT 
             f=formalParameterList b=block?)
-    |   ^(PRIMITIVE_VAR_DECLARATION modifierList? simpleType variableDeclaratorList)
-    |   ^(OBJECT_VAR_DECLARATION modifierList? objectType variableDeclaratorList)
+    |   ^(PRIMITIVE_VAR_DECLARATION modifierList? simpleType variableDeclaratorList[false])
+    |   ^(OBJECT_VAR_DECLARATION modifierList? objectType variableDeclaratorList[false])
     |   ^(CONSTRUCTOR_DECL m=modifierList? g=genericTypeParameterList? IDENT f=formalParameterList 
             b=block)
+        {
+               if (currentClass != null) {
+                currentClass.constructor = $classScopeDeclaration.start;
+            } 
+        }
     ;
     
 interfaceScopeDeclaration
@@ -171,20 +177,25 @@ interfaceScopeDeclaration
         // Interface constant declarations have been switched to variable
         // declarations by Charj.g; the parser has already checked that
         // there's an obligatory initializer.
-    |   ^(PRIMITIVE_VAR_DECLARATION modifierList? simpleType variableDeclaratorList)
-    |   ^(OBJECT_VAR_DECLARATION modifierList? objectType variableDeclaratorList)
+    |   ^(PRIMITIVE_VAR_DECLARATION modifierList? simpleType variableDeclaratorList[false])
+    |   ^(OBJECT_VAR_DECLARATION modifierList? objectType variableDeclaratorList[false])
     ;
 
-variableDeclaratorList
-    :   ^(VAR_DECLARATOR_LIST variableDeclarator+)
+variableDeclaratorList[boolean localdef]
+    :   ^(VAR_DECLARATOR_LIST variableDeclarator[localdef]+)
     ;
 
-variableDeclarator
-    :   ^(VAR_DECLARATOR variableDeclaratorId variableInitializer?)
+variableDeclarator[boolean localdef]
+    :   ^(VAR_DECLARATOR variableDeclaratorId[localdef] variableInitializer?)
     ;
     
-variableDeclaratorId returns [CharjAST domainExp]
-    :   ^(IDENT domainExpression? { domainExp = $domainExpression.start; }  )
+variableDeclaratorId[boolean localdef]
+    :   ^(IDENT domainExpression? 
+        { 
+            if (currentClass != null && !localdef) {
+                currentClass.initializers.add($variableDeclaratorId.start);
+            }
+        } )
     ;
 
 rangeItem
@@ -310,11 +321,11 @@ formalParameterList
     ;
     
 formalParameterStandardDecl
-    :   ^(FORMAL_PARAM_STD_DECL localModifierList? type variableDeclaratorId)
+    :   ^(FORMAL_PARAM_STD_DECL localModifierList? type variableDeclaratorId[false])
     ;
     
 formalParameterVarargDecl
-    :   ^(FORMAL_PARAM_VARARG_DECL localModifierList? type variableDeclaratorId)
+    :   ^(FORMAL_PARAM_VARARG_DECL localModifierList? type variableDeclaratorId[false])
     ;
     
 // FIXME: is this rule right? Verify that this is ok, I expected something like:
@@ -334,8 +345,8 @@ blockStatement
     ;
     
 localVariableDeclaration
-    :   ^(PRIMITIVE_VAR_DECLARATION localModifierList? simpleType variableDeclaratorList)
-    |   ^(OBJECT_VAR_DECLARATION localModifierList? objectType variableDeclaratorList)
+    :   ^(PRIMITIVE_VAR_DECLARATION localModifierList? simpleType variableDeclaratorList[true])
+    |   ^(OBJECT_VAR_DECLARATION localModifierList? objectType variableDeclaratorList[true])
     ;
 
 statement
@@ -461,6 +472,11 @@ arrayTypeDeclarator
 
 newExpression
     :   ^(NEW_EXPRESSION arguments? domainExpression)
+        {
+            if (currentClass != null) {
+                currentClass.initializers.add($newExpression.start);
+            }
+        }
     ;
 
 /*newExpression
index eadb958c06ff677d122f844c795be96e9b075705..f5f228bebf2dbde655179a4fd5a4e651b88d777a 100644 (file)
@@ -8,6 +8,9 @@ public class ClassSymbol extends SymbolWithScope implements Scope {
     public ClassSymbol superClass;
     public List<String> interfaceImpls;
     public List<String> templateArgs;
+    public List<CharjAST> initializers;
+
+    public CharjAST constructor;
 
     Map<String, PackageScope> imports = 
         new LinkedHashMap<String, PackageScope>();
@@ -37,6 +40,8 @@ public class ClassSymbol extends SymbolWithScope implements Scope {
         for (String pkg : SymbolTable.AUTO_IMPORTS) {
             importPackage(pkg);
         }
+       this.initializers = new ArrayList<CharjAST>();
+       constructor = null;
     }
 
     public ClassSymbol(
@@ -47,6 +52,8 @@ public class ClassSymbol extends SymbolWithScope implements Scope {
         this(symtab, name);
         this.superClass = superClass;
         this.scope = scope;
+       this.initializers = new ArrayList<CharjAST>();
+       constructor = null;
 
         // manually add automatic class methods and symbols here
     }
index 63fa066a1d40c0e70031d857de15cd378678e01f..f0bdce59c819cc6b8a0a331976ce5a3056804de7 100644 (file)
@@ -90,9 +90,14 @@ public class Translator {
 
         // do AST rewriting in semantic phase
         if (m_printAST) printAST("Before Semantic Pass", "before.html");
-        semanticPass();
+        ClassSymbol sem = semanticPass();
+       modifyNodes(sem);
         if (m_printAST) printAST("After Semantic Pass", "after.html");
 
+       m_nodes = new CommonTreeNodeStream(m_ast);
+        m_nodes.setTokenStream(tokens);
+        m_nodes.setTreeAdaptor(m_adaptor);
+
         // emit code for .ci, .h, and .cc based on rewritten AST
         m_nodes.reset();
         String ciOutput = translationPass(OutputMode.ci);
@@ -124,6 +129,60 @@ public class Translator {
         return sem.charjSource(m_symtab);
     }
 
+
+    private CharjAST addConstructor(ClassSymbol sem) {
+       CharjAST ast1 = new CharjAST(CharjParser.CONSTRUCTOR_DECL, 
+                                    "CONSTRUCTOR_DECL");
+       CharjAST ast2 = new CharjAST(CharjParser.IDENT, 
+                                    sem.getScopeName());
+       CharjAST ast3 = new CharjAST(CharjParser.FORMAL_PARAM_LIST, 
+                                    "FORMAL_PARAM_LIST");
+       CharjAST ast4 = new CharjAST(CharjParser.BLOCK, "BLOCK");
+       
+       ast1.addChild(ast2);
+       ast1.addChild(ast3);
+       ast1.addChild(ast4);
+       sem.definition.addChild(ast1);
+       return ast1;
+    }
+
+    private void modifyNodes(ClassSymbol sem) {
+       /* Add constructor */
+
+       if (sem.constructor == null) {
+           sem.constructor = addConstructor(sem);
+       }
+
+       /* Insert array initializers into the constructor */
+
+       for (CharjAST init : sem.initializers) {
+           System.out.println("processing init token = " + init.getType());
+
+           if (init.getType() == CharjParser.IDENT) {
+               CharjAST ast1 = new CharjAST(CharjParser.EXPR, "EXPR");
+               CharjAST ast2 = new CharjAST(CharjParser.METHOD_CALL, "METHOD_CALL");
+               CharjAST ast2_1 = new CharjAST(CharjParser.T__140, ".");
+               CharjAST ast2_2 = new CharjAST(CharjParser.IDENT, init.getText());
+               CharjAST ast2_3 = new CharjAST(CharjParser.IDENT, "init");
+               CharjAST ast4 = new CharjAST(CharjParser.ARGUMENT_LIST, "ARGUMENT_LIST");
+
+               ast1.addChild(ast2);
+               ast2.addChild(ast2_1);
+               ast2_1.addChild(ast2_2);
+               ast2_1.addChild(ast2_3);
+               ast2.addChild(ast4);
+               ast4.addChildren(init.getChildren());
+
+               //System.out.println(sem.constructor.toStringTree());
+
+               sem.constructor.getChild(2).addChild(ast1);
+           } else if (init.getType() == CharjParser.NEW_EXPRESSION) {
+               //(OBJECT_VAR_DECLARATION (TYPE (QUALIFIED_TYPE_IDENT (Array (TEMPLATE_INST (TYPE double(Symbol(double_primitive, ClassSymbol[double]: {}, ))))))) (VAR_DECLARATOR_LIST (VAR_DECLARATOR ccc (NEW_EXPRESSION (ARGUMENT_LIST (EXPR get)) (DOMAIN_EXPRESSION (RANGE_EXPRESSION 1))))))
+           }
+           
+       }
+    }
+
     private String translationPass(OutputMode m) throws
         RecognitionException, IOException, InterruptedException
     {
index 969314daa5e42ed0ad61f14f78a3c1aea6784161..bb67191ffe010f8f1f03ba14bf752a7d7c6f3f66 100644 (file)
@@ -1,4 +1,17 @@
-template <class abc, class def>
-class T {
 
-}
\ No newline at end of file
+class test {
+      Array<int, 2> test[2:2, 4];
+      Array<int, 2> test2 = new [2, 4](gen);
+      Array<int> aaa[3];
+
+      test() {
+         aaa(abc, 4, test);
+        
+        def.init(abc, 4, test);
+
+        Array<double> ddd[5];
+        Array<double> ccc = new [1](get);
+
+        //test = new [2]();
+      }
+}