Charj: better treatment of blocks, particularly single statement blocks
authorAaron Becker <akbecker@gmail.com>
Wed, 26 May 2010 03:01:36 +0000 (22:01 -0500)
committerAaron Becker <akbecker@gmail.com>
Wed, 26 May 2010 03:01:36 +0000 (22:01 -0500)
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

index 7d9e09b06c91e8006bbab145d7227c185e84cf74..6d28af2177c985075cc2795a15e9a70c7f074878 100644 (file)
@@ -69,7 +69,8 @@ tokens {
 
     BITWISE_OR              = '|'               ;
     BITWISE_AND             = '&'               ;
-    ASSIGNMENT              = '='               ;
+    EQUALS                  = '='               ;
+    NOT_EQUALS              = '!='              ;
     PLUS_EQUALS             = '+='              ;
     MINUS_EQUALS            = '-='              ;
     TIMES_EQUALS            = '*='              ;
@@ -479,6 +480,8 @@ qualifiedIdentifier
 block
     :   lc='{' blockStatement* '}'
         ->  ^(BLOCK[$lc, "BLOCK"] blockStatement*)
+    |   nonBlockStatement
+        -> ^(BLOCK nonBlockStatement)
     ;
 
 blockStatement
@@ -492,31 +495,35 @@ localVariableDeclaration
     |   localModifierList? objectType classFieldDeclaratorList
         ->  ^(OBJECT_VAR_DECLARATION localModifierList? objectType classFieldDeclaratorList)
     ;
-        
+
 statement
-    :   block
-    |   'assert' expr1=expression 
+    :   nonBlockStatement
+    |   block
+    ;
+        
+nonBlockStatement
+    :   'assert' expr1=expression 
         (   ':' expr2=expression ';'
             ->  ^('assert' $expr1 $expr2)
         |   ';'
             ->  ^('assert' $expr1)
         )
-    |   IF parenthesizedExpression ifStat=statement 
-        (   ELSE elseStat=statement
+    |   IF parenthesizedExpression ifStat=block
+        (   ELSE elseStat=block
             ->  ^(IF parenthesizedExpression $ifStat $elseStat)
         |
             ->  ^(IF parenthesizedExpression $ifStat)
         )   
     |   f=FOR '('
-        (   forInit? ';' expression? ';' expressionList? ')' statement
-            -> ^($f forInit? FOR_EXPR expression? FOR_UPDATE expressionList? statement)
-        |   localModifierList? type IDENT ':' expression ')' statement
-            -> ^(FOR_EACH[$f, "FOR_EACH"] localModifierList? type IDENT expression statement)
+        (   forInit? ';' expression? ';' expressionList? ')' block
+            -> ^($f forInit? FOR_EXPR expression? FOR_UPDATE expressionList? block)
+        |   localModifierList? type IDENT ':' expression ')' block
+            -> ^(FOR_EACH[$f, "FOR_EACH"] localModifierList? type IDENT expression block)
         )
-    |   WHILE parenthesizedExpression statement
-        ->  ^(WHILE parenthesizedExpression statement)
-    |   DO statement WHILE parenthesizedExpression ';'
-        ->  ^(DO statement parenthesizedExpression)
+    |   WHILE parenthesizedExpression block
+        ->  ^(WHILE parenthesizedExpression block)
+    |   DO block WHILE parenthesizedExpression ';'
+        ->  ^(DO block parenthesizedExpression)
     |   SWITCH parenthesizedExpression '{' switchCaseLabel* '}'
         ->  ^(SWITCH parenthesizedExpression switchCaseLabel*)
     |   RETURN expression? ';'
index f905d0d6bf8a79e09e0b7660ae164a082aca1bb1..88e04103b3824653cb7e481cfd7ffa2bafb64037 100644 (file)
@@ -319,33 +319,23 @@ CkAssert(<cond>);
 
 if(cond, then, else_) ::=
 <<
-if <cond> {
-    <then>
-}<if(else_)> else {
-    <else_>
-}<endif>
+if <cond> <then><if(else_)> else <else_><endif>
 >>
 
 
 for(initializer, cond, update, body) ::=
 <<
-for (<if(initializer)><initializer><else>;<endif> <cond>; <update; separator=", ">) {
-    <body>
-}
+for (<if(initializer)><initializer><else>;<endif> <cond>; <update; separator=", ">) <body>
 >>
 
 while(cond, body) ::=
 <<
-while <cond> {
-    <body>
-} 
+while <cond> <body>
 >>
 
 dowhile(cond, body) ::=
 <<
-do {
-    <body>
-} while <cond>;
+do <body> while <cond>;
 >>
 
 
index 07039f59f97b6b611d554e358a1d05830fa91abb..1c582a8d6ba0a1af4c2b2642afe5e94738227995 100644 (file)
@@ -57,7 +57,7 @@ packageDeclaration
     ;
     
 importDeclarations returns [List<CharjAST> packageNames]
-    :   (^('import' qualifiedIdentifier '.*'?))*
+    :   (^(IMPORT qualifiedIdentifier '.*'?))*
     ;
 
 typeDeclaration[List<CharjAST> imports] returns [ClassSymbol sym]
@@ -84,7 +84,6 @@ 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)
     |   ^(CONSTRUCTOR_DECL m=modifierList? g=genericTypeParameterList? IDENT f=formalParameterList 
@@ -241,13 +240,17 @@ localVariableDeclaration
     ;
 
 statement
-    :   block
-    |   ^(ASSERT expression expression?)
-    |   ^(IF parenthesizedExpression statement statement?)
-    |   ^(FOR forInit? FOR_EXPR expression? FOR_UPDATE expression* statement)
-    |   ^(FOR_EACH localModifierList? type IDENT expression statement) 
-    |   ^(WHILE parenthesizedExpression statement)
-    |   ^(DO statement parenthesizedExpression)
+    :   nonBlockStatement
+    |   block
+    ;
+
+nonBlockStatement
+    :   ^(ASSERT expression expression?)
+    |   ^(IF parenthesizedExpression block block?)
+    |   ^(FOR forInit? FOR_EXPR expression? FOR_UPDATE expression* block)
+    |   ^(FOR_EACH localModifierList? type IDENT expression block) 
+    |   ^(WHILE parenthesizedExpression block)
+    |   ^(DO block parenthesizedExpression)
     |   ^(SWITCH parenthesizedExpression switchCaseLabel*)
     |   ^(RETURN expression?)
     |   ^(THROW expression)
@@ -263,6 +266,7 @@ statement
         }
     |   ^(LABELED_STATEMENT IDENT statement)
     |   expression
+    |   ^('delete' qualifiedIdentifier)
     |   ^(EMBED STRING_LITERAL EMBED_BLOCK)
     |   ';' // Empty statement.
     ;
@@ -367,6 +371,7 @@ newExpression
             |   genericTypeArgumentList? qualifiedTypeIdent newArrayConstruction
             )
         )
+    |   ^('new' qualifiedTypeIdent arguments)
     ;
 
 newArrayConstruction
index 680fb7d48668c32c7dcf222d1b8940c9b9c7ee23..892499d578ab6ad4e0e6f5735b8eb3742671e2f2 100644 (file)
@@ -478,20 +478,25 @@ localVariableDeclaration
 
 
 statement
-    :   block
+    :   nonBlockStatement
+        -> {$nonBlockStatement.st}
+    |   block
         -> {$block.st}
-    |   ^(ASSERT cond=expression msg=expression?)
+    ;
+
+nonBlockStatement
+    :   ^(ASSERT cond=expression msg=expression?)
         -> assert(cond={$cond.st}, msg={$msg.st})
-    |   ^(IF parenthesizedExpression then=statement else_=statement?)
+    |   ^(IF parenthesizedExpression then=block else_=block?)
         -> if(cond={$parenthesizedExpression.st}, then={$then.st}, else_={$else_.st})
-    |   ^(FOR forInit? FOR_EXPR cond=expression? FOR_UPDATE (update+=expression)* s=statement)
-        -> for(initializer={$forInit.st}, cond={$cond.st}, update={$update}, body={$s.st})
-    |   ^(FOR_EACH localModifierList? type IDENT expression statement
+    |   ^(FOR forInit? FOR_EXPR cond=expression? FOR_UPDATE (update+=expression)* b=block)
+        -> for(initializer={$forInit.st}, cond={$cond.st}, update={$update}, body={$block.st})
+    |   ^(FOR_EACH localModifierList? type IDENT expression block
         -> 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})
+    |   ^(WHILE pe=parenthesizedExpression b=block)
+        -> while(cond={$pe.st}, body={$b.st})
+    |   ^(DO b=block pe=parenthesizedExpression)
+        -> dowhile(cond={$pe.st}, block={$b.st})
     |   ^(SWITCH pe=parenthesizedExpression (scls+=switchCaseLabel)*)
         -> switch(expr={$pe.st}, labels={$scls})
     |   ^(RETURN e=expression?)
index f5c731a117f08d02af5f53f813163cecbad78196..9bd9b2939a98f1ec090b7edad616ad2d146715a5 100644 (file)
@@ -95,7 +95,7 @@ packageDeclaration
 @init { 
     List<String> names = null; 
 }
-    :   ^('package' (ids+=IDENT)+)  
+    :   ^(PACKAGE (ids+=IDENT)+)  
         {
             String packageName = "";
             for(Object o : $ids) packageName += '.' + ((CharjAST)o).getText();
@@ -325,13 +325,17 @@ localVariableDeclaration
     ;
 
 statement
-    :   block
-    |   ^(ASSERT expression expression?)
-    |   ^(IF parenthesizedExpression statement statement?)
-    |   ^(FOR forInit? FOR_EXPR expression? FOR_UPDATE expression* statement)
-    |   ^(FOR_EACH localModifierList? type IDENT expression statement) 
-    |   ^(WHILE parenthesizedExpression statement)
-    |   ^(DO statement parenthesizedExpression)
+    : nonBlockStatement
+    | block
+    ;
+
+nonBlockStatement
+    :   ^(ASSERT expression expression?)
+    |   ^(IF parenthesizedExpression block block?)
+    |   ^(FOR forInit? FOR_EXPR expression? FOR_UPDATE expression* block)
+    |   ^(FOR_EACH localModifierList? type IDENT expression block) 
+    |   ^(WHILE parenthesizedExpression block)
+    |   ^(DO block parenthesizedExpression)
     |   ^(SWITCH parenthesizedExpression switchCaseLabel*)
     |   ^(RETURN expression?)
     |   ^(THROW expression)