You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@flex.apache.org by cd...@apache.org on 2014/08/27 00:44:20 UTC

[49/51] [partial] Refactored the PMD Maven build - Adjusted the directory structure - Fixed a lot of compile problems - Fixed the maven setup - Made PMD build with Flexmojos 7.1.0 and Apache Flex 4.13.0 - Fixed a few UnitTests

http://git-wip-us.apache.org/repos/asf/flex-utilities/blob/e43b7a87/FlexPMD/as3-parser/src/main/java/de/bokelberg/flex/parser/AS3Parser.java
----------------------------------------------------------------------
diff --git a/FlexPMD/as3-parser/src/main/java/de/bokelberg/flex/parser/AS3Parser.java b/FlexPMD/as3-parser/src/main/java/de/bokelberg/flex/parser/AS3Parser.java
deleted file mode 100644
index d12f099..0000000
--- a/FlexPMD/as3-parser/src/main/java/de/bokelberg/flex/parser/AS3Parser.java
+++ /dev/null
@@ -1,2360 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package de.bokelberg.flex.parser;
-
-import java.io.File;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-
-import com.adobe.ac.pmd.files.impl.FileUtils;
-import com.adobe.ac.pmd.parser.IAS3Parser;
-import com.adobe.ac.pmd.parser.IParserNode;
-import com.adobe.ac.pmd.parser.KeyWords;
-import com.adobe.ac.pmd.parser.NodeKind;
-import com.adobe.ac.pmd.parser.Operators;
-import com.adobe.ac.pmd.parser.exceptions.NullTokenException;
-import com.adobe.ac.pmd.parser.exceptions.TokenException;
-import com.adobe.ac.pmd.parser.exceptions.UnExpectedTokenException;
-import com.adobe.ac.pmd.parser.exceptions.UnExpectedTokenException.Position;
-
-import de.bokelberg.flex.parser.AS3Scanner.Token;
-
-/**
- * @author xagnetti
- */
-public class AS3Parser implements IAS3Parser
-{
-   /**
-    * 
-    */
-   public static final String  ASDOC_COMMENT          = "/**";
-   /**
-    * 
-    */
-   public static final String  MULTIPLE_LINES_COMMENT = "/*";
-   /**
-    * 
-    */
-   public static final String  NEW_LINE               = "\n";
-   /**
-    * 
-    */
-   public static final String  SINGLE_LINE_COMMENT    = "//";
-   private static final String VECTOR                 = "Vector";
-   private Node                currentAsDoc;
-   private Node                currentFunctionNode;
-   private Node                currentMultiLineComment;
-   private String              fileName;
-   private boolean             isInFor;
-   private AS3Scanner          scn;
-   private Token               tok;
-
-   /**
-    * 
-    */
-   public AS3Parser()
-   {
-      this.scn = new AS3Scanner();
-      isInFor = false;
-   }
-
-   /*
-    * (non-Javadoc)
-    * @see de.bokelberg.flex.parser.IAS3Parser#buildAst(java.lang.String)
-    */
-   public final IParserNode buildAst( final String filePath ) throws IOException,
-                                                             TokenException
-   {
-      return parseLines( filePath,
-                         FileUtils.readLines( new File( filePath ) ) );
-   }
-
-   /*
-    * (non-Javadoc)
-    * @see com.adobe.ac.pmd.parser.IAS3Parser#buildAst(java.lang.String,
-    * java.lang.String[])
-    */
-   public final IParserNode buildAst( final String filePath,
-                                      final String[] scriptBlockLines ) throws TokenException
-   {
-      return parseLines( filePath,
-                         scriptBlockLines );
-   }
-
-   /**
-    * @return
-    */
-   final AS3Scanner getScn()
-   {
-      return scn;
-   }
-
-   final void nextToken() throws TokenException
-   {
-      nextToken( false );
-   }
-
-   /**
-    * Get the next token Skip comments and newlines for now In the end we want
-    * to keep them though.
-    * 
-    * @throws TokenException
-    */
-   final void nextToken( final boolean ignoreDocumentation ) throws TokenException
-   {
-      do
-      {
-         if ( ignoreDocumentation )
-         {
-            nextTokenIgnoringDocumentation();
-         }
-         else
-         {
-            nextTokenAllowNewLine();
-         }
-      }
-      while ( tok.getText().equals( NEW_LINE ) );
-   }
-
-   /**
-    * tok is first content token
-    * 
-    * @throws TokenException
-    */
-   final Node parseClassContent() throws TokenException
-   {
-      final Node result = Node.create( NodeKind.CONTENT,
-                                       tok.getLine(),
-                                       tok.getColumn() );
-      final List< Token > modifiers = new ArrayList< Token >();
-      final List< Node > meta = new ArrayList< Node >();
-
-      while ( !tokIs( Operators.RIGHT_CURLY_BRACKET ) )
-      {
-         if ( tokIs( Operators.LEFT_CURLY_BRACKET ) )
-         {
-            result.addChild( parseBlock() );
-         }
-         if ( tokIs( Operators.LEFT_SQUARE_BRACKET ) )
-         {
-            meta.add( parseMetaData() );
-         }
-         else if ( tokIs( KeyWords.VAR ) )
-         {
-            parseClassField( result,
-                             modifiers,
-                             meta );
-         }
-         else if ( tokIs( KeyWords.CONST ) )
-         {
-            parseClassConstant( result,
-                                modifiers,
-                                meta );
-         }
-         else if ( tokIs( KeyWords.IMPORT ) )
-         {
-            result.addChild( parseImport() );
-         }
-         else if ( tokIs( KeyWords.FUNCTION ) )
-         {
-            parseClassFunctions( result,
-                                 modifiers,
-                                 meta );
-         }
-         else
-         {
-            tryToParseCommentNode( result,
-                                   modifiers );
-         }
-      }
-      return result;
-   }
-
-   /**
-    * tok is empty, since nextToken has not been called before
-    * 
-    * @throws UnExpectedTokenException
-    */
-   final Node parseCompilationUnit() throws TokenException
-   {
-      final Node result = Node.create( NodeKind.COMPILATION_UNIT,
-                                       -1,
-                                       -1 );
-
-      nextTokenIgnoringDocumentation();
-      if ( tokIs( KeyWords.PACKAGE ) )
-      {
-         result.addChild( parsePackage() );
-      }
-      result.addChild( parsePackageContent() );
-      return result;
-   }
-
-   /**
-    * @return
-    * @throws TokenException
-    */
-   final IParserNode parseExpression() throws TokenException
-   {
-      return parseAssignmentExpression();
-   }
-
-   /**
-    * tok is first content token
-    * 
-    * @throws TokenException
-    */
-   final Node parseInterfaceContent() throws TokenException
-   {
-      final Node result = Node.create( NodeKind.CONTENT,
-                                       tok.getLine(),
-                                       tok.getColumn() );
-      while ( !tokIs( Operators.RIGHT_CURLY_BRACKET ) )
-      {
-         if ( tokIs( KeyWords.IMPORT ) )
-         {
-            result.addChild( parseImport() );
-         }
-         else if ( tokIs( KeyWords.FUNCTION ) )
-         {
-            result.addChild( parseFunctionSignature() );
-         }
-         else if ( tokIs( KeyWords.INCLUDE )
-               || tokIs( KeyWords.INCLUDE_AS2 ) )
-         {
-            result.addChild( parseIncludeExpression() );
-         }
-         else if ( tokIs( Operators.LEFT_SQUARE_BRACKET ) )
-         {
-            while ( !tokIs( Operators.RIGHT_SQUARE_BRACKET ) )
-            {
-               nextToken();
-            }
-            nextToken();
-         }
-         else
-         {
-            tryToParseCommentNode( result,
-                                   null );
-         }
-      }
-      return result;
-   }
-
-   /**
-    * tok is first token of content
-    * 
-    * @throws UnExpectedTokenException
-    */
-   final Node parsePackageContent() throws TokenException
-   {
-      final Node result = Node.create( NodeKind.CONTENT,
-                                       tok.getLine(),
-                                       tok.getColumn() );
-      final List< Token > modifiers = new ArrayList< Token >();
-      final List< Node > meta = new ArrayList< Node >();
-
-      while ( !tokIs( Operators.RIGHT_CURLY_BRACKET )
-            && !tokIs( KeyWords.EOF ) )
-      {
-         if ( tokIs( KeyWords.IMPORT ) )
-         {
-            result.addChild( parseImport() );
-         }
-         else if ( tokIs( KeyWords.USE ) )
-         {
-            result.addChild( parseUse() );
-         }
-         else if ( tokIs( Operators.LEFT_SQUARE_BRACKET ) )
-         {
-            meta.add( parseMetaData() );
-         }
-         else if ( tokIs( KeyWords.CLASS ) )
-         {
-            result.addChild( parseClass( meta,
-                                         modifiers ) );
-
-            modifiers.clear();
-            meta.clear();
-         }
-         else if ( tokIs( KeyWords.INTERFACE ) )
-         {
-            result.addChild( parseInterface( meta,
-                                             modifiers ) );
-            modifiers.clear();
-            meta.clear();
-         }
-         else if ( tokIs( KeyWords.FUNCTION ) )
-         {
-            parseClassFunctions( result,
-                                 modifiers,
-                                 meta );
-         }
-         else if ( tok.getText().startsWith( ASDOC_COMMENT ) )
-         {
-            currentAsDoc = Node.create( NodeKind.AS_DOC,
-                                        tok.getLine(),
-                                        tok.getColumn(),
-                                        tok.getText() );
-            nextToken();
-         }
-         else if ( tok.getText().startsWith( MULTIPLE_LINES_COMMENT ) )
-         {
-            currentMultiLineComment = Node.create( NodeKind.MULTI_LINE_COMMENT,
-                                                   tok.getLine(),
-                                                   tok.getColumn(),
-                                                   tok.getText() );
-            nextToken();
-         }
-         else
-         {
-            modifiers.add( tok );
-            nextTokenIgnoringDocumentation();
-         }
-      }
-      return result;
-   }
-
-   /**
-    * @return
-    * @throws TokenException
-    */
-   final Node parsePrimaryExpression() throws TokenException
-   {
-      Node result = Node.create( NodeKind.PRIMARY,
-                                 tok.getLine(),
-                                 tok.getColumn(),
-                                 tok.getText() );
-
-      if ( tokIs( Operators.LEFT_SQUARE_BRACKET ) )
-      {
-         result.addChild( parseArrayLiteral() );
-      }
-      else if ( tokIs( Operators.LEFT_CURLY_BRACKET ) )
-      {
-         result.addChild( parseObjectLiteral() );
-      }
-      else if ( tokIs( KeyWords.FUNCTION ) )
-      {
-         result.addChild( parseLambdaExpression() );
-      }
-      else if ( tokIs( KeyWords.NEW ) )
-      {
-         result = parseNewExpression();
-      }
-      else if ( tokIs( Operators.LEFT_PARENTHESIS ) )
-      {
-         result.addChild( parseEncapsulatedExpression() );
-      }
-      else
-      {
-         nextToken( true );
-      }
-      return result;
-   }
-
-   /**
-    * tok is the first token of a statement
-    * 
-    * @throws TokenException
-    */
-   final IParserNode parseStatement() throws TokenException
-   {
-      IParserNode result;
-
-      if ( tokIs( KeyWords.FOR ) )
-      {
-         result = parseFor();
-      }
-      else if ( tokIs( KeyWords.IF ) )
-      {
-         result = parseIf();
-      }
-      else if ( tokIs( KeyWords.SWITCH ) )
-      {
-         result = parseSwitch();
-      }
-      else if ( tokIs( KeyWords.DO ) )
-      {
-         result = parseDo();
-      }
-      else if ( tokIs( KeyWords.WHILE ) )
-      {
-         result = parseWhile();
-      }
-      else if ( tokIs( KeyWords.TRY ) )
-      {
-         result = parseTry();
-      }
-      else if ( tokIs( KeyWords.CATCH ) )
-      {
-         result = parseCatch();
-      }
-      else if ( tokIs( KeyWords.FINALLY ) )
-      {
-         result = parseFinally();
-      }
-      else if ( tokIs( Operators.LEFT_CURLY_BRACKET ) )
-      {
-         result = parseBlock();
-      }
-      else if ( tokIs( KeyWords.VAR ) )
-      {
-         result = parseVar();
-      }
-      else if ( tokIs( KeyWords.CONST ) )
-      {
-         result = parseConst();
-      }
-      else if ( tokIs( KeyWords.RETURN ) )
-      {
-         result = parseReturnStatement();
-      }
-      else if ( tokIs( Operators.SEMI_COLUMN ) )
-      {
-         result = parseEmptyStatement();
-      }
-      else
-      {
-         result = parseExpressionList();
-         skip( Operators.SEMI_COLUMN );
-      }
-      return result;
-   }
-
-   /**
-    * @return
-    * @throws TokenException
-    */
-   final Node parseUnaryExpression() throws TokenException
-   {
-      Node result;
-      if ( tokIs( Operators.INCREMENT ) )
-      {
-         nextToken();
-         result = Node.create( NodeKind.PRE_INC,
-                               tok.getLine(),
-                               tok.getColumn(),
-                               parseUnaryExpression() );
-      }
-      else if ( tokIs( Operators.DECREMENT ) )
-      {
-         nextToken();
-         result = Node.create( NodeKind.PRE_DEC,
-                               tok.getLine(),
-                               tok.getColumn(),
-                               parseUnaryExpression() );
-      }
-      else if ( tokIs( Operators.MINUS ) )
-      {
-         nextToken();
-         result = Node.create( NodeKind.MINUS,
-                               tok.getLine(),
-                               tok.getColumn(),
-                               parseUnaryExpression() );
-      }
-      else if ( tokIs( Operators.PLUS )
-            || tokIs( Operators.PLUS_AS2 ) )
-      {
-         nextToken();
-         result = Node.create( NodeKind.PLUS,
-                               tok.getLine(),
-                               tok.getColumn(),
-                               parseUnaryExpression() );
-      }
-      else
-      {
-         result = parseUnaryExpressionNotPlusMinus();
-      }
-      return result;
-   }
-
-   private IParserNode collectVarListContent( final Node result ) throws TokenException
-   {
-      result.addChild( parseNameTypeInit() );
-      while ( tokIs( Operators.COMMA ) )
-      {
-         nextToken( true );
-         result.addChild( parseNameTypeInit() );
-      }
-      return result;
-   }
-
-   private void consume( final KeyWords keyword ) throws TokenException
-   {
-      consume( keyword.toString() );
-   }
-
-   private void consume( final Operators operator ) throws TokenException
-   {
-      consume( operator.toString() );
-   }
-
-   /**
-    * Compare the current token to the parameter. If it equals, get the next
-    * token. If not, throw a runtime exception.
-    * 
-    * @param text
-    * @throws UnExpectedTokenException
-    */
-   private void consume( final String text ) throws TokenException
-   {
-      while ( tok.getText().startsWith( "//" ) )
-      {
-         nextToken();
-      }
-
-      if ( !tokIs( text ) )
-      {
-         throw new UnExpectedTokenException( tok.getText(),
-                                             new Position( tok.getLine(), tok.getColumn() ),
-                                             fileName,
-                                             text );
-      }
-      nextToken();
-   }
-
-   private Node convertMeta( final List< Node > metadataList )
-   {
-      if ( metadataList == null
-            || metadataList.isEmpty() )
-      {
-         return null;
-      }
-
-      final Node result = Node.create( NodeKind.META_LIST,
-                                       tok.getLine(),
-                                       tok.getColumn() );
-
-      for ( final Node metadataNode : metadataList )
-      {
-         result.addChild( metadataNode );
-      }
-      return result;
-   }
-
-   private Node convertModifiers( final List< Token > modifierList )
-   {
-      if ( modifierList == null )
-      {
-         return null;
-      }
-
-      final Node result = Node.create( NodeKind.MOD_LIST,
-                                       tok.getLine(),
-                                       tok.getColumn() );
-
-      for ( final Token modifierToken : modifierList )
-      {
-         result.addChild( NodeKind.MODIFIER,
-                          tok.getLine(),
-                          tok.getColumn(),
-                          modifierToken.getText() );
-      }
-      return result;
-   }
-
-   private Node[] doParseSignature() throws TokenException
-   {
-      consume( KeyWords.FUNCTION );
-
-      Node type = Node.create( NodeKind.TYPE,
-                               tok.getLine(),
-                               tok.getColumn(),
-                               KeyWords.FUNCTION.toString() );
-      if ( tokIs( KeyWords.SET )
-            || tokIs( KeyWords.GET ) )
-      {
-         type = Node.create( NodeKind.TYPE,
-                             tok.getLine(),
-                             tok.getColumn(),
-                             tok.getText() );
-         nextToken(); // set or get
-      }
-      final Node name = Node.create( NodeKind.NAME,
-                                     tok.getLine(),
-                                     tok.getColumn(),
-                                     tok.getText() );
-      nextToken(); // name
-      final Node params = parseParameterList();
-      final Node returnType = parseOptionalType();
-      return new Node[]
-      { type,
-                  name,
-                  params,
-                  returnType };
-   }
-
-   private NodeKind findFunctionTypeFromSignature( final Node[] signature )
-   {
-      for ( final Node node : signature )
-      {
-         if ( node.is( NodeKind.TYPE ) )
-         {
-            if ( node.getStringValue().equals( "set" ) )
-            {
-               return NodeKind.SET;
-            }
-            if ( node.getStringValue().equals( "get" ) )
-            {
-               return NodeKind.GET;
-            }
-            return NodeKind.FUNCTION;
-         }
-      }
-      return NodeKind.FUNCTION;
-   }
-
-   /**
-    * Get the next token Skip comments but keep newlines We need this method for
-    * beeing able to decide if a returnStatement has an expression
-    * 
-    * @throws UnExpectedTokenException
-    */
-   private void nextTokenAllowNewLine() throws TokenException
-   {
-      do
-      {
-         tok = scn.nextToken();
-
-         if ( tok == null )
-         {
-            throw new NullTokenException( fileName );
-
-         }
-         if ( tok.getText() == null )
-         {
-            throw new NullTokenException( fileName );
-         }
-      }
-      while ( tok.getText().startsWith( SINGLE_LINE_COMMENT ) );
-   }
-
-   private void nextTokenIgnoringDocumentation() throws TokenException
-   {
-      do
-      {
-         nextToken();
-      }
-      while ( tok.getText().startsWith( MULTIPLE_LINES_COMMENT ) );
-   }
-
-   private IParserNode parseAdditiveExpression() throws TokenException
-   {
-      final Node result = Node.create( NodeKind.ADD,
-                                       tok.getLine(),
-                                       tok.getColumn(),
-                                       parseMultiplicativeExpression() );
-      while ( tokIs( Operators.PLUS )
-            || tokIs( Operators.PLUS_AS2 ) || tokIs( Operators.MINUS ) )
-      {
-         result.addChild( Node.create( NodeKind.OP,
-                                       tok.getLine(),
-                                       tok.getColumn(),
-                                       tok.getText() ) );
-         nextToken( true );
-         result.addChild( parseMultiplicativeExpression() );
-      }
-      return result.numChildren() > 1 ? result
-                                     : result.getChild( 0 );
-   }
-
-   // ------------------------------------------------------------------------
-   // language specific recursive descent parsing
-   // ------------------------------------------------------------------------
-
-   private IParserNode parseAndExpression() throws TokenException
-   {
-      final Node result = Node.create( NodeKind.AND,
-                                       tok.getLine(),
-                                       tok.getColumn(),
-                                       parseBitwiseOrExpression() );
-      while ( tokIs( Operators.AND )
-            || tokIs( Operators.AND_AS2 ) )
-      {
-         result.addChild( Node.create( NodeKind.OP,
-                                       tok.getLine(),
-                                       tok.getColumn(),
-                                       tok.getText() ) );
-         nextToken( true );
-         result.addChild( parseBitwiseOrExpression() );
-      }
-      return result.numChildren() > 1 ? result
-                                     : result.getChild( 0 );
-   }
-
-   /**
-    * tok is ( exit tok is first token after )
-    */
-   private Node parseArgumentList() throws TokenException
-   {
-      consume( Operators.LEFT_PARENTHESIS );
-      final Node result = Node.create( NodeKind.ARGUMENTS,
-                                       tok.getLine(),
-                                       tok.getColumn() );
-      while ( !tokIs( Operators.RIGHT_PARENTHESIS ) )
-      {
-         result.addChild( parseExpression() );
-         skip( Operators.COMMA );
-      }
-      consume( Operators.RIGHT_PARENTHESIS );
-      return result;
-   }
-
-   private Node parseArrayAccessor( final Node node ) throws TokenException
-   {
-      final Node result = Node.create( NodeKind.ARRAY_ACCESSOR,
-                                       tok.getLine(),
-                                       tok.getColumn() );
-      result.addChild( node );
-      while ( tokIs( Operators.LEFT_SQUARE_BRACKET ) )
-      {
-         nextToken( true );
-         result.addChild( parseExpression() );
-         consume( Operators.RIGHT_SQUARE_BRACKET );
-      }
-      return result;
-   }
-
-   /**
-    * tok is [
-    */
-   private IParserNode parseArrayLiteral() throws TokenException
-   {
-      final Node result = Node.create( NodeKind.ARRAY,
-                                       tok.getLine(),
-                                       tok.getColumn() );
-      consume( Operators.LEFT_SQUARE_BRACKET );
-      while ( !tokIs( Operators.RIGHT_SQUARE_BRACKET ) )
-      {
-         result.addChild( parseExpression() );
-         skip( Operators.COMMA );
-      }
-      consume( Operators.RIGHT_SQUARE_BRACKET );
-      return result;
-   }
-
-   private IParserNode parseAssignmentExpression() throws TokenException
-   {
-      final Node result = Node.create( NodeKind.ASSIGN,
-                                       tok.getLine(),
-                                       tok.getColumn(),
-                                       parseConditionalExpression() );
-      while ( tokIs( Operators.EQUAL )
-            || tokIs( Operators.PLUS_EQUAL ) || tokIs( Operators.MINUS_EQUAL )
-            || tokIs( Operators.TIMES_EQUAL ) || tokIs( Operators.DIVIDED_EQUAL )
-            || tokIs( Operators.MODULO_EQUAL ) || tokIs( Operators.AND_EQUAL ) || tokIs( Operators.OR_EQUAL )
-            || tokIs( Operators.XOR_EQUAL ) )
-      {
-         result.addChild( Node.create( NodeKind.OP,
-                                       tok.getLine(),
-                                       tok.getColumn(),
-                                       tok.getText() ) );
-         nextToken( true );
-         result.addChild( parseExpression() );
-      }
-      return result.numChildren() > 1 ? result
-                                     : result.getChild( 0 );
-   }
-
-   private IParserNode parseBitwiseAndExpression() throws TokenException
-   {
-      final Node result = Node.create( NodeKind.B_AND,
-                                       tok.getLine(),
-                                       tok.getColumn(),
-                                       parseEqualityExpression() );
-      while ( tokIs( Operators.B_AND ) )
-      {
-         result.addChild( Node.create( NodeKind.OP,
-                                       tok.getLine(),
-                                       tok.getColumn(),
-                                       tok.getText() ) );
-         nextToken( true );
-         result.addChild( parseEqualityExpression() );
-      }
-      return result.numChildren() > 1 ? result
-                                     : result.getChild( 0 );
-   }
-
-   private IParserNode parseBitwiseOrExpression() throws TokenException
-   {
-      final Node result = Node.create( NodeKind.B_OR,
-                                       tok.getLine(),
-                                       tok.getColumn(),
-                                       parseBitwiseXorExpression() );
-      while ( tokIs( Operators.B_OR ) )
-      {
-         result.addChild( Node.create( NodeKind.OP,
-                                       tok.getLine(),
-                                       tok.getColumn(),
-                                       tok.getText() ) );
-         nextToken( true );
-         result.addChild( parseBitwiseXorExpression() );
-      }
-      return result.numChildren() > 1 ? result
-                                     : result.getChild( 0 );
-   }
-
-   private IParserNode parseBitwiseXorExpression() throws TokenException
-   {
-      final Node result = Node.create( NodeKind.B_XOR,
-                                       tok.getLine(),
-                                       tok.getColumn(),
-                                       parseBitwiseAndExpression() );
-      while ( tokIs( Operators.B_XOR ) )
-      {
-         result.addChild( Node.create( NodeKind.OP,
-                                       tok.getLine(),
-                                       tok.getColumn(),
-                                       tok.getText() ) );
-         nextToken( true );
-         result.addChild( parseBitwiseAndExpression() );
-      }
-      return result.numChildren() > 1 ? result
-                                     : result.getChild( 0 );
-   }
-
-   private Node parseBlock() throws TokenException
-   {
-      return parseBlock( Node.create( NodeKind.BLOCK,
-                                      tok.getLine(),
-                                      tok.getColumn() ) );
-   }
-
-   private Node parseBlock( final Node result ) throws TokenException
-   {
-      consume( Operators.LEFT_CURLY_BRACKET );
-
-      while ( !tokIs( Operators.RIGHT_CURLY_BRACKET ) )
-      {
-         if ( tok.getText().startsWith( MULTIPLE_LINES_COMMENT ) )
-         {
-            currentFunctionNode.addChild( Node.create( NodeKind.MULTI_LINE_COMMENT,
-                                                       tok.getLine(),
-                                                       tok.getColumn(),
-                                                       tok.getText() ) );
-            nextToken();
-         }
-         else
-         {
-            result.addChild( parseStatement() );
-         }
-      }
-      consume( Operators.RIGHT_CURLY_BRACKET );
-      return result;
-   }
-
-   /**
-    * tok is catch
-    * 
-    * @throws TokenException
-    */
-   private Node parseCatch() throws TokenException
-   {
-      consume( KeyWords.CATCH );
-      consume( Operators.LEFT_PARENTHESIS );
-      final Node result = Node.create( NodeKind.CATCH,
-                                       tok.getLine(),
-                                       tok.getColumn(),
-                                       Node.create( NodeKind.NAME,
-                                                    tok.getLine(),
-                                                    tok.getColumn(),
-                                                    tok.getText() ) );
-      nextToken( true ); // name
-      if ( tokIs( Operators.COLUMN ) )
-      {
-         nextToken( true ); // :
-         result.addChild( Node.create( NodeKind.TYPE,
-                                       tok.getLine(),
-                                       tok.getColumn(),
-                                       tok.getText() ) );
-         nextToken( true ); // type
-      }
-      consume( Operators.RIGHT_PARENTHESIS );
-      result.addChild( parseBlock() );
-      return result;
-   }
-
-   /**
-    * tok is class
-    * 
-    * @param meta
-    * @param modifier
-    * @throws TokenException
-    */
-   private Node parseClass( final List< Node > meta,
-                            final List< Token > modifier ) throws TokenException
-   {
-      consume( KeyWords.CLASS );
-
-      final Node result = Node.create( NodeKind.CLASS,
-                                       tok.getLine(),
-                                       tok.getColumn() );
-
-      if ( currentAsDoc != null )
-      {
-         result.addChild( currentAsDoc );
-         currentAsDoc = null;
-      }
-      if ( currentMultiLineComment != null )
-      {
-         result.addChild( currentMultiLineComment );
-         currentMultiLineComment = null;
-      }
-
-      result.addChild( NodeKind.NAME,
-                       tok.getLine(),
-                       tok.getColumn(),
-                       parseQualifiedName( true ) );
-
-      result.addChild( convertMeta( meta ) );
-      result.addChild( convertModifiers( modifier ) );
-
-      // nextToken( true ); // name
-
-      do
-      {
-         if ( tokIs( KeyWords.EXTENDS ) )
-         {
-            nextToken( true ); // extends
-            result.addChild( NodeKind.EXTENDS,
-                             tok.getLine(),
-                             tok.getColumn(),
-                             parseQualifiedName( false ) );
-         }
-         else if ( tokIs( KeyWords.IMPLEMENTS ) )
-         {
-            result.addChild( parseImplementsList() );
-         }
-      }
-      while ( !tokIs( Operators.LEFT_CURLY_BRACKET ) );
-      consume( Operators.LEFT_CURLY_BRACKET );
-      result.addChild( parseClassContent() );
-      consume( Operators.RIGHT_CURLY_BRACKET );
-      return result;
-   }
-
-   private void parseClassConstant( final Node result,
-                                    final List< Token > modifiers,
-                                    final List< Node > meta ) throws TokenException
-   {
-      result.addChild( parseConstList( meta,
-                                       modifiers ) );
-      if ( tokIs( Operators.SEMI_COLUMN ) )
-      {
-         nextToken();
-      }
-      meta.clear();
-      modifiers.clear();
-   }
-
-   private void parseClassField( final Node result,
-                                 final List< Token > modifiers,
-                                 final List< Node > meta ) throws TokenException
-   {
-      final Node varList = parseVarList( meta,
-                                         modifiers );
-      result.addChild( varList );
-      if ( currentAsDoc != null )
-      {
-         varList.addChild( currentAsDoc );
-         currentAsDoc = null;
-      }
-      if ( currentMultiLineComment != null )
-      {
-         result.addChild( currentMultiLineComment );
-         currentMultiLineComment = null;
-      }
-      if ( tokIs( Operators.SEMI_COLUMN ) )
-      {
-         nextToken();
-      }
-      meta.clear();
-      modifiers.clear();
-   }
-
-   private void parseClassFunctions( final Node result,
-                                     final List< Token > modifiers,
-                                     final List< Node > meta ) throws TokenException
-   {
-      result.addChild( parseFunction( meta,
-                                      modifiers ) );
-      meta.clear();
-      modifiers.clear();
-   }
-
-   /**
-    * tok is (
-    * 
-    * @throws TokenException
-    */
-   private Node parseCondition() throws TokenException
-   {
-      consume( Operators.LEFT_PARENTHESIS );
-      final Node result = Node.create( NodeKind.CONDITION,
-                                       tok.getLine(),
-                                       tok.getColumn(),
-                                       parseExpression() );
-      consume( Operators.RIGHT_PARENTHESIS );
-      return result;
-   }
-
-   private IParserNode parseConditionalExpression() throws TokenException
-   {
-      final IParserNode result = parseOrExpression();
-      if ( tokIs( Operators.QUESTION_MARK ) )
-      {
-         final Node conditional = Node.create( NodeKind.CONDITIONAL,
-                                               tok.getLine(),
-                                               tok.getColumn(),
-                                               result );
-         nextToken( true ); // ?
-         conditional.addChild( parseExpression() );
-         nextToken( true ); // :
-         conditional.addChild( parseExpression() );
-
-         return conditional;
-      }
-      return result;
-   }
-
-   private Node parseConst() throws TokenException
-   {
-      Node result;
-      result = parseConstList( null,
-                               null );
-      skip( Operators.SEMI_COLUMN );
-      return result;
-   }
-
-   /**
-    * tok is const
-    * 
-    * @param modifiers
-    * @param meta
-    * @throws TokenException
-    */
-   private Node parseConstList( final List< Node > meta,
-                                final List< Token > modifiers ) throws TokenException
-   {
-      consume( KeyWords.CONST );
-      final Node result = Node.create( NodeKind.CONST_LIST,
-                                       tok.getLine(),
-                                       tok.getColumn() );
-      result.addChild( convertMeta( meta ) );
-      result.addChild( convertModifiers( modifiers ) );
-      collectVarListContent( result );
-      return result;
-   }
-
-   private Node parseDecrement( final Node node ) throws TokenException
-   {
-      nextToken( true );
-      final Node result = Node.create( NodeKind.POST_DEC,
-                                       tok.getLine(),
-                                       tok.getColumn() );
-      result.addChild( node );
-      return result;
-   }
-
-   /**
-    * tok is do
-    * 
-    * @throws TokenException
-    */
-   private Node parseDo() throws TokenException
-   {
-      consume( KeyWords.DO );
-      final Node result = Node.create( NodeKind.DO,
-                                       tok.getLine(),
-                                       tok.getColumn(),
-                                       parseStatement() );
-      consume( KeyWords.WHILE );
-      result.addChild( parseCondition() );
-      if ( tokIs( Operators.SEMI_COLUMN ) )
-      {
-         nextToken( true );
-      }
-      return result;
-   }
-
-   private Node parseDot( final Node node ) throws TokenException
-   {
-      nextToken();
-      if ( tokIs( Operators.LEFT_PARENTHESIS ) )
-      {
-         nextToken();
-         final Node result = Node.create( NodeKind.E4X_FILTER,
-                                          tok.getLine(),
-                                          tok.getColumn() );
-         result.addChild( node );
-         result.addChild( parseExpression() );
-         consume( Operators.RIGHT_PARENTHESIS );
-         return result;
-      }
-      else if ( tokIs( Operators.TIMES ) )
-      {
-         final Node result = Node.create( NodeKind.E4X_STAR,
-                                          tok.getLine(),
-                                          tok.getColumn() );
-         result.addChild( node );
-         return result;
-      }
-      final Node result = Node.create( NodeKind.DOT,
-                                       tok.getLine(),
-                                       tok.getColumn() );
-      result.addChild( node );
-      result.addChild( parseExpression() );
-      return result;
-   }
-
-   private Node parseEmptyStatement() throws TokenException
-   {
-      Node result;
-      result = Node.create( NodeKind.STMT_EMPTY,
-                            tok.getLine(),
-                            tok.getColumn(),
-                            Operators.SEMI_COLUMN.toString() );
-      nextToken( true );
-      return result;
-   }
-
-   private Node parseEncapsulatedExpression() throws TokenException
-   {
-      consume( Operators.LEFT_PARENTHESIS );
-      final Node result = Node.create( NodeKind.ENCAPSULATED,
-                                       tok.getLine(),
-                                       tok.getColumn() );
-      result.addChild( parseExpressionList() );
-
-      consume( Operators.RIGHT_PARENTHESIS );
-
-      return result;
-   }
-
-   private IParserNode parseEqualityExpression() throws TokenException
-   {
-      final Node result = Node.create( NodeKind.EQUALITY,
-                                       tok.getLine(),
-                                       tok.getColumn(),
-                                       parseRelationalExpression() );
-      while ( tokIs( Operators.DOUBLE_EQUAL )
-            || tokIs( Operators.DOUBLE_EQUAL_AS2 ) || tokIs( Operators.STRICTLY_EQUAL )
-            || tokIs( Operators.NON_EQUAL ) || tokIs( Operators.NON_EQUAL_AS2_1 )
-            || tokIs( Operators.NON_EQUAL_AS2_2 ) || tokIs( Operators.NON_STRICTLY_EQUAL ) )
-      {
-         result.addChild( Node.create( NodeKind.OP,
-                                       tok.getLine(),
-                                       tok.getColumn(),
-                                       tok.getText() ) );
-         nextToken( true );
-         result.addChild( parseRelationalExpression() );
-      }
-      return result.numChildren() > 1 ? result
-                                     : result.getChild( 0 );
-   }
-
-   private IParserNode parseExpressionList() throws TokenException
-   {
-      final Node result = Node.create( NodeKind.EXPR_LIST,
-                                       tok.getLine(),
-                                       tok.getColumn(),
-                                       parseAssignmentExpression() );
-      while ( tokIs( Operators.COMMA ) )
-      {
-         nextToken( true );
-         result.addChild( parseAssignmentExpression() );
-      }
-      return result.numChildren() > 1 ? result
-                                     : result.getChild( 0 );
-   }
-
-   private Node parseFinally() throws TokenException
-   {
-      Node result;
-      nextToken( true );
-      result = Node.create( NodeKind.FINALLY,
-                            tok.getLine(),
-                            tok.getColumn(),
-                            parseBlock() );
-      return result;
-   }
-
-   /**
-    * tok is for
-    * 
-    * @throws TokenException
-    */
-   private Node parseFor() throws TokenException
-   {
-      consume( KeyWords.FOR );
-
-      if ( tokIs( KeyWords.EACH ) )
-      {
-         nextToken();
-         return parseForEach();
-      }
-      else
-      {
-         return parseTraditionalFor();
-      }
-   }
-
-   /**
-    * tok is ( for each( var obj : Type in List )
-    * 
-    * @throws TokenException
-    */
-   private Node parseForEach() throws TokenException
-   {
-      consume( Operators.LEFT_PARENTHESIS );
-
-      final Node result = Node.create( NodeKind.FOREACH,
-                                       tok.getLine(),
-                                       tok.getColumn() );
-      if ( tokIs( KeyWords.VAR ) )
-      {
-         final Node var = Node.create( NodeKind.VAR,
-                                       tok.getLine(),
-                                       tok.getColumn() );
-         nextToken();
-         var.addChild( parseNameTypeInit() );
-         result.addChild( var );
-      }
-      else
-      {
-         result.addChild( NodeKind.NAME,
-                          tok.getLine(),
-                          tok.getColumn(),
-                          tok.getText() );
-         // names allowed?
-         nextToken();
-      }
-      nextToken(); // in
-      result.addChild( NodeKind.IN,
-                       tok.getLine(),
-                       tok.getColumn(),
-                       parseExpression() );
-      consume( Operators.RIGHT_PARENTHESIS );
-      result.addChild( parseStatement() );
-      return result;
-   }
-
-   private Node parseForIn( final Node result ) throws TokenException
-   {
-      nextToken();
-      result.addChild( NodeKind.IN,
-                       tok.getLine(),
-                       tok.getColumn(),
-                       parseExpression() );
-      result.setId( NodeKind.FORIN );
-      return result;
-   }
-
-   /**
-    * tok is function
-    * 
-    * @param modifiers
-    * @param meta
-    * @throws TokenException
-    */
-   private Node parseFunction( final List< Node > meta,
-                               final List< Token > modifiers ) throws TokenException
-   {
-      final Node[] signature = doParseSignature();
-      final Node result = Node.create( findFunctionTypeFromSignature( signature ),
-                                       tok.getLine(),
-                                       tok.getColumn(),
-                                       signature[ 0 ].getStringValue() );
-
-      if ( currentAsDoc != null )
-      {
-         result.addChild( currentAsDoc );
-         currentAsDoc = null;
-      }
-      if ( currentMultiLineComment != null )
-      {
-         result.addChild( currentMultiLineComment );
-         currentMultiLineComment = null;
-      }
-      result.addChild( convertMeta( meta ) );
-      result.addChild( convertModifiers( modifiers ) );
-      result.addChild( signature[ 1 ] );
-      result.addChild( signature[ 2 ] );
-      result.addChild( signature[ 3 ] );
-      if ( tokIs( Operators.SEMI_COLUMN ) )
-      {
-         consume( Operators.SEMI_COLUMN );
-      }
-      else
-      {
-         result.addChild( parseFunctionBlock() );
-      }
-      currentFunctionNode = null;
-      return result;
-   }
-
-   /**
-    * tok is { exit tok is the first tok after }
-    * 
-    * @throws TokenException
-    * @throws TokenException
-    */
-
-   private Node parseFunctionBlock() throws TokenException
-   {
-      final Node block = Node.create( NodeKind.BLOCK,
-                                      tok.getLine(),
-                                      tok.getColumn() );
-
-      currentFunctionNode = block;
-
-      parseBlock( block );
-
-      return block;
-   }
-
-   private Node parseFunctionCall( final Node node ) throws TokenException
-   {
-      final Node result = Node.create( NodeKind.CALL,
-                                       tok.getLine(),
-                                       tok.getColumn() );
-      result.addChild( node );
-      while ( tokIs( Operators.LEFT_PARENTHESIS ) )
-      {
-         result.addChild( parseArgumentList() );
-      }
-      while ( tokIs( Operators.LEFT_SQUARE_BRACKET ) )
-      {
-         result.addChild( parseArrayLiteral() );
-      }
-
-      return result;
-   }
-
-   /**
-    * tok is function exit tok is the first token after the optional ;
-    * 
-    * @throws TokenException
-    */
-   private Node parseFunctionSignature() throws TokenException
-   {
-      final Node[] signature = doParseSignature();
-      skip( Operators.SEMI_COLUMN );
-      final Node result = Node.create( findFunctionTypeFromSignature( signature ),
-                                       tok.getLine(),
-                                       tok.getColumn(),
-                                       signature[ 0 ].getStringValue() );
-      result.addChild( signature[ 1 ] );
-      result.addChild( signature[ 2 ] );
-      result.addChild( signature[ 3 ] );
-      return result;
-   }
-
-   /**
-    * tok is if
-    * 
-    * @throws TokenException
-    */
-   private Node parseIf() throws TokenException
-   {
-      consume( KeyWords.IF );
-      final Node result = Node.create( NodeKind.IF,
-                                       tok.getLine(),
-                                       tok.getColumn(),
-                                       parseCondition() );
-      result.addChild( parseStatement() );
-      if ( tokIs( KeyWords.ELSE ) )
-      {
-         nextToken( true );
-         result.addChild( parseStatement() );
-      }
-      return result;
-   }
-
-   /**
-    * tok is implements implements a,b,c exit tok is the first token after the
-    * list of qualfied names
-    * 
-    * @throws TokenException
-    */
-   private Node parseImplementsList() throws TokenException
-   {
-      consume( KeyWords.IMPLEMENTS );
-
-      final Node result = Node.create( NodeKind.IMPLEMENTS_LIST,
-                                       tok.getLine(),
-                                       tok.getColumn() );
-      result.addChild( NodeKind.IMPLEMENTS,
-                       tok.getLine(),
-                       tok.getColumn(),
-                       parseQualifiedName( true ) );
-      while ( tokIs( Operators.COMMA ) )
-      {
-         nextToken( true );
-         result.addChild( NodeKind.IMPLEMENTS,
-                          tok.getLine(),
-                          tok.getColumn(),
-                          parseQualifiedName( false ) );
-      }
-      return result;
-   }
-
-   /**
-    * tok is import
-    * 
-    * @throws TokenException
-    */
-   private Node parseImport() throws TokenException
-   {
-      consume( KeyWords.IMPORT );
-      final Node result = Node.create( NodeKind.IMPORT,
-                                       tok.getLine(),
-                                       tok.getColumn(),
-                                       parseImportName() );
-      skip( Operators.SEMI_COLUMN );
-      return result;
-   }
-
-   /**
-    * tok is the first part of a name the last part can be a star exit tok is
-    * the first token, which doesn't belong to the name
-    * 
-    * @throws TokenException
-    */
-   private String parseImportName() throws TokenException
-   {
-      final StringBuffer result = new StringBuffer();
-
-      result.append( tok.getText() );
-      nextToken();
-      while ( tokIs( Operators.DOT ) )
-      {
-         result.append( Operators.DOT );
-         nextToken(); // .
-         result.append( tok.getText() );
-         nextToken(); // part of name
-      }
-      return result.toString();
-   }
-
-   private IParserNode parseIncludeExpression() throws TokenException
-   {
-      final Node result = Node.create( NodeKind.INCLUDE,
-                                       tok.getLine(),
-                                       tok.getColumn() );
-      if ( tokIs( KeyWords.INCLUDE ) )
-      {
-         consume( KeyWords.INCLUDE );
-      }
-      else if ( tokIs( KeyWords.INCLUDE_AS2 ) )
-      {
-         consume( KeyWords.INCLUDE_AS2 );
-      }
-      result.addChild( parseExpression() );
-      return result;
-   }
-
-   private Node parseIncrement( final Node node ) throws TokenException
-   {
-      nextToken( true );
-      final Node result = Node.create( NodeKind.POST_INC,
-                                       tok.getLine(),
-                                       tok.getColumn() );
-      result.addChild( node );
-      return result;
-   }
-
-   /**
-    * tok is interface
-    * 
-    * @param meta
-    * @param modifier
-    * @throws TokenException
-    */
-   private Node parseInterface( final List< Node > meta,
-                                final List< Token > modifier ) throws TokenException
-   {
-      consume( KeyWords.INTERFACE );
-      final Node result = Node.create( NodeKind.INTERFACE,
-                                       tok.getLine(),
-                                       tok.getColumn() );
-
-      if ( currentAsDoc != null )
-      {
-         result.addChild( currentAsDoc );
-         currentAsDoc = null;
-      }
-      if ( currentMultiLineComment != null )
-      {
-         result.addChild( currentMultiLineComment );
-         currentMultiLineComment = null;
-      }
-      result.addChild( NodeKind.NAME,
-                       tok.getLine(),
-                       tok.getColumn(),
-                       parseQualifiedName( true ) );
-
-      result.addChild( convertMeta( meta ) );
-      result.addChild( convertModifiers( modifier ) );
-
-      if ( tokIs( KeyWords.EXTENDS ) )
-      {
-         nextToken(); // extends
-         result.addChild( NodeKind.EXTENDS,
-                          tok.getLine(),
-                          tok.getColumn(),
-                          parseQualifiedName( false ) );
-      }
-      while ( tokIs( Operators.COMMA ) )
-      {
-         nextToken(); // comma
-         result.addChild( NodeKind.EXTENDS,
-                          tok.getLine(),
-                          tok.getColumn(),
-                          parseQualifiedName( false ) );
-      }
-      consume( Operators.LEFT_CURLY_BRACKET );
-      result.addChild( parseInterfaceContent() );
-      consume( Operators.RIGHT_CURLY_BRACKET );
-      return result;
-   }
-
-   /**
-    * tok is function
-    * 
-    * @throws TokenException
-    */
-   private Node parseLambdaExpression() throws TokenException
-   {
-      consume( KeyWords.FUNCTION );
-      Node result;
-
-      if ( tok.getText().compareTo( "(" ) == 0 )
-      {
-         result = Node.create( NodeKind.LAMBDA,
-                               tok.getLine(),
-                               tok.getColumn() );
-      }
-      else
-      {
-         result = Node.create( NodeKind.FUNCTION,
-                               tok.getLine(),
-                               tok.getColumn(),
-                               tok.getText() );
-         nextToken( true );
-      }
-      result.addChild( parseParameterList() );
-      result.addChild( parseOptionalType() );
-      result.addChild( parseBlock() );
-      return result;
-   }
-
-   private IParserNode parseLines( final String filePath,
-                                   final String[] lines ) throws TokenException
-   {
-      setFileName( filePath );
-      scn = new AS3Scanner();
-      scn.setLines( lines );
-      return parseCompilationUnit();
-   }
-
-   /**
-    * tok is [ [id] [id ("test")] [id (name="test",type="a.b.c.Event")] exit
-    * token is the first token after ]
-    * 
-    * @throws TokenException
-    */
-   private Node parseMetaData() throws TokenException
-   {
-      final StringBuffer buffer = new StringBuffer();
-
-      final int line = tok.getLine();
-      final int column = tok.getColumn();
-
-      consume( Operators.LEFT_SQUARE_BRACKET );
-      while ( !tokIs( Operators.RIGHT_SQUARE_BRACKET ) )
-      {
-         if ( buffer.length() > 0 )
-         {
-            buffer.append( ' ' );
-         }
-         buffer.append( tok.getText() );
-         nextToken();
-      }
-      skip( Operators.RIGHT_SQUARE_BRACKET );
-      final Node metaDataNode = Node.create( NodeKind.META,
-                                             line,
-                                             column,
-                                             buffer.toString() );
-
-      return metaDataNode;
-   }
-
-   private IParserNode parseMultiplicativeExpression() throws TokenException
-   {
-      final Node result = Node.create( NodeKind.MULTIPLICATION,
-                                       tok.getLine(),
-                                       tok.getColumn(),
-                                       parseUnaryExpression() );
-      while ( tokIs( Operators.TIMES )
-            || tokIs( Operators.SLASH ) || tokIs( Operators.MODULO ) )
-      {
-         result.addChild( Node.create( NodeKind.OP,
-                                       tok.getLine(),
-                                       tok.getColumn(),
-                                       tok.getText() ) );
-         nextToken( true );
-         result.addChild( parseUnaryExpression() );
-      }
-      return result.numChildren() > 1 ? result
-                                     : result.getChild( 0 );
-   }
-
-   private String parseNamespaceName() throws TokenException
-   {
-      final String name = tok.getText();
-      nextToken(); // simple name for now
-      return name;
-   }
-
-   private Node parseNameTypeInit() throws TokenException
-   {
-      final Node result = Node.create( NodeKind.NAME_TYPE_INIT,
-                                       tok.getLine(),
-                                       tok.getColumn() );
-      result.addChild( NodeKind.NAME,
-                       tok.getLine(),
-                       tok.getColumn(),
-                       tok.getText() );
-      nextToken( true ); // name
-      result.addChild( parseOptionalType() );
-      result.addChild( parseOptionalInit() );
-      return result;
-   }
-
-   private Node parseNewExpression() throws TokenException
-   {
-      consume( KeyWords.NEW );
-
-      final Node result = Node.create( NodeKind.NEW,
-                                       tok.getLine(),
-                                       tok.getColumn() );
-      result.addChild( parseExpression() ); // name
-      if ( tokIs( Operators.VECTOR_START ) )
-      {
-         result.addChild( Node.create( NodeKind.VECTOR,
-                                       tok.getLine(),
-                                       tok.getColumn(),
-                                       parseVector() ) );
-      }
-      if ( tokIs( Operators.LEFT_PARENTHESIS ) )
-      {
-         result.addChild( parseArgumentList() );
-      }
-      return result;
-   }
-
-   /**
-    * tok is {
-    */
-   private Node parseObjectLiteral() throws TokenException
-   {
-      final Node result = Node.create( NodeKind.OBJECT,
-                                       tok.getLine(),
-                                       tok.getColumn() );
-      consume( Operators.LEFT_CURLY_BRACKET );
-      while ( !tokIs( Operators.RIGHT_CURLY_BRACKET ) )
-      {
-         result.addChild( parseObjectLiteralPropertyDeclaration() );
-         skip( Operators.COMMA );
-      }
-      consume( Operators.RIGHT_CURLY_BRACKET );
-      return result;
-   }
-
-   /*
-    * tok is name
-    */
-   private Node parseObjectLiteralPropertyDeclaration() throws TokenException
-   {
-      final Node result = Node.create( NodeKind.PROP,
-                                       tok.getLine(),
-                                       tok.getColumn() );
-      final Node name = Node.create( NodeKind.NAME,
-                                     tok.getLine(),
-                                     tok.getColumn(),
-                                     tok.getText() );
-      result.addChild( name );
-      nextToken(); // name
-      consume( Operators.COLUMN );
-      result.addChild( NodeKind.VALUE,
-                       tok.getLine(),
-                       tok.getColumn(),
-                       parseExpression() );
-      return result;
-   }
-
-   /**
-    * if tok is "=" parse the expression otherwise do nothing
-    * 
-    * @return
-    */
-   private Node parseOptionalInit() throws TokenException
-   {
-      Node result = null;
-      if ( tokIs( Operators.EQUAL ) )
-      {
-         nextToken( true );
-         result = Node.create( NodeKind.INIT,
-                               tok.getLine(),
-                               tok.getColumn(),
-                               parseExpression() );
-      }
-      return result;
-   }
-
-   /**
-    * if tok is ":" parse the type otherwise do nothing
-    * 
-    * @return
-    * @throws TokenException
-    */
-   private Node parseOptionalType() throws TokenException
-   {
-      Node result = Node.create( NodeKind.TYPE,
-                                 tok.getLine(),
-                                 tok.getColumn(),
-                                 "" );
-      if ( tokIs( Operators.COLUMN ) )
-      {
-         nextToken( true );
-         result = parseType();
-      }
-      return result;
-   }
-
-   private IParserNode parseOrExpression() throws TokenException
-   {
-      final Node result = Node.create( NodeKind.OR,
-                                       tok.getLine(),
-                                       tok.getColumn(),
-                                       parseAndExpression() );
-      while ( tokIs( Operators.LOGICAL_OR )
-            || tokIs( Operators.LOGICAL_OR_AS2 ) )
-      {
-         result.addChild( Node.create( NodeKind.OP,
-                                       tok.getLine(),
-                                       tok.getColumn(),
-                                       tok.getText() ) );
-         nextToken( true );
-         result.addChild( parseAndExpression() );
-      }
-      return result.numChildren() > 1 ? result
-                                     : result.getChild( 0 );
-   }
-
-   /**
-    * tok is package
-    * 
-    * @throws UnExpectedTokenException
-    */
-   private Node parsePackage() throws TokenException
-   {
-      consume( KeyWords.PACKAGE );
-
-      final Node result = Node.create( NodeKind.PACKAGE,
-                                       tok.getLine(),
-                                       tok.getColumn() );
-      final StringBuffer nameBuffer = new StringBuffer();
-
-      while ( !tokIs( Operators.LEFT_CURLY_BRACKET ) )
-      {
-         nameBuffer.append( tok.getText() );
-         nextToken();
-      }
-      result.addChild( NodeKind.NAME,
-                       tok.getLine(),
-                       tok.getColumn(),
-                       nameBuffer.toString() );
-      consume( Operators.LEFT_CURLY_BRACKET );
-      result.addChild( parsePackageContent() );
-      consume( Operators.RIGHT_CURLY_BRACKET );
-      return result;
-   }
-
-   /**
-    * tok is the name of a parameter or ...
-    */
-   private Node parseParameter() throws TokenException
-   {
-      final Node result = Node.create( NodeKind.PARAMETER,
-                                       tok.getLine(),
-                                       tok.getColumn() );
-      if ( tokIs( Operators.REST_PARAMETERS ) )
-      {
-         nextToken( true ); // ...
-         final Node rest = Node.create( NodeKind.REST,
-                                        tok.getLine(),
-                                        tok.getColumn(),
-                                        tok.getText() );
-         nextToken( true ); // rest
-         result.addChild( rest );
-      }
-      else
-      {
-         result.addChild( parseNameTypeInit() );
-      }
-      return result;
-   }
-
-   /**
-    * tok is (
-    * 
-    * @throws TokenException
-    */
-   private Node parseParameterList() throws TokenException
-   {
-      consume( Operators.LEFT_PARENTHESIS );
-
-      final Node result = Node.create( NodeKind.PARAMETER_LIST,
-                                       tok.getLine(),
-                                       tok.getColumn() );
-      while ( !tokIs( Operators.RIGHT_PARENTHESIS ) )
-      {
-         result.addChild( parseParameter() );
-         if ( tokIs( Operators.COMMA ) )
-         {
-            nextToken( true );
-         }
-         else
-         {
-            break;
-         }
-      }
-      consume( Operators.RIGHT_PARENTHESIS );
-      return result;
-   }
-
-   /**
-    * tok is first part of the name exit tok is the first token after the name
-    * 
-    * @throws TokenException
-    */
-   private String parseQualifiedName( final boolean skipPackage ) throws TokenException
-   {
-      final StringBuffer buffer = new StringBuffer();
-
-      buffer.append( tok.getText() );
-      nextToken();
-      while ( tokIs( Operators.DOT )
-            || tokIs( Operators.DOUBLE_COLUMN ) )
-      {
-         buffer.append( tok.getText() );
-         nextToken();
-         buffer.append( tok.getText() );
-         nextToken(); // name
-      }
-
-      if ( skipPackage )
-      {
-         return buffer.substring( buffer.lastIndexOf( Operators.DOT.toString() ) + 1 );
-      }
-      return buffer.toString();
-   }
-
-   private IParserNode parseRelationalExpression() throws TokenException
-   {
-      final Node result = Node.create( NodeKind.RELATION,
-                                       tok.getLine(),
-                                       tok.getColumn(),
-                                       parseShiftExpression() );
-      while ( tokIs( Operators.INFERIOR )
-            || tokIs( Operators.INFERIOR_AS2 ) || tokIs( Operators.INFERIOR_OR_EQUAL )
-            || tokIs( Operators.INFERIOR_OR_EQUAL_AS2 ) || tokIs( Operators.SUPERIOR )
-            || tokIs( Operators.SUPERIOR_AS2 ) || tokIs( Operators.SUPERIOR_OR_EQUAL )
-            || tokIs( Operators.SUPERIOR_OR_EQUAL_AS2 ) || tokIs( KeyWords.IS ) || tokIs( KeyWords.IN )
-            && !isInFor || tokIs( KeyWords.AS ) || tokIs( KeyWords.INSTANCE_OF ) )
-      {
-         if ( !tokIs( KeyWords.AS ) )
-         {
-            result.addChild( Node.create( NodeKind.OP,
-                                          tok.getLine(),
-                                          tok.getColumn(),
-                                          tok.getText() ) );
-         }
-         else
-         {
-            result.addChild( Node.create( NodeKind.AS,
-                                          tok.getLine(),
-                                          tok.getColumn(),
-                                          tok.getText() ) );
-         }
-         nextToken( true );
-         result.addChild( parseShiftExpression() );
-      }
-      return result.numChildren() > 1 ? result
-                                     : result.getChild( 0 );
-   }
-
-   private IParserNode parseReturnStatement() throws TokenException
-   {
-      Node result;
-
-      nextTokenAllowNewLine();
-      if ( tokIs( NEW_LINE )
-            || tokIs( Operators.SEMI_COLUMN ) )
-      {
-         nextToken( true );
-         result = Node.create( NodeKind.RETURN,
-                               tok.getLine(),
-                               tok.getColumn(),
-                               "" );
-      }
-      else
-      {
-         result = Node.create( NodeKind.RETURN,
-                               tok.getLine(),
-                               tok.getColumn(),
-                               parseExpression() );
-         skip( Operators.SEMI_COLUMN );
-      }
-      return result;
-   }
-
-   private IParserNode parseShiftExpression() throws TokenException
-   {
-      final Node result = Node.create( NodeKind.SHIFT,
-                                       tok.getLine(),
-                                       tok.getColumn(),
-                                       parseAdditiveExpression() );
-      while ( tokIs( Operators.DOUBLE_SHIFT_LEFT )
-            || tokIs( Operators.TRIPLE_SHIFT_LEFT ) || tokIs( Operators.DOUBLE_SHIFT_RIGHT )
-            || tokIs( Operators.TRIPLE_SHIFT_RIGHT ) )
-      {
-         result.addChild( Node.create( NodeKind.OP,
-                                       tok.getLine(),
-                                       tok.getColumn(),
-                                       tok.getText() ) );
-         nextToken( true );
-         result.addChild( parseAdditiveExpression() );
-      }
-      return result.numChildren() > 1 ? result
-                                     : result.getChild( 0 );
-   }
-
-   /**
-    * tok is switch
-    * 
-    * @throws TokenException
-    */
-   private Node parseSwitch() throws TokenException
-   {
-      consume( KeyWords.SWITCH );
-      final Node result = Node.create( NodeKind.SWITCH,
-                                       tok.getLine(),
-                                       tok.getColumn(),
-                                       parseCondition() );
-      if ( tokIs( Operators.LEFT_CURLY_BRACKET ) )
-      {
-         nextToken();
-         result.addChild( parseSwitchCases() );
-         consume( Operators.RIGHT_CURLY_BRACKET );
-      }
-      return result;
-   }
-
-   /**
-    * tok is case, default or the first token of the first statement
-    * 
-    * @throws TokenException
-    */
-   private Node parseSwitchBlock() throws TokenException
-   {
-      final Node result = Node.create( NodeKind.SWITCH_BLOCK,
-                                       tok.getLine(),
-                                       tok.getColumn() );
-      while ( !tokIs( KeyWords.CASE )
-            && !tokIs( KeyWords.DEFAULT ) && !tokIs( Operators.RIGHT_CURLY_BRACKET ) )
-      {
-         result.addChild( parseStatement() );
-      }
-      return result;
-   }
-
-   /**
-    * tok is { exit tok is }
-    * 
-    * @throws TokenException
-    */
-   private Node parseSwitchCases() throws TokenException
-   {
-      final Node result = Node.create( NodeKind.CASES,
-                                       tok.getLine(),
-                                       tok.getColumn() );
-      for ( ;; )
-      {
-         if ( tokIs( Operators.RIGHT_CURLY_BRACKET ) )
-         {
-            break;
-         }
-         else if ( tokIs( KeyWords.CASE ) )
-         {
-            nextToken( true ); // case
-            final Node caseNode = Node.create( NodeKind.CASE,
-                                               tok.getLine(),
-                                               tok.getColumn(),
-                                               parseExpression() );
-            consume( Operators.COLUMN );
-            caseNode.addChild( parseSwitchBlock() );
-            result.addChild( caseNode );
-         }
-         else if ( tokIs( KeyWords.DEFAULT ) )
-         {
-            nextToken( true ); // default
-            consume( Operators.COLUMN );
-            final Node caseNode = Node.create( NodeKind.CASE,
-                                               tok.getLine(),
-                                               tok.getColumn(),
-                                               Node.create( NodeKind.DEFAULT,
-                                                            tok.getLine(),
-                                                            tok.getColumn(),
-                                                            KeyWords.DEFAULT.toString() ) );
-            caseNode.addChild( parseSwitchBlock() );
-            result.addChild( caseNode );
-         }
-      }
-      return result;
-   }
-
-   /**
-    * tok is ( for( var x : int = 0; i < length; i++ ) for( var s : String in
-    * Object )
-    * 
-    * @throws TokenException
-    */
-   private Node parseTraditionalFor() throws TokenException
-   {
-      consume( Operators.LEFT_PARENTHESIS );
-
-      final Node result = Node.create( NodeKind.FOR,
-                                       tok.getLine(),
-                                       tok.getColumn() );
-      if ( !tokIs( Operators.SEMI_COLUMN ) )
-      {
-         if ( tokIs( KeyWords.VAR ) )
-         {
-            result.addChild( NodeKind.INIT,
-                             tok.getLine(),
-                             tok.getColumn(),
-                             parseVarList( null,
-                                           null ) );
-         }
-         else
-         {
-            isInFor = true;
-            result.addChild( NodeKind.INIT,
-                             tok.getLine(),
-                             tok.getColumn(),
-                             parseExpression() );
-            isInFor = false;
-         }
-         if ( tokIs( NodeKind.IN.toString() ) )
-         {
-            return parseForIn( result );
-         }
-      }
-      consume( Operators.SEMI_COLUMN );
-      if ( !tokIs( Operators.SEMI_COLUMN ) )
-      {
-         result.addChild( NodeKind.COND,
-                          tok.getLine(),
-                          tok.getColumn(),
-                          parseExpression() );
-      }
-      consume( Operators.SEMI_COLUMN );
-      if ( !tokIs( Operators.RIGHT_PARENTHESIS ) )
-      {
-         result.addChild( NodeKind.ITER,
-                          tok.getLine(),
-                          tok.getColumn(),
-                          parseExpressionList() );
-      }
-      consume( Operators.RIGHT_PARENTHESIS );
-      result.addChild( parseStatement() );
-      return result;
-   }
-
-   private Node parseTry() throws TokenException
-   {
-      Node result;
-      nextToken( true );
-      result = Node.create( NodeKind.TRY,
-                            tok.getLine(),
-                            tok.getColumn(),
-                            parseBlock() );
-      return result;
-   }
-
-   private Node parseType() throws TokenException
-   {
-      Node result;
-      if ( tok.getText().equals( VECTOR ) )
-      {
-         result = parseVector();
-      }
-      else
-      {
-         result = Node.create( NodeKind.TYPE,
-                               tok.getLine(),
-                               tok.getColumn(),
-                               parseQualifiedName( true ) );
-         // nextToken( true );
-      }
-      return result;
-   }
-
-   private Node parseUnaryExpressionNotPlusMinus() throws TokenException
-   {
-      Node result;
-      if ( tokIs( KeyWords.DELETE ) )
-      {
-         nextToken( true );
-         result = Node.create( NodeKind.DELETE,
-                               tok.getLine(),
-                               tok.getColumn(),
-                               parseExpression() );
-      }
-      else if ( tokIs( KeyWords.VOID ) )
-      {
-         nextToken( true );
-         result = Node.create( NodeKind.VOID,
-                               tok.getLine(),
-                               tok.getColumn(),
-                               parseExpression() );
-      }
-      else if ( tokIs( KeyWords.TYPEOF ) )
-      {
-         nextToken( true );
-         result = Node.create( NodeKind.TYPEOF,
-                               tok.getLine(),
-                               tok.getColumn(),
-                               parseExpression() );
-      }
-      else if ( tokIs( "!" )
-            || tokIs( "not" ) )
-      {
-         nextToken( true );
-         result = Node.create( NodeKind.NOT,
-                               tok.getLine(),
-                               tok.getColumn(),
-                               parseExpression() );
-      }
-      else if ( tokIs( "~" ) )
-      {
-         nextToken( true );
-         result = Node.create( NodeKind.B_NOT,
-                               tok.getLine(),
-                               tok.getColumn(),
-                               parseExpression() );
-      }
-      else
-      {
-         result = parseUnaryPostfixExpression();
-      }
-      return result;
-   }
-
-   private Node parseUnaryPostfixExpression() throws TokenException
-   {
-      Node node = parsePrimaryExpression();
-
-      if ( tokIs( Operators.LEFT_SQUARE_BRACKET ) )
-      {
-         node = parseArrayAccessor( node );
-      }
-      else if ( tokIs( Operators.LEFT_PARENTHESIS ) )
-      {
-         node = parseFunctionCall( node );
-      }
-      if ( tokIs( Operators.INCREMENT ) )
-      {
-         node = parseIncrement( node );
-      }
-      else if ( tokIs( Operators.DECREMENT ) )
-      {
-         node = parseDecrement( node );
-      }
-      else if ( tokIs( Operators.DOT )
-            || tokIs( Operators.DOUBLE_COLUMN ) )
-      {
-         node = parseDot( node );
-      }
-      return node;
-   }
-
-   private Node parseUse() throws TokenException
-   {
-      consume( KeyWords.USE );
-      consume( KeyWords.NAMESPACE );
-      final Node result = Node.create( NodeKind.USE,
-                                       tok.getLine(),
-                                       tok.getColumn(),
-                                       parseNamespaceName() );
-      skip( Operators.SEMI_COLUMN );
-      return result;
-   }
-
-   private Node parseVar() throws TokenException
-   {
-      Node result;
-      result = parseVarList( null,
-                             null );
-      skip( Operators.SEMI_COLUMN );
-      return result;
-   }
-
-   /**
-    * tok is var var x, y : String, z : int = 0;
-    * 
-    * @param modifiers
-    * @param meta
-    * @throws TokenException
-    */
-   private Node parseVarList( final List< Node > meta,
-                              final List< Token > modifiers ) throws TokenException
-   {
-      consume( KeyWords.VAR );
-      final Node result = Node.create( NodeKind.VAR_LIST,
-                                       tok.getLine(),
-                                       tok.getColumn() );
-      result.addChild( convertMeta( meta ) );
-      result.addChild( convertModifiers( modifiers ) );
-      collectVarListContent( result );
-      return result;
-   }
-
-   private Node parseVector() throws TokenException
-   {
-      final Node result = Node.create( NodeKind.VECTOR,
-                                       tok.getLine(),
-                                       tok.getColumn(),
-                                       "" );
-      if ( tok.getText().compareTo( "Vector" ) == 0 )
-      {
-         nextToken();
-      }
-      consume( Operators.VECTOR_START );
-
-      result.addChild( parseType() );
-
-      consume( Operators.SUPERIOR );
-
-      return result;
-   }
-
-   /**
-    * tok is while
-    * 
-    * @throws TokenException
-    */
-   private Node parseWhile() throws TokenException
-   {
-      consume( KeyWords.WHILE );
-      final Node result = Node.create( NodeKind.WHILE,
-                                       tok.getLine(),
-                                       tok.getColumn() );
-      result.addChild( parseCondition() );
-      result.addChild( parseStatement() );
-      return result;
-   }
-
-   private void setFileName( final String fileNameToParse )
-   {
-      fileName = fileNameToParse;
-   }
-
-   private void skip( final Operators operator ) throws TokenException
-   {
-      skip( operator.toString() );
-   }
-
-   /**
-    * Skip the current token, if it equals to the parameter
-    * 
-    * @param text
-    * @throws UnExpectedTokenException
-    */
-   private void skip( final String text ) throws TokenException
-   {
-      if ( tokIs( text ) )
-      {
-         nextToken();
-      }
-   }
-
-   private boolean tokIs( final KeyWords keyword )
-   {
-      return tok.getText().compareTo( keyword.toString() ) == 0;
-   }
-
-   private boolean tokIs( final Operators operator )
-   {
-      return tok.getText().compareTo( operator.toString() ) == 0;
-   }
-
-   /**
-    * Compare the current token to the parameter
-    * 
-    * @param text
-    * @return true, if tok's text property equals the parameter
-    */
-   private boolean tokIs( final String text )
-   {
-      return tok.getText().equals( text );
-   }
-
-   private void tryToParseCommentNode( final Node result,
-                                       final List< Token > modifiers ) throws TokenException
-   {
-      if ( tok.getText().startsWith( ASDOC_COMMENT ) )
-      {
-         currentAsDoc = Node.create( NodeKind.AS_DOC,
-                                     tok.getLine(),
-                                     tok.getColumn(),
-                                     tok.getText() );
-         nextToken();
-      }
-      else if ( tok.getText().startsWith( MULTIPLE_LINES_COMMENT ) )
-      {
-         result.addChild( Node.create( NodeKind.MULTI_LINE_COMMENT,
-                                       tok.getLine(),
-                                       tok.getColumn(),
-                                       tok.getText() ) );
-         nextToken();
-      }
-      else
-      {
-         if ( modifiers != null )
-         {
-            modifiers.add( tok );
-         }
-         nextTokenIgnoringDocumentation();
-      }
-   }
-}