Merged arrays into Charj mainline.
[charm.git] / src / langs / charj / src / charj / translator / Charj.g
index 45a7e930992cdcc3bfd1083f6cd49cbde62746fa..94e671962dcc279bec1f9f866ce21ac51745ff53 100644 (file)
@@ -16,7 +16,108 @@ options {
 }
 
 tokens {
+
+    ENTRY                   = 'entry'           ;
+    PUBLIC                  = 'public'          ;
+    PROTECTED               = 'protected'       ;
     ENTRY                   = 'entry'           ;
+    PRIVATE                 = 'private'         ;
+    ABSTRACT                = 'abstract'        ;
+    NATIVE                  = 'native'          ;
+    FINAL                   = 'final'           ;
+    STATIC                  = 'static'          ;
+    VOLATILE                = 'volatile'        ;
+    VOID                    = 'void'            ;
+    BOOLEAN                 = 'boolean'         ;
+    CHAR                    = 'char'            ;
+    BYTE                    = 'byte'            ;
+    SHORT                   = 'short'           ;
+    INT                     = 'int'             ;
+    LONG                    = 'long'            ;
+    FLOAT                   = 'float'           ;
+    DOUBLE                  = 'double'          ;
+    TRUE                    = 'true'            ;
+    FALSE                   = 'false'           ;
+    NULL                    = 'null'            ;
+    THIS                    = 'this'            ;
+    SUPER                   = 'super'           ;
+    CHARE                   = 'chare'           ;
+    CHARE_ARRAY             = 'chare_array'     ;
+    MAINCHARE               = 'mainchare'       ;
+    INTERFACE               = 'interface'       ;
+    PACKAGE                 = 'package'         ;
+    IMPORT                  = 'import'          ;
+    CLASS                   = 'class'           ;
+    EXTENDS                 = 'extends'         ;
+    GROUP                   = 'group'           ;
+    NODEGROUP               = 'nodegroup'       ;
+    ENUM                    = 'enum'            ;
+    READONLY                = 'readonly'        ;
+
+    PRINT                   = 'print'           ;
+    PRINTLN                 = 'println'         ;
+    EXIT                    = 'exit'            ;
+    EXITALL                 = 'exitAll'         ;
+    GETMYPE                 = 'getMyPe'         ;
+    GETMYRANK               = 'getMyRank'       ;
+    GETMYNODE               = 'getMyNode'       ;
+    GETNUMPES               = 'getNumPes'       ;
+    GETNUMNODES             = 'getNumNodes'     ;
+
+    FOR                     = 'for'             ;
+    WHILE                   = 'while'           ;
+    IF                      = 'if'              ;
+    CASE                    = 'case'            ;
+    SWITCH                  = 'switch'          ;
+    RETURN                  = 'return'          ;
+    ELSE                    = 'else'            ;
+    CONTINUE                = 'continue'        ;
+    DO                      = 'do'              ;
+    DEFAULT                 = 'default'         ;
+    WHILE                   = 'while'           ;
+    THROW                   = 'throw'           ;
+    BREAK                   = 'break'           ;
+
+    DOT                     = '.'               ;
+    NEW                     = 'new'             ;
+    BITWISE_OR              = '|'               ;
+    BITWISE_AND             = '&'               ;
+    ASSIGNMENT              = '='               ;
+    EQUALS                  = '=='              ;
+    NOT_EQUALS              = '!='              ;
+    PLUS_EQUALS             = '+='              ;
+    MINUS_EQUALS            = '-='              ;
+    TIMES_EQUALS            = '*='              ;
+    DIVIDE_EQUALS           = '/='              ;
+    AND_EQUALS              = '&='              ;
+    OR_EQUALS               = '|='              ;
+    POWER_EQUALS            = '^='              ;
+    MOD_EQUALS              = '%='              ;
+    OR                      = '||'              ;
+    AND                     = '&&'              ;
+    POWER                   = '^'               ;
+    GT                      = '>'               ;
+    GTE                     = '>='              ;
+    LT                      = '<'               ;
+    LTE                     = '<='              ;
+    PLUS                    = '+'               ;
+    MINUS                   = '-'               ;
+    TIMES                   = '*'               ;
+    DIVIDE                  = '/'               ;
+    MOD                     = '%'               ;
+    UNARY_PLUS              = '++'              ;
+    UNARY_MINUS             = '--'              ;
+    NOT                     = '!'               ;
+    TILDE                   = '~'               ;
+    AT                      = '@'               ;
+    INSTANCEOF              = 'instanceof'      ;
+
+    // Charj keywords for things that are automatically generated
+    // and we don't want the user to use them as identifiers
+
+    PUP                     = 'pup'             ;
+    INITMETHOD              = 'initMethod'      ;
+
 
     // C++ keywords that aren't used in charj. 
     // We don't use these ourselves, but they're still reserved
@@ -70,6 +171,8 @@ tokens {
     EXTENDS_BOUND_LIST;
     EXTENDS_CLAUSE;
     FOR_EACH;
+    FOR_EXPR;
+    FOR_UPDATE;
     FORMAL_PARAM_LIST;
     FORMAL_PARAM_STD_DECL;
     FORMAL_PARAM_VARARG_DECL;
@@ -79,9 +182,9 @@ tokens {
     INTERFACE_TOP_LEVEL_SCOPE;
     IMPLEMENTS_CLAUSE;
     LABELED_STATEMENT;
-    LOCAL_MODIFIER_LIST;
     CHARJ_SOURCE;
     METHOD_CALL;
+    ENTRY_METHOD_CALL;
     MODIFIER_LIST;
     NEW_EXPRESSION;
     PAREN_EXPR;
@@ -96,13 +199,20 @@ tokens {
     TEMPLATE_INST;
     THIS_CONSTRUCTOR_CALL;
     TYPE;
-    UNARY_MINUS;
-    UNARY_PLUS;
+    SIMPLE_TYPE;
+    OBJECT_TYPE;
+    REFERENCE_TYPE;
+    POINTER_TYPE;
+    PROXY_TYPE;
     PRIMITIVE_VAR_DECLARATION;
     OBJECT_VAR_DECLARATION;
     VAR_DECLARATOR;
     VAR_DECLARATOR_LIST;
-    VOID_METHOD_DECL;
+    ARROW;
+    LOCAL_MODIFIER_LIST;
+    ACCESS_MODIFIER_LIST;
+    CHARJ_MODIFIER_LIST;
+    OTHER_MODIFIER_LIST;
 }
 
 @header {
@@ -121,22 +231,32 @@ package charj.translator;
 
 // Starting point for parsing a Charj file.
 charjSource
-    :   compilationUnit
+    :   compilationUnit EOF
         ->  ^(CHARJ_SOURCE compilationUnit)
     ;
 
 compilationUnit
     :   packageDeclaration? 
-        importDeclaration* 
-        typeDeclaration
+        topLevelDeclaration+ 
+    ;
+
+topLevelDeclaration
+    :   importDeclaration
+    |   readonlyDeclaration
+    |   typeDeclaration
     ;
 
 packageDeclaration
-    :   'package'^ qualifiedIdentifier ';'!  
+    :   PACKAGE IDENT (DOT IDENT)* ';'
+        ->  ^(PACKAGE IDENT+)
     ;
 
 importDeclaration
-    :   'import'^ qualifiedIdentifier '.*'? ';'!
+    :   IMPORT^ qualifiedIdentifier '.*'? ';'!
+    ;
+
+readonlyDeclaration
+    :   READONLY^ localVariableDeclaration ';'!
     ;
 
 typeDeclaration
@@ -145,7 +265,6 @@ typeDeclaration
     |   interfaceDefinition
     |   enumDefinition
     |   chareDefinition
-    |   chareArrayDefinition
     ;
 
 templateList
@@ -158,44 +277,38 @@ templateDeclaration
     ;
 
 classDefinition
-    : 'public'? 'class' IDENT ('extends' type)? ('implements' typeList)? '{'
-            classScopeDeclaration*
-        '}' ';'?
-        -> ^('class' IDENT ^('extends' type)? ^('implements' typeList)? classScopeDeclaration*)
+    :   PUBLIC? CLASS IDENT (EXTENDS type)? ('implements' typeList)? '{'
+      classScopeDeclaration* '}' ';'?
+        -> ^(TYPE CLASS IDENT ^(EXTENDS type)? ^('implements' typeList)? classScopeDeclaration*)
     ;
 
 chareType
-    :   'chare'
-    |   'group'
-    |   'nodegroup'
+    :   CHARE
+    |   GROUP
+    |   NODEGROUP
+    |   MAINCHARE
+    |   CHARE_ARRAY '[' ARRAY_DIMENSION ']' -> ^(CHARE_ARRAY ARRAY_DIMENSION)
     ;
 
 chareDefinition
-    :   'public'? chareType IDENT ('extends' type)? ('implements' typeList)? '{'
+    :   PUBLIC? chareType IDENT (EXTENDS type)? ('implements' typeList)? '{'
             classScopeDeclaration*
         '}' ';'?
-        -> ^(chareType IDENT ^('extends' type)? ^('implements' typeList)? classScopeDeclaration*)
-    ;
-
-chareArrayDefinition
-    :   'public'? 'chare_array' '[' ARRAY_DIMENSION ']' IDENT ('extends' type)? ('implements' typeList)? '{'
-            classScopeDeclaration*
-        '}' ';'?
-        -> ^('chare_array' ARRAY_DIMENSION IDENT ^('extends' type)? ^('implements' typeList)? classScopeDeclaration*)
+        -> ^(TYPE chareType IDENT ^(EXTENDS type)? ^('implements' typeList)? classScopeDeclaration*)
     ;
 
 interfaceDefinition
-    :   'interface' IDENT ('extends' typeList)?  '{'
+    :   'interface' IDENT (EXTENDS typeList)?  '{'
             interfaceScopeDeclaration*
         '}' ';'?
-        -> ^('interface' IDENT ^('extends' typeList)? interfaceScopeDeclaration*)
+        -> ^('interface' IDENT ^(EXTENDS typeList)? interfaceScopeDeclaration*)
     ;
 
 enumDefinition
-    :   'enum' IDENT ('implements' typeList)? '{'
+    :   ENUM IDENT ('implements' typeList)? '{'
             enumConstants ','? ';' classScopeDeclaration*
         '}' ';'?
-        -> ^('enum' IDENT ^('implements' typeList)? enumConstants classScopeDeclaration*)
+        -> ^(ENUM IDENT ^('implements' typeList)? enumConstants classScopeDeclaration*)
     ;
 
 enumConstants
@@ -216,8 +329,8 @@ classScopeDeclaration
             (   type IDENT formalParameterList (block | ';')
                 ->  ^(FUNCTION_METHOD_DECL modifierList? genericTypeParameterList? type IDENT
                     formalParameterList block?)
-            |   'void' IDENT formalParameterList (block | ';')
-                ->  ^(VOID_METHOD_DECL modifierList? genericTypeParameterList? IDENT formalParameterList block?)
+            /*|   'void' IDENT formalParameterList (block | ';')
+                ->  ^(VOID_METHOD_DECL modifierList? genericTypeParameterList? IDENT formalParameterList block?)*/
             |   ident=IDENT formalParameterList block
                 ->  ^(CONSTRUCTOR_DECL[$ident, "CONSTRUCTOR_DECL"] modifierList? genericTypeParameterList? IDENT
                         formalParameterList block)
@@ -235,8 +348,8 @@ interfaceScopeDeclaration
             (   type IDENT formalParameterList ';'
                 ->  ^(FUNCTION_METHOD_DECL modifierList? genericTypeParameterList?
                         type IDENT formalParameterList)
-            |   'void' IDENT formalParameterList ';'
-                ->  ^(VOID_METHOD_DECL modifierList? genericTypeParameterList? IDENT formalParameterList)
+            /*|   'void' IDENT formalParameterList ';'
+                ->  ^(VOID_METHOD_DECL modifierList? genericTypeParameterList? IDENT formalParameterList)*/
             )
         |   simpleType interfaceFieldDeclaratorList ';'
             ->  ^(PRIMITIVE_VAR_DECLARATION modifierList? simpleType interfaceFieldDeclaratorList)
@@ -251,7 +364,7 @@ classFieldDeclaratorList
     ;
 
 classFieldDeclarator
-    :   variableDeclaratorId ('=' variableInitializer)?
+    :   variableDeclaratorId (ASSIGNMENT variableInitializer)?
         ->  ^(VAR_DECLARATOR variableDeclaratorId variableInitializer?)
     ;
 
@@ -261,18 +374,18 @@ interfaceFieldDeclaratorList
     ;
 
 interfaceFieldDeclarator
-    :   variableDeclaratorId '=' variableInitializer
+    :   variableDeclaratorId ASSIGNMENT variableInitializer
         ->  ^(VAR_DECLARATOR variableDeclaratorId variableInitializer)
     ;
 
 
 variableDeclaratorId
-    :   IDENT^ domainExpression?
+    :   ^(IDENT domainExpression?)
     ;
 
 variableInitializer
     :   arrayInitializer
-    |   newExpression
+    |   expression
     ;
 
 /*arrayDeclarator
@@ -326,7 +439,7 @@ genericTypeParameter
     ;
 
 bound
-    :   e='extends' type ('&' type)*
+    :   e=EXTENDS type ('&' type)*
         ->  ^(EXTENDS_BOUND_LIST[$e, "EXTENDS_BOUND_LIST"] type+)
     ;
 
@@ -336,12 +449,12 @@ modifierList
     ;
 
 modifier
-    :   'public'
-    |   'protected'
-    |   'entry'
-    |   'private'
-    |   'abstract'
-    |   'native'
+    :   PUBLIC
+    |   PROTECTED
+    |   ENTRY
+    |   PRIVATE
+    |   ABSTRACT
+    |   NATIVE
     |   localModifier
     ;
 
@@ -351,28 +464,39 @@ localModifierList
     ;
 
 localModifier
-    :   'final'
-    |   'static'
-    |   'volatile'
+    :   FINAL
+    |   STATIC
+    |   VOLATILE
     ;
 
 type
     :   simpleType
     |   objectType
+    |   VOID
+    ;
+
+constructorType
+    :   qualifiedTypeIdent AT domainExpression?
+        ->  ^(PROXY_TYPE qualifiedTypeIdent domainExpression?)
+    |   qualifiedTypeIdent domainExpression?
+        ->  ^(OBJECT_TYPE qualifiedTypeIdent domainExpression?)
     ;
 
+
 simpleType
     :   primitiveType domainExpression?
-        ->  ^(TYPE primitiveType domainExpression?)  
+        ->  ^(SIMPLE_TYPE primitiveType domainExpression?)  
     ;
 
 objectType
-    :   qualifiedTypeIdent domainExpression?
-        ->  ^(TYPE qualifiedTypeIdent domainExpression?)
+    :   qualifiedTypeIdent AT domainExpression?
+        ->  ^(PROXY_TYPE qualifiedTypeIdent domainExpression?)
+    |   qualifiedTypeIdent domainExpression?
+        ->  ^(POINTER_TYPE qualifiedTypeIdent domainExpression?)
     ;
 
 qualifiedTypeIdent
-    :   typeIdent ('.' typeIdent)*
+    :   typeIdent (DOT typeIdent)*
         ->  ^(QUALIFIED_TYPE_IDENT typeIdent+) 
     ;
 
@@ -381,14 +505,14 @@ typeIdent
     ;
 
 primitiveType
-    :   'boolean'
-    |   'char'
-    |   'byte'
-    |   'short'
-    |   'int'
-    |   'long'
-    |   'float'
-    |   'double'
+    :   BOOLEAN
+    |   CHAR
+    |   BYTE
+    |   SHORT
+    |   INT
+    |   LONG
+    |   FLOAT
+    |   DOUBLE
     ;
 
 /*genericTypeArgumentList
@@ -433,14 +557,16 @@ qualifiedIdentifier
     :   (   IDENT
             ->  IDENT
         )
-        (   '.' ident=IDENT
-            ->  ^('.' $qualifiedIdentifier $ident)
+        (   DOT ident=IDENT
+            ->  ^(DOT $qualifiedIdentifier $ident)
         )*
     ;
 
 block
     :   lc='{' blockStatement* '}'
         ->  ^(BLOCK[$lc, "BLOCK"] blockStatement*)
+    |   nonBlockStatement
+        -> ^(BLOCK nonBlockStatement)
     ;
 
 blockStatement
@@ -454,53 +580,68 @@ 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 $elseStat)
+    |   IF parenthesizedExpression ifStat=block
+        (   ELSE elseStat=block
+            ->  ^(IF parenthesizedExpression $ifStat $elseStat)
         |
-            ->  ^('if' parenthesizedExpression $ifStat)
+            ->  ^(IF parenthesizedExpression $ifStat)
         )   
-    |   f='for' '('
-        (   forInit? ';' expression? ';' expressionList? ')' statement
-            -> ^($f forInit expression? expressionList statement)
-        |   localModifierList? type IDENT ':' expression ')' statement
-            -> ^(FOR_EACH[$f, "FOR_EACH"] localModifierList? type IDENT expression statement)
+    |   f=FOR '('
+        (   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)
-    |   'switch' parenthesizedExpression '{' switchCaseLabel* '}'
-        ->  ^('switch' parenthesizedExpression switchCaseLabel*)
-    |   'return' expression? ';'
-        ->  ^('return' expression?)
-    |   'throw' expression ';'
-        ->  ^('throw' expression)
-    |   'break' IDENT? ';'
-        ->  ^('break' IDENT?)
-    |   'continue' IDENT? ';'
-        ->  ^('continue' IDENT?)
+    |   WHILE parenthesizedExpression block
+        ->  ^(WHILE parenthesizedExpression block)
+    |   DO block WHILE parenthesizedExpression ';'
+        ->  ^(DO block parenthesizedExpression)
+    |   SWITCH parenthesizedExpression '{' switchCaseLabel* '}'
+        ->  ^(SWITCH parenthesizedExpression switchCaseLabel*)
+    |   RETURN expression? ';'
+        ->  ^(RETURN expression?)
+    |   THROW expression ';'
+        ->  ^(THROW expression)
+    |   BREAK IDENT? ';'
+        ->  ^(BREAK IDENT?)
+    |   CONTINUE IDENT? ';'
+        ->  ^(CONTINUE IDENT?)
     |   IDENT ':' statement
         ->  ^(LABELED_STATEMENT IDENT statement)
+    |   'delete' qualifiedIdentifier ';'
+        -> ^('delete' qualifiedIdentifier)
     |   'embed' STRING_LITERAL EMBED_BLOCK
         ->  ^('embed' STRING_LITERAL EMBED_BLOCK)
     |   expression ';'!
     |   ';' // Preserve empty statements.
+    |   PRINT '(' (expression (',' expression)*)* ')' ';'
+        ->  ^(PRINT expression*)
+    |   PRINTLN '(' (expression (',' expression)*)* ')' ';'
+        ->  ^(PRINTLN expression*)
+    |   EXIT '(' expression? ')' ';'
+        ->  ^(EXIT expression?)
+    |   EXITALL '(' ')' ';'
+        ->  EXITALL
+
     ;           
         
 
 switchCaseLabel
-    :   'case'^ expression ':'! blockStatement*
-    |   'default'^ ':'! blockStatement*
+    :   CASE^ expression ':'! blockStatement*
+    |   DEFAULT^ ':'! blockStatement*
     ;
     
 forInit
@@ -549,7 +690,7 @@ expression
 
 assignmentExpression
     :   conditionalExpression 
-        (   (   '='^
+        (   (   ASSIGNMENT^
             |   '+='^
             |   '-='^
             |   '*='^
@@ -591,7 +732,7 @@ andExpression
 
 equalityExpression
     :   instanceOfExpression 
-        (   (   '=='^
+        (   (   EQUALS^
             |   '!='^
             ) 
             instanceOfExpression
@@ -669,9 +810,8 @@ postfixedExpression
     :   (   primaryExpression
             ->  primaryExpression
         )
-        // ... and than the optional things that may follow a primary
-        // expression 0 or more times.
-        (   outerDot='.'                 
+        // ... and than the optional things that may follow a primary expression 0 or more times.
+        (   outerDot=DOT                 
             // Note: generic type arguments are only valid for method calls,
             // i.e. if there is an argument list
             (   (   templateInstantiation?  
@@ -681,17 +821,19 @@ postfixedExpression
                 (   arguments
                     ->  ^(METHOD_CALL $postfixedExpression templateInstantiation? arguments)
                 )?
-            |   'this'
-                ->  ^($outerDot $postfixedExpression 'this')
-            |   s='super' arguments
+            |   THIS
+                ->  ^($outerDot $postfixedExpression THIS)
+            |   s=SUPER arguments
                 ->  ^(SUPER_CONSTRUCTOR_CALL[$s, "SUPER_CONSTRUCTOR_CALL"] $postfixedExpression arguments)
-            |   (   'super' innerDot='.' IDENT
-                    ->  ^($innerDot ^($outerDot $postfixedExpression 'super') IDENT)
+            |   (   SUPER innerDot=DOT IDENT
+                    ->  ^($innerDot ^($outerDot $postfixedExpression SUPER) IDENT)
                 )
                 (   arguments
                     ->  ^(METHOD_CALL $postfixedExpression arguments)
                 )?
             )
+        |   (AT templateInstantiation? IDENT arguments)
+            ->  ^(ENTRY_METHOD_CALL ^(AT $postfixedExpression IDENT) templateInstantiation? arguments)
         |   '[' expression ']'
             ->  ^(ARRAY_ELEMENT_ACCESS $postfixedExpression expression)
         )*
@@ -706,32 +848,42 @@ primaryExpression
     |   literal
     |   newExpression
     |   qualifiedIdentExpression
-    |   templateInstantiation 
-        (   s='super'
+    |   templateInstantiation
+        (   s=SUPER
             (   arguments
                 ->  ^(SUPER_CONSTRUCTOR_CALL[$s, "SUPER_CONSTRUCTOR_CALL"] templateInstantiation arguments)
             |   IDENT arguments
-                ->  ^(METHOD_CALL ^('.' 'super' IDENT) templateInstantiation arguments)
+                ->  ^(METHOD_CALL ^(DOT SUPER IDENT) templateInstantiation arguments)
             )
         |   IDENT arguments
             ->  ^(METHOD_CALL IDENT templateInstantiation arguments)
-        |   t='this' arguments
+        |   t=THIS arguments
             ->  ^(THIS_CONSTRUCTOR_CALL[$t, "THIS_CONSTRUCTOR_CALL"] templateInstantiation arguments)
         )
-    |   (   'this'
-            ->  'this'
+    |   (   THIS
+            ->  THIS
         )
         (   arguments
             ->  ^(THIS_CONSTRUCTOR_CALL[$t, "THIS_CONSTRUCTOR_CALL"] arguments)
         )?
-    |   s='super' arguments
+    |   s=SUPER arguments
         ->  ^(SUPER_CONSTRUCTOR_CALL[$s, "SUPER_CONSTRUCTOR_CALL"] arguments)
-    |   (   'super' '.' IDENT
+    |   (   SUPER DOT IDENT
         )
         (   arguments
-            ->  ^(METHOD_CALL ^('.' 'super' IDENT) arguments)
-        |   ->  ^('.' 'super' IDENT)
+            ->  ^(METHOD_CALL ^(DOT SUPER IDENT) arguments)
+        |   ->  ^(DOT SUPER IDENT)
         )
+    |   GETMYPE '(' ')'
+        ->  GETMYPE
+    |   GETNUMPES '(' ')'
+        ->  GETNUMPES
+    |   GETMYRANK '(' ')'
+        ->  GETMYRANK
+    |   GETMYNODE '(' ')'
+        -> GETMYNODE
+    |   GETNUMNODES '(' ')'
+        -> GETNUMNODES
     ;
     
 qualifiedIdentExpression
@@ -742,28 +894,33 @@ qualifiedIdentExpression
         // And now comes the stuff that may follow the qualified identifier.
         (   arguments
             ->  ^(METHOD_CALL qualifiedIdentifier arguments)
-        |   outerDot='.'
-            (   templateInstantiation 
-                (   s='super' arguments
+        |   outerDot=DOT
+            (   templateInstantiation
+                (   s=SUPER arguments
                     ->  ^(SUPER_CONSTRUCTOR_CALL[$s, "SUPER_CONSTRUCTOR_CALL"]
                             qualifiedIdentifier templateInstantiation arguments)
-                |   'super' innerDot='.' IDENT arguments
-                    ->  ^(METHOD_CALL ^($innerDot ^($outerDot qualifiedIdentifier 'super') IDENT)
+                |   SUPER innerDot=DOT IDENT arguments
+                    ->  ^(METHOD_CALL ^($innerDot ^($outerDot qualifiedIdentifier SUPER) IDENT)
                             templateInstantiation arguments)
                 |   IDENT arguments
                     ->  ^(METHOD_CALL ^($outerDot qualifiedIdentifier IDENT) templateInstantiation arguments)
                 )
-            |   'this'
-                ->  ^($outerDot qualifiedIdentifier 'this')
-            |   s='super' arguments
+            |   THIS
+                ->  ^($outerDot qualifiedIdentifier THIS)
+            |   s=SUPER arguments
                 ->  ^(SUPER_CONSTRUCTOR_CALL[$s, "SUPER_CONSTRUCTOR_CALL"] qualifiedIdentifier arguments)
             )
         )?
     ;
 
 newExpression
-    :   'new' domainExpression arguments?
-        ->  ^(NEW_EXPRESSION arguments? domainExpression)
+    :   n=NEW
+        (
+            domainExpression arguments?
+            ->  ^(NEW_EXPRESSION arguments? domainExpression)
+        |   constructorType arguments
+            -> ^(NEW constructorType arguments)
+        )
     ;
     
 /*newArrayConstruction
@@ -783,9 +940,9 @@ literal
     |   FLOATING_POINT_LITERAL
     |   CHARACTER_LITERAL
     |   STRING_LITERAL
-    |   'true'
-    |   'false'
-    |   'null'
+    |   TRUE
+    |   FALSE
+    |   NULL
     ;
 
 // LEXER
@@ -796,8 +953,7 @@ DECIMAL_LITERAL : ('0' | '1'..'9' '0'..'9'*) INTEGER_TYPE_SUFFIX? ;
 
 OCTAL_LITERAL : '0' ('0'..'7')+ INTEGER_TYPE_SUFFIX? ;
 
-//fragment
-ARRAY_DIMENSION :  '1'..'6' ('d'|'D') ;
+ARRAY_DIMENSION :  ('1'..'6')('d'|'D') ;
 
 fragment
 HEX_DIGIT : ('0'..'9'|'a'..'f'|'A'..'F') ;
@@ -808,11 +964,11 @@ INTEGER_TYPE_SUFFIX : ('l'|'L') ;
 FLOATING_POINT_LITERAL
     :   ('0'..'9')+ 
         (
-            '.' ('0'..'9')* EXPONENT? FLOAT_TYPE_SUFFIX?
+            DOT ('0'..'9')* EXPONENT? FLOAT_TYPE_SUFFIX?
         |   EXPONENT FLOAT_TYPE_SUFFIX?
         |   FLOAT_TYPE_SUFFIX
         )
-    |   '.' ('0'..'9')+ EXPONENT? FLOAT_TYPE_SUFFIX?
+    |   DOT ('0'..'9')+ EXPONENT? FLOAT_TYPE_SUFFIX?
     ;
 
 fragment
@@ -894,8 +1050,9 @@ COMMENT
     ;
 
 LINE_COMMENT
-    : '//' ~('\n'|'\r')* '\r'? '\n'
+    : ('//'|'#') ~('\n'|'\r')* '\r'? '\n'
     {   
         $channel = HIDDEN;
     }
     ;
+