예제 #1
0
        public override AstNode Visit(FunctionDefinition node)
        {
            // Visit the prototype.
            node.GetPrototype().Accept(this);

            return node;
        }
예제 #2
0
        public override AstNode Visit(FunctionDefinition node)
        {
            // Process attributes.
            ProcessAttributes(node);

            // Ignore pure declarations.
            if(node.GetChildren() == null)
                return node;

            // Update the scope.
            PushScope(node.GetScope());

            // Visit the children.
            VisitList(node.GetChildren());

            // Restore the scope.
            PopScope();

            return node;
        }
예제 #3
0
        private void DefineGeneratorBody(FunctionDefinition node)
        {
            // Get entry function.
            Function entryFunction = node.GetFunction();

            // Rebase his locals.
            entryFunction.RebaseLocals();

            // Create the generator class.
            Scope spaceScope = entryFunction.GetParentScope();
            Class generatorClass =
                new Class(GenSym(), MemberFlags.Internal, spaceScope);
            node.GeneratorClass = generatorClass;

            // Use the same generic prototype as the entry point function.
            generatorClass.SetGenericPrototype(entryFunction.GetGenericPrototype());

            // Add the generator class to the same scope as the function.
            if(spaceScope.IsClass() || spaceScope.IsStructure())
            {
                Structure parentClass = (Structure)spaceScope;
                parentClass.AddType(generatorClass);
            }
            else if(spaceScope.IsNamespace())
            {
                Namespace parentSpace = (Namespace)spaceScope;
                parentSpace.AddMember(generatorClass);
            }
            else
            {
                Error(node, "Cannot create generator class in {0}", spaceScope.GetFullName());
            }

            // Add the enumerable interface.
            Structure enumerableIface = null;
            if(node.IsEnumerable)
            {
                enumerableIface = currentModule.GetEnumerableIface();
                if(node.IsGenericIterator)
                {
                    enumerableIface = currentModule.GetEnumerableGIface();
                    GenericInstance gargs = new GenericInstance(enumerableIface.GetGenericPrototype(),
                        new IChelaType[]{node.YieldType});
                    enumerableIface = (Structure)enumerableIface.InstanceGeneric(gargs, currentModule);
                }

                generatorClass.AddInterface(enumerableIface);
            }

            // Add the enumerator interface.
            Structure enumeratorIface = currentModule.GetEnumeratorIface();
            if(node.IsGenericIterator)
            {
                enumeratorIface = currentModule.GetEnumeratorGIface();
                GenericInstance gargs = new GenericInstance(enumeratorIface.GetGenericPrototype(),
                    new IChelaType[]{node.YieldType});
                enumeratorIface = (Structure)enumeratorIface.InstanceGeneric(gargs, currentModule);
            }
            generatorClass.AddInterface(enumeratorIface);

            // Create the yielded field.
            FieldVariable yieldedValue = new FieldVariable("yielded", MemberFlags.Private, node.YieldType, generatorClass);
            generatorClass.AddField(yieldedValue);
            node.YieldedValue = yieldedValue;

            // Create the generator state variable.
            FieldVariable generatorState = new FieldVariable("state", MemberFlags.Private, ChelaType.GetIntType(), generatorClass);
            generatorClass.AddField(generatorState);
            node.GeneratorState = generatorState;

            // Encapsulate the locals in fields.
            foreach(LocalVariable local in entryFunction.GetLocals())
            {
                if(!local.IsPseudoLocal)
                    continue;

                // Variables containing arguments must be public.
                MemberFlags access = MemberFlags.Private;
                if(local.ArgumentIndex >= 0)
                    access = MemberFlags.Public;

                // Create the field to hold the state.
                FieldVariable localField = new FieldVariable(GenSym(), access, local.GetVariableType(), generatorClass);
                generatorClass.AddField(localField);
                local.ActualVariable = localField;
            }

            // Create an instance of the generator class.
            Structure generatorClassInstance = generatorClass.GetClassInstance();
            if(generatorClass.GetGenericPrototype().GetPlaceHolderCount() != 0)
            {
                // Create an instance using the same placeholders.
                GenericPrototype proto = generatorClass.GetGenericPrototype();
                int numargs = proto.GetPlaceHolderCount();
                IChelaType[] protoInstance = new IChelaType[numargs];
                for(int i = 0; i < numargs; ++i)
                    protoInstance[i] = proto.GetPlaceHolder(i);

                // Instance the generic class.
                GenericInstance instance = new GenericInstance(proto, protoInstance);
                generatorClassInstance = (Structure)generatorClassInstance.InstanceGeneric(instance, currentModule);
            }
            node.GeneratorClassInstance = generatorClassInstance;

            // Create the trivial constructor.
            Function ctor = CreateTrivialConstructor(generatorClass, generatorClassInstance);
            if(generatorClass.IsGeneric())
                ctor = FindFirstConstructor(generatorClassInstance);

            // Create a local to hold the created closure.
            LexicalScope topScope = (LexicalScope)node.GetScope();
            LocalVariable closureLocal = new LocalVariable("closure", topScope, ReferenceType.Create(generatorClassInstance));

            // Create the entry point content.
            BasicBlock entryBlock = CreateBasicBlock();
            entryBlock.SetName("entry");
            builder.SetBlock(entryBlock);

            // Create the closure and store it in his local.
            builder.CreateNewObject(generatorClassInstance, ctor, 0);
            builder.CreateStoreLocal(closureLocal);

            // Load the closure.
            builder.CreateLoadLocal(closureLocal);

            // Store the arguments into the closure.
            FunctionPrototype prototype = node.GetPrototype();
            AstNode argument = prototype.GetArguments();
            byte index = 0;
            while(argument != null)
            {
                FunctionArgument argNode = (FunctionArgument) argument;

                // TODO: Forbid ref, out, stream arguments here.

                // Store the argument in the closure.
                LocalVariable argVar = argNode.GetVariable();
                if(argVar != null)
                {
                    // Load the closure
                    builder.CreateDup1();

                    // Load the argument.
                    builder.CreateLoadArg(index);

                    // Store it into the field.
                    builder.CreateStoreField((FieldVariable)argVar.ActualVariable);
                }

                // Process the next argument.
                argument = argument.GetNext();
                index++;
            }

            // Encapsulate the argument variables.
            foreach(ArgumentVariable argVar in node.ArgumentVariables)
            {
                if(!argVar.IsPseudoArgument)
                    continue;

                // Create the argument field.
                FieldVariable argField = new FieldVariable(GenSym(), MemberFlags.Public, argVar.GetVariableType(), generatorClass);
                generatorClass.AddField(argField);
                argVar.ActualVariable = argField;

                // Store the self field.
                if(!currentFunction.IsStatic() && argVar.GetArgumentIndex() == 0)
                    node.GeneratorSelf = argField;

                // Load the closure.
                builder.CreateDup1();

                // Load the argument.
                builder.CreateLoadArg((byte)argVar.GetArgumentIndex());

                // Store it into the closure.
                builder.CreateStoreField(argField);
            }

            // Return the generator.
            builder.CreateRet();

            // Notify the yields about their states.
            int stateIndex = 2;
            foreach(ReturnStatement yieldStmtn in node.Yields)
            {
                yieldStmtn.YieldState = stateIndex;
                stateIndex += 2;
            }

            // Implement IEnumerator.
            if(node.IsEnumerable)
            {
                // Create the object GetEnumerator method.
                CreateGenerator_GetEnumerator(node, currentModule.GetEnumeratorIface(), false);

                // Create the generic GetEnumerator method
                if(node.IsGenericIterator)
                    CreateGenerator_GetEnumerator(node, enumeratorIface, true);
            }

            // Create the Current property.
            CreateGenerator_Current(node, false);
            if(node.IsGenericIterator)
                CreateGenerator_Current(node, true);

            // Create the Reset method.
            CreateGenerator_Reset(node);

            // Create the MoveNext method.
            Function moveNext = CreateGenerator_MoveNext(node);

            // Create the Dispose method.
            CreateGenerator_Dispose(node, moveNext);

            // Fix the inheritance.
            generatorClass.FixInheritance();
        }
예제 #4
0
        private void DefineFunctionBody(FunctionDefinition node, Function function, LexicalScope topScope)
        {
            // Create the top basic block.
            BasicBlock topBlock = CreateBasicBlock();
            topBlock.SetName("top");
            builder.SetBlock(topBlock);

            // Prepare returning.
            PrepareReturning(node, function, topScope);

            // Store the arguments into local variables.
            FunctionPrototype prototype = node.GetPrototype();
            AstNode argument = prototype.GetArguments();
            byte index = 0;
            while(argument != null)
            {
                FunctionArgument argNode = (FunctionArgument) argument;
                LocalVariable argVar = argNode.GetVariable();
                if(argVar != null && !argVar.IsPseudoScope())
                {
                    // Load the argument.
                    builder.CreateLoadArg(index);

                    // Store it into the local.
                    builder.CreateStoreLocal(argVar);
                }

                // Process the next argument.
                argument = argument.GetNext();
                index++;
            }

            // Generate constructor initialization.
            if(function.IsConstructor())
            {
                Method ctor = (Method)function;
                ConstructorInitializer ctorInit = prototype.GetConstructorInitializer();
                if(ctorInit != null)
                    ctorInit.Accept(this);
                else
                    CreateImplicitBaseConstructor(node, ctor);

                // Initialize some field.
                if(ctor.IsCtorLeaf())
                {
                    Structure building = (Structure)ctor.GetParentScope();
                    GenerateFieldInitializations(node, building);
                }
            }
            else if(function.IsStaticConstructor())
            {
                // Generate static field initialization.
                Scope parent = function.GetParentScope();
                Structure pbuilding = parent as Structure;
                if(pbuilding != null)
                    GenerateStaticFieldInitializations(node, function, pbuilding);
            }

            // Visit his children.
            VisitList(node.GetChildren());

            // Finish return.
            FinishReturn(node, function);
        }
예제 #5
0
        private void CreateGenerator_Reset(FunctionDefinition node)
        {
            // Get the generator class.
            Class genClass = node.GeneratorClass;

            // Create the function type.
            FunctionType functionType =
                FunctionType.Create(ChelaType.GetVoidType(),
                    new IChelaType[]{ReferenceType.Create(node.GeneratorClassInstance)}, false);

            // Create the method.
            Method method = new Method("Reset", MemberFlags.Public, genClass);
            method.SetFunctionType(functionType);
            genClass.AddFunction("Reset", method);

            // Create the top block.
            BasicBlock top = new BasicBlock(method);
            builder.SetBlock(top);

            // Throw an exception.
            Class excpt = (Class)ExtractClass(node, currentModule.GetLangMember("InvalidOperationException"));
            builder.CreateLoadString("IEnumerator.Reset cannot be called in generators.");
            builder.CreateNewObject(excpt, GetExceptionCtor(node, excpt), 1);
            builder.CreateThrow();
        }
예제 #6
0
        private Function CreateGenerator_MoveNext(FunctionDefinition node)
        {
            // Get the generator class.
            Class genClass = node.GeneratorClass;

            // Create the function type.
            FunctionType functionType =
                FunctionType.Create(ChelaType.GetBoolType(),
                    new IChelaType[]{ReferenceType.Create(node.GeneratorClassInstance)}, false);

            // Create the method.
            Method method = new Method("MoveNext", MemberFlags.Public, genClass);
            method.SetFunctionType(functionType);
            method.DefinitionNode = node;
            genClass.AddFunction("MoveNext", method);

            // Swap the exception contexts.
            method.SwapExceptionContexts(currentFunction);

            // Store the old function.
            Function oldFunction = currentFunction;
            currentFunction = method;

            // Create the jump table block.
            BasicBlock jmpBlock = CreateBasicBlock();
            jmpBlock.SetName("jmp");

            // Generate the main code.
            BasicBlock topBlock = CreateBasicBlock();
            topBlock.SetName("top");
            builder.SetBlock(topBlock);

            // Prepare returning.
            LexicalScope topScope = (LexicalScope) node.GetScope();
            PrepareReturning(node, currentFunction, topScope);

            // Create the function body.
            VisitList(node.GetChildren());

            // Finish returning.
            FinishReturn(node, currentFunction);

            // Create the state jump table.
            builder.SetBlock(jmpBlock);

            // Load the current state.
            builder.CreateLoadArg(0);
            builder.CreateLoadField(node.GeneratorState);

            // Build the jump table.
            int numstates = node.Yields.Count*2+3;
            int[] stateConstants = new int[numstates];
            BasicBlock[] stateEntries = new BasicBlock[numstates];

            // The default case is return.
            stateConstants[0] = -1;
            stateEntries[0] = currentFunction.ReturnBlock;

            // The first state is the top block.
            stateConstants[1] = 0;
            stateEntries[1] = topBlock;

            // The second state is the return block.
            stateConstants[2] = 1;
            stateEntries[2] = currentFunction.ReturnBlock;

            // The next states are the yield merges followed by yield disposes.
            for(int i = 0; i < node.Yields.Count; ++i)
            {
                ReturnStatement yieldStmnt = node.Yields[i];

                // Emit the merge state.
                int stateId = i*2+2;
                int entryIndex = stateId+1;
                stateConstants[entryIndex] = stateId;
                stateEntries[entryIndex] = yieldStmnt.MergeBlock;

                // Emit the dispose state.
                stateConstants[entryIndex+1] = stateId+1;
                stateEntries[entryIndex+1] = yieldStmnt.DisposeBlock;
            }

            builder.CreateSwitch(stateConstants, stateEntries);

            // Restore the old function.
            currentFunction = oldFunction;

            return method;
        }
예제 #7
0
        private void CreateGenerator_GetEnumerator(FunctionDefinition node, Structure enumeratorType, bool generic)
        {
            // Get the generator class.
            Class genClass = node.GeneratorClass;

            // Use the GetEnumerator name for the most specific version.
            string name = "GetEnumerator";
            Function contract = null;
            if(!generic && node.IsGenericIterator)
            {
                name = GenSym();
                contract = FindFirstConstract(currentModule.GetEnumerableIface(), "GetEnumerator");
            }

            // Create the function type.
            FunctionType functionType =
                FunctionType.Create(ReferenceType.Create(enumeratorType),
                    new IChelaType[]{ReferenceType.Create(node.GeneratorClassInstance)}, false);

            // Create the method.
            Method method = new Method(name, MemberFlags.Public, genClass);
            method.SetFunctionType(functionType);
            genClass.AddFunction(name, method);

            // Set the explicit contract.
            if(contract != null)
                method.SetExplicitContract(contract);

            // Create the method block.
            BasicBlock block = new BasicBlock(method);
            block.SetName("top");

            // Return this.
            builder.SetBlock(block);
            builder.CreateLoadArg(0);
            builder.CreateRet();
        }
예제 #8
0
        public override AstNode Visit(FunctionDefinition node)
        {
            // Process attributes.
            ProcessAttributes(node);

            // Get the prototype.
            FunctionPrototype prototype = node.GetPrototype();

            // Get the function.
            Function function = prototype.GetFunction();

            // Store the definition node in the function.
            if(function.DefinitionNode != null)
                Error(node, "multiples definition of a function.");
            function.DefinitionNode = node;

            // Check for declarations, interfaces.
            MemberFlags instanceFlags = function.GetFlags() & MemberFlags.InstanceMask;
            if(instanceFlags == MemberFlags.Abstract || instanceFlags == MemberFlags.Contract
               || function.IsExternal())
            {
                if(node.GetChildren() != null)
                    Error(node, "abstract/extern functions cannot have a definition body.");
                return node;
            }
            else
            {
                if(node.GetChildren() == null)
                    Error(node, "functions must have a definition.");
            }

            // Store the old function.
            // TODO: Add closures
            Function oldFunction = currentFunction;
            currentFunction = function;

            // Create the function lexical scope.
            LexicalScope topScope = CreateLexicalScope(node);
            node.SetScope(topScope);

            // Use the prototype scope.
            Scope protoScope = prototype.GetScope();
            if(protoScope != null)
                PushScope(protoScope);

            // Update the scope.
            PushScope(topScope);

            // Push the security.
            if(function.IsUnsafe())
                PushUnsafe();

            // Declare the argument variables.
            AstNode argument = prototype.GetArguments();
            int index = 0;
            while(argument != null)
            {
                // Cast the argument node.
                FunctionArgument argNode = (FunctionArgument)argument;

                // Set the argument name.
                string name = argument.GetName();
                ArgumentData argData = function.GetArguments()[index++];
                argData.Name = name;

                // Create the argument variable.
                if(name != null && name != "" && name != "this")
                {
                    // Create the argument local variable
                    LocalVariable argLocal = new LocalVariable(name, topScope, argNode.GetNodeType());
                    argLocal.Type = LocalType.Argument;
                    argLocal.ArgumentIndex = index;

                    // Store it in the argument node.
                    argNode.SetVariable(argLocal);
                }
                else if(name == "this")
                {
                    // Create the this argument.
                    node.ArgumentVariables.Add(
                        new ArgumentVariable(0, "this", topScope, argument.GetNodeType())
                    );
                }

                argument = argument.GetNext();
            }

            // Check the constructor initializer.
            if(function.IsConstructor())
                CheckConstructorInit(node);

            // Visit his children.
            VisitList(node.GetChildren());

            // Restore the security.
            if(function.IsUnsafe())
                PopUnsafe();

            // Restore the scope.
            PopScope();

            // Restore the prototype scope.
            if(protoScope != null)
                PopScope();

            // Restore the current function.
            currentFunction = oldFunction;

            return node;
        }
예제 #9
0
        private void CreateGenerator_Current(FunctionDefinition node, bool generic)
        {
            // Get the generator class.
            Class genClass = node.GeneratorClass;

            // Use the get_Current name for the most specific version.
            string name = "get_Current";
            Function contract = null;
            if(!generic && node.IsGenericIterator)
            {
                name = GenSym();
                contract = FindFirstConstract(currentModule.GetEnumeratorIface(), "get_Current");
            }

            // Select the current type.
            IChelaType currentType = node.YieldType;
            if(!generic)
                currentType = ReferenceType.Create(currentModule.GetObjectClass());

            // Create the function type.
            FunctionType functionType =
                FunctionType.Create(currentType,
                    new IChelaType[]{ReferenceType.Create(node.GeneratorClassInstance)}, false);

            // Create the method.
            Method method = new Method(name, MemberFlags.Public, genClass);
            method.SetFunctionType(functionType);
            genClass.AddFunction(name, method);

            // Set the explicit contract.
            if(contract != null)
                method.SetExplicitContract(contract);

            // Create the method block.
            BasicBlock block = new BasicBlock(method);
            block.SetName("top");

            // Create the return and error blocks.
            BasicBlock retBlock = new BasicBlock(method);
            retBlock.SetName("ret");

            BasicBlock errorBlock = new BasicBlock(method);
            errorBlock.SetName("error");

            // Make sure reset was called before the first Current.
            builder.SetBlock(block);
            builder.CreateLoadArg(0);
            builder.CreateLoadField(node.GeneratorState);
            builder.CreateLoadInt32(0);
            builder.CreateCmpEQ();
            builder.CreateBr(errorBlock, retBlock);

            // Raise an error if reset wasn't called.
            builder.SetBlock(errorBlock);

            Class excpt = (Class)ExtractClass(node, currentModule.GetLangMember("InvalidOperationException"));
            builder.CreateLoadString("IEnumerator.MoveNext must be called before than IEnumerator.Current.");
            builder.CreateNewObject(excpt, GetExceptionCtor(node, excpt), 1);
            builder.CreateThrow();

            // Load the yielded value.
            builder.SetBlock(retBlock);
            builder.CreateLoadArg(0);
            builder.CreateLoadField(node.YieldedValue);

            // Cast the yielded value.
            Cast(node, null, node.YieldType, currentType);

            // Return.
            builder.CreateRet();
        }
예제 #10
0
        public override AstNode Visit(FunctionDefinition node)
        {
            // Begin the node.
            builder.BeginNode(node);

            // Process attributes.
            ProcessAttributes(node);

            // Get the prototype.
            FunctionPrototype prototype = node.GetPrototype();

            // Get the function.
            Function function = prototype.GetFunction();

            // Ignore functions without a body.
            if(node.GetChildren() == null)
                return builder.EndNode();

            // Store the old function.
            // TODO: Add closures
            Function oldFunction = currentFunction;
            currentFunction = function;

            // Update the securiry.
            if(function.IsUnsafe())
                PushUnsafe();

            // Get the function lexical scope.
            LexicalScope topScope = (LexicalScope)node.GetScope();

            // Update the scope.
            PushScope(topScope);

            // Define the generator or function body
            if(node.IsGenerator)
                DefineGeneratorBody(node);
            else
                DefineFunctionBody(node, function, topScope);

            // Restore the scope.
            PopScope();

            // Restore the security.
            if(function.IsUnsafe())
                PopUnsafe();

            // Restore the current function.
            currentFunction = oldFunction;

            return builder.EndNode();
        }
예제 #11
0
 public virtual AstNode Visit(FunctionDefinition node)
 {
     throw new System.NotImplementedException();
 }
예제 #12
0
파일: Parser.cs 프로젝트: ronsaldo/chela
  /** the generated parser.
      Maintains a state and a value stack, currently with fixed maximum size.
      @param yyLex scanner.
      @return result of the last reduction, if any.
      @throws yyException on irrecoverable parse error.
    */
  internal Object yyparse (yyParser.yyInput yyLex)
  {
    if (yyMax <= 0) yyMax = 256;		// initial size
    int yyState = 0;                   // state stack ptr
    int [] yyStates;               	// state stack 
    yyVal = null;
    yyToken = -1;
    int yyErrorFlag = 0;				// #tks to shift
	if (use_global_stacks && global_yyStates != null) {
		yyVals = global_yyVals;
		yyStates = global_yyStates;
   } else {
		yyVals = new object [yyMax];
		yyStates = new int [yyMax];
		if (use_global_stacks) {
			global_yyVals = yyVals;
			global_yyStates = yyStates;
		}
	}

    /*yyLoop:*/ for (yyTop = 0;; ++ yyTop) {
      if (yyTop >= yyStates.Length) {			// dynamically increase
        global::System.Array.Resize (ref yyStates, yyStates.Length+yyMax);
        global::System.Array.Resize (ref yyVals, yyVals.Length+yyMax);
      }
      yyStates[yyTop] = yyState;
      yyVals[yyTop] = yyVal;
//t      if (debug != null) debug.push(yyState, yyVal);

      /*yyDiscarded:*/ while (true) {	// discarding a token does not change stack
        int yyN;
        if ((yyN = yyDefRed[yyState]) == 0) {	// else [default] reduce (yyN)
          if (yyToken < 0) {
            yyToken = yyLex.advance() ? yyLex.token() : 0;
//t            if (debug != null)
//t              debug.lex(yyState, yyToken, yyname(yyToken), yyLex.value());
          }
          if ((yyN = yySindex[yyState]) != 0 && ((yyN += yyToken) >= 0)
              && (yyN < yyTable.Length) && (yyCheck[yyN] == yyToken)) {
//t            if (debug != null)
//t              debug.shift(yyState, yyTable[yyN], yyErrorFlag-1);
            yyState = yyTable[yyN];		// shift to yyN
            yyVal = yyLex.value();
            yyToken = -1;
            if (yyErrorFlag > 0) -- yyErrorFlag;
            goto continue_yyLoop;
          }
          if ((yyN = yyRindex[yyState]) != 0 && (yyN += yyToken) >= 0
              && yyN < yyTable.Length && yyCheck[yyN] == yyToken)
            yyN = yyTable[yyN];			// reduce (yyN)
          else
            switch (yyErrorFlag) {
  
            case 0:
              yyExpectingState = yyState;
              // yyerror(String.Format ("syntax error, got token `{0}'", yyname (yyToken)), yyExpecting(yyState));
//t              if (debug != null) debug.error("syntax error");
              if (yyToken == 0 /*eof*/ || yyToken == eof_token) throw new yyParser.yyUnexpectedEof ();
              goto case 1;
            case 1: case 2:
              yyErrorFlag = 3;
              do {
                if ((yyN = yySindex[yyStates[yyTop]]) != 0
                    && (yyN += Token.yyErrorCode) >= 0 && yyN < yyTable.Length
                    && yyCheck[yyN] == Token.yyErrorCode) {
//t                  if (debug != null)
//t                    debug.shift(yyStates[yyTop], yyTable[yyN], 3);
                  yyState = yyTable[yyN];
                  yyVal = yyLex.value();
                  goto continue_yyLoop;
                }
//t                if (debug != null) debug.pop(yyStates[yyTop]);
              } while (-- yyTop >= 0);
//t              if (debug != null) debug.reject();
              throw new yyParser.yyException("irrecoverable syntax error");
  
            case 3:
              if (yyToken == 0) {
//t                if (debug != null) debug.reject();
                throw new yyParser.yyException("irrecoverable syntax error at end-of-file");
              }
//t              if (debug != null)
//t                debug.discard(yyState, yyToken, yyname(yyToken),
//t  							yyLex.value());
              yyToken = -1;
              goto continue_yyDiscarded;		// leave stack alone
            }
        }
        int yyV = yyTop + 1-yyLen[yyN];
//t        if (debug != null)
//t          debug.reduce(yyState, yyStates[yyV-1], yyN, YYRules.getRule (yyN), yyLen[yyN]);
        yyVal = yyV > yyTop ? null : yyVals[yyV]; // yyVal = yyDefault(yyV > yyTop ? null : yyVals[yyV]);
        switch (yyN) {
case 1:
#line 548 "Parser.y"
  { yyVal = new TypeNode(TypeKind.Bool, ((TokenPosition)yyVals[0+yyTop])); }
  break;
case 2:
#line 549 "Parser.y"
  { yyVal = new TypeNode(TypeKind.Byte, ((TokenPosition)yyVals[0+yyTop])); }
  break;
case 3:
#line 550 "Parser.y"
  { yyVal = new TypeNode(TypeKind.SByte, ((TokenPosition)yyVals[0+yyTop])); }
  break;
case 4:
#line 551 "Parser.y"
  { yyVal = new TypeNode(TypeKind.Char, ((TokenPosition)yyVals[0+yyTop])); }
  break;
case 5:
#line 552 "Parser.y"
  { yyVal = new TypeNode(TypeKind.UChar, ((TokenPosition)yyVals[0+yyTop])); }
  break;
case 6:
#line 553 "Parser.y"
  { yyVal = new TypeNode(TypeKind.Double, ((TokenPosition)yyVals[0+yyTop])); }
  break;
case 7:
#line 554 "Parser.y"
  { yyVal = new TypeNode(TypeKind.Float, ((TokenPosition)yyVals[0+yyTop])); }
  break;
case 8:
#line 555 "Parser.y"
  { yyVal = new TypeNode(TypeKind.Int, ((TokenPosition)yyVals[0+yyTop])); }
  break;
case 9:
#line 556 "Parser.y"
  { yyVal = new TypeNode(TypeKind.UInt, ((TokenPosition)yyVals[0+yyTop])); }
  break;
case 10:
#line 557 "Parser.y"
  { yyVal = new TypeNode(TypeKind.Long, ((TokenPosition)yyVals[0+yyTop])); }
  break;
case 11:
#line 558 "Parser.y"
  { yyVal = new TypeNode(TypeKind.ULong, ((TokenPosition)yyVals[0+yyTop])); }
  break;
case 12:
#line 559 "Parser.y"
  { yyVal = new TypeNode(TypeKind.Short, ((TokenPosition)yyVals[0+yyTop])); }
  break;
case 13:
#line 560 "Parser.y"
  { yyVal = new TypeNode(TypeKind.UShort, ((TokenPosition)yyVals[0+yyTop])); }
  break;
case 14:
#line 561 "Parser.y"
  { yyVal = new TypeNode(TypeKind.Object, ((TokenPosition)yyVals[0+yyTop])); }
  break;
case 15:
#line 562 "Parser.y"
  { yyVal = new TypeNode(TypeKind.String, ((TokenPosition)yyVals[0+yyTop])); }
  break;
case 16:
#line 563 "Parser.y"
  { yyVal = new TypeNode(TypeKind.Size, ((TokenPosition)yyVals[0+yyTop])); }
  break;
case 17:
#line 564 "Parser.y"
  { yyVal = new TypeNode(TypeKind.Void, ((TokenPosition)yyVals[0+yyTop])); }
  break;
case 18:
#line 565 "Parser.y"
  { yyVal = new TypeNode(TypeKind.PtrDiff, ((TokenPosition)yyVals[0+yyTop])); }
  break;
case 19:
#line 567 "Parser.y"
  { yyVal = new TypeNode(TypeKind.Float, 2, ((TokenPosition)yyVals[0+yyTop])); }
  break;
case 20:
#line 568 "Parser.y"
  { yyVal = new TypeNode(TypeKind.Float, 3, ((TokenPosition)yyVals[0+yyTop])); }
  break;
case 21:
#line 569 "Parser.y"
  { yyVal = new TypeNode(TypeKind.Float, 4, ((TokenPosition)yyVals[0+yyTop])); }
  break;
case 22:
#line 570 "Parser.y"
  { yyVal = new TypeNode(TypeKind.Double, 2, ((TokenPosition)yyVals[0+yyTop])); }
  break;
case 23:
#line 571 "Parser.y"
  { yyVal = new TypeNode(TypeKind.Double, 3, ((TokenPosition)yyVals[0+yyTop])); }
  break;
case 24:
#line 572 "Parser.y"
  { yyVal = new TypeNode(TypeKind.Double, 4, ((TokenPosition)yyVals[0+yyTop])); }
  break;
case 25:
#line 573 "Parser.y"
  { yyVal = new TypeNode(TypeKind.Int, 2, ((TokenPosition)yyVals[0+yyTop])); }
  break;
case 26:
#line 574 "Parser.y"
  { yyVal = new TypeNode(TypeKind.Int, 3, ((TokenPosition)yyVals[0+yyTop])); }
  break;
case 27:
#line 575 "Parser.y"
  { yyVal = new TypeNode(TypeKind.Int, 4, ((TokenPosition)yyVals[0+yyTop])); }
  break;
case 28:
#line 576 "Parser.y"
  { yyVal = new TypeNode(TypeKind.Bool, 2, ((TokenPosition)yyVals[0+yyTop])); }
  break;
case 29:
#line 577 "Parser.y"
  { yyVal = new TypeNode(TypeKind.Bool, 3, ((TokenPosition)yyVals[0+yyTop])); }
  break;
case 30:
#line 578 "Parser.y"
  { yyVal = new TypeNode(TypeKind.Bool, 4, ((TokenPosition)yyVals[0+yyTop])); }
  break;
case 31:
#line 580 "Parser.y"
  { yyVal = new TypeNode(TypeKind.Float, 2, 2, ((TokenPosition)yyVals[0+yyTop])); }
  break;
case 32:
#line 581 "Parser.y"
  { yyVal = new TypeNode(TypeKind.Float, 2, 3, ((TokenPosition)yyVals[0+yyTop])); }
  break;
case 33:
#line 582 "Parser.y"
  { yyVal = new TypeNode(TypeKind.Float, 2, 4, ((TokenPosition)yyVals[0+yyTop])); }
  break;
case 34:
#line 583 "Parser.y"
  { yyVal = new TypeNode(TypeKind.Float, 3, 2, ((TokenPosition)yyVals[0+yyTop])); }
  break;
case 35:
#line 584 "Parser.y"
  { yyVal = new TypeNode(TypeKind.Float, 3, 3, ((TokenPosition)yyVals[0+yyTop])); }
  break;
case 36:
#line 585 "Parser.y"
  { yyVal = new TypeNode(TypeKind.Float, 3, 4, ((TokenPosition)yyVals[0+yyTop])); }
  break;
case 37:
#line 586 "Parser.y"
  { yyVal = new TypeNode(TypeKind.Float, 4, 2, ((TokenPosition)yyVals[0+yyTop])); }
  break;
case 38:
#line 587 "Parser.y"
  { yyVal = new TypeNode(TypeKind.Float, 4, 3, ((TokenPosition)yyVals[0+yyTop])); }
  break;
case 39:
#line 588 "Parser.y"
  { yyVal = new TypeNode(TypeKind.Float, 4, 4, ((TokenPosition)yyVals[0+yyTop])); }
  break;
case 40:
#line 590 "Parser.y"
  { yyVal = new TypeNode(TypeKind.Double, 2, 2, ((TokenPosition)yyVals[0+yyTop])); }
  break;
case 41:
#line 591 "Parser.y"
  { yyVal = new TypeNode(TypeKind.Double, 2, 3, ((TokenPosition)yyVals[0+yyTop])); }
  break;
case 42:
#line 592 "Parser.y"
  { yyVal = new TypeNode(TypeKind.Double, 2, 4, ((TokenPosition)yyVals[0+yyTop])); }
  break;
case 43:
#line 593 "Parser.y"
  { yyVal = new TypeNode(TypeKind.Double, 3, 2, ((TokenPosition)yyVals[0+yyTop])); }
  break;
case 44:
#line 594 "Parser.y"
  { yyVal = new TypeNode(TypeKind.Double, 3, 3, ((TokenPosition)yyVals[0+yyTop])); }
  break;
case 45:
#line 595 "Parser.y"
  { yyVal = new TypeNode(TypeKind.Double, 3, 4, ((TokenPosition)yyVals[0+yyTop])); }
  break;
case 46:
#line 596 "Parser.y"
  { yyVal = new TypeNode(TypeKind.Double, 4, 2, ((TokenPosition)yyVals[0+yyTop])); }
  break;
case 47:
#line 597 "Parser.y"
  { yyVal = new TypeNode(TypeKind.Double, 4, 3, ((TokenPosition)yyVals[0+yyTop])); }
  break;
case 48:
#line 598 "Parser.y"
  { yyVal = new TypeNode(TypeKind.Double, 4, 4, ((TokenPosition)yyVals[0+yyTop])); }
  break;
case 49:
#line 600 "Parser.y"
  { yyVal = new TypeNode(TypeKind.Int, 2, 2, ((TokenPosition)yyVals[0+yyTop])); }
  break;
case 50:
#line 601 "Parser.y"
  { yyVal = new TypeNode(TypeKind.Int, 2, 3, ((TokenPosition)yyVals[0+yyTop])); }
  break;
case 51:
#line 602 "Parser.y"
  { yyVal = new TypeNode(TypeKind.Int, 2, 4, ((TokenPosition)yyVals[0+yyTop])); }
  break;
case 52:
#line 603 "Parser.y"
  { yyVal = new TypeNode(TypeKind.Int, 3, 2, ((TokenPosition)yyVals[0+yyTop])); }
  break;
case 53:
#line 604 "Parser.y"
  { yyVal = new TypeNode(TypeKind.Int, 3, 3, ((TokenPosition)yyVals[0+yyTop])); }
  break;
case 54:
#line 605 "Parser.y"
  { yyVal = new TypeNode(TypeKind.Int, 3, 4, ((TokenPosition)yyVals[0+yyTop])); }
  break;
case 55:
#line 606 "Parser.y"
  { yyVal = new TypeNode(TypeKind.Int, 4, 2, ((TokenPosition)yyVals[0+yyTop])); }
  break;
case 56:
#line 607 "Parser.y"
  { yyVal = new TypeNode(TypeKind.Int, 4, 3, ((TokenPosition)yyVals[0+yyTop])); }
  break;
case 57:
#line 608 "Parser.y"
  { yyVal = new TypeNode(TypeKind.Int, 4, 4, ((TokenPosition)yyVals[0+yyTop])); }
  break;
case 58:
#line 611 "Parser.y"
  { yyVal = new MemberAccess(((Expression)yyVals[-2+yyTop]), (string)((TokenValue)yyVals[0+yyTop]).GetValue(), ((TokenPosition)yyVals[-1+yyTop])); }
  break;
case 59:
#line 612 "Parser.y"
  { yyVal = new VariableReference((string)((TokenValue)yyVals[0+yyTop]).GetValue(), ((TokenValue)yyVals[0+yyTop])); }
  break;
case 60:
#line 615 "Parser.y"
  { yyVal = new MemberAccess(((Expression)yyVals[-2+yyTop]), (string)((TokenValue)yyVals[0+yyTop]).GetValue(), ((TokenPosition)yyVals[-1+yyTop])); }
  break;
case 61:
#line 618 "Parser.y"
  { yyVal = new VariableReference((string)((TokenValue)yyVals[0+yyTop]).GetValue(), ((TokenValue)yyVals[0+yyTop])); }
  break;
case 62:
#line 619 "Parser.y"
  { yyVal = new VariableReference("this", ((TokenPosition)yyVals[0+yyTop])); }
  break;
case 63:
#line 620 "Parser.y"
  { yyVal = new BaseExpression(((TokenPosition)yyVals[0+yyTop])); }
  break;
case 64:
#line 623 "Parser.y"
  { yyVal = new ByteConstant((byte)(ulong)((TokenValue)yyVals[0+yyTop]).GetValue(), ((TokenValue)yyVals[0+yyTop])); }
  break;
case 65:
#line 624 "Parser.y"
  { yyVal = new SByteConstant((sbyte)(long)((TokenValue)yyVals[0+yyTop]).GetValue(), ((TokenValue)yyVals[0+yyTop])); }
  break;
case 66:
#line 625 "Parser.y"
  { yyVal = new ShortConstant((short)(long)((TokenValue)yyVals[0+yyTop]).GetValue(), ((TokenValue)yyVals[0+yyTop])); }
  break;
case 67:
#line 626 "Parser.y"
  { yyVal = new UShortConstant((ushort)(ulong)((TokenValue)yyVals[0+yyTop]).GetValue(), ((TokenValue)yyVals[0+yyTop])); }
  break;
case 68:
#line 627 "Parser.y"
  { yyVal = new IntegerConstant((int)(long)((TokenValue)yyVals[0+yyTop]).GetValue(), ((TokenValue)yyVals[0+yyTop])); }
  break;
case 69:
#line 628 "Parser.y"
  { yyVal = new UIntegerConstant((uint)(ulong)((TokenValue)yyVals[0+yyTop]).GetValue(), ((TokenValue)yyVals[0+yyTop])); }
  break;
case 70:
#line 629 "Parser.y"
  { yyVal = new LongConstant((long)((TokenValue)yyVals[0+yyTop]).GetValue(), ((TokenValue)yyVals[0+yyTop])); }
  break;
case 71:
#line 630 "Parser.y"
  { yyVal = new ULongConstant((ulong)((TokenValue)yyVals[0+yyTop]).GetValue(), ((TokenValue)yyVals[0+yyTop])); }
  break;
case 72:
#line 631 "Parser.y"
  { yyVal = new FloatConstant((float)(double)((TokenValue)yyVals[0+yyTop]).GetValue(), ((TokenValue)yyVals[0+yyTop])); }
  break;
case 73:
#line 632 "Parser.y"
  { yyVal = new DoubleConstant((double)((TokenValue)yyVals[0+yyTop]).GetValue(), ((TokenValue)yyVals[0+yyTop])); }
  break;
case 74:
#line 633 "Parser.y"
  { yyVal = new BoolConstant((bool)((TokenValue)yyVals[0+yyTop]).GetValue(), ((TokenValue)yyVals[0+yyTop])); }
  break;
case 75:
#line 634 "Parser.y"
  { yyVal = new NullConstant(((TokenPosition)yyVals[0+yyTop])); }
  break;
case 76:
#line 635 "Parser.y"
  { yyVal = new CharacterConstant((char)(long)((TokenValue)yyVals[0+yyTop]).GetValue(), ((TokenValue)yyVals[0+yyTop])); }
  break;
case 77:
#line 638 "Parser.y"
  { yyVal = new StringConstant((string)((TokenValue)yyVals[0+yyTop]).GetValue(), ((TokenValue)yyVals[0+yyTop])); }
  break;
case 78:
#line 639 "Parser.y"
  { yyVal = new CStringConstant((string)((TokenValue)yyVals[0+yyTop]).GetValue(), ((TokenValue)yyVals[0+yyTop])); }
  break;
case 79:
#line 642 "Parser.y"
  { yyVal = ((Expression)yyVals[0+yyTop]); }
  break;
case 80:
#line 643 "Parser.y"
  { yyVal = (Expression)AddList(((Expression)yyVals[-2+yyTop]), ((Expression)yyVals[0+yyTop])); }
  break;
case 81:
#line 646 "Parser.y"
  { yyVal = new SubscriptAccess(((Expression)yyVals[-3+yyTop]), ((Expression)yyVals[-1+yyTop]), ((TokenPosition)yyVals[-2+yyTop])); }
  break;
case 82:
#line 647 "Parser.y"
  { yyVal = new MakeArray(((Expression)yyVals[-3+yyTop]), ((int)yyVals[-1+yyTop]), ((Expression)yyVals[-3+yyTop]).GetPosition()); }
  break;
case 83:
#line 650 "Parser.y"
  { yyVal = new IndirectAccess(((Expression)yyVals[-2+yyTop]), (string)((TokenValue)yyVals[0+yyTop]).GetValue(), ((TokenPosition)yyVals[-1+yyTop])); }
  break;
case 84:
#line 653 "Parser.y"
  { yyVal = ((Expression)yyVals[0+yyTop]); }
  break;
case 85:
#line 654 "Parser.y"
  { yyVal = ((Expression)yyVals[0+yyTop]); }
  break;
case 86:
#line 655 "Parser.y"
  { yyVal = new GenericInstanceExpr(((Expression)yyVals[-3+yyTop]), ((AstNode)yyVals[-1+yyTop]), ((TokenPosition)yyVals[-2+yyTop])); }
  break;
case 87:
#line 656 "Parser.y"
  { yyVal = new GenericInstanceExpr(((Expression)yyVals[-3+yyTop]), ((AstNode)yyVals[-1+yyTop]), ((TokenPosition)yyVals[-2+yyTop])); }
  break;
case 88:
#line 657 "Parser.y"
  { yyVal = new MemberAccess(((Expression)yyVals[-2+yyTop]), (string)((TokenValue)yyVals[0+yyTop]).GetValue(), ((TokenPosition)yyVals[-1+yyTop])); }
  break;
case 89:
#line 658 "Parser.y"
  { yyVal = new IndirectAccess(((Expression)yyVals[-2+yyTop]), (string)((TokenValue)yyVals[0+yyTop]).GetValue(), ((TokenPosition)yyVals[-1+yyTop])); }
  break;
case 90:
#line 661 "Parser.y"
  { yyVal = ((Expression)yyVals[0+yyTop]); }
  break;
case 91:
#line 662 "Parser.y"
  { yyVal = new DereferenceOperation(((Expression)yyVals[0+yyTop]), ((Expression)yyVals[0+yyTop]).GetPosition()); }
  break;
case 92:
#line 665 "Parser.y"
  { yyVal = ((Expression)yyVals[0+yyTop]); }
  break;
case 93:
#line 666 "Parser.y"
  { yyVal = new MemberAccess(((Expression)yyVals[-2+yyTop]), (string)((TokenValue)yyVals[0+yyTop]).GetValue(), ((TokenPosition)yyVals[-1+yyTop])); }
  break;
case 94:
#line 667 "Parser.y"
  { yyVal = new IndirectAccess(((Expression)yyVals[-2+yyTop]), (string)((TokenValue)yyVals[0+yyTop]).GetValue(), ((TokenPosition)yyVals[-1+yyTop])); }
  break;
case 96:
#line 671 "Parser.y"
  { yyVal = ((Expression)yyVals[0+yyTop]); }
  break;
case 97:
#line 672 "Parser.y"
  { yyVal = new MakeConstant(((Expression)yyVals[0+yyTop]), ((TokenPosition)yyVals[-1+yyTop])); }
  break;
case 98:
#line 675 "Parser.y"
  { yyVal = 1; }
  break;
case 99:
#line 676 "Parser.y"
  { yyVal = ((int)yyVals[-1+yyTop]) + 1;}
  break;
case 100:
#line 679 "Parser.y"
  { yyVal = ((AstNode)yyVals[0+yyTop]); }
  break;
case 101:
#line 680 "Parser.y"
  { yyVal = new MakeConstant(new MakePointer(((Expression)yyVals[-2+yyTop]), ((Expression)yyVals[-2+yyTop]).GetPosition()), ((Expression)yyVals[-2+yyTop]).GetPosition()); }
  break;
case 102:
#line 681 "Parser.y"
  { yyVal = new MakePointer(((Expression)yyVals[-1+yyTop]), ((Expression)yyVals[-1+yyTop]).GetPosition()); }
  break;
case 103:
#line 682 "Parser.y"
  { yyVal = new MakeFunctionPointer(((Expression)yyVals[-5+yyTop]), ((Expression)yyVals[-1+yyTop]), ((MemberFlags)yyVals[-3+yyTop]), ((Expression)yyVals[-5+yyTop]).GetPosition()); }
  break;
case 104:
#line 685 "Parser.y"
  { yyVal = ((Expression)yyVals[0+yyTop]); }
  break;
case 105:
#line 686 "Parser.y"
  { yyVal = new MakeArray(((Expression)yyVals[-3+yyTop]), ((int)yyVals[-1+yyTop]), ((Expression)yyVals[-3+yyTop]).GetPosition()); }
  break;
case 106:
#line 687 "Parser.y"
  { yyVal = new SubscriptAccess(((Expression)yyVals[-3+yyTop]), ((Expression)yyVals[-1+yyTop]), ((TokenPosition)yyVals[-2+yyTop])); }
  break;
case 107:
#line 690 "Parser.y"
  { yyVal = ((Expression)yyVals[0+yyTop]); ((Expression)yyVals[0+yyTop]).SetHints(Expression.TypeHint); }
  break;
case 108:
#line 693 "Parser.y"
  { yyVal = ((Expression)yyVals[0+yyTop]); }
  break;
case 109:
#line 694 "Parser.y"
  { yyVal = new MakeConstant(((Expression)yyVals[0+yyTop]), ((TokenPosition)yyVals[-1+yyTop])); }
  break;
case 110:
#line 697 "Parser.y"
  { yyVal = ((Expression)yyVals[0+yyTop]); }
  break;
case 111:
#line 698 "Parser.y"
  { yyVal = ((Expression)yyVals[-1+yyTop]); }
  break;
case 112:
#line 701 "Parser.y"
  { yyVal = null; }
  break;
case 113:
#line 702 "Parser.y"
  { yyVal = ((Expression)yyVals[0+yyTop]); }
  break;
case 114:
#line 703 "Parser.y"
  { yyVal = AddList(((Expression)yyVals[-2+yyTop]), ((Expression)yyVals[0+yyTop])); }
  break;
case 115:
#line 706 "Parser.y"
  { yyVal = ((Expression)yyVals[0+yyTop]); }
  break;
case 116:
#line 707 "Parser.y"
  { yyVal = new ArrayExpression((Expression)((AstNode)yyVals[-1+yyTop]), ((TokenPosition)yyVals[-2+yyTop])); }
  break;
case 117:
#line 710 "Parser.y"
  { yyVal = ((Expression)yyVals[0+yyTop]); }
  break;
case 118:
#line 711 "Parser.y"
  { yyVal = AddList(((AstNode)yyVals[-2+yyTop]), ((Expression)yyVals[0+yyTop])); }
  break;
case 119:
#line 714 "Parser.y"
  { yyVal = null; }
  break;
case 120:
#line 715 "Parser.y"
  { yyVal = ((AstNode)yyVals[0+yyTop]);   }
  break;
case 121:
#line 716 "Parser.y"
  { yyVal = ((AstNode)yyVals[-1+yyTop]);   }
  break;
case 122:
#line 719 "Parser.y"
  { yyVal = new NewExpression(((Expression)yyVals[-3+yyTop]), ((Expression)yyVals[-1+yyTop]), ((TokenPosition)yyVals[-4+yyTop]));            }
  break;
case 123:
#line 720 "Parser.y"
  { yyVal = new NewArrayExpression(((Expression)yyVals[-3+yyTop]), ((Expression)yyVals[-1+yyTop]), null, -1, ((TokenPosition)yyVals[-4+yyTop])); }
  break;
case 124:
#line 721 "Parser.y"
  { yyVal = new NewArrayExpression(((Expression)yyVals[-6+yyTop]), ((Expression)yyVals[-4+yyTop]), ((AstNode)yyVals[-1+yyTop]), -1, ((TokenPosition)yyVals[-7+yyTop]));   }
  break;
case 125:
#line 722 "Parser.y"
  { yyVal = new NewArrayExpression(((Expression)yyVals[-6+yyTop]), null, ((AstNode)yyVals[-1+yyTop]), ((int)yyVals[-4+yyTop]), ((TokenPosition)yyVals[-7+yyTop])); }
  break;
case 126:
#line 725 "Parser.y"
  { yyVal = new NewRawExpression(((Expression)yyVals[0+yyTop]), null, true, ((TokenPosition)yyVals[-1+yyTop]));          }
  break;
case 127:
#line 726 "Parser.y"
  { yyVal = new NewRawExpression(((Expression)yyVals[-3+yyTop]), ((Expression)yyVals[-1+yyTop]), true, ((TokenPosition)yyVals[-4+yyTop]));            }
  break;
case 128:
#line 727 "Parser.y"
  { yyVal = new NewRawArrayExpression(((Expression)yyVals[-3+yyTop]), ((Expression)yyVals[-1+yyTop]), true, ((TokenPosition)yyVals[-4+yyTop]));    }
  break;
case 129:
#line 728 "Parser.y"
  { yyVal = new NewRawExpression(((Expression)yyVals[0+yyTop]), null, false, ((TokenPosition)yyVals[-1+yyTop]));          }
  break;
case 130:
#line 729 "Parser.y"
  { yyVal = new NewRawExpression(((Expression)yyVals[-3+yyTop]), ((Expression)yyVals[-1+yyTop]), false, ((TokenPosition)yyVals[-4+yyTop]));            }
  break;
case 131:
#line 730 "Parser.y"
  { yyVal = new NewRawArrayExpression(((Expression)yyVals[-3+yyTop]), ((Expression)yyVals[-1+yyTop]), false, ((TokenPosition)yyVals[-4+yyTop]));    }
  break;
case 132:
#line 733 "Parser.y"
  { yyVal = ((Expression)yyVals[-1+yyTop]); }
  break;
case 133:
#line 734 "Parser.y"
  { yyVal = ((Expression)yyVals[-1+yyTop]); }
  break;
case 134:
#line 737 "Parser.y"
  { yyVal = new PostfixOperation(PostfixOperation.Increment, ((Expression)yyVals[-1+yyTop]), ((TokenPosition)yyVals[0+yyTop])); }
  break;
case 135:
#line 738 "Parser.y"
  { yyVal = new PostfixOperation(PostfixOperation.Decrement, ((Expression)yyVals[-1+yyTop]), ((TokenPosition)yyVals[0+yyTop])); }
  break;
case 136:
  case_136();
  break;
case 137:
  case_137();
  break;
case 138:
#line 753 "Parser.y"
  { yyVal = new PrefixOperation(PrefixOperation.Increment, ((Expression)yyVals[0+yyTop]), ((TokenPosition)yyVals[-1+yyTop])); }
  break;
case 139:
#line 754 "Parser.y"
  { yyVal = new PrefixOperation(PrefixOperation.Decrement, ((Expression)yyVals[0+yyTop]), ((TokenPosition)yyVals[-1+yyTop])); }
  break;
case 140:
#line 757 "Parser.y"
  { yyVal = new ExpressionStatement(((Expression)yyVals[-1+yyTop]), ((Expression)yyVals[-1+yyTop]).GetPosition()); }
  break;
case 141:
#line 760 "Parser.y"
  { yyVal = ((Expression)yyVals[0+yyTop]); }
  break;
case 142:
#line 761 "Parser.y"
  { yyVal = ((Expression)yyVals[0+yyTop]); }
  break;
case 143:
#line 762 "Parser.y"
  { yyVal = ((Expression)yyVals[0+yyTop]); }
  break;
case 144:
#line 763 "Parser.y"
  { yyVal = ((Expression)yyVals[0+yyTop]); }
  break;
case 145:
#line 764 "Parser.y"
  { yyVal = ((Expression)yyVals[0+yyTop]);}
  break;
case 146:
#line 765 "Parser.y"
  { yyVal = ((Expression)yyVals[0+yyTop]); }
  break;
case 147:
#line 766 "Parser.y"
  { yyVal = ((Expression)yyVals[0+yyTop]); }
  break;
case 148:
#line 767 "Parser.y"
  { yyVal = ((Expression)yyVals[0+yyTop]); }
  break;
case 149:
#line 768 "Parser.y"
  { yyVal = ((Expression)yyVals[0+yyTop]); }
  break;
case 150:
#line 769 "Parser.y"
  { yyVal = ((Expression)yyVals[0+yyTop]); }
  break;
case 151:
#line 770 "Parser.y"
  { yyVal = ((Expression)yyVals[0+yyTop]); }
  break;
case 152:
#line 771 "Parser.y"
  { yyVal = ((Expression)yyVals[0+yyTop]); }
  break;
case 153:
#line 772 "Parser.y"
  { yyVal = ((Expression)yyVals[0+yyTop]); }
  break;
case 154:
#line 773 "Parser.y"
  { yyVal = ((Expression)yyVals[0+yyTop]); }
  break;
case 155:
#line 774 "Parser.y"
  { yyVal = ((Expression)yyVals[0+yyTop]); }
  break;
case 156:
#line 775 "Parser.y"
  { yyVal = ((Expression)yyVals[-1+yyTop]); }
  break;
case 157:
#line 778 "Parser.y"
  { yyVal = new SizeOfExpression(((Expression)yyVals[-1+yyTop]), ((TokenPosition)yyVals[-3+yyTop])); }
  break;
case 158:
#line 781 "Parser.y"
  { yyVal = new TypeOfExpression(((Expression)yyVals[-1+yyTop]), ((TokenPosition)yyVals[-3+yyTop])); }
  break;
case 159:
#line 784 "Parser.y"
  { yyVal = new DefaultExpression(((Expression)yyVals[-1+yyTop]), ((TokenPosition)yyVals[-3+yyTop])); }
  break;
case 160:
#line 787 "Parser.y"
  { yyVal = ((AstNode)yyVals[0+yyTop]); }
  break;
case 161:
#line 788 "Parser.y"
  { yyVal = new DereferenceOperation(((Expression)yyVals[0+yyTop]), ((Expression)yyVals[0+yyTop]).GetPosition()); }
  break;
case 162:
#line 791 "Parser.y"
  { yyVal = new ReinterpretCast(((Expression)yyVals[-4+yyTop]), ((Expression)yyVals[-1+yyTop]), ((TokenPosition)yyVals[-6+yyTop])); }
  break;
case 163:
#line 794 "Parser.y"
  { yyVal = MemberFlags.Default; }
  break;
case 164:
#line 795 "Parser.y"
  { yyVal = ((MemberFlagsAndMask)yyVals[0+yyTop]).flags;           }
  break;
case 165:
#line 798 "Parser.y"
  { yyVal = ((Expression)yyVals[0+yyTop]); }
  break;
case 166:
#line 799 "Parser.y"
  { yyVal = new MakeConstant(new MakePointer(((Expression)yyVals[-2+yyTop]), ((Expression)yyVals[-2+yyTop]).GetPosition()), ((Expression)yyVals[-2+yyTop]).GetPosition()); }
  break;
case 167:
#line 800 "Parser.y"
  { yyVal = new MakePointer(((Expression)yyVals[-1+yyTop]), ((Expression)yyVals[-1+yyTop]).GetPosition()); }
  break;
case 168:
#line 801 "Parser.y"
  { yyVal = new BinaryOperation(BinaryOperation.OpMul, ((Expression)yyVals[-2+yyTop]), ((Expression)yyVals[0+yyTop]), ((TokenPosition)yyVals[-1+yyTop])); }
  break;
case 169:
#line 802 "Parser.y"
  { yyVal = new MakeFunctionPointer(((Expression)yyVals[-5+yyTop]), ((Expression)yyVals[-1+yyTop]), ((MemberFlags)yyVals[-3+yyTop]), ((Expression)yyVals[-5+yyTop]).GetPosition()); }
  break;
case 170:
#line 805 "Parser.y"
  { yyVal = ((Expression)yyVals[0+yyTop]); }
  break;
case 171:
#line 806 "Parser.y"
  { yyVal = new UnaryOperation(UnaryOperation.OpNot, ((Expression)yyVals[0+yyTop]), ((TokenPosition)yyVals[-1+yyTop])); }
  break;
case 172:
#line 807 "Parser.y"
  { yyVal = new UnaryOperation(UnaryOperation.OpBitNot, ((Expression)yyVals[0+yyTop]), ((TokenPosition)yyVals[-1+yyTop])); }
  break;
case 173:
#line 808 "Parser.y"
  { yyVal = ((Expression)yyVals[0+yyTop]); }
  break;
case 174:
#line 809 "Parser.y"
  { yyVal = new UnaryOperation(UnaryOperation.OpNeg, ((Expression)yyVals[0+yyTop]), ((Expression)yyVals[0+yyTop]).GetPosition()); }
  break;
case 175:
#line 810 "Parser.y"
  { yyVal = new AddressOfOperation(((Expression)yyVals[0+yyTop]), ((TokenPosition)yyVals[-1+yyTop])); }
  break;
case 176:
#line 811 "Parser.y"
  { yyVal = new RefExpression(false, ((Expression)yyVals[0+yyTop]), ((TokenValue)yyVals[-1+yyTop])); }
  break;
case 177:
#line 812 "Parser.y"
  { yyVal = new RefExpression(true, ((Expression)yyVals[0+yyTop]), ((TokenValue)yyVals[-1+yyTop])); }
  break;
case 178:
#line 813 "Parser.y"
  { yyVal = new CastOperation(((Expression)yyVals[-2+yyTop]), ((Expression)yyVals[0+yyTop]), ((TokenPosition)yyVals[-3+yyTop])); }
  break;
case 179:
#line 814 "Parser.y"
  { yyVal = ((Expression)yyVals[-1+yyTop]); }
  break;
case 180:
#line 815 "Parser.y"
  { yyVal = ((Expression)yyVals[0+yyTop]); }
  break;
case 181:
#line 818 "Parser.y"
  { yyVal = ((Expression)yyVals[0+yyTop]); }
  break;
case 182:
#line 819 "Parser.y"
  { yyVal = new BinaryOperation(BinaryOperation.OpMul, ((Expression)yyVals[-2+yyTop]), ((Expression)yyVals[0+yyTop]), ((TokenPosition)yyVals[-1+yyTop])); }
  break;
case 183:
#line 820 "Parser.y"
  { yyVal = new BinaryOperation(BinaryOperation.OpDiv, ((Expression)yyVals[-2+yyTop]), ((Expression)yyVals[0+yyTop]), ((TokenPosition)yyVals[-1+yyTop])); }
  break;
case 184:
#line 821 "Parser.y"
  { yyVal = new BinaryOperation(BinaryOperation.OpMod, ((Expression)yyVals[-2+yyTop]), ((Expression)yyVals[0+yyTop]), ((TokenPosition)yyVals[-1+yyTop])); }
  break;
case 185:
#line 824 "Parser.y"
  { yyVal = ((Expression)yyVals[0+yyTop]); }
  break;
case 186:
#line 825 "Parser.y"
  { yyVal = new BinaryOperation(BinaryOperation.OpAdd, ((Expression)yyVals[-2+yyTop]), ((Expression)yyVals[0+yyTop]), ((TokenPosition)yyVals[-1+yyTop])); }
  break;
case 187:
#line 826 "Parser.y"
  { yyVal = new BinaryOperation(BinaryOperation.OpSub, ((Expression)yyVals[-2+yyTop]), ((Expression)yyVals[0+yyTop]), ((TokenPosition)yyVals[-1+yyTop])); }
  break;
case 188:
#line 829 "Parser.y"
  { yyVal = ((Expression)yyVals[0+yyTop]); }
  break;
case 189:
#line 830 "Parser.y"
  { yyVal = new BinaryOperation(BinaryOperation.OpBitLeft, ((Expression)yyVals[-2+yyTop]), ((Expression)yyVals[0+yyTop]), ((TokenPosition)yyVals[-1+yyTop])); }
  break;
case 190:
#line 831 "Parser.y"
  { yyVal = new BinaryOperation(BinaryOperation.OpBitRight, ((Expression)yyVals[-2+yyTop]), ((Expression)yyVals[0+yyTop]), ((TokenPosition)yyVals[-1+yyTop])); }
  break;
case 191:
#line 834 "Parser.y"
  { yyVal = ((Expression)yyVals[0+yyTop]); }
  break;
case 192:
#line 835 "Parser.y"
  { yyVal = new BinaryOperation(BinaryOperation.OpLT, ((Expression)yyVals[-2+yyTop]), ((Expression)yyVals[0+yyTop]), ((TokenPosition)yyVals[-1+yyTop])); }
  break;
case 193:
#line 836 "Parser.y"
  { yyVal = new BinaryOperation(BinaryOperation.OpLEQ, ((Expression)yyVals[-2+yyTop]), ((Expression)yyVals[0+yyTop]), ((TokenPosition)yyVals[-1+yyTop])); }
  break;
case 194:
#line 837 "Parser.y"
  { yyVal = new BinaryOperation(BinaryOperation.OpGEQ, ((Expression)yyVals[-2+yyTop]), ((Expression)yyVals[0+yyTop]), ((TokenPosition)yyVals[-1+yyTop])); }
  break;
case 195:
#line 838 "Parser.y"
  { yyVal = new BinaryOperation(BinaryOperation.OpGT, ((Expression)yyVals[-2+yyTop]), ((Expression)yyVals[0+yyTop]), ((TokenPosition)yyVals[-1+yyTop])); }
  break;
case 196:
#line 839 "Parser.y"
  { yyVal = new IsExpression(((Expression)yyVals[-2+yyTop]), ((Expression)yyVals[0+yyTop]), ((TokenPosition)yyVals[-1+yyTop])); }
  break;
case 197:
#line 840 "Parser.y"
  { yyVal = new AsExpression(((Expression)yyVals[-2+yyTop]), ((Expression)yyVals[0+yyTop]), ((TokenPosition)yyVals[-1+yyTop])); }
  break;
case 198:
#line 843 "Parser.y"
  { yyVal = ((Expression)yyVals[0+yyTop]); }
  break;
case 199:
#line 844 "Parser.y"
  { yyVal = new BinaryOperation(BinaryOperation.OpEQ, ((Expression)yyVals[-2+yyTop]), ((Expression)yyVals[0+yyTop]), ((TokenPosition)yyVals[-1+yyTop])); }
  break;
case 200:
#line 845 "Parser.y"
  { yyVal = new BinaryOperation(BinaryOperation.OpNEQ, ((Expression)yyVals[-2+yyTop]), ((Expression)yyVals[0+yyTop]), ((TokenPosition)yyVals[-1+yyTop])); }
  break;
case 201:
#line 848 "Parser.y"
  { yyVal = ((Expression)yyVals[0+yyTop]); }
  break;
case 202:
#line 849 "Parser.y"
  { yyVal = new BinaryOperation(BinaryOperation.OpBitAnd, ((Expression)yyVals[-2+yyTop]), ((Expression)yyVals[0+yyTop]), ((TokenPosition)yyVals[-1+yyTop])); }
  break;
case 203:
#line 850 "Parser.y"
  { yyVal = new BinaryOperation(BinaryOperation.OpBitOr, ((Expression)yyVals[-2+yyTop]), ((Expression)yyVals[0+yyTop]), ((TokenPosition)yyVals[-1+yyTop])); }
  break;
case 204:
#line 851 "Parser.y"
  { yyVal = new BinaryOperation(BinaryOperation.OpBitXor, ((Expression)yyVals[-2+yyTop]), ((Expression)yyVals[0+yyTop]), ((TokenPosition)yyVals[-1+yyTop])); }
  break;
case 205:
#line 854 "Parser.y"
  { yyVal = ((Expression)yyVals[0+yyTop]); }
  break;
case 206:
#line 855 "Parser.y"
  { yyVal = new BinaryOperation(BinaryOperation.OpLAnd, ((Expression)yyVals[-2+yyTop]), ((Expression)yyVals[0+yyTop]), ((TokenPosition)yyVals[-1+yyTop])); }
  break;
case 207:
#line 858 "Parser.y"
  { yyVal = ((Expression)yyVals[0+yyTop]); }
  break;
case 208:
#line 859 "Parser.y"
  { yyVal = new BinaryOperation(BinaryOperation.OpLOr, ((Expression)yyVals[-2+yyTop]), ((Expression)yyVals[0+yyTop]), ((TokenPosition)yyVals[-1+yyTop])); }
  break;
case 209:
#line 862 "Parser.y"
  { yyVal = ((Expression)yyVals[0+yyTop]);								   }
  break;
case 210:
#line 863 "Parser.y"
  { yyVal = new TernaryOperation(((Expression)yyVals[-4+yyTop]), ((Expression)yyVals[-2+yyTop]), ((Expression)yyVals[0+yyTop]), ((TokenPosition)yyVals[-3+yyTop])); }
  break;
case 211:
#line 866 "Parser.y"
  { yyVal = new AssignmentExpression(((Expression)yyVals[-2+yyTop]), ((Expression)yyVals[0+yyTop]), ((TokenPosition)yyVals[-1+yyTop])); }
  break;
case 212:
#line 867 "Parser.y"
  { yyVal = new BinaryAssignOperation(BinaryOperation.OpAdd, ((Expression)yyVals[-2+yyTop]), ((Expression)yyVals[0+yyTop]), ((TokenPosition)yyVals[-1+yyTop]));      }
  break;
case 213:
#line 868 "Parser.y"
  { yyVal = new BinaryAssignOperation(BinaryOperation.OpSub, ((Expression)yyVals[-2+yyTop]), ((Expression)yyVals[0+yyTop]), ((TokenPosition)yyVals[-1+yyTop]));      }
  break;
case 214:
#line 869 "Parser.y"
  { yyVal = new BinaryAssignOperation(BinaryOperation.OpMul, ((Expression)yyVals[-2+yyTop]), ((Expression)yyVals[0+yyTop]), ((TokenPosition)yyVals[-1+yyTop]));      }
  break;
case 215:
#line 870 "Parser.y"
  { yyVal = new BinaryAssignOperation(BinaryOperation.OpDiv, ((Expression)yyVals[-2+yyTop]), ((Expression)yyVals[0+yyTop]), ((TokenPosition)yyVals[-1+yyTop]));      }
  break;
case 216:
#line 871 "Parser.y"
  { yyVal = new BinaryAssignOperation(BinaryOperation.OpMod, ((Expression)yyVals[-2+yyTop]), ((Expression)yyVals[0+yyTop]), ((TokenPosition)yyVals[-1+yyTop]));      }
  break;
case 217:
#line 872 "Parser.y"
  { yyVal = new BinaryAssignOperation(BinaryOperation.OpBitOr, ((Expression)yyVals[-2+yyTop]), ((Expression)yyVals[0+yyTop]), ((TokenPosition)yyVals[-1+yyTop]));    }
  break;
case 218:
#line 873 "Parser.y"
  { yyVal = new BinaryAssignOperation(BinaryOperation.OpBitXor, ((Expression)yyVals[-2+yyTop]), ((Expression)yyVals[0+yyTop]), ((TokenPosition)yyVals[-1+yyTop]));   }
  break;
case 219:
#line 874 "Parser.y"
  { yyVal = new BinaryAssignOperation(BinaryOperation.OpBitAnd, ((Expression)yyVals[-2+yyTop]), ((Expression)yyVals[0+yyTop]), ((TokenPosition)yyVals[-1+yyTop]));   }
  break;
case 220:
#line 875 "Parser.y"
  { yyVal = new BinaryAssignOperation(BinaryOperation.OpBitLeft, ((Expression)yyVals[-2+yyTop]), ((Expression)yyVals[0+yyTop]), ((TokenPosition)yyVals[-1+yyTop]));  }
  break;
case 221:
#line 876 "Parser.y"
  { yyVal = new BinaryAssignOperation(BinaryOperation.OpBitRight, ((Expression)yyVals[-2+yyTop]), ((Expression)yyVals[0+yyTop]), ((TokenPosition)yyVals[-1+yyTop])); }
  break;
case 222:
#line 879 "Parser.y"
  { yyVal = new AssignmentExpression(((Expression)yyVals[-2+yyTop]), ((Expression)yyVals[0+yyTop]), ((TokenPosition)yyVals[-1+yyTop])); }
  break;
case 223:
#line 880 "Parser.y"
  { yyVal = new BinaryAssignOperation(BinaryOperation.OpAdd, ((Expression)yyVals[-2+yyTop]), ((Expression)yyVals[0+yyTop]), ((TokenPosition)yyVals[-1+yyTop]));      }
  break;
case 224:
#line 881 "Parser.y"
  { yyVal = new BinaryAssignOperation(BinaryOperation.OpSub, ((Expression)yyVals[-2+yyTop]), ((Expression)yyVals[0+yyTop]), ((TokenPosition)yyVals[-1+yyTop]));      }
  break;
case 225:
#line 882 "Parser.y"
  { yyVal = new BinaryAssignOperation(BinaryOperation.OpMul, ((Expression)yyVals[-2+yyTop]), ((Expression)yyVals[0+yyTop]), ((TokenPosition)yyVals[-1+yyTop]));      }
  break;
case 226:
#line 883 "Parser.y"
  { yyVal = new BinaryAssignOperation(BinaryOperation.OpDiv, ((Expression)yyVals[-2+yyTop]), ((Expression)yyVals[0+yyTop]), ((TokenPosition)yyVals[-1+yyTop]));      }
  break;
case 227:
#line 884 "Parser.y"
  { yyVal = new BinaryAssignOperation(BinaryOperation.OpMod, ((Expression)yyVals[-2+yyTop]), ((Expression)yyVals[0+yyTop]), ((TokenPosition)yyVals[-1+yyTop]));      }
  break;
case 228:
#line 885 "Parser.y"
  { yyVal = new BinaryAssignOperation(BinaryOperation.OpBitOr, ((Expression)yyVals[-2+yyTop]), ((Expression)yyVals[0+yyTop]), ((TokenPosition)yyVals[-1+yyTop]));    }
  break;
case 229:
#line 886 "Parser.y"
  { yyVal = new BinaryAssignOperation(BinaryOperation.OpBitXor, ((Expression)yyVals[-2+yyTop]), ((Expression)yyVals[0+yyTop]), ((TokenPosition)yyVals[-1+yyTop]));   }
  break;
case 230:
#line 887 "Parser.y"
  { yyVal = new BinaryAssignOperation(BinaryOperation.OpBitAnd, ((Expression)yyVals[-2+yyTop]), ((Expression)yyVals[0+yyTop]), ((TokenPosition)yyVals[-1+yyTop]));   }
  break;
case 231:
#line 888 "Parser.y"
  { yyVal = new BinaryAssignOperation(BinaryOperation.OpBitLeft, ((Expression)yyVals[-2+yyTop]), ((Expression)yyVals[0+yyTop]), ((TokenPosition)yyVals[-1+yyTop]));  }
  break;
case 232:
#line 889 "Parser.y"
  { yyVal = new BinaryAssignOperation(BinaryOperation.OpBitRight, ((Expression)yyVals[-2+yyTop]), ((Expression)yyVals[0+yyTop]), ((TokenPosition)yyVals[-1+yyTop])); }
  break;
case 233:
#line 892 "Parser.y"
  { yyVal = new ExpressionStatement(((Expression)yyVals[-1+yyTop]), ((Expression)yyVals[-1+yyTop]).GetPosition()); }
  break;
case 234:
#line 895 "Parser.y"
  { yyVal = ((Expression)yyVals[0+yyTop]); }
  break;
case 235:
#line 898 "Parser.y"
  { yyVal = ((Expression)yyVals[0+yyTop]); }
  break;
case 236:
#line 899 "Parser.y"
  { yyVal = ((Expression)yyVals[0+yyTop]); }
  break;
case 237:
#line 904 "Parser.y"
  { yyVal = new BlockNode(((AstNode)yyVals[-1+yyTop]), ((TokenPosition)yyVals[-2+yyTop]));}
  break;
case 238:
#line 907 "Parser.y"
  { yyVal = new UnsafeBlockNode(((AstNode)yyVals[-1+yyTop]), ((TokenPosition)yyVals[-3+yyTop])); }
  break;
case 239:
#line 910 "Parser.y"
  { yyVal = null;			}
  break;
case 240:
#line 911 "Parser.y"
  { yyVal = ((Expression)yyVals[0+yyTop]);				}
  break;
case 241:
#line 912 "Parser.y"
  { yyVal = AddList(((Expression)yyVals[-2+yyTop]), ((Expression)yyVals[0+yyTop])); }
  break;
case 242:
#line 915 "Parser.y"
  { yyVal = new CallExpression(((Expression)yyVals[-3+yyTop]), ((Expression)yyVals[-1+yyTop]), ((TokenPosition)yyVals[-2+yyTop])); }
  break;
case 243:
#line 918 "Parser.y"
  { yyVal = new CallExpression(((Expression)yyVals[-3+yyTop]), ((Expression)yyVals[-1+yyTop]), ((TokenPosition)yyVals[-2+yyTop])); }
  break;
case 244:
#line 921 "Parser.y"
  { yyVal = new ExpressionStatement(((Expression)yyVals[-1+yyTop]), ((TokenPosition)yyVals[0+yyTop])); }
  break;
case 245:
#line 924 "Parser.y"
  { yyVal = new ExpressionStatement(((Expression)yyVals[-1+yyTop]), ((Expression)yyVals[-1+yyTop]).GetPosition()); }
  break;
case 246:
#line 927 "Parser.y"
  { yyVal = new ReturnStatement(((Expression)yyVals[-1+yyTop]), ((TokenPosition)yyVals[-2+yyTop])); }
  break;
case 247:
#line 928 "Parser.y"
  { yyVal = new ReturnStatement(null, ((TokenPosition)yyVals[-1+yyTop])); }
  break;
case 248:
  case_248();
  break;
case 249:
#line 937 "Parser.y"
  { yyVal = new IfStatement(((Expression)yyVals[-2+yyTop]), ((AstNode)yyVals[0+yyTop]), null, ((TokenPosition)yyVals[-4+yyTop])); }
  break;
case 250:
#line 938 "Parser.y"
  { yyVal = new IfStatement(((Expression)yyVals[-4+yyTop]), ((AstNode)yyVals[-2+yyTop]), ((AstNode)yyVals[0+yyTop]), ((TokenPosition)yyVals[-6+yyTop])); }
  break;
case 251:
#line 941 "Parser.y"
  { yyVal = new CaseLabel(((Expression)yyVals[-2+yyTop]), ((AstNode)yyVals[0+yyTop]), ((TokenPosition)yyVals[-3+yyTop])); }
  break;
case 252:
#line 942 "Parser.y"
  { yyVal = new CaseLabel(null, ((AstNode)yyVals[0+yyTop]), ((TokenPosition)yyVals[-2+yyTop])); }
  break;
case 253:
#line 945 "Parser.y"
  { yyVal = ((AstNode)yyVals[0+yyTop]); }
  break;
case 254:
#line 946 "Parser.y"
  { yyVal = AddList(((AstNode)yyVals[-1+yyTop]), ((AstNode)yyVals[0+yyTop])); }
  break;
case 255:
#line 949 "Parser.y"
  { yyVal = new SwitchStatement(((Expression)yyVals[-4+yyTop]), ((AstNode)yyVals[-1+yyTop]), ((TokenPosition)yyVals[-6+yyTop])); }
  break;
case 256:
#line 952 "Parser.y"
  { yyVal = new WhileStatement(((Expression)yyVals[-2+yyTop]), ((AstNode)yyVals[0+yyTop]), ((TokenPosition)yyVals[-4+yyTop])); }
  break;
case 257:
#line 955 "Parser.y"
  { yyVal = new DoWhileStatement(((Expression)yyVals[-1+yyTop]), ((AstNode)yyVals[-4+yyTop]), ((TokenPosition)yyVals[-5+yyTop])); }
  break;
case 258:
#line 958 "Parser.y"
  { yyVal = null; }
  break;
case 259:
#line 959 "Parser.y"
  { yyVal = new ExpressionStatement(((Expression)yyVals[0+yyTop]), ((Expression)yyVals[0+yyTop]).GetPosition());; }
  break;
case 260:
#line 960 "Parser.y"
  { yyVal = new ExpressionStatement(((Expression)yyVals[0+yyTop]), ((Expression)yyVals[0+yyTop]).GetPosition());; }
  break;
case 261:
#line 961 "Parser.y"
  { yyVal = new ExpressionStatement(((Expression)yyVals[0+yyTop]), ((Expression)yyVals[0+yyTop]).GetPosition());; }
  break;
case 262:
#line 962 "Parser.y"
  { yyVal = new ExpressionStatement(((Expression)yyVals[0+yyTop]), ((Expression)yyVals[0+yyTop]).GetPosition());; }
  break;
case 263:
#line 965 "Parser.y"
  { yyVal = null; }
  break;
case 264:
#line 966 "Parser.y"
  { yyVal = ((Expression)yyVals[-1+yyTop]); }
  break;
case 265:
#line 969 "Parser.y"
  { yyVal = null; }
  break;
case 266:
#line 970 "Parser.y"
  { yyVal = ((AstNode)yyVals[0+yyTop]); }
  break;
case 267:
#line 973 "Parser.y"
  { yyVal = new ForStatement(((AstNode)yyVals[-4+yyTop]), ((Expression)yyVals[-3+yyTop]), ((AstNode)yyVals[-2+yyTop]), ((AstNode)yyVals[0+yyTop]), ((TokenPosition)yyVals[-6+yyTop])); }
  break;
case 268:
#line 977 "Parser.y"
  { yyVal = new ForEachStatement(((Expression)yyVals[-5+yyTop]), (string)((TokenValue)yyVals[-4+yyTop]).GetValue(), ((Expression)yyVals[-2+yyTop]), ((AstNode)yyVals[0+yyTop]), ((TokenPosition)yyVals[-7+yyTop])); }
  break;
case 269:
#line 980 "Parser.y"
  { yyVal = new BreakStatement(((TokenPosition)yyVals[-1+yyTop])); }
  break;
case 270:
#line 983 "Parser.y"
  { yyVal = new ContinueStatement(((TokenPosition)yyVals[-1+yyTop])); }
  break;
case 271:
#line 986 "Parser.y"
  { yyVal = new GotoCaseStatement(((Expression)yyVals[-1+yyTop]), ((TokenPosition)yyVals[-3+yyTop]));   }
  break;
case 272:
#line 987 "Parser.y"
  { yyVal = new GotoCaseStatement(null, ((TokenPosition)yyVals[-2+yyTop])); }
  break;
case 273:
#line 990 "Parser.y"
  { yyVal = new CatchStatement(((Expression)yyVals[-2+yyTop]), null, ((AstNode)yyVals[0+yyTop]), ((TokenPosition)yyVals[-4+yyTop])); }
  break;
case 274:
#line 991 "Parser.y"
  { yyVal = new CatchStatement(((Expression)yyVals[-3+yyTop]), (string)((TokenValue)yyVals[-2+yyTop]).GetValue(), ((AstNode)yyVals[0+yyTop]), ((TokenPosition)yyVals[-5+yyTop])); }
  break;
case 275:
#line 994 "Parser.y"
  { yyVal = ((AstNode)yyVals[0+yyTop]); }
  break;
case 276:
#line 995 "Parser.y"
  { yyVal = AddList(((AstNode)yyVals[-1+yyTop]), ((AstNode)yyVals[0+yyTop])); }
  break;
case 277:
#line 998 "Parser.y"
  { yyVal = new FinallyStatement(((AstNode)yyVals[0+yyTop]), ((TokenPosition)yyVals[-1+yyTop])); }
  break;
case 278:
#line 1001 "Parser.y"
  { yyVal = new TryStatement(((AstNode)yyVals[-2+yyTop]), ((AstNode)yyVals[-1+yyTop]), ((AstNode)yyVals[0+yyTop]), ((TokenPosition)yyVals[-3+yyTop])); }
  break;
case 279:
#line 1002 "Parser.y"
  { yyVal = new TryStatement(((AstNode)yyVals[-1+yyTop]), ((AstNode)yyVals[0+yyTop]), null, ((TokenPosition)yyVals[-2+yyTop])); }
  break;
case 280:
#line 1003 "Parser.y"
  { yyVal = new TryStatement(((AstNode)yyVals[-1+yyTop]), null, ((AstNode)yyVals[0+yyTop]), ((TokenPosition)yyVals[-2+yyTop])); }
  break;
case 281:
#line 1006 "Parser.y"
  {yyVal = new VariableDeclaration((string)((TokenValue)yyVals[0+yyTop]).GetValue(), null, ((TokenValue)yyVals[0+yyTop])); }
  break;
case 282:
#line 1007 "Parser.y"
  {yyVal = new VariableDeclaration((string)((TokenValue)yyVals[-2+yyTop]).GetValue(), ((Expression)yyVals[0+yyTop]), ((TokenValue)yyVals[-2+yyTop])); }
  break;
case 283:
#line 1010 "Parser.y"
  { yyVal = ((AstNode)yyVals[0+yyTop]);				}
  break;
case 284:
#line 1011 "Parser.y"
  { yyVal = AddList(((AstNode)yyVals[-2+yyTop]), ((AstNode)yyVals[0+yyTop])); }
  break;
case 285:
#line 1014 "Parser.y"
  { yyVal = new LocalVariablesDeclaration(((Expression)yyVals[-2+yyTop]), (VariableDeclaration)((AstNode)yyVals[-1+yyTop]), ((Expression)yyVals[-2+yyTop]).GetPosition()); }
  break;
case 286:
#line 1017 "Parser.y"
  { yyVal = new LockStatement(((Expression)yyVals[-2+yyTop]), ((AstNode)yyVals[0+yyTop]), ((TokenPosition)yyVals[-4+yyTop])); }
  break;
case 287:
#line 1020 "Parser.y"
  { yyVal = new DeleteStatement(((Expression)yyVals[-1+yyTop]), ((TokenPosition)yyVals[-2+yyTop])); }
  break;
case 288:
#line 1021 "Parser.y"
  { yyVal = new DeleteRawArrayStatement(((Expression)yyVals[-1+yyTop]), ((TokenPosition)yyVals[-4+yyTop])); }
  break;
case 289:
#line 1024 "Parser.y"
  { yyVal = new ThrowStatement(((Expression)yyVals[-1+yyTop]), ((TokenPosition)yyVals[-2+yyTop])); }
  break;
case 290:
  case_290();
  break;
case 291:
#line 1034 "Parser.y"
  { yyVal = new FixedVariableDecl((string)((TokenValue)yyVals[-2+yyTop]).GetValue(), ((Expression)yyVals[0+yyTop]), ((TokenValue)yyVals[-2+yyTop]));}
  break;
case 292:
#line 1037 "Parser.y"
  { yyVal = ((AstNode)yyVals[0+yyTop]); }
  break;
case 293:
#line 1038 "Parser.y"
  { yyVal = AddList(((AstNode)yyVals[-2+yyTop]), ((AstNode)yyVals[0+yyTop])); }
  break;
case 294:
#line 1042 "Parser.y"
  { yyVal = new FixedStatement(((Expression)yyVals[-3+yyTop]), ((AstNode)yyVals[-2+yyTop]), ((AstNode)yyVals[0+yyTop]), ((TokenPosition)yyVals[-5+yyTop])); }
  break;
case 295:
#line 1045 "Parser.y"
  { yyVal = new NullStatement(((TokenPosition)yyVals[0+yyTop])); }
  break;
case 296:
#line 1046 "Parser.y"
  { yyVal = ((AstNode)yyVals[0+yyTop]); }
  break;
case 297:
#line 1047 "Parser.y"
  { yyVal = ((AstNode)yyVals[0+yyTop]); }
  break;
case 298:
#line 1048 "Parser.y"
  { yyVal = ((AstNode)yyVals[0+yyTop]); }
  break;
case 299:
#line 1049 "Parser.y"
  { yyVal = ((AstNode)yyVals[0+yyTop]);}
  break;
case 300:
#line 1050 "Parser.y"
  { yyVal = ((AstNode)yyVals[0+yyTop]); }
  break;
case 301:
#line 1051 "Parser.y"
  { yyVal = ((AstNode)yyVals[0+yyTop]); }
  break;
case 302:
#line 1052 "Parser.y"
  { yyVal = ((AstNode)yyVals[0+yyTop]); }
  break;
case 303:
#line 1053 "Parser.y"
  { yyVal = ((AstNode)yyVals[0+yyTop]); }
  break;
case 304:
#line 1054 "Parser.y"
  { yyVal = ((AstNode)yyVals[0+yyTop]); }
  break;
case 305:
#line 1055 "Parser.y"
  { yyVal = ((AstNode)yyVals[0+yyTop]); }
  break;
case 306:
#line 1056 "Parser.y"
  { yyVal = ((AstNode)yyVals[0+yyTop]); }
  break;
case 307:
#line 1057 "Parser.y"
  { yyVal = ((AstNode)yyVals[0+yyTop]); }
  break;
case 308:
#line 1058 "Parser.y"
  { yyVal = ((AstNode)yyVals[0+yyTop]); }
  break;
case 309:
#line 1059 "Parser.y"
  { yyVal = ((AstNode)yyVals[0+yyTop]); }
  break;
case 310:
#line 1060 "Parser.y"
  { yyVal = ((AstNode)yyVals[0+yyTop]); }
  break;
case 311:
#line 1061 "Parser.y"
  { yyVal = ((AstNode)yyVals[0+yyTop]); }
  break;
case 312:
#line 1062 "Parser.y"
  { yyVal = ((AstNode)yyVals[0+yyTop]); }
  break;
case 313:
#line 1063 "Parser.y"
  { yyVal = ((AstNode)yyVals[0+yyTop]); }
  break;
case 314:
#line 1064 "Parser.y"
  { yyVal = ((AstNode)yyVals[0+yyTop]); }
  break;
case 315:
#line 1065 "Parser.y"
  { yyVal = ((AstNode)yyVals[0+yyTop]); }
  break;
case 316:
#line 1066 "Parser.y"
  { yyVal = ((AstNode)yyVals[0+yyTop]); }
  break;
case 317:
#line 1067 "Parser.y"
  { yyVal = ((AstNode)yyVals[0+yyTop]); }
  break;
case 318:
#line 1068 "Parser.y"
  { yyVal = ((AstNode)yyVals[0+yyTop]); }
  break;
case 319:
#line 1069 "Parser.y"
  { yyVal = ((AstNode)yyVals[0+yyTop]); }
  break;
case 320:
#line 1072 "Parser.y"
  { yyVal = null; }
  break;
case 321:
#line 1073 "Parser.y"
  { yyVal = AddList(((AstNode)yyVals[-1+yyTop]), ((AstNode)yyVals[0+yyTop])); }
  break;
case 322:
  case_322();
  break;
case 323:
#line 1091 "Parser.y"
  { yyVal = new AttributeArgument(((Expression)yyVals[0+yyTop]), (string)((TokenValue)yyVals[-2+yyTop]).GetValue(), ((TokenValue)yyVals[-2+yyTop])); }
  break;
case 324:
#line 1092 "Parser.y"
  { yyVal = new AttributeArgument(((Expression)yyVals[0+yyTop]), null, ((Expression)yyVals[0+yyTop]).GetPosition()); }
  break;
case 325:
#line 1095 "Parser.y"
  { yyVal = ((AstNode)yyVals[0+yyTop]); }
  break;
case 326:
#line 1096 "Parser.y"
  { yyVal = AddList(((AstNode)yyVals[-2+yyTop]), ((AstNode)yyVals[0+yyTop])); }
  break;
case 327:
#line 1099 "Parser.y"
  { yyVal = null; }
  break;
case 328:
#line 1100 "Parser.y"
  { yyVal = ((AstNode)yyVals[0+yyTop]);   }
  break;
case 329:
#line 1102 "Parser.y"
  { yyVal = new AttributeInstance(((Expression)yyVals[-3+yyTop]), (AttributeArgument)((AstNode)yyVals[-1+yyTop]), ((Expression)yyVals[-3+yyTop]).GetPosition());   }
  break;
case 330:
#line 1103 "Parser.y"
  { yyVal = new AttributeInstance(((Expression)yyVals[0+yyTop]), null, ((Expression)yyVals[0+yyTop]).GetPosition()); }
  break;
case 331:
#line 1106 "Parser.y"
  { yyVal = ((AstNode)yyVals[0+yyTop]); }
  break;
case 332:
#line 1107 "Parser.y"
  { yyVal = AddList(((AstNode)yyVals[-2+yyTop]), ((AstNode)yyVals[0+yyTop])); }
  break;
case 333:
#line 1110 "Parser.y"
  { yyVal = new ArgTypeAndFlags(((Expression)yyVals[0+yyTop])); }
  break;
case 334:
#line 1111 "Parser.y"
  { yyVal = new ArgTypeAndFlags(new MakeReference(((Expression)yyVals[-1+yyTop]), ReferenceFlow.In,    true,  ((TokenPosition)yyVals[0+yyTop])), ((Expression)yyVals[-1+yyTop]).GetPosition()); }
  break;
case 335:
#line 1112 "Parser.y"
  { yyVal = new ArgTypeAndFlags(new MakeReference(((Expression)yyVals[0+yyTop]), ReferenceFlow.InOut, false, ((TokenValue)yyVals[-1+yyTop])), ((TokenValue)yyVals[-1+yyTop])); }
  break;
case 336:
#line 1113 "Parser.y"
  { yyVal = new ArgTypeAndFlags(new MakeReference(((Expression)yyVals[-1+yyTop]), ReferenceFlow.InOut, true,  ((TokenValue)yyVals[-2+yyTop])), ((TokenValue)yyVals[-2+yyTop])); }
  break;
case 337:
#line 1114 "Parser.y"
  { yyVal = new ArgTypeAndFlags(new MakeReference(((Expression)yyVals[0+yyTop]), ReferenceFlow.Out,   false, ((TokenValue)yyVals[-1+yyTop])), ((TokenValue)yyVals[-1+yyTop])); }
  break;
case 338:
#line 1115 "Parser.y"
  { yyVal = new ArgTypeAndFlags(new MakeReference(((Expression)yyVals[-1+yyTop]), ReferenceFlow.Out,   true,  ((TokenValue)yyVals[-2+yyTop])), ((TokenValue)yyVals[-2+yyTop])); }
  break;
case 339:
#line 1116 "Parser.y"
  { yyVal = new ArgTypeAndFlags(((Expression)yyVals[0+yyTop]), ((TokenValue)yyVals[-1+yyTop]), true); }
  break;
case 340:
  case_340();
  break;
case 341:
#line 1127 "Parser.y"
  { yyVal = new GenericParameter((string)((TokenValue)yyVals[0+yyTop]).GetValue(), ((TokenValue)yyVals[0+yyTop])); }
  break;
case 342:
#line 1130 "Parser.y"
  { yyVal = ((GenericParameter)yyVals[0+yyTop]); }
  break;
case 343:
#line 1131 "Parser.y"
  { yyVal = (GenericParameter)AddList(((GenericParameter)yyVals[-2+yyTop]), ((GenericParameter)yyVals[0+yyTop])); }
  break;
case 344:
#line 1134 "Parser.y"
  { yyVal = new ConstraintChain(false, false, ((Expression)yyVals[0+yyTop])); }
  break;
case 345:
#line 1135 "Parser.y"
  { yyVal = new ConstraintChain(true, false, null); }
  break;
case 346:
#line 1136 "Parser.y"
  { yyVal = new ConstraintChain(false, true, null); }
  break;
case 347:
#line 1139 "Parser.y"
  { yyVal = ((ConstraintChain)yyVals[0+yyTop]); }
  break;
case 348:
  case_348();
  break;
case 349:
  case_349();
  break;
case 350:
#line 1157 "Parser.y"
  { yyVal = null; }
  break;
case 351:
#line 1158 "Parser.y"
  { yyVal = AddList(((GenericConstraint)yyVals[-1+yyTop]), ((GenericConstraint)yyVals[0+yyTop])); }
  break;
case 352:
#line 1161 "Parser.y"
  { yyVal = null; }
  break;
case 353:
#line 1162 "Parser.y"
  { yyVal = new GenericSignature(((GenericParameter)yyVals[-1+yyTop]), null, ((TokenPosition)yyVals[-2+yyTop])); }
  break;
case 354:
#line 1165 "Parser.y"
  { yyVal = ((Expression)yyVals[0+yyTop]); }
  break;
case 355:
#line 1166 "Parser.y"
  { yyVal = AddList(((AstNode)yyVals[-2+yyTop]), ((Expression)yyVals[0+yyTop])); }
  break;
case 356:
#line 1170 "Parser.y"
  { yyVal = new FunctionArgument(((ArgTypeAndFlags)yyVals[0+yyTop]).type, ((ArgTypeAndFlags)yyVals[0+yyTop]).isParams, "", ((ArgTypeAndFlags)yyVals[0+yyTop])); }
  break;
case 357:
#line 1171 "Parser.y"
  { yyVal = new FunctionArgument(((ArgTypeAndFlags)yyVals[-1+yyTop]).type, ((ArgTypeAndFlags)yyVals[-1+yyTop]).isParams, (string)((TokenValue)yyVals[0+yyTop]).GetValue(), ((ArgTypeAndFlags)yyVals[-1+yyTop])); }
  break;
case 358:
#line 1174 "Parser.y"
  { yyVal = ((AstNode)yyVals[0+yyTop]);              }
  break;
case 359:
#line 1175 "Parser.y"
  { yyVal = AddList(((AstNode)yyVals[-2+yyTop]), ((AstNode)yyVals[0+yyTop])); }
  break;
case 360:
#line 1178 "Parser.y"
  { yyVal = null; }
  break;
case 361:
#line 1179 "Parser.y"
  { yyVal = ((AstNode)yyVals[0+yyTop]);   }
  break;
case 362:
#line 1182 "Parser.y"
  { yyVal = "Op_Add"; }
  break;
case 363:
#line 1183 "Parser.y"
  { yyVal = "Op_Sub"; }
  break;
case 364:
#line 1184 "Parser.y"
  { yyVal = "Op_Mul"; }
  break;
case 365:
#line 1185 "Parser.y"
  { yyVal = "Op_Div"; }
  break;
case 366:
#line 1186 "Parser.y"
  { yyVal = "Op_Mod"; }
  break;
case 367:
#line 1187 "Parser.y"
  { yyVal = "Op_Lt";  }
  break;
case 368:
#line 1188 "Parser.y"
  { yyVal = "Op_Gt";  }
  break;
case 369:
#line 1189 "Parser.y"
  { yyVal = "Op_Leq"; }
  break;
case 370:
#line 1190 "Parser.y"
  { yyVal = "Op_Geq"; }
  break;
case 371:
#line 1191 "Parser.y"
  { yyVal = "Op_Eq";  }
  break;
case 372:
#line 1192 "Parser.y"
  { yyVal = "Op_Neq"; }
  break;
case 373:
#line 1193 "Parser.y"
  { yyVal = "Op_And"; }
  break;
case 374:
#line 1194 "Parser.y"
  { yyVal = "Op_Xor"; }
  break;
case 375:
#line 1195 "Parser.y"
  { yyVal = "Op_Or";  }
  break;
case 376:
#line 1196 "Parser.y"
  { yyVal = "Op_Not"; }
  break;
case 377:
#line 1199 "Parser.y"
  { yyVal = (string)((TokenValue)yyVals[0+yyTop]).GetValue(); }
  break;
case 378:
  case_378();
  break;
case 379:
  case_379();
  break;
case 380:
  case_380();
  break;
case 381:
  case_381();
  break;
case 382:
#line 1239 "Parser.y"
  { yyVal = new FunctionDefinition((FunctionPrototype)((AstNode)yyVals[-1+yyTop]), ((AstNode)yyVals[0+yyTop]), ((AstNode)yyVals[-1+yyTop]).GetPosition()); }
  break;
case 383:
#line 1242 "Parser.y"
  { yyVal = null; }
  break;
case 384:
#line 1243 "Parser.y"
  { yyVal = new ConstructorInitializer(true, ((Expression)yyVals[-1+yyTop]), ((TokenPosition)yyVals[-3+yyTop])); }
  break;
case 385:
#line 1244 "Parser.y"
  { yyVal = new ConstructorInitializer(false, ((Expression)yyVals[-1+yyTop]), ((TokenPosition)yyVals[-3+yyTop])); }
  break;
case 386:
  case_386();
  break;
case 387:
  case_387();
  break;
case 388:
  case_388();
  break;
case 389:
  case_389();
  break;
case 390:
#line 1291 "Parser.y"
  { yyVal = new FunctionDefinition((FunctionPrototype)((AstNode)yyVals[-1+yyTop]), ((AstNode)yyVals[0+yyTop]), ((AstNode)yyVals[-1+yyTop]).GetPosition()); }
  break;
case 391:
  case_391();
  break;
case 392:
#line 1305 "Parser.y"
  { yyVal = new FunctionDefinition((FunctionPrototype)((AstNode)yyVals[-1+yyTop]), null, ((AstNode)yyVals[-1+yyTop]).GetPosition());}
  break;
case 393:
#line 1308 "Parser.y"
  { yyVal = new MemberFlagsAndMask(MemberFlags.Public, MemberFlags.VisibilityMask, ((TokenPosition)yyVals[0+yyTop])); }
  break;
case 394:
#line 1309 "Parser.y"
  { yyVal = new MemberFlagsAndMask(MemberFlags.Internal, MemberFlags.VisibilityMask, ((TokenPosition)yyVals[0+yyTop])); }
  break;
case 395:
#line 1310 "Parser.y"
  { yyVal = new MemberFlagsAndMask(MemberFlags.Protected, MemberFlags.VisibilityMask, ((TokenPosition)yyVals[0+yyTop])); }
  break;
case 396:
#line 1311 "Parser.y"
  { yyVal = new MemberFlagsAndMask(MemberFlags.ProtectedInternal, MemberFlags.VisibilityMask, ((TokenPosition)yyVals[-1+yyTop])); }
  break;
case 397:
#line 1312 "Parser.y"
  { yyVal = new MemberFlagsAndMask(MemberFlags.Private, MemberFlags.VisibilityMask, ((TokenPosition)yyVals[0+yyTop])); }
  break;
case 398:
#line 1315 "Parser.y"
  { yyVal = new MemberFlagsAndMask(MemberFlags.Cdecl,   MemberFlags.LanguageMask, ((TokenPosition)yyVals[0+yyTop])); }
  break;
case 399:
#line 1316 "Parser.y"
  { yyVal = new MemberFlagsAndMask(MemberFlags.StdCall, MemberFlags.LanguageMask, ((TokenPosition)yyVals[0+yyTop])); }
  break;
case 400:
#line 1317 "Parser.y"
  { yyVal = new MemberFlagsAndMask(MemberFlags.ApiCall, MemberFlags.LanguageMask, ((TokenPosition)yyVals[0+yyTop])); }
  break;
case 401:
#line 1318 "Parser.y"
  { yyVal = new MemberFlagsAndMask(MemberFlags.Kernel,  MemberFlags.LanguageMask, ((TokenPosition)yyVals[0+yyTop])); }
  break;
case 402:
#line 1321 "Parser.y"
  { yyVal = new MemberFlagsAndMask(MemberFlags.Static, MemberFlags.InstanceMask, ((TokenPosition)yyVals[0+yyTop]));   }
  break;
case 403:
#line 1322 "Parser.y"
  { yyVal = new MemberFlagsAndMask(MemberFlags.Virtual, MemberFlags.InstanceMask, ((TokenPosition)yyVals[0+yyTop]));  }
  break;
case 404:
#line 1323 "Parser.y"
  { yyVal = new MemberFlagsAndMask(MemberFlags.Override, MemberFlags.InstanceMask, ((TokenPosition)yyVals[0+yyTop])); }
  break;
case 405:
#line 1324 "Parser.y"
  { yyVal = new MemberFlagsAndMask(MemberFlags.Abstract, MemberFlags.InstanceMask, ((TokenPosition)yyVals[0+yyTop])); }
  break;
case 406:
#line 1327 "Parser.y"
  { yyVal = new MemberFlagsAndMask(MemberFlags.External, MemberFlags.InstanceMask, ((TokenPosition)yyVals[0+yyTop])); }
  break;
case 407:
#line 1330 "Parser.y"
  { yyVal = new MemberFlagsAndMask(MemberFlags.ReadOnly, MemberFlags.AccessMask, ((TokenPosition)yyVals[0+yyTop])); }
  break;
case 408:
#line 1333 "Parser.y"
  { yyVal = new MemberFlagsAndMask(MemberFlags.Unsafe, MemberFlags.SecurityMask, ((TokenPosition)yyVals[0+yyTop])); }
  break;
case 409:
#line 1336 "Parser.y"
  { yyVal = new MemberFlagsAndMask(MemberFlags.Partial, MemberFlags.ImplFlagMask, ((TokenPosition)yyVals[0+yyTop])); }
  break;
case 410:
#line 1339 "Parser.y"
  { yyVal = new MemberFlagsAndMask(MemberFlags.Sealed, MemberFlags.InheritanceMask, ((TokenPosition)yyVals[0+yyTop])); }
  break;
case 411:
#line 1342 "Parser.y"
  { yyVal = ((MemberFlagsAndMask)yyVals[0+yyTop]); }
  break;
case 412:
#line 1343 "Parser.y"
  { yyVal = ((MemberFlagsAndMask)yyVals[0+yyTop]); }
  break;
case 413:
#line 1344 "Parser.y"
  { yyVal = ((MemberFlagsAndMask)yyVals[0+yyTop]); }
  break;
case 414:
#line 1345 "Parser.y"
  { yyVal = ((MemberFlagsAndMask)yyVals[0+yyTop]); }
  break;
case 415:
#line 1346 "Parser.y"
  { yyVal = ((MemberFlagsAndMask)yyVals[0+yyTop]); }
  break;
case 416:
#line 1347 "Parser.y"
  { yyVal = ((MemberFlagsAndMask)yyVals[0+yyTop]); }
  break;
case 417:
#line 1348 "Parser.y"
  { yyVal = ((MemberFlagsAndMask)yyVals[0+yyTop]); }
  break;
case 418:
#line 1349 "Parser.y"
  { yyVal = ((MemberFlagsAndMask)yyVals[0+yyTop]); }
  break;
case 419:
#line 1352 "Parser.y"
  { yyVal = ((MemberFlagsAndMask)yyVals[0+yyTop]); }
  break;
case 420:
  case_420();
  break;
case 421:
#line 1361 "Parser.y"
  { yyVal = MemberFlags.Default; }
  break;
case 422:
#line 1362 "Parser.y"
  { yyVal = ((MemberFlagsAndMask)yyVals[0+yyTop]).flags; }
  break;
case 423:
  case_423();
  break;
case 424:
#line 1373 "Parser.y"
  { yyVal = ((MemberFlags)yyVals[0+yyTop]); }
  break;
case 425:
#line 1376 "Parser.y"
  { yyVal = new FieldDeclaration((string)((TokenValue)yyVals[-2+yyTop]).GetValue(), ((Expression)yyVals[0+yyTop]), ((TokenValue)yyVals[-2+yyTop])); }
  break;
case 426:
#line 1377 "Parser.y"
  { yyVal = new FieldDeclaration((string)((TokenValue)yyVals[0+yyTop]).GetValue(), null, ((TokenValue)yyVals[0+yyTop])); }
  break;
case 427:
#line 1380 "Parser.y"
  { yyVal = ((AstNode)yyVals[0+yyTop]); }
  break;
case 428:
#line 1381 "Parser.y"
  { yyVal = AddList(((AstNode)yyVals[-2+yyTop]), ((AstNode)yyVals[0+yyTop])); }
  break;
case 429:
#line 1384 "Parser.y"
  { yyVal = new FieldDefinition(((MemberFlags)yyVals[-3+yyTop]), ((Expression)yyVals[-2+yyTop]), (FieldDeclaration)((AstNode)yyVals[-1+yyTop]), ((Expression)yyVals[-2+yyTop]).GetPosition()); }
  break;
case 430:
#line 1387 "Parser.y"
  { yyVal = MemberFlags.ImplicitVis; }
  break;
case 431:
#line 1388 "Parser.y"
  { yyVal = ((MemberFlagsAndMask)yyVals[0+yyTop]); }
  break;
case 432:
  case_432();
  break;
case 433:
  case_433();
  break;
case 434:
#line 1413 "Parser.y"
  { yyVal = ((AstNode)yyVals[0+yyTop]); }
  break;
case 435:
#line 1414 "Parser.y"
  { yyVal = AddList(((AstNode)yyVals[-1+yyTop]), ((AstNode)yyVals[0+yyTop])); }
  break;
case 436:
#line 1417 "Parser.y"
  { yyVal = new FunctionArgument(((Expression)yyVals[-1+yyTop]), (string)((TokenValue)yyVals[0+yyTop]).GetValue(), ((Expression)yyVals[-1+yyTop]).GetPosition()); }
  break;
case 437:
#line 1420 "Parser.y"
  { yyVal = ((AstNode)yyVals[0+yyTop]); }
  break;
case 438:
#line 1421 "Parser.y"
  { yyVal = AddList(((AstNode)yyVals[-2+yyTop]), ((AstNode)yyVals[0+yyTop]));}
  break;
case 439:
  case_439();
  break;
case 440:
  case_440();
  break;
case 441:
#line 1440 "Parser.y"
  { yyVal = new PropertyDefinition(((MemberFlags)yyVals[-8+yyTop]), ((Expression)yyVals[-7+yyTop]), "this", ((AstNode)yyVals[-4+yyTop]), ((AstNode)yyVals[-1+yyTop]), ((Expression)yyVals[-7+yyTop]).GetPosition()); }
  break;
case 442:
#line 1444 "Parser.y"
  { yyVal = new GetAccessorDefinition(((MemberFlags)yyVals[-2+yyTop]), null, ((TokenValue)yyVals[-1+yyTop]));}
  break;
case 443:
  case_443();
  break;
case 444:
#line 1456 "Parser.y"
  { yyVal = ((AstNode)yyVals[0+yyTop]); }
  break;
case 445:
#line 1457 "Parser.y"
  { yyVal = AddList(((AstNode)yyVals[-1+yyTop]), ((AstNode)yyVals[0+yyTop])); }
  break;
case 446:
#line 1461 "Parser.y"
  { yyVal = new PropertyDefinition(MemberFlags.InterfaceMember, ((Expression)yyVals[-4+yyTop]), (string)((TokenValue)yyVals[-3+yyTop]).GetValue(), null, ((AstNode)yyVals[-1+yyTop]), ((Expression)yyVals[-4+yyTop]).GetPosition()); }
  break;
case 447:
#line 1463 "Parser.y"
  { yyVal = new PropertyDefinition(MemberFlags.InterfaceMember, ((Expression)yyVals[-7+yyTop]), "this", ((AstNode)yyVals[-4+yyTop]), ((AstNode)yyVals[-1+yyTop]), ((Expression)yyVals[-7+yyTop]).GetPosition()); }
  break;
case 448:
#line 1466 "Parser.y"
  { yyVal = new EventAccessorDefinition(((MemberFlags)yyVals[-2+yyTop]), (string)((TokenValue)yyVals[-1+yyTop]).GetValue(), ((AstNode)yyVals[0+yyTop]), ((TokenValue)yyVals[-1+yyTop])); }
  break;
case 449:
#line 1467 "Parser.y"
  { yyVal = new EventAccessorDefinition(((MemberFlags)yyVals[-2+yyTop]), (string)((TokenValue)yyVals[-1+yyTop]).GetValue(), null, ((TokenValue)yyVals[-1+yyTop]));}
  break;
case 450:
#line 1470 "Parser.y"
  { yyVal = ((AstNode)yyVals[0+yyTop]); }
  break;
case 451:
#line 1471 "Parser.y"
  { yyVal = AddList(((AstNode)yyVals[-1+yyTop]), ((AstNode)yyVals[0+yyTop])); }
  break;
case 452:
  case_452();
  break;
case 453:
#line 1484 "Parser.y"
  {
                    yyVal = new EventDefinition(((MemberFlags)yyVals[-4+yyTop]), ((Expression)yyVals[-2+yyTop]), (string)((TokenValue)yyVals[-1+yyTop]).GetValue(), null, ((TokenPosition)yyVals[-3+yyTop]));
                  }
  break;
case 454:
#line 1487 "Parser.y"
  { yyVal = new EventAccessorDefinition(((MemberFlags)yyVals[-2+yyTop]), (string)((TokenValue)yyVals[-1+yyTop]).GetValue(), null, ((TokenValue)yyVals[-1+yyTop]));}
  break;
case 455:
#line 1490 "Parser.y"
  { yyVal = ((AstNode)yyVals[0+yyTop]); }
  break;
case 456:
#line 1491 "Parser.y"
  { yyVal = AddList(((AstNode)yyVals[-1+yyTop]), ((AstNode)yyVals[0+yyTop])); }
  break;
case 457:
  case_457();
  break;
case 458:
#line 1504 "Parser.y"
  {
                    yyVal = new EventDefinition(MemberFlags.InterfaceMember, ((Expression)yyVals[-2+yyTop]), (string)((TokenValue)yyVals[-1+yyTop]).GetValue(), null, ((TokenPosition)yyVals[-3+yyTop]));
                  }
  break;
case 459:
#line 1507 "Parser.y"
  { yyVal = ((AstNode)yyVals[-1+yyTop]); }
  break;
case 460:
#line 1508 "Parser.y"
  { yyVal = ((AstNode)yyVals[0+yyTop]); }
  break;
case 461:
#line 1509 "Parser.y"
  { yyVal = ((AstNode)yyVals[0+yyTop]); }
  break;
case 462:
#line 1510 "Parser.y"
  { yyVal = ((AstNode)yyVals[0+yyTop]); }
  break;
case 463:
#line 1511 "Parser.y"
  { yyVal = ((AstNode)yyVals[0+yyTop]); }
  break;
case 464:
#line 1512 "Parser.y"
  { yyVal = ((AstNode)yyVals[0+yyTop]); }
  break;
case 465:
#line 1513 "Parser.y"
  { yyVal = ((AstNode)yyVals[0+yyTop]); }
  break;
case 466:
#line 1514 "Parser.y"
  { yyVal = ((AstNode)yyVals[0+yyTop]); }
  break;
case 467:
#line 1515 "Parser.y"
  { yyVal = ((AstNode)yyVals[0+yyTop]); }
  break;
case 468:
#line 1516 "Parser.y"
  { yyVal = ((AstNode)yyVals[0+yyTop]); }
  break;
case 469:
#line 1517 "Parser.y"
  { yyVal = ((AstNode)yyVals[0+yyTop]); }
  break;
case 470:
#line 1518 "Parser.y"
  { yyVal = null; }
  break;
case 471:
#line 1521 "Parser.y"
  { ((AstNode)yyVals[0+yyTop]).SetAttributes(((AstNode)yyVals[-2+yyTop])); yyVal = ((AstNode)yyVals[0+yyTop]);}
  break;
case 472:
#line 1522 "Parser.y"
  { yyVal = ((AstNode)yyVals[0+yyTop]); }
  break;
case 473:
#line 1525 "Parser.y"
  { yyVal = null;			}
  break;
case 474:
#line 1526 "Parser.y"
  { yyVal = AddList(((AstNode)yyVals[-1+yyTop]), ((AstNode)yyVals[0+yyTop])); }
  break;
case 475:
#line 1529 "Parser.y"
  { yyVal = ((AstNode)yyVals[0+yyTop]); }
  break;
case 476:
#line 1530 "Parser.y"
  { yyVal = ((AstNode)yyVals[0+yyTop]); }
  break;
case 477:
#line 1531 "Parser.y"
  { yyVal = ((AstNode)yyVals[0+yyTop]); }
  break;
case 478:
#line 1534 "Parser.y"
  { yyVal = null; }
  break;
case 479:
#line 1535 "Parser.y"
  { yyVal = AddList(((AstNode)yyVals[-1+yyTop]), ((AstNode)yyVals[0+yyTop])); }
  break;
case 480:
#line 1538 "Parser.y"
  { yyVal = ((Expression)yyVals[0+yyTop]);				}
  break;
case 481:
#line 1539 "Parser.y"
  { yyVal = AddList(((AstNode)yyVals[-2+yyTop]), ((Expression)yyVals[0+yyTop])); }
  break;
case 482:
#line 1542 "Parser.y"
  { yyVal = null; }
  break;
case 483:
#line 1543 "Parser.y"
  { yyVal = ((AstNode)yyVals[0+yyTop]);	 }
  break;
case 484:
  case_484();
  break;
case 485:
  case_485();
  break;
case 486:
  case_486();
  break;
case 487:
  case_487();
  break;
case 488:
#line 1584 "Parser.y"
  { yyVal = new EnumConstantDefinition((string)((TokenValue)yyVals[0+yyTop]).GetValue(), null, ((TokenValue)yyVals[0+yyTop])); }
  break;
case 489:
#line 1585 "Parser.y"
  { yyVal = new EnumConstantDefinition((string)((TokenValue)yyVals[-2+yyTop]).GetValue(), ((Expression)yyVals[0+yyTop]), ((TokenValue)yyVals[-2+yyTop]));   }
  break;
case 490:
#line 1588 "Parser.y"
  { yyVal = null; }
  break;
case 491:
#line 1589 "Parser.y"
  { yyVal = ((AstNode)yyVals[0+yyTop]); }
  break;
case 492:
#line 1590 "Parser.y"
  { yyVal = AddList(((AstNode)yyVals[-2+yyTop]), ((AstNode)yyVals[0+yyTop])); }
  break;
case 493:
#line 1591 "Parser.y"
  { yyVal = ((AstNode)yyVals[-1+yyTop]); }
  break;
case 494:
#line 1594 "Parser.y"
  { yyVal = null; }
  break;
case 495:
#line 1595 "Parser.y"
  { yyVal = ((Expression)yyVals[0+yyTop]); }
  break;
case 496:
#line 1601 "Parser.y"
  {
                    yyVal = new EnumDefinition(((MemberFlags)yyVals[-6+yyTop]), (string)((TokenValue)yyVals[-4+yyTop]).GetValue(), ((AstNode)yyVals[-1+yyTop]), ((Expression)yyVals[-3+yyTop]), ((TokenPosition)yyVals[-5+yyTop]));
               }
  break;
case 497:
  case_497();
  break;
case 498:
#line 1613 "Parser.y"
  { yyVal = new FieldDeclaration((string)((TokenValue)yyVals[-2+yyTop]).GetValue(), ((Expression)yyVals[0+yyTop]), ((TokenValue)yyVals[-2+yyTop])); }
  break;
case 499:
#line 1614 "Parser.y"
  { yyVal = new FieldDeclaration((string)((TokenValue)yyVals[0+yyTop]).GetValue(), null, ((TokenValue)yyVals[0+yyTop])); }
  break;
case 500:
#line 1617 "Parser.y"
  { yyVal = ((AstNode)yyVals[0+yyTop]); }
  break;
case 501:
#line 1618 "Parser.y"
  { yyVal = AddList(((AstNode)yyVals[-2+yyTop]), ((AstNode)yyVals[0+yyTop])); }
  break;
case 502:
#line 1621 "Parser.y"
  { yyVal = new TypedefDefinition(((MemberFlags)yyVals[-4+yyTop]), ((Expression)yyVals[-2+yyTop]), (string)((TokenValue)yyVals[-1+yyTop]).GetValue(), ((TokenPosition)yyVals[-3+yyTop])); }
  break;
case 503:
#line 1624 "Parser.y"
  { yyVal = new UsingStatement(((Expression)yyVals[-1+yyTop]), ((TokenPosition)yyVals[-2+yyTop])); }
  break;
case 504:
#line 1625 "Parser.y"
  { yyVal = new AliasDeclaration((string)((TokenValue)yyVals[-3+yyTop]).GetValue(), ((Expression)yyVals[-1+yyTop]), ((TokenPosition)yyVals[-4+yyTop])); }
  break;
case 505:
#line 1629 "Parser.y"
  { yyVal = ((AstNode)yyVals[0+yyTop]); }
  break;
case 506:
#line 1630 "Parser.y"
  { yyVal = ((AstNode)yyVals[-1+yyTop]); }
  break;
case 507:
#line 1631 "Parser.y"
  { yyVal = ((AstNode)yyVals[0+yyTop]); }
  break;
case 508:
#line 1632 "Parser.y"
  { yyVal = ((AstNode)yyVals[0+yyTop]); }
  break;
case 509:
#line 1633 "Parser.y"
  { yyVal = ((AstNode)yyVals[0+yyTop]); }
  break;
case 510:
#line 1634 "Parser.y"
  { yyVal = ((AstNode)yyVals[0+yyTop]); }
  break;
case 511:
#line 1635 "Parser.y"
  { yyVal = ((AstNode)yyVals[0+yyTop]); }
  break;
case 512:
#line 1636 "Parser.y"
  { yyVal = ((AstNode)yyVals[0+yyTop]); }
  break;
case 513:
#line 1637 "Parser.y"
  { yyVal = ((AstNode)yyVals[0+yyTop]); }
  break;
case 514:
#line 1638 "Parser.y"
  { yyVal = ((AstNode)yyVals[0+yyTop]); }
  break;
case 515:
#line 1639 "Parser.y"
  { yyVal = ((AstNode)yyVals[0+yyTop]); }
  break;
case 516:
#line 1640 "Parser.y"
  { yyVal = ((AstNode)yyVals[0+yyTop]); }
  break;
case 517:
#line 1641 "Parser.y"
  { yyVal = null; }
  break;
case 518:
#line 1644 "Parser.y"
  { ((AstNode)yyVals[0+yyTop]).SetAttributes(((AstNode)yyVals[-2+yyTop])); yyVal = ((AstNode)yyVals[0+yyTop]); }
  break;
case 519:
#line 1645 "Parser.y"
  { yyVal = ((AstNode)yyVals[0+yyTop]); }
  break;
case 520:
#line 1648 "Parser.y"
  { yyVal = null; }
  break;
case 521:
#line 1649 "Parser.y"
  { yyVal = AddList(((AstNode)yyVals[-1+yyTop]), ((AstNode)yyVals[0+yyTop])); }
  break;
case 522:
#line 1652 "Parser.y"
  { yyVal = (string)((TokenValue)yyVals[0+yyTop]).GetValue(); }
  break;
case 523:
#line 1653 "Parser.y"
  { yyVal = ((string)yyVals[-2+yyTop]) + "." + (string)((TokenValue)yyVals[0+yyTop]).GetValue(); }
  break;
case 524:
#line 1656 "Parser.y"
  {yyVal = new NamespaceDefinition(((string)yyVals[-3+yyTop]), ((AstNode)yyVals[-1+yyTop]), ((TokenPosition)yyVals[-4+yyTop])); }
  break;
case 525:
#line 1659 "Parser.y"
  { yyVal = null;}
  break;
case 526:
#line 1660 "Parser.y"
  { yyVal = AddList(((AstNode)yyVals[-1+yyTop]), ((AstNode)yyVals[0+yyTop])); }
  break;
case 527:
#line 1663 "Parser.y"
  { yyVal = ((AstNode)yyVals[-1+yyTop]); }
  break;
#line default
        }
        yyTop -= yyLen[yyN];
        yyState = yyStates[yyTop];
        int yyM = yyLhs[yyN];
        if (yyState == 0 && yyM == 0) {
//t          if (debug != null) debug.shift(0, yyFinal);
          yyState = yyFinal;
          if (yyToken < 0) {
            yyToken = yyLex.advance() ? yyLex.token() : 0;
//t            if (debug != null)
//t               debug.lex(yyState, yyToken,yyname(yyToken), yyLex.value());
          }
          if (yyToken == 0) {
//t            if (debug != null) debug.accept(yyVal);
            return yyVal;
          }
          goto continue_yyLoop;
        }
        if (((yyN = yyGindex[yyM]) != 0) && ((yyN += yyState) >= 0)
            && (yyN < yyTable.Length) && (yyCheck[yyN] == yyState))
          yyState = yyTable[yyN];
        else
          yyState = yyDgoto[yyM];
//t        if (debug != null) debug.shift(yyStates[yyTop], yyState);
	 goto continue_yyLoop;
      continue_yyDiscarded: ;	// implements the named-loop continue: 'continue yyDiscarded'
      }
    continue_yyLoop: ;		// implements the named-loop continue: 'continue yyLoop'
    }
  }
예제 #13
0
        public override AstNode Visit(FunctionDefinition node)
        {
            // Get the prototype.
            FunctionPrototype prototype = node.GetPrototype();

            // Visit the prototype.
            prototype.Accept(this);

            // Set the node type.
            node.SetNodeType(prototype.GetNodeType());

            // Get and link the function with the definition.
            Function function = prototype.GetFunction();
            node.SetFunction(function);

            // Create finalizers as macros.
            AstNode children = node.GetChildren();
            if(prototype.GetDestructorName() != null && children != null)
            {
                TokenPosition position = node.GetPosition();
                // Get the base finalizer.
                Expression baseFinalizer = new MemberAccess(new BaseExpression(position), "Finalize", position);

                // Invoke it.
                AstNode baseInvoke = new CallExpression(baseFinalizer, null, position);
                FinallyStatement finalStmnt = new FinallyStatement(baseInvoke, position);

                // Try the finalizer, always invoke the parent finalizer.
                TryStatement tryStmnt = new TryStatement(children, null, finalStmnt, position);
                node.SetChildren(tryStmnt);
            }

            return node;
        }
예제 #14
0
 public virtual AstNode Visit(FunctionDefinition node)
 {
     throw new System.NotImplementedException();
 }
예제 #15
0
        private void CreateGenerator_Dispose(FunctionDefinition node, Function moveNext)
        {
            // Get the generator class.
            Class genClass = node.GeneratorClass;

            // Create the function type.
            FunctionType functionType =
                FunctionType.Create(ChelaType.GetVoidType(),
                    new IChelaType[]{ReferenceType.Create(node.GeneratorClassInstance)}, false);

            // Create the method.
            Method method = new Method("Dispose", MemberFlags.Public, genClass);
            method.SetFunctionType(functionType);
            genClass.AddFunction("Dispose", method);

            // Create the top block.
            BasicBlock top = new BasicBlock(method);
            builder.SetBlock(top);

            // Create the return and dispose blocks.
            BasicBlock justReturn = new BasicBlock(method);
            BasicBlock disposeAndReturn = new BasicBlock(method);

            // Load the current state.
            builder.CreateLoadArg(0);
            builder.CreateDup1();
            builder.CreateDup1();
            builder.CreateLoadField(node.GeneratorState);
            builder.CreateDup1();
            builder.CreateLoadInt32(1);
            builder.CreateCmpEQ();
            builder.CreateBr(justReturn, disposeAndReturn);

            // Dispose and return implementation.
            builder.SetBlock(disposeAndReturn);

            // Increase the state.
            builder.CreateLoadInt32(1);
            builder.CreateAdd();
            builder.CreateStoreField(node.GeneratorState);

            // Call move next.
            builder.CreateCall(moveNext, 1);
            builder.CreateRetVoid();

            // Just return implementation.
            builder.SetBlock(justReturn);
            builder.CreateRetVoid();
        }
예제 #16
0
 public override AstNode Visit(FunctionDefinition node)
 {
     return node;
 }
예제 #17
0
        private void CheckConstructorInit(FunctionDefinition node)
        {
            // Get the prototype.
            FunctionPrototype prototype = node.GetPrototype();

            // Get the constructor initializer.
            ConstructorInitializer ctorInit = prototype.GetConstructorInitializer();

            // Get the function.
            Method function = (Method)prototype.GetFunction();

            // Special check for the implicit constructor.
            if(ctorInit == null)
            {
                CheckDefaultConstructorInit(node, function);
                return;
            }

            // Get the base constructor.
            Structure building = (Structure)function.GetParentScope();
            FunctionGroup ctorGroup;
            if(ctorInit.IsBaseCall())
            {
                Structure baseBuilding = building.GetBase();
                if(baseBuilding == null)
                    Error(node, "cannot invoke base constructor in Object definition.");

                ctorGroup = baseBuilding.GetConstructor();
            }
            else
            {
                ctorGroup = building.GetConstructor();
            }

            // Store the constructor group.
            ctorInit.SetConstructorGroup(ctorGroup);

            // Visit the constructor initializer
            ctorInit.Accept(this);

            // Set the parent constructor.
            function.SetCtorParent((Method)ctorInit.GetConstructor());

            // Make sure the construction invocation is acyclic.
            if(!function.IsCtorLeaf())
                CheckConstructorCycles(node, function);
        }