overhaul of statement codegen
authorAaron Becker <abecker3@illinois.edu>
Tue, 16 Jun 2009 02:04:03 +0000 (02:04 +0000)
committerAaron Becker <abecker3@illinois.edu>
Tue, 16 Jun 2009 02:04:03 +0000 (02:04 +0000)
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

index a49af2abac8f560134dd0a9b5056a99e4dac1877..c93df227d7873525547740f99798d78623336653 100644 (file)
@@ -666,8 +666,8 @@ finallyClause
     ;
 
 switchBlockLabels
-    :   switchCaseLabels switchDefaultLabel? switchCaseLabels
-        ->  ^(SWITCH_BLOCK_LABEL_LIST switchCaseLabels switchDefaultLabel? switchCaseLabels)
+    :   switchCaseLabels
+        ->  ^(SWITCH_BLOCK_LABEL_LIST switchCaseLabels)
     ;
     
 switchCaseLabels
@@ -676,10 +676,7 @@ switchCaseLabels
         
 switchCaseLabel
     :   CASE^ expression COLON! blockStatement*
-    ;
-    
-switchDefaultLabel
-    :   DEFAULT^ COLON! blockStatement*
+    |   DEFAULT^ COLON! blockStatement*
     ;
     
 forInit
index 87bb5436101da3332fa4b50cda525f39314c93d2..e5ded70c286643708016ee35b9be7d38bd06b381 100644 (file)
@@ -19,6 +19,7 @@ charjSource_ci(pd, ids, tds, debug) ::=
 
 <tds>
 <if(debug)>/* \</charjSource_ci> */<endif>
+
 >>
 
 
@@ -38,6 +39,7 @@ charjSource_h(pd, ids, tds, cb, debug) ::=
 <cb>
 
 <if(debug)>/* \</CHARJ_SOURCE> */<endif>
+
 >>
 
 
@@ -149,7 +151,9 @@ entry <ty> <gtpl> <id><fpl> <adl> <tc>;
 
 funcMethodDecl_cc(modl, gtpl, ty, id, fpl, adl, tc, block) ::=
 <<
-<modl>: <ty> <gtpl> <id><fpl> <adl> <tc> <block>
+<modl>: <ty> <gtpl> <id><fpl> <adl> <tc> {
+    <block>
+}
 >>
 
 
@@ -167,7 +171,9 @@ voidMethodDecl_h(modl, gtpl, id, fpl, tc, block) ::=
 
 voidMethodDecl_cc(modl, gtpl, id, fpl, tc, block) ::=
 <<
-<modl>: void<gtpl> <id><fpl> <tc> <block>
+<modl>: void<gtpl> <id><fpl> <tc> {
+    <block>
+}
 >>
 
 
@@ -185,16 +191,19 @@ ctorDecl_h(modl, gtpl, id, fpl, tc, block) ::=
 
 ctorDecl_cc(modl, gtpl, id, fpl, tc, block) ::=
 <<
-<modl>:<gtpl> <id><fpl> <tc> <block>
+<modl>:<gtpl> <id><fpl> <tc> {
+    <block>
+}
 >>
 
 
 block_cc(bsl) ::=
 <<
-{
-    <bsl; separator="\n">
-}
+<bsl:{s| <s><\n>}>
 >>
+/*{
+    <bsl; separator="\n">
+}*/
 
 
 embed_cc(str, blk) ::=
@@ -205,6 +214,30 @@ embed_cc(str, blk) ::=
 >>
 
 
+var_decl_list(var_decls) ::=
+<<
+<var_decls; separator=", ">
+>>
+
+
+var_decl(id, initializer) ::=
+<<
+<id> <initializer>
+>>
+
+
+var_decl_id(id, array_decl_list) ::=
+<<
+<id> <array_decl_list>
+>>
+
+
+var_id_decl(id, adl) ::=
+<<
+<id> <adl>
+>>
+
+
 primitive_var_decl(modList, type, declList) ::=
 <<
 <if(modList)>
@@ -231,6 +264,18 @@ type(typeID, arrDeclList) ::=
 >>
 
 
+typeIdent(typeID, generics) ::=
+<<
+<typeID><generics>
+>>
+
+
+generic_arg_list(types) ::=
+<<
+\<<types>\>
+>>
+
+
 formal_param_list(sdecl, vdecl) ::=
 <<
 <if(vdecl)>
@@ -247,3 +292,57 @@ formal_param_decl(modList, type, declID) ::=
 >>
 
 
+assert(cond, msg) ::=
+<<
+<if(msg)>
+CkAssert(<cond> && <msg>);
+<else>
+CkAssert(<cond>);
+<endif>
+>>
+
+
+if(cond, then, else_) ::=
+<<
+if (<cond>) {
+    <then>
+}<if(else_)> else {
+    <else_>
+}<endif>
+>>
+
+
+for(initializer, cond, update, body) ::=
+<<
+for (<initializer>; <cond>; <update>) {
+    <body>
+}
+>>
+
+while(cond, body) ::=
+<<
+while (<cond>) {
+    <body>
+} 
+>>
+
+dowhile(cond, body) ::=
+<<
+do {
+    <body>
+} while (<cond>);
+>>
+
+
+switch(expr, labels) ::=
+<<
+switch (<expr>) {
+    <labels>
+}
+>>
+
+return(val) ::=
+<<
+return<if(val)> <val><endif>;
+>>
+
index 2c22c6fc5c5311b3a800ad72516fb465937680f8..e7c645322c693eb756142454f9ec1695488c41c7 100644 (file)
@@ -55,6 +55,7 @@ package charj.translator;
      *  type.
      */
     public boolean listContainsToken(List<CharjAST> list, int tokenType) {
+        if (list == null) return false;
         for (CharjAST node : list) {
             if (node.token.getType() == tokenType) {
                 return true;
@@ -331,38 +332,38 @@ classScopeDeclarations
     
 interfaceTopLevelScope
     :   ^(INTERFACE_TOP_LEVEL_SCOPE interfaceScopeDeclarations*)
-        -> template(t={$text}) "<t>"
+        -> template(t={$text}) "/*interfaceTopLevelScope-not implemented */ <t>"
     ;
     
 interfaceScopeDeclarations
     :   ^(FUNCTION_METHOD_DECL modifierList genericTypeParameterList? type IDENT formalParameterList arrayDeclaratorList? throwsClause?)
-        -> template(t={$text}) "<t>"
+        -> template(t={$text}) "/*interfaceScopeDeclarations-not implemented */ <t>"
     |   ^(VOID_METHOD_DECL modifierList genericTypeParameterList? IDENT formalParameterList throwsClause?)
-        -> template(t={$text}) "<t>"
+        -> template(t={$text}) "/*interfaceScopeDeclarations-not implemented */ <t>"
         // 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)
-        -> template(t={$text}) "<t>"
+        -> template(t={$text}) "/*interfaceScopeDeclarations-not implemented */ <t>"
     |   ^(OBJECT_VAR_DECLARATION modifierList objectType variableDeclaratorList)
-        -> template(t={$text}) "<t>"
+        -> template(t={$text}) "/*interfaceScopeDeclarations-not implemented */ <t>"
     |   typeDeclaration
         -> {$typeDeclaration.st}
     ;
 
 variableDeclaratorList
-    :   ^(VAR_DECLARATOR_LIST variableDeclarator+)
-        -> template(t={$text}) "/*variableDeclaratorList*/ <t>"
+    :   ^(VAR_DECLARATOR_LIST (var_decls+=variableDeclarator)+)
+        -> var_decl_list(var_decls={$var_decls})
     ;
 
 variableDeclarator
-    :   ^(VAR_DECLARATOR variableDeclaratorId variableInitializer?)
-        -> template(t={$text}) "/*variableDeclarator*/ <t>"
+    :   ^(VAR_DECLARATOR id=variableDeclaratorId initializer=variableInitializer?)
+        -> var_decl(id={$id.st}, initializer={$initializer.st})
     ;
     
 variableDeclaratorId
-    :   ^(IDENT arrayDeclaratorList?)
-        -> template(t={$text}) "/*variableDeclaratorId*/ <t>"
+    :   ^(IDENT adl=arrayDeclaratorList?)
+        -> var_decl_id(id={$IDENT.text}, arrayDeclList={$adl.st})
     ;
 
 variableInitializer
@@ -384,12 +385,12 @@ arrayDeclaratorList
     
 arrayInitializer
     :   ^(ARRAY_INITIALIZER variableInitializer*)
-        -> template(t={$text}) "<t>"
+        -> template(t={$text}) "/* arrayInitializer-not implemented */ <t>"
     ;
 
 throwsClause
     :   ^(THROWS_CLAUSE qualifiedIdentifier+)
-        -> template(t={$text}) "<t>"
+        -> template(t={$text}) "/* throwsClause-not implemented */ <t>"
     ;
 
 modifierList
@@ -416,8 +417,8 @@ $st = %{$start.getText()};
     ;
 
 localModifierList
-    :   ^(LOCAL_MODIFIER_LIST localModifier*)
-        -> template(t={$text}) "<t>"
+    :   ^(LOCAL_MODIFIER_LIST (m+=localModifier)*)
+        -> template(mod={$m}) "<mod; separator=\" \">"
     ;
 
 localModifier
@@ -444,13 +445,13 @@ objectType
     ;
 
 qualifiedTypeIdent
-    :   ^(QUALIFIED_TYPE_IDENT typeIdent+) 
-        -> template(t={$text}) "<t>"
+    :   ^(QUALIFIED_TYPE_IDENT (t+=typeIdent)+) 
+        -> template(types={$t}) "<types; separator=\".\">"
     ;
 
 typeIdent
     :   ^(IDENT genericTypeArgumentList?)
-        -> template(t={$text}) "<t>"
+        -> typeIdent(typeID={$IDENT.text}, generics={$genericTypeArgumentList.st})
     ;
 
 primitiveType
@@ -468,22 +469,22 @@ $st = %{$start.getText()};
     ;
 
 genericTypeArgumentList
-    :   ^(GENERIC_TYPE_ARG_LIST genericTypeArgument+)
-        -> template(t={$text}) "<t>"
+    :   ^(GENERIC_TYPE_ARG_LIST (gta+=genericTypeArgument)+)
+        -> template(gtal={$gta}) "\<<gtal; separator=\", \">\>"
     ;
     
 genericTypeArgument
     :   type
         -> {$type.st}
     |   ^(QUESTION genericWildcardBoundType?)
-        -> template(t={$text}) "<t>"
+        -> template(t={$text}) "/* genericTypeArgument: wildcard bound types not implemented */ <t>"
     ;
 
 genericWildcardBoundType                                                                                                                      
     :   ^(EXTENDS type)
-        -> template(t={$text}) "<t>"
+        -> template(t={$text}) "/* genericWildcardBoundType not implemented */ <t>"
     |   ^(SUPER type)
-        -> template(t={$text}) "<t>"
+        -> template(t={$text}) "/* genericWildcardBoundType not implemented */ <t>"
     ;
 
 formalParameterList
@@ -498,7 +499,7 @@ formalParameterStandardDecl
     
 formalParameterVarargDecl
     :   ^(FORMAL_PARAM_VARARG_DECL localModifierList type variableDeclaratorId)
-        -> template(t={$text}) "/*fpvd*/ <t>"
+        -> template(t={$text}) "/*formal parameter varargs not implemented*/ <t>"
     ;
     
 qualifiedIdentifier
@@ -544,32 +545,32 @@ localVariableDeclaration
 statement
     :   block
         -> {$block.st}
-    |   ^(ASSERT expression expression?)
-        -> template(t={$text}) "<t>"
-    |   ^(IF parenthesizedExpression statement statement?)
-        -> template(t={$text}) "<t>"
-    |   ^(FOR forInit forCondition forUpdater statement)
-        -> template(t={$text}) "<t>"
+    |   ^(ASSERT cond=expression msg=expression?)
+        -> assert(cond={$cond.st}, msg={$msg.st})
+    |   ^(IF parenthesizedExpression then=statement else_=statement?)
+        -> if(cond={$parenthesizedExpression.st}, then={$then.st}, else_={$else_.st})
+    |   ^(FOR forInit forCondition forUpdater s=statement)
+        -> for(initializer={$forInit.st}, cond={$forCondition.st}, update={$forUpdater.st}, body={$s.st})
     |   ^(FOR_EACH localModifierList type IDENT expression statement) 
-        -> template(t={$text}) "<t>"
-    |   ^(WHILE parenthesizedExpression statement)
-        -> template(t={$text}) "<t>"
-    |   ^(DO statement parenthesizedExpression)
-        -> template(t={$text}) "<t>"
-    |   ^(TRY block catches? block?)  // The second optional block is the optional finally block.
-        -> template(t={$text}) "<t>"
-    |   ^(SWITCH parenthesizedExpression switchBlockLabels)
-        -> template(t={$text}) "<t>"
+        -> template(t={$text}) "/* foreach not implemented */ <t>"
+    |   ^(WHILE pe=parenthesizedExpression s=statement)
+        -> while(cond={$pe.st}, body={$s.st})
+    |   ^(DO s=statement pe=parenthesizedExpression)
+        -> dowhile(cond={$pe.st}, block={$s.st})
+    |   ^(TRY block catches? block?)  // The second optional block is the finally block.
+        -> template(t={$text}) "/* try/catch not implemented */ <t>"
+    |   ^(SWITCH pe=parenthesizedExpression sbls=switchBlockLabels)
+        -> switch(expr={$pe.st}, labels={$sbls.st})
     |   ^(SYNCHRONIZED parenthesizedExpression block)
-        -> template(t={$text}) "<t>"
-    |   ^(RETURN expression?)
-        -> template(t={$text}) "<t>"
+        -> template(t={$text}) "/* synchronized not implemented */ <t>"
+    |   ^(RETURN e=expression?)
+        -> return(val={$e.st})
     |   ^(THROW expression)
-        -> template(t={$text}) "<t>"
+        -> template(t={$text}) "/* throw not implemented */ <t>"
     |   ^(BREAK IDENT?)
-        -> template(t={$text}) "<t>"
+        -> template() "break;" // TODO: support labeling
     |   ^(CONTINUE IDENT?)
-        -> template(t={$text}) "<t>"
+        -> template() "continue" // TODO: support labeling
     |   ^(LABELED_STATEMENT IDENT statement)
         -> template(t={$text}) "<t>"
     |   expression
@@ -582,26 +583,23 @@ statement
         
 catches
     :   ^(CATCH_CLAUSE_LIST catchClause+)
-        -> template(t={$text}) "<t>"
+        -> template(t={$text}) "/* catch not implemented */ <t>"
     ;
     
 catchClause
     :   ^(CATCH formalParameterStandardDecl block)
-        -> template(t={$text}) "<t>"
+        -> template(t={$text}) "/* catchClause not implemented */ <t>"
     ;
 
 switchBlockLabels
-    :   ^(SWITCH_BLOCK_LABEL_LIST switchCaseLabel* switchDefaultLabel? switchCaseLabel*)
+    :   ^(SWITCH_BLOCK_LABEL_LIST switchCaseLabel*)
         -> template(t={$text}) "<t>"
     ;
         
 switchCaseLabel
     :   ^(CASE expression blockStatement*)
         -> template(t={$text}) "<t>"
-    ;
-    
-switchDefaultLabel
-    :   ^(DEFAULT blockStatement*)
+    |   ^(DEFAULT blockStatement*)
         -> template(t={$text}) "<t>"
     ;
     
index eb6ca0690f1ad5e7178fc5a44170945c1d78e5e0..089b73e2415d7eeb85acdbb9aee365c9759e31eb 100644 (file)
@@ -34,6 +34,7 @@ package charj.translator;
      *  type.
      */
     public boolean listContainsToken(List<CharjAST> list, int tokenType) {
+        if (list == null) return false;
         for (CharjAST node : list) {
             if (node.token.getType() == tokenType) {
                 return true;
@@ -357,8 +358,16 @@ statement
     |   ^(SYNCHRONIZED parenthesizedExpression block)
     |   ^(RETURN expression?)
     |   ^(THROW expression)
-    |   ^(BREAK IDENT?)
-    |   ^(CONTINUE IDENT?)
+    |   ^(BREAK IDENT?) {
+            if ($IDENT != null) {
+                translator.error(this, "Labeled break not supported yet, ignoring.", $ID);
+            }
+        }
+    |   ^(CONTINUE IDENT?) {
+            if ($IDENT != null) {
+                translator.error(this, "Labeled continue not supported yet, ignoring.", $ID);
+            }
+        }
     |   ^(LABELED_STATEMENT IDENT statement)
     |   expression
     |   ^(EMBED STRING_LITERAL EMBED_BLOCK)
@@ -374,15 +383,12 @@ catchClause
     ;
 
 switchBlockLabels
-    :   ^(SWITCH_BLOCK_LABEL_LIST switchCaseLabel* switchDefaultLabel? switchCaseLabel*)
+    :   ^(SWITCH_BLOCK_LABEL_LIST switchCaseLabel*)
     ;
         
 switchCaseLabel
     :   ^(CASE expression blockStatement*)
-    ;
-    
-switchDefaultLabel
-    :   ^(DEFAULT blockStatement*)
+    |   ^(DEFAULT blockStatement*)
     ;
     
 forInit