/*******************************************************************************
 * Copyright (c) 2007 University of Illinois at Urbana-Champaign and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *     UIUC - Initial API and implementation
 *******************************************************************************/
package org.eclipse.photran.internal.core.parser;

import org.eclipse.photran.internal.core.lexer.*;                   import org.eclipse.photran.internal.core.analysis.binding.ScopingNode;                   import org.eclipse.photran.internal.core.SyntaxException;                   import java.io.IOException;

import java.util.AbstractList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.io.ByteArrayOutputStream;
import java.io.PrintStream;


import org.eclipse.photran.internal.core.parser.Parser.ErrorRecoveryInfo;
import org.eclipse.photran.internal.core.parser.Parser.Production;

@SuppressWarnings("all")
final class SemanticActions
{
    public void initialize()
    {
            
    }

    public void deinitialize()
    {
            
    }

    public void onErrorRecovery(ErrorRecoveryInfo errorInfo)
    {
                    for (int i = 0; i < errorInfo.discardedSymbols.size(); i++)
                    {
                        if (errorInfo.discardedSymbols.get(i) instanceof HashMap)
                        {
                            HashMap map = (HashMap)errorInfo.discardedSymbols.get(i);
                            IASTListNode<IASTNode> errorRecoveryList = (IASTListNode<IASTNode>)map.get("errorRecoveryList");
                            errorInfo.<IASTNode>getDiscardedSymbols().set(i, errorRecoveryList);
                            for (IASTNode n : errorRecoveryList)
                                if (n != null)
                                    n.setParent(errorRecoveryList);
                        }
                    }
    }
        public Object handle(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
            switch (productionIndex)
            {
                case Production.EXECUTABLE_PROGRAM_1_INDEX:
                {
                    return handleExecutableProgram1(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.EXECUTABLE_PROGRAM_2_INDEX:
                {
                    return handleExecutableProgram2(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.EMPTY_PROGRAM_3_INDEX:
                {
                    return handleEmptyProgram3(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.EMPTY_PROGRAM_4_INDEX:
                {
                    return handleEmptyProgram4(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.PROGRAM_UNIT_LIST_5_INDEX:
                {
                    return handleProgramUnitList5(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.PROGRAM_UNIT_LIST_6_INDEX:
                {
                    return handleProgramUnitList6(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.PROGRAM_UNIT_7_INDEX:
                {
                    return handleProgramUnit7(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.PROGRAM_UNIT_8_INDEX:
                {
                    return handleProgramUnit8(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.PROGRAM_UNIT_9_INDEX:
                {
                    return handleProgramUnit9(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.PROGRAM_UNIT_10_INDEX:
                {
                    return handleProgramUnit10(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.PROGRAM_UNIT_11_INDEX:
                {
                    return handleProgramUnit11(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.PROGRAM_UNIT_12_INDEX:
                {
                    return handleProgramUnit12(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.MAIN_PROGRAM_13_INDEX:
                {
                    return handleMainProgram13(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.MAIN_PROGRAM_14_INDEX:
                {
                    return handleMainProgram14(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.MAIN_RANGE_15_INDEX:
                {
                    return handleMainRange15(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.MAIN_RANGE_16_INDEX:
                {
                    return handleMainRange16(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.MAIN_RANGE_17_INDEX:
                {
                    return handleMainRange17(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.BODY_18_INDEX:
                {
                    return handleBody18(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.BODY_19_INDEX:
                {
                    return handleBody19(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.BODY_CONSTRUCT_20_INDEX:
                {
                    return handleBodyConstruct20(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.BODY_CONSTRUCT_21_INDEX:
                {
                    return handleBodyConstruct21(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.FUNCTION_SUBPROGRAM_22_INDEX:
                {
                    return handleFunctionSubprogram22(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.FUNCTION_RANGE_23_INDEX:
                {
                    return handleFunctionRange23(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.FUNCTION_RANGE_24_INDEX:
                {
                    return handleFunctionRange24(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.FUNCTION_RANGE_25_INDEX:
                {
                    return handleFunctionRange25(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.SUBROUTINE_SUBPROGRAM_26_INDEX:
                {
                    return handleSubroutineSubprogram26(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.SUBROUTINE_RANGE_27_INDEX:
                {
                    return handleSubroutineRange27(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.SUBROUTINE_RANGE_28_INDEX:
                {
                    return handleSubroutineRange28(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.SUBROUTINE_RANGE_29_INDEX:
                {
                    return handleSubroutineRange29(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.SEPARATE_MODULE_SUBPROGRAM_30_INDEX:
                {
                    return handleSeparateModuleSubprogram30(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.MP_SUBPROGRAM_RANGE_31_INDEX:
                {
                    return handleMpSubprogramRange31(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.MP_SUBPROGRAM_RANGE_32_INDEX:
                {
                    return handleMpSubprogramRange32(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.MP_SUBPROGRAM_RANGE_33_INDEX:
                {
                    return handleMpSubprogramRange33(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.MP_SUBPROGRAM_STMT_34_INDEX:
                {
                    return handleMpSubprogramStmt34(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.END_MP_SUBPROGRAM_STMT_35_INDEX:
                {
                    return handleEndMpSubprogramStmt35(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.END_MP_SUBPROGRAM_STMT_36_INDEX:
                {
                    return handleEndMpSubprogramStmt36(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.END_MP_SUBPROGRAM_STMT_37_INDEX:
                {
                    return handleEndMpSubprogramStmt37(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.END_MP_SUBPROGRAM_STMT_38_INDEX:
                {
                    return handleEndMpSubprogramStmt38(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.END_MP_SUBPROGRAM_STMT_39_INDEX:
                {
                    return handleEndMpSubprogramStmt39(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.MODULE_40_INDEX:
                {
                    return handleModule40(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.MODULE_BLOCK_41_INDEX:
                {
                    return handleModuleBlock41(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.MODULE_BLOCK_42_INDEX:
                {
                    return handleModuleBlock42(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.MODULE_BODY_43_INDEX:
                {
                    return handleModuleBody43(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.MODULE_BODY_44_INDEX:
                {
                    return handleModuleBody44(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.MODULE_BODY_CONSTRUCT_45_INDEX:
                {
                    return handleModuleBodyConstruct45(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.MODULE_BODY_CONSTRUCT_46_INDEX:
                {
                    return handleModuleBodyConstruct46(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.SUBMODULE_47_INDEX:
                {
                    return handleSubmodule47(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.SUBMODULE_BLOCK_48_INDEX:
                {
                    return handleSubmoduleBlock48(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.SUBMODULE_BLOCK_49_INDEX:
                {
                    return handleSubmoduleBlock49(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.SUBMODULE_STMT_50_INDEX:
                {
                    return handleSubmoduleStmt50(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.PARENT_IDENTIFIER_51_INDEX:
                {
                    return handleParentIdentifier51(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.PARENT_IDENTIFIER_52_INDEX:
                {
                    return handleParentIdentifier52(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.END_SUBMODULE_STMT_53_INDEX:
                {
                    return handleEndSubmoduleStmt53(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.END_SUBMODULE_STMT_54_INDEX:
                {
                    return handleEndSubmoduleStmt54(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.END_SUBMODULE_STMT_55_INDEX:
                {
                    return handleEndSubmoduleStmt55(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.END_SUBMODULE_STMT_56_INDEX:
                {
                    return handleEndSubmoduleStmt56(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.END_SUBMODULE_STMT_57_INDEX:
                {
                    return handleEndSubmoduleStmt57(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.BLOCK_DATA_SUBPROGRAM_58_INDEX:
                {
                    return handleBlockDataSubprogram58(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.BLOCK_DATA_SUBPROGRAM_59_INDEX:
                {
                    return handleBlockDataSubprogram59(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.BLOCK_DATA_BODY_60_INDEX:
                {
                    return handleBlockDataBody60(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.BLOCK_DATA_BODY_61_INDEX:
                {
                    return handleBlockDataBody61(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.BLOCK_DATA_BODY_CONSTRUCT_62_INDEX:
                {
                    return handleBlockDataBodyConstruct62(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.SPECIFICATION_PART_CONSTRUCT_63_INDEX:
                {
                    return handleSpecificationPartConstruct63(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.SPECIFICATION_PART_CONSTRUCT_64_INDEX:
                {
                    return handleSpecificationPartConstruct64(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.SPECIFICATION_PART_CONSTRUCT_65_INDEX:
                {
                    return handleSpecificationPartConstruct65(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.SPECIFICATION_PART_CONSTRUCT_66_INDEX:
                {
                    return handleSpecificationPartConstruct66(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.SPECIFICATION_PART_CONSTRUCT_67_INDEX:
                {
                    return handleSpecificationPartConstruct67(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.SPECIFICATION_PART_CONSTRUCT_68_INDEX:
                {
                    return handleSpecificationPartConstruct68(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.SPECIFICATION_PART_CONSTRUCT_69_INDEX:
                {
                    return handleSpecificationPartConstruct69(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.DECLARATION_CONSTRUCT_70_INDEX:
                {
                    return handleDeclarationConstruct70(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.DECLARATION_CONSTRUCT_71_INDEX:
                {
                    return handleDeclarationConstruct71(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.DECLARATION_CONSTRUCT_72_INDEX:
                {
                    return handleDeclarationConstruct72(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.DECLARATION_CONSTRUCT_73_INDEX:
                {
                    return handleDeclarationConstruct73(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.DECLARATION_CONSTRUCT_74_INDEX:
                {
                    return handleDeclarationConstruct74(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.DECLARATION_CONSTRUCT_75_INDEX:
                {
                    return handleDeclarationConstruct75(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.EXECUTION_PART_CONSTRUCT_76_INDEX:
                {
                    return handleExecutionPartConstruct76(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.EXECUTION_PART_CONSTRUCT_77_INDEX:
                {
                    return handleExecutionPartConstruct77(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.EXECUTION_PART_CONSTRUCT_78_INDEX:
                {
                    return handleExecutionPartConstruct78(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.EXECUTION_PART_CONSTRUCT_79_INDEX:
                {
                    return handleExecutionPartConstruct79(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.OBSOLETE_EXECUTION_PART_CONSTRUCT_80_INDEX:
                {
                    return handleObsoleteExecutionPartConstruct80(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.BODY_PLUS_INTERNALS_81_INDEX:
                {
                    return handleBodyPlusInternals81(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.BODY_PLUS_INTERNALS_82_INDEX:
                {
                    return handleBodyPlusInternals82(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.INTERNAL_SUBPROGRAMS_83_INDEX:
                {
                    return handleInternalSubprograms83(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.INTERNAL_SUBPROGRAMS_84_INDEX:
                {
                    return handleInternalSubprograms84(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.INTERNAL_SUBPROGRAM_85_INDEX:
                {
                    return handleInternalSubprogram85(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.INTERNAL_SUBPROGRAM_86_INDEX:
                {
                    return handleInternalSubprogram86(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.MODULE_SUBPROGRAM_PART_CONSTRUCT_87_INDEX:
                {
                    return handleModuleSubprogramPartConstruct87(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.MODULE_SUBPROGRAM_PART_CONSTRUCT_88_INDEX:
                {
                    return handleModuleSubprogramPartConstruct88(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.MODULE_SUBPROGRAM_PART_CONSTRUCT_89_INDEX:
                {
                    return handleModuleSubprogramPartConstruct89(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.MODULE_SUBPROGRAM_90_INDEX:
                {
                    return handleModuleSubprogram90(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.MODULE_SUBPROGRAM_91_INDEX:
                {
                    return handleModuleSubprogram91(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.SPECIFICATION_STMT_92_INDEX:
                {
                    return handleSpecificationStmt92(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.SPECIFICATION_STMT_93_INDEX:
                {
                    return handleSpecificationStmt93(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.SPECIFICATION_STMT_94_INDEX:
                {
                    return handleSpecificationStmt94(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.SPECIFICATION_STMT_95_INDEX:
                {
                    return handleSpecificationStmt95(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.SPECIFICATION_STMT_96_INDEX:
                {
                    return handleSpecificationStmt96(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.SPECIFICATION_STMT_97_INDEX:
                {
                    return handleSpecificationStmt97(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.SPECIFICATION_STMT_98_INDEX:
                {
                    return handleSpecificationStmt98(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.SPECIFICATION_STMT_99_INDEX:
                {
                    return handleSpecificationStmt99(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.SPECIFICATION_STMT_100_INDEX:
                {
                    return handleSpecificationStmt100(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.SPECIFICATION_STMT_101_INDEX:
                {
                    return handleSpecificationStmt101(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.SPECIFICATION_STMT_102_INDEX:
                {
                    return handleSpecificationStmt102(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.SPECIFICATION_STMT_103_INDEX:
                {
                    return handleSpecificationStmt103(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.SPECIFICATION_STMT_104_INDEX:
                {
                    return handleSpecificationStmt104(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.SPECIFICATION_STMT_105_INDEX:
                {
                    return handleSpecificationStmt105(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.SPECIFICATION_STMT_106_INDEX:
                {
                    return handleSpecificationStmt106(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.SPECIFICATION_STMT_107_INDEX:
                {
                    return handleSpecificationStmt107(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.SPECIFICATION_STMT_108_INDEX:
                {
                    return handleSpecificationStmt108(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.SPECIFICATION_STMT_109_INDEX:
                {
                    return handleSpecificationStmt109(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.SPECIFICATION_STMT_110_INDEX:
                {
                    return handleSpecificationStmt110(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.SPECIFICATION_STMT_111_INDEX:
                {
                    return handleSpecificationStmt111(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.SPECIFICATION_STMT_112_INDEX:
                {
                    return handleSpecificationStmt112(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.SPECIFICATION_STMT_113_INDEX:
                {
                    return handleSpecificationStmt113(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.SPECIFICATION_STMT_114_INDEX:
                {
                    return handleSpecificationStmt114(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.UNPROCESSED_INCLUDE_STMT_115_INDEX:
                {
                    return handleUnprocessedIncludeStmt115(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.EXECUTABLE_CONSTRUCT_116_INDEX:
                {
                    return handleExecutableConstruct116(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.EXECUTABLE_CONSTRUCT_117_INDEX:
                {
                    return handleExecutableConstruct117(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.EXECUTABLE_CONSTRUCT_118_INDEX:
                {
                    return handleExecutableConstruct118(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.EXECUTABLE_CONSTRUCT_119_INDEX:
                {
                    return handleExecutableConstruct119(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.EXECUTABLE_CONSTRUCT_120_INDEX:
                {
                    return handleExecutableConstruct120(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.EXECUTABLE_CONSTRUCT_121_INDEX:
                {
                    return handleExecutableConstruct121(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.EXECUTABLE_CONSTRUCT_122_INDEX:
                {
                    return handleExecutableConstruct122(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.EXECUTABLE_CONSTRUCT_123_INDEX:
                {
                    return handleExecutableConstruct123(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.EXECUTABLE_CONSTRUCT_124_INDEX:
                {
                    return handleExecutableConstruct124(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.EXECUTABLE_CONSTRUCT_125_INDEX:
                {
                    return handleExecutableConstruct125(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.EXECUTABLE_CONSTRUCT_126_INDEX:
                {
                    return handleExecutableConstruct126(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ACTION_STMT_127_INDEX:
                {
                    return handleActionStmt127(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ACTION_STMT_128_INDEX:
                {
                    return handleActionStmt128(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ACTION_STMT_129_INDEX:
                {
                    return handleActionStmt129(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ACTION_STMT_130_INDEX:
                {
                    return handleActionStmt130(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ACTION_STMT_131_INDEX:
                {
                    return handleActionStmt131(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ACTION_STMT_132_INDEX:
                {
                    return handleActionStmt132(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ACTION_STMT_133_INDEX:
                {
                    return handleActionStmt133(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ACTION_STMT_134_INDEX:
                {
                    return handleActionStmt134(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ACTION_STMT_135_INDEX:
                {
                    return handleActionStmt135(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ACTION_STMT_136_INDEX:
                {
                    return handleActionStmt136(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ACTION_STMT_137_INDEX:
                {
                    return handleActionStmt137(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ACTION_STMT_138_INDEX:
                {
                    return handleActionStmt138(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ACTION_STMT_139_INDEX:
                {
                    return handleActionStmt139(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ACTION_STMT_140_INDEX:
                {
                    return handleActionStmt140(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ACTION_STMT_141_INDEX:
                {
                    return handleActionStmt141(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ACTION_STMT_142_INDEX:
                {
                    return handleActionStmt142(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ACTION_STMT_143_INDEX:
                {
                    return handleActionStmt143(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ACTION_STMT_144_INDEX:
                {
                    return handleActionStmt144(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ACTION_STMT_145_INDEX:
                {
                    return handleActionStmt145(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ACTION_STMT_146_INDEX:
                {
                    return handleActionStmt146(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ACTION_STMT_147_INDEX:
                {
                    return handleActionStmt147(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ACTION_STMT_148_INDEX:
                {
                    return handleActionStmt148(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ACTION_STMT_149_INDEX:
                {
                    return handleActionStmt149(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ACTION_STMT_150_INDEX:
                {
                    return handleActionStmt150(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ACTION_STMT_151_INDEX:
                {
                    return handleActionStmt151(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ACTION_STMT_152_INDEX:
                {
                    return handleActionStmt152(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ACTION_STMT_153_INDEX:
                {
                    return handleActionStmt153(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ACTION_STMT_154_INDEX:
                {
                    return handleActionStmt154(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ACTION_STMT_155_INDEX:
                {
                    return handleActionStmt155(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ACTION_STMT_156_INDEX:
                {
                    return handleActionStmt156(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ACTION_STMT_157_INDEX:
                {
                    return handleActionStmt157(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ACTION_STMT_158_INDEX:
                {
                    return handleActionStmt158(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ACTION_STMT_159_INDEX:
                {
                    return handleActionStmt159(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ACTION_STMT_160_INDEX:
                {
                    return handleActionStmt160(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ACTION_STMT_161_INDEX:
                {
                    return handleActionStmt161(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.OBSOLETE_ACTION_STMT_162_INDEX:
                {
                    return handleObsoleteActionStmt162(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.OBSOLETE_ACTION_STMT_163_INDEX:
                {
                    return handleObsoleteActionStmt163(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.OBSOLETE_ACTION_STMT_164_INDEX:
                {
                    return handleObsoleteActionStmt164(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.NAME_165_INDEX:
                {
                    return handleName165(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.CONSTANT_166_INDEX:
                {
                    return handleConstant166(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.CONSTANT_167_INDEX:
                {
                    return handleConstant167(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.CONSTANT_168_INDEX:
                {
                    return handleConstant168(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.CONSTANT_169_INDEX:
                {
                    return handleConstant169(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.CONSTANT_170_INDEX:
                {
                    return handleConstant170(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.CONSTANT_171_INDEX:
                {
                    return handleConstant171(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.CONSTANT_172_INDEX:
                {
                    return handleConstant172(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.CONSTANT_173_INDEX:
                {
                    return handleConstant173(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.CONSTANT_174_INDEX:
                {
                    return handleConstant174(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.CONSTANT_175_INDEX:
                {
                    return handleConstant175(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.CONSTANT_176_INDEX:
                {
                    return handleConstant176(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.NAMED_CONSTANT_177_INDEX:
                {
                    return handleNamedConstant177(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.NAMED_CONSTANT_USE_178_INDEX:
                {
                    return handleNamedConstantUse178(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.POWER_OP_179_INDEX:
                {
                    return handlePowerOp179(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.MULT_OP_180_INDEX:
                {
                    return handleMultOp180(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.MULT_OP_181_INDEX:
                {
                    return handleMultOp181(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ADD_OP_182_INDEX:
                {
                    return handleAddOp182(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ADD_OP_183_INDEX:
                {
                    return handleAddOp183(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.SIGN_184_INDEX:
                {
                    return handleSign184(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.SIGN_185_INDEX:
                {
                    return handleSign185(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.CONCAT_OP_186_INDEX:
                {
                    return handleConcatOp186(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.REL_OP_187_INDEX:
                {
                    return handleRelOp187(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.REL_OP_188_INDEX:
                {
                    return handleRelOp188(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.REL_OP_189_INDEX:
                {
                    return handleRelOp189(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.REL_OP_190_INDEX:
                {
                    return handleRelOp190(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.REL_OP_191_INDEX:
                {
                    return handleRelOp191(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.REL_OP_192_INDEX:
                {
                    return handleRelOp192(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.REL_OP_193_INDEX:
                {
                    return handleRelOp193(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.REL_OP_194_INDEX:
                {
                    return handleRelOp194(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.REL_OP_195_INDEX:
                {
                    return handleRelOp195(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.REL_OP_196_INDEX:
                {
                    return handleRelOp196(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.REL_OP_197_INDEX:
                {
                    return handleRelOp197(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.REL_OP_198_INDEX:
                {
                    return handleRelOp198(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.NOT_OP_199_INDEX:
                {
                    return handleNotOp199(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.AND_OP_200_INDEX:
                {
                    return handleAndOp200(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.OR_OP_201_INDEX:
                {
                    return handleOrOp201(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.EQUIV_OP_202_INDEX:
                {
                    return handleEquivOp202(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.EQUIV_OP_203_INDEX:
                {
                    return handleEquivOp203(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.DEFINED_OPERATOR_204_INDEX:
                {
                    return handleDefinedOperator204(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.DEFINED_OPERATOR_205_INDEX:
                {
                    return handleDefinedOperator205(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.DEFINED_OPERATOR_206_INDEX:
                {
                    return handleDefinedOperator206(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.DEFINED_OPERATOR_207_INDEX:
                {
                    return handleDefinedOperator207(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.DEFINED_OPERATOR_208_INDEX:
                {
                    return handleDefinedOperator208(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.DEFINED_OPERATOR_209_INDEX:
                {
                    return handleDefinedOperator209(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.DEFINED_OPERATOR_210_INDEX:
                {
                    return handleDefinedOperator210(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.DEFINED_OPERATOR_211_INDEX:
                {
                    return handleDefinedOperator211(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.DEFINED_OPERATOR_212_INDEX:
                {
                    return handleDefinedOperator212(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.DEFINED_OPERATOR_213_INDEX:
                {
                    return handleDefinedOperator213(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.DEFINED_UNARY_OP_214_INDEX:
                {
                    return handleDefinedUnaryOp214(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.DEFINED_BINARY_OP_215_INDEX:
                {
                    return handleDefinedBinaryOp215(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.LABEL_216_INDEX:
                {
                    return handleLabel216(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.UNSIGNED_ARITHMETIC_CONSTANT_217_INDEX:
                {
                    return handleUnsignedArithmeticConstant217(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.UNSIGNED_ARITHMETIC_CONSTANT_218_INDEX:
                {
                    return handleUnsignedArithmeticConstant218(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.UNSIGNED_ARITHMETIC_CONSTANT_219_INDEX:
                {
                    return handleUnsignedArithmeticConstant219(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.UNSIGNED_ARITHMETIC_CONSTANT_220_INDEX:
                {
                    return handleUnsignedArithmeticConstant220(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.UNSIGNED_ARITHMETIC_CONSTANT_221_INDEX:
                {
                    return handleUnsignedArithmeticConstant221(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.UNSIGNED_ARITHMETIC_CONSTANT_222_INDEX:
                {
                    return handleUnsignedArithmeticConstant222(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.UNSIGNED_ARITHMETIC_CONSTANT_223_INDEX:
                {
                    return handleUnsignedArithmeticConstant223(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.KIND_PARAM_224_INDEX:
                {
                    return handleKindParam224(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.KIND_PARAM_225_INDEX:
                {
                    return handleKindParam225(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.BOZ_LITERAL_CONSTANT_226_INDEX:
                {
                    return handleBozLiteralConstant226(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.BOZ_LITERAL_CONSTANT_227_INDEX:
                {
                    return handleBozLiteralConstant227(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.BOZ_LITERAL_CONSTANT_228_INDEX:
                {
                    return handleBozLiteralConstant228(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.COMPLEX_CONST_229_INDEX:
                {
                    return handleComplexConst229(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.LOGICAL_CONSTANT_230_INDEX:
                {
                    return handleLogicalConstant230(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.LOGICAL_CONSTANT_231_INDEX:
                {
                    return handleLogicalConstant231(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.LOGICAL_CONSTANT_232_INDEX:
                {
                    return handleLogicalConstant232(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.LOGICAL_CONSTANT_233_INDEX:
                {
                    return handleLogicalConstant233(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.DERIVED_TYPE_DEF_234_INDEX:
                {
                    return handleDerivedTypeDef234(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.DERIVED_TYPE_DEF_235_INDEX:
                {
                    return handleDerivedTypeDef235(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.DERIVED_TYPE_DEF_236_INDEX:
                {
                    return handleDerivedTypeDef236(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.DERIVED_TYPE_DEF_237_INDEX:
                {
                    return handleDerivedTypeDef237(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.DERIVED_TYPE_DEF_238_INDEX:
                {
                    return handleDerivedTypeDef238(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.DERIVED_TYPE_DEF_239_INDEX:
                {
                    return handleDerivedTypeDef239(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.DERIVED_TYPE_DEF_240_INDEX:
                {
                    return handleDerivedTypeDef240(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.DERIVED_TYPE_DEF_241_INDEX:
                {
                    return handleDerivedTypeDef241(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.DERIVED_TYPE_BODY_242_INDEX:
                {
                    return handleDerivedTypeBody242(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.DERIVED_TYPE_BODY_243_INDEX:
                {
                    return handleDerivedTypeBody243(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.DERIVED_TYPE_BODY_CONSTRUCT_244_INDEX:
                {
                    return handleDerivedTypeBodyConstruct244(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.DERIVED_TYPE_BODY_CONSTRUCT_245_INDEX:
                {
                    return handleDerivedTypeBodyConstruct245(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.DERIVED_TYPE_STMT_246_INDEX:
                {
                    return handleDerivedTypeStmt246(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.DERIVED_TYPE_STMT_247_INDEX:
                {
                    return handleDerivedTypeStmt247(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.DERIVED_TYPE_STMT_248_INDEX:
                {
                    return handleDerivedTypeStmt248(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.DERIVED_TYPE_STMT_249_INDEX:
                {
                    return handleDerivedTypeStmt249(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.DERIVED_TYPE_STMT_250_INDEX:
                {
                    return handleDerivedTypeStmt250(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.DERIVED_TYPE_STMT_251_INDEX:
                {
                    return handleDerivedTypeStmt251(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.TYPE_PARAM_NAME_LIST_252_INDEX:
                {
                    return handleTypeParamNameList252(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.TYPE_PARAM_NAME_LIST_253_INDEX:
                {
                    return handleTypeParamNameList253(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.TYPE_ATTR_SPEC_LIST_254_INDEX:
                {
                    return handleTypeAttrSpecList254(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.TYPE_ATTR_SPEC_LIST_255_INDEX:
                {
                    return handleTypeAttrSpecList255(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.TYPE_ATTR_SPEC_256_INDEX:
                {
                    return handleTypeAttrSpec256(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.TYPE_ATTR_SPEC_257_INDEX:
                {
                    return handleTypeAttrSpec257(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.TYPE_ATTR_SPEC_258_INDEX:
                {
                    return handleTypeAttrSpec258(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.TYPE_ATTR_SPEC_259_INDEX:
                {
                    return handleTypeAttrSpec259(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.TYPE_PARAM_NAME_260_INDEX:
                {
                    return handleTypeParamName260(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.PRIVATE_SEQUENCE_STMT_261_INDEX:
                {
                    return handlePrivateSequenceStmt261(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.PRIVATE_SEQUENCE_STMT_262_INDEX:
                {
                    return handlePrivateSequenceStmt262(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.TYPE_PARAM_DEF_STMT_263_INDEX:
                {
                    return handleTypeParamDefStmt263(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.TYPE_PARAM_DECL_LIST_264_INDEX:
                {
                    return handleTypeParamDeclList264(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.TYPE_PARAM_DECL_LIST_265_INDEX:
                {
                    return handleTypeParamDeclList265(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.TYPE_PARAM_DECL_266_INDEX:
                {
                    return handleTypeParamDecl266(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.TYPE_PARAM_DECL_267_INDEX:
                {
                    return handleTypeParamDecl267(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.TYPE_PARAM_ATTR_SPEC_268_INDEX:
                {
                    return handleTypeParamAttrSpec268(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.TYPE_PARAM_ATTR_SPEC_269_INDEX:
                {
                    return handleTypeParamAttrSpec269(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.COMPONENT_DEF_STMT_270_INDEX:
                {
                    return handleComponentDefStmt270(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.COMPONENT_DEF_STMT_271_INDEX:
                {
                    return handleComponentDefStmt271(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.DATA_COMPONENT_DEF_STMT_272_INDEX:
                {
                    return handleDataComponentDefStmt272(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.DATA_COMPONENT_DEF_STMT_273_INDEX:
                {
                    return handleDataComponentDefStmt273(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.DATA_COMPONENT_DEF_STMT_274_INDEX:
                {
                    return handleDataComponentDefStmt274(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.COMPONENT_ATTR_SPEC_LIST_275_INDEX:
                {
                    return handleComponentAttrSpecList275(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.COMPONENT_ATTR_SPEC_LIST_276_INDEX:
                {
                    return handleComponentAttrSpecList276(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.COMPONENT_ATTR_SPEC_277_INDEX:
                {
                    return handleComponentAttrSpec277(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.COMPONENT_ATTR_SPEC_278_INDEX:
                {
                    return handleComponentAttrSpec278(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.COMPONENT_ATTR_SPEC_279_INDEX:
                {
                    return handleComponentAttrSpec279(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.COMPONENT_ATTR_SPEC_280_INDEX:
                {
                    return handleComponentAttrSpec280(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.COMPONENT_ATTR_SPEC_281_INDEX:
                {
                    return handleComponentAttrSpec281(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.COMPONENT_ATTR_SPEC_282_INDEX:
                {
                    return handleComponentAttrSpec282(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.COMPONENT_ARRAY_SPEC_283_INDEX:
                {
                    return handleComponentArraySpec283(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.COMPONENT_ARRAY_SPEC_284_INDEX:
                {
                    return handleComponentArraySpec284(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.COMPONENT_DECL_LIST_285_INDEX:
                {
                    return handleComponentDeclList285(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.COMPONENT_DECL_LIST_286_INDEX:
                {
                    return handleComponentDeclList286(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.COMPONENT_DECL_287_INDEX:
                {
                    return handleComponentDecl287(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.COMPONENT_DECL_288_INDEX:
                {
                    return handleComponentDecl288(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.COMPONENT_DECL_289_INDEX:
                {
                    return handleComponentDecl289(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.COMPONENT_DECL_290_INDEX:
                {
                    return handleComponentDecl290(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.COMPONENT_DECL_291_INDEX:
                {
                    return handleComponentDecl291(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.COMPONENT_DECL_292_INDEX:
                {
                    return handleComponentDecl292(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.COMPONENT_DECL_293_INDEX:
                {
                    return handleComponentDecl293(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.COMPONENT_DECL_294_INDEX:
                {
                    return handleComponentDecl294(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.COMPONENT_DECL_295_INDEX:
                {
                    return handleComponentDecl295(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.COMPONENT_DECL_296_INDEX:
                {
                    return handleComponentDecl296(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.COMPONENT_DECL_297_INDEX:
                {
                    return handleComponentDecl297(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.COMPONENT_DECL_298_INDEX:
                {
                    return handleComponentDecl298(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.COMPONENT_DECL_299_INDEX:
                {
                    return handleComponentDecl299(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.COMPONENT_DECL_300_INDEX:
                {
                    return handleComponentDecl300(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.COMPONENT_DECL_301_INDEX:
                {
                    return handleComponentDecl301(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.COMPONENT_DECL_302_INDEX:
                {
                    return handleComponentDecl302(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.COMPONENT_INITIALIZATION_303_INDEX:
                {
                    return handleComponentInitialization303(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.COMPONENT_INITIALIZATION_304_INDEX:
                {
                    return handleComponentInitialization304(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.END_TYPE_STMT_305_INDEX:
                {
                    return handleEndTypeStmt305(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.END_TYPE_STMT_306_INDEX:
                {
                    return handleEndTypeStmt306(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.END_TYPE_STMT_307_INDEX:
                {
                    return handleEndTypeStmt307(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.END_TYPE_STMT_308_INDEX:
                {
                    return handleEndTypeStmt308(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.PROC_COMPONENT_DEF_STMT_309_INDEX:
                {
                    return handleProcComponentDefStmt309(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.PROC_COMPONENT_DEF_STMT_310_INDEX:
                {
                    return handleProcComponentDefStmt310(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.PROC_INTERFACE_311_INDEX:
                {
                    return handleProcInterface311(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.PROC_INTERFACE_312_INDEX:
                {
                    return handleProcInterface312(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.PROC_DECL_LIST_313_INDEX:
                {
                    return handleProcDeclList313(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.PROC_DECL_LIST_314_INDEX:
                {
                    return handleProcDeclList314(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.PROC_DECL_315_INDEX:
                {
                    return handleProcDecl315(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.PROC_DECL_316_INDEX:
                {
                    return handleProcDecl316(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.PROC_COMPONENT_ATTR_SPEC_LIST_317_INDEX:
                {
                    return handleProcComponentAttrSpecList317(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.PROC_COMPONENT_ATTR_SPEC_LIST_318_INDEX:
                {
                    return handleProcComponentAttrSpecList318(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.PROC_COMPONENT_ATTR_SPEC_319_INDEX:
                {
                    return handleProcComponentAttrSpec319(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.PROC_COMPONENT_ATTR_SPEC_320_INDEX:
                {
                    return handleProcComponentAttrSpec320(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.PROC_COMPONENT_ATTR_SPEC_321_INDEX:
                {
                    return handleProcComponentAttrSpec321(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.PROC_COMPONENT_ATTR_SPEC_322_INDEX:
                {
                    return handleProcComponentAttrSpec322(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.PROC_COMPONENT_ATTR_SPEC_323_INDEX:
                {
                    return handleProcComponentAttrSpec323(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.TYPE_BOUND_PROCEDURE_PART_324_INDEX:
                {
                    return handleTypeBoundProcedurePart324(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.TYPE_BOUND_PROCEDURE_PART_325_INDEX:
                {
                    return handleTypeBoundProcedurePart325(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.BINDING_PRIVATE_STMT_326_INDEX:
                {
                    return handleBindingPrivateStmt326(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.PROC_BINDING_STMTS_327_INDEX:
                {
                    return handleProcBindingStmts327(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.PROC_BINDING_STMTS_328_INDEX:
                {
                    return handleProcBindingStmts328(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.PROC_BINDING_STMT_329_INDEX:
                {
                    return handleProcBindingStmt329(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.PROC_BINDING_STMT_330_INDEX:
                {
                    return handleProcBindingStmt330(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.PROC_BINDING_STMT_331_INDEX:
                {
                    return handleProcBindingStmt331(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.SPECIFIC_BINDING_332_INDEX:
                {
                    return handleSpecificBinding332(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.SPECIFIC_BINDING_333_INDEX:
                {
                    return handleSpecificBinding333(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.SPECIFIC_BINDING_334_INDEX:
                {
                    return handleSpecificBinding334(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.SPECIFIC_BINDING_335_INDEX:
                {
                    return handleSpecificBinding335(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.SPECIFIC_BINDING_336_INDEX:
                {
                    return handleSpecificBinding336(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.SPECIFIC_BINDING_337_INDEX:
                {
                    return handleSpecificBinding337(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.SPECIFIC_BINDING_338_INDEX:
                {
                    return handleSpecificBinding338(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.SPECIFIC_BINDING_339_INDEX:
                {
                    return handleSpecificBinding339(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.SPECIFIC_BINDING_340_INDEX:
                {
                    return handleSpecificBinding340(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.SPECIFIC_BINDING_341_INDEX:
                {
                    return handleSpecificBinding341(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.SPECIFIC_BINDING_342_INDEX:
                {
                    return handleSpecificBinding342(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.SPECIFIC_BINDING_343_INDEX:
                {
                    return handleSpecificBinding343(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.GENERIC_BINDING_344_INDEX:
                {
                    return handleGenericBinding344(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.GENERIC_BINDING_345_INDEX:
                {
                    return handleGenericBinding345(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.GENERIC_BINDING_346_INDEX:
                {
                    return handleGenericBinding346(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.GENERIC_BINDING_347_INDEX:
                {
                    return handleGenericBinding347(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.BINDING_NAME_LIST_348_INDEX:
                {
                    return handleBindingNameList348(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.BINDING_NAME_LIST_349_INDEX:
                {
                    return handleBindingNameList349(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.BINDING_ATTR_LIST_350_INDEX:
                {
                    return handleBindingAttrList350(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.BINDING_ATTR_LIST_351_INDEX:
                {
                    return handleBindingAttrList351(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.BINDING_ATTR_352_INDEX:
                {
                    return handleBindingAttr352(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.BINDING_ATTR_353_INDEX:
                {
                    return handleBindingAttr353(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.BINDING_ATTR_354_INDEX:
                {
                    return handleBindingAttr354(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.BINDING_ATTR_355_INDEX:
                {
                    return handleBindingAttr355(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.BINDING_ATTR_356_INDEX:
                {
                    return handleBindingAttr356(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.BINDING_ATTR_357_INDEX:
                {
                    return handleBindingAttr357(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.FINAL_BINDING_358_INDEX:
                {
                    return handleFinalBinding358(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.FINAL_BINDING_359_INDEX:
                {
                    return handleFinalBinding359(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.FINAL_SUBROUTINE_NAME_LIST_360_INDEX:
                {
                    return handleFinalSubroutineNameList360(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.FINAL_SUBROUTINE_NAME_LIST_361_INDEX:
                {
                    return handleFinalSubroutineNameList361(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.STRUCTURE_CONSTRUCTOR_362_INDEX:
                {
                    return handleStructureConstructor362(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.STRUCTURE_CONSTRUCTOR_363_INDEX:
                {
                    return handleStructureConstructor363(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ENUM_DEF_364_INDEX:
                {
                    return handleEnumDef364(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ENUMERATOR_DEF_STMTS_365_INDEX:
                {
                    return handleEnumeratorDefStmts365(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ENUMERATOR_DEF_STMTS_366_INDEX:
                {
                    return handleEnumeratorDefStmts366(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ENUM_DEF_STMT_367_INDEX:
                {
                    return handleEnumDefStmt367(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ENUMERATOR_DEF_STMT_368_INDEX:
                {
                    return handleEnumeratorDefStmt368(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ENUMERATOR_DEF_STMT_369_INDEX:
                {
                    return handleEnumeratorDefStmt369(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ENUMERATOR_370_INDEX:
                {
                    return handleEnumerator370(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ENUMERATOR_371_INDEX:
                {
                    return handleEnumerator371(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ENUMERATOR_LIST_372_INDEX:
                {
                    return handleEnumeratorList372(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ENUMERATOR_LIST_373_INDEX:
                {
                    return handleEnumeratorList373(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.END_ENUM_STMT_374_INDEX:
                {
                    return handleEndEnumStmt374(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ARRAY_CONSTRUCTOR_375_INDEX:
                {
                    return handleArrayConstructor375(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ARRAY_CONSTRUCTOR_376_INDEX:
                {
                    return handleArrayConstructor376(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.AC_VALUE_LIST_377_INDEX:
                {
                    return handleAcValueList377(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.AC_VALUE_LIST_378_INDEX:
                {
                    return handleAcValueList378(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.AC_VALUE_379_INDEX:
                {
                    return handleAcValue379(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.AC_VALUE_380_INDEX:
                {
                    return handleAcValue380(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.AC_IMPLIED_DO_381_INDEX:
                {
                    return handleAcImpliedDo381(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.AC_IMPLIED_DO_382_INDEX:
                {
                    return handleAcImpliedDo382(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.AC_IMPLIED_DO_383_INDEX:
                {
                    return handleAcImpliedDo383(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.AC_IMPLIED_DO_384_INDEX:
                {
                    return handleAcImpliedDo384(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.TYPE_DECLARATION_STMT_385_INDEX:
                {
                    return handleTypeDeclarationStmt385(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.TYPE_DECLARATION_STMT_386_INDEX:
                {
                    return handleTypeDeclarationStmt386(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.TYPE_DECLARATION_STMT_387_INDEX:
                {
                    return handleTypeDeclarationStmt387(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.TYPE_DECLARATION_STMT_388_INDEX:
                {
                    return handleTypeDeclarationStmt388(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ATTR_SPEC_SEQ_389_INDEX:
                {
                    return handleAttrSpecSeq389(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ATTR_SPEC_SEQ_390_INDEX:
                {
                    return handleAttrSpecSeq390(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.TYPE_SPEC_391_INDEX:
                {
                    return handleTypeSpec391(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.TYPE_SPEC_392_INDEX:
                {
                    return handleTypeSpec392(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.TYPE_SPEC_393_INDEX:
                {
                    return handleTypeSpec393(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.TYPE_SPEC_394_INDEX:
                {
                    return handleTypeSpec394(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.TYPE_SPEC_395_INDEX:
                {
                    return handleTypeSpec395(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.TYPE_SPEC_396_INDEX:
                {
                    return handleTypeSpec396(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.TYPE_SPEC_397_INDEX:
                {
                    return handleTypeSpec397(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.TYPE_SPEC_398_INDEX:
                {
                    return handleTypeSpec398(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.TYPE_SPEC_399_INDEX:
                {
                    return handleTypeSpec399(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.TYPE_SPEC_400_INDEX:
                {
                    return handleTypeSpec400(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.TYPE_SPEC_401_INDEX:
                {
                    return handleTypeSpec401(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.TYPE_SPEC_402_INDEX:
                {
                    return handleTypeSpec402(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.TYPE_SPEC_403_INDEX:
                {
                    return handleTypeSpec403(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.TYPE_SPEC_404_INDEX:
                {
                    return handleTypeSpec404(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.TYPE_SPEC_405_INDEX:
                {
                    return handleTypeSpec405(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.TYPE_SPEC_406_INDEX:
                {
                    return handleTypeSpec406(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.TYPE_SPEC_407_INDEX:
                {
                    return handleTypeSpec407(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.TYPE_SPEC_NO_PREFIX_408_INDEX:
                {
                    return handleTypeSpecNoPrefix408(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.TYPE_SPEC_NO_PREFIX_409_INDEX:
                {
                    return handleTypeSpecNoPrefix409(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.TYPE_SPEC_NO_PREFIX_410_INDEX:
                {
                    return handleTypeSpecNoPrefix410(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.TYPE_SPEC_NO_PREFIX_411_INDEX:
                {
                    return handleTypeSpecNoPrefix411(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.TYPE_SPEC_NO_PREFIX_412_INDEX:
                {
                    return handleTypeSpecNoPrefix412(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.TYPE_SPEC_NO_PREFIX_413_INDEX:
                {
                    return handleTypeSpecNoPrefix413(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.TYPE_SPEC_NO_PREFIX_414_INDEX:
                {
                    return handleTypeSpecNoPrefix414(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.TYPE_SPEC_NO_PREFIX_415_INDEX:
                {
                    return handleTypeSpecNoPrefix415(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.TYPE_SPEC_NO_PREFIX_416_INDEX:
                {
                    return handleTypeSpecNoPrefix416(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.TYPE_SPEC_NO_PREFIX_417_INDEX:
                {
                    return handleTypeSpecNoPrefix417(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.TYPE_SPEC_NO_PREFIX_418_INDEX:
                {
                    return handleTypeSpecNoPrefix418(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.TYPE_SPEC_NO_PREFIX_419_INDEX:
                {
                    return handleTypeSpecNoPrefix419(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.TYPE_SPEC_NO_PREFIX_420_INDEX:
                {
                    return handleTypeSpecNoPrefix420(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.TYPE_SPEC_NO_PREFIX_421_INDEX:
                {
                    return handleTypeSpecNoPrefix421(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.TYPE_SPEC_NO_PREFIX_422_INDEX:
                {
                    return handleTypeSpecNoPrefix422(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.DERIVED_TYPE_SPEC_423_INDEX:
                {
                    return handleDerivedTypeSpec423(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.DERIVED_TYPE_SPEC_424_INDEX:
                {
                    return handleDerivedTypeSpec424(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.TYPE_PARAM_SPEC_LIST_425_INDEX:
                {
                    return handleTypeParamSpecList425(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.TYPE_PARAM_SPEC_LIST_426_INDEX:
                {
                    return handleTypeParamSpecList426(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.TYPE_PARAM_SPEC_427_INDEX:
                {
                    return handleTypeParamSpec427(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.TYPE_PARAM_SPEC_428_INDEX:
                {
                    return handleTypeParamSpec428(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.TYPE_PARAM_VALUE_429_INDEX:
                {
                    return handleTypeParamValue429(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.TYPE_PARAM_VALUE_430_INDEX:
                {
                    return handleTypeParamValue430(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.TYPE_PARAM_VALUE_431_INDEX:
                {
                    return handleTypeParamValue431(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ATTR_SPEC_432_INDEX:
                {
                    return handleAttrSpec432(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ATTR_SPEC_433_INDEX:
                {
                    return handleAttrSpec433(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ATTR_SPEC_434_INDEX:
                {
                    return handleAttrSpec434(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ATTR_SPEC_435_INDEX:
                {
                    return handleAttrSpec435(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ATTR_SPEC_436_INDEX:
                {
                    return handleAttrSpec436(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ATTR_SPEC_437_INDEX:
                {
                    return handleAttrSpec437(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ATTR_SPEC_438_INDEX:
                {
                    return handleAttrSpec438(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ATTR_SPEC_439_INDEX:
                {
                    return handleAttrSpec439(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ATTR_SPEC_440_INDEX:
                {
                    return handleAttrSpec440(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ATTR_SPEC_441_INDEX:
                {
                    return handleAttrSpec441(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ATTR_SPEC_442_INDEX:
                {
                    return handleAttrSpec442(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ATTR_SPEC_443_INDEX:
                {
                    return handleAttrSpec443(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ATTR_SPEC_444_INDEX:
                {
                    return handleAttrSpec444(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ATTR_SPEC_445_INDEX:
                {
                    return handleAttrSpec445(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ATTR_SPEC_446_INDEX:
                {
                    return handleAttrSpec446(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ATTR_SPEC_447_INDEX:
                {
                    return handleAttrSpec447(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ATTR_SPEC_448_INDEX:
                {
                    return handleAttrSpec448(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ATTR_SPEC_449_INDEX:
                {
                    return handleAttrSpec449(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.LANGUAGE_BINDING_SPEC_450_INDEX:
                {
                    return handleLanguageBindingSpec450(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.LANGUAGE_BINDING_SPEC_451_INDEX:
                {
                    return handleLanguageBindingSpec451(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ENTITY_DECL_LIST_452_INDEX:
                {
                    return handleEntityDeclList452(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ENTITY_DECL_LIST_453_INDEX:
                {
                    return handleEntityDeclList453(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ENTITY_DECL_454_INDEX:
                {
                    return handleEntityDecl454(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ENTITY_DECL_455_INDEX:
                {
                    return handleEntityDecl455(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ENTITY_DECL_456_INDEX:
                {
                    return handleEntityDecl456(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ENTITY_DECL_457_INDEX:
                {
                    return handleEntityDecl457(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ENTITY_DECL_458_INDEX:
                {
                    return handleEntityDecl458(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ENTITY_DECL_459_INDEX:
                {
                    return handleEntityDecl459(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ENTITY_DECL_460_INDEX:
                {
                    return handleEntityDecl460(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ENTITY_DECL_461_INDEX:
                {
                    return handleEntityDecl461(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ENTITY_DECL_462_INDEX:
                {
                    return handleEntityDecl462(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ENTITY_DECL_463_INDEX:
                {
                    return handleEntityDecl463(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ENTITY_DECL_464_INDEX:
                {
                    return handleEntityDecl464(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ENTITY_DECL_465_INDEX:
                {
                    return handleEntityDecl465(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ENTITY_DECL_466_INDEX:
                {
                    return handleEntityDecl466(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ENTITY_DECL_467_INDEX:
                {
                    return handleEntityDecl467(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ENTITY_DECL_468_INDEX:
                {
                    return handleEntityDecl468(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ENTITY_DECL_469_INDEX:
                {
                    return handleEntityDecl469(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ENTITY_DECL_470_INDEX:
                {
                    return handleEntityDecl470(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ENTITY_DECL_471_INDEX:
                {
                    return handleEntityDecl471(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ENTITY_DECL_472_INDEX:
                {
                    return handleEntityDecl472(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ENTITY_DECL_473_INDEX:
                {
                    return handleEntityDecl473(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ENTITY_DECL_474_INDEX:
                {
                    return handleEntityDecl474(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.INVALID_ENTITY_DECL_475_INDEX:
                {
                    return handleInvalidEntityDecl475(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.INVALID_ENTITY_DECL_476_INDEX:
                {
                    return handleInvalidEntityDecl476(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.INITIALIZATION_477_INDEX:
                {
                    return handleInitialization477(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.INITIALIZATION_478_INDEX:
                {
                    return handleInitialization478(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.KIND_SELECTOR_479_INDEX:
                {
                    return handleKindSelector479(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.KIND_SELECTOR_480_INDEX:
                {
                    return handleKindSelector480(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.KIND_SELECTOR_481_INDEX:
                {
                    return handleKindSelector481(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.CHAR_SELECTOR_482_INDEX:
                {
                    return handleCharSelector482(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.CHAR_SELECTOR_483_INDEX:
                {
                    return handleCharSelector483(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.CHAR_SELECTOR_484_INDEX:
                {
                    return handleCharSelector484(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.CHAR_SELECTOR_485_INDEX:
                {
                    return handleCharSelector485(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.CHAR_SELECTOR_486_INDEX:
                {
                    return handleCharSelector486(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.CHAR_SELECTOR_487_INDEX:
                {
                    return handleCharSelector487(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.CHAR_SELECTOR_488_INDEX:
                {
                    return handleCharSelector488(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.CHAR_LEN_PARAM_VALUE_489_INDEX:
                {
                    return handleCharLenParamValue489(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.CHAR_LEN_PARAM_VALUE_490_INDEX:
                {
                    return handleCharLenParamValue490(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.CHAR_LEN_PARAM_VALUE_491_INDEX:
                {
                    return handleCharLenParamValue491(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.CHAR_LENGTH_492_INDEX:
                {
                    return handleCharLength492(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.CHAR_LENGTH_493_INDEX:
                {
                    return handleCharLength493(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.CHAR_LENGTH_494_INDEX:
                {
                    return handleCharLength494(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ACCESS_SPEC_495_INDEX:
                {
                    return handleAccessSpec495(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ACCESS_SPEC_496_INDEX:
                {
                    return handleAccessSpec496(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.COARRAY_SPEC_497_INDEX:
                {
                    return handleCoarraySpec497(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.COARRAY_SPEC_498_INDEX:
                {
                    return handleCoarraySpec498(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.DEFERRED_COSHAPE_SPEC_LIST_499_INDEX:
                {
                    return handleDeferredCoshapeSpecList499(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.DEFERRED_COSHAPE_SPEC_LIST_500_INDEX:
                {
                    return handleDeferredCoshapeSpecList500(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.EXPLICIT_COSHAPE_SPEC_501_INDEX:
                {
                    return handleExplicitCoshapeSpec501(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.INTENT_SPEC_502_INDEX:
                {
                    return handleIntentSpec502(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.INTENT_SPEC_503_INDEX:
                {
                    return handleIntentSpec503(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.INTENT_SPEC_504_INDEX:
                {
                    return handleIntentSpec504(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.INTENT_SPEC_505_INDEX:
                {
                    return handleIntentSpec505(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ARRAY_SPEC_506_INDEX:
                {
                    return handleArraySpec506(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ARRAY_SPEC_507_INDEX:
                {
                    return handleArraySpec507(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ARRAY_SPEC_508_INDEX:
                {
                    return handleArraySpec508(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ARRAY_SPEC_509_INDEX:
                {
                    return handleArraySpec509(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ASSUMED_SHAPE_SPEC_LIST_510_INDEX:
                {
                    return handleAssumedShapeSpecList510(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ASSUMED_SHAPE_SPEC_LIST_511_INDEX:
                {
                    return handleAssumedShapeSpecList511(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ASSUMED_SHAPE_SPEC_LIST_512_INDEX:
                {
                    return handleAssumedShapeSpecList512(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.EXPLICIT_SHAPE_SPEC_LIST_513_INDEX:
                {
                    return handleExplicitShapeSpecList513(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.EXPLICIT_SHAPE_SPEC_LIST_514_INDEX:
                {
                    return handleExplicitShapeSpecList514(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.EXPLICIT_SHAPE_SPEC_515_INDEX:
                {
                    return handleExplicitShapeSpec515(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.EXPLICIT_SHAPE_SPEC_516_INDEX:
                {
                    return handleExplicitShapeSpec516(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.LOWER_BOUND_517_INDEX:
                {
                    return handleLowerBound517(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.UPPER_BOUND_518_INDEX:
                {
                    return handleUpperBound518(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ASSUMED_SHAPE_SPEC_519_INDEX:
                {
                    return handleAssumedShapeSpec519(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ASSUMED_SHAPE_SPEC_520_INDEX:
                {
                    return handleAssumedShapeSpec520(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.DEFERRED_SHAPE_SPEC_LIST_521_INDEX:
                {
                    return handleDeferredShapeSpecList521(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.DEFERRED_SHAPE_SPEC_LIST_522_INDEX:
                {
                    return handleDeferredShapeSpecList522(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.DEFERRED_SHAPE_SPEC_523_INDEX:
                {
                    return handleDeferredShapeSpec523(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ASSUMED_SIZE_SPEC_524_INDEX:
                {
                    return handleAssumedSizeSpec524(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ASSUMED_SIZE_SPEC_525_INDEX:
                {
                    return handleAssumedSizeSpec525(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ASSUMED_SIZE_SPEC_526_INDEX:
                {
                    return handleAssumedSizeSpec526(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ASSUMED_SIZE_SPEC_527_INDEX:
                {
                    return handleAssumedSizeSpec527(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.INTENT_STMT_528_INDEX:
                {
                    return handleIntentStmt528(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.INTENT_STMT_529_INDEX:
                {
                    return handleIntentStmt529(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.INTENT_PAR_LIST_530_INDEX:
                {
                    return handleIntentParList530(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.INTENT_PAR_LIST_531_INDEX:
                {
                    return handleIntentParList531(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.INTENT_PAR_532_INDEX:
                {
                    return handleIntentPar532(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.OPTIONAL_STMT_533_INDEX:
                {
                    return handleOptionalStmt533(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.OPTIONAL_STMT_534_INDEX:
                {
                    return handleOptionalStmt534(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.OPTIONAL_PAR_LIST_535_INDEX:
                {
                    return handleOptionalParList535(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.OPTIONAL_PAR_LIST_536_INDEX:
                {
                    return handleOptionalParList536(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.OPTIONAL_PAR_537_INDEX:
                {
                    return handleOptionalPar537(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ACCESS_STMT_538_INDEX:
                {
                    return handleAccessStmt538(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ACCESS_STMT_539_INDEX:
                {
                    return handleAccessStmt539(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ACCESS_STMT_540_INDEX:
                {
                    return handleAccessStmt540(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ACCESS_ID_LIST_541_INDEX:
                {
                    return handleAccessIdList541(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ACCESS_ID_LIST_542_INDEX:
                {
                    return handleAccessIdList542(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ACCESS_ID_543_INDEX:
                {
                    return handleAccessId543(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ACCESS_ID_544_INDEX:
                {
                    return handleAccessId544(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.SAVE_STMT_545_INDEX:
                {
                    return handleSaveStmt545(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.SAVE_STMT_546_INDEX:
                {
                    return handleSaveStmt546(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.SAVE_STMT_547_INDEX:
                {
                    return handleSaveStmt547(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.SAVED_ENTITY_LIST_548_INDEX:
                {
                    return handleSavedEntityList548(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.SAVED_ENTITY_LIST_549_INDEX:
                {
                    return handleSavedEntityList549(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.SAVED_ENTITY_550_INDEX:
                {
                    return handleSavedEntity550(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.SAVED_ENTITY_551_INDEX:
                {
                    return handleSavedEntity551(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.SAVED_COMMON_BLOCK_552_INDEX:
                {
                    return handleSavedCommonBlock552(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.DIMENSION_STMT_553_INDEX:
                {
                    return handleDimensionStmt553(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.DIMENSION_STMT_554_INDEX:
                {
                    return handleDimensionStmt554(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ARRAY_DECLARATOR_LIST_555_INDEX:
                {
                    return handleArrayDeclaratorList555(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ARRAY_DECLARATOR_LIST_556_INDEX:
                {
                    return handleArrayDeclaratorList556(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ARRAY_DECLARATOR_557_INDEX:
                {
                    return handleArrayDeclarator557(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ALLOCATABLE_STMT_558_INDEX:
                {
                    return handleAllocatableStmt558(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ALLOCATABLE_STMT_559_INDEX:
                {
                    return handleAllocatableStmt559(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ARRAY_ALLOCATION_LIST_560_INDEX:
                {
                    return handleArrayAllocationList560(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ARRAY_ALLOCATION_LIST_561_INDEX:
                {
                    return handleArrayAllocationList561(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ARRAY_ALLOCATION_562_INDEX:
                {
                    return handleArrayAllocation562(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ARRAY_ALLOCATION_563_INDEX:
                {
                    return handleArrayAllocation563(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ASYNCHRONOUS_STMT_564_INDEX:
                {
                    return handleAsynchronousStmt564(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ASYNCHRONOUS_STMT_565_INDEX:
                {
                    return handleAsynchronousStmt565(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.OBJECT_LIST_566_INDEX:
                {
                    return handleObjectList566(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.OBJECT_LIST_567_INDEX:
                {
                    return handleObjectList567(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.BIND_STMT_568_INDEX:
                {
                    return handleBindStmt568(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.BIND_STMT_569_INDEX:
                {
                    return handleBindStmt569(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.BIND_ENTITY_570_INDEX:
                {
                    return handleBindEntity570(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.BIND_ENTITY_571_INDEX:
                {
                    return handleBindEntity571(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.BIND_ENTITY_LIST_572_INDEX:
                {
                    return handleBindEntityList572(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.BIND_ENTITY_LIST_573_INDEX:
                {
                    return handleBindEntityList573(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.POINTER_STMT_574_INDEX:
                {
                    return handlePointerStmt574(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.POINTER_STMT_575_INDEX:
                {
                    return handlePointerStmt575(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.POINTER_STMT_OBJECT_LIST_576_INDEX:
                {
                    return handlePointerStmtObjectList576(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.POINTER_STMT_OBJECT_LIST_577_INDEX:
                {
                    return handlePointerStmtObjectList577(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.POINTER_STMT_OBJECT_578_INDEX:
                {
                    return handlePointerStmtObject578(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.POINTER_STMT_OBJECT_579_INDEX:
                {
                    return handlePointerStmtObject579(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.POINTER_NAME_580_INDEX:
                {
                    return handlePointerName580(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.CRAY_POINTER_STMT_581_INDEX:
                {
                    return handleCrayPointerStmt581(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.CRAY_POINTER_STMT_OBJECT_LIST_582_INDEX:
                {
                    return handleCrayPointerStmtObjectList582(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.CRAY_POINTER_STMT_OBJECT_LIST_583_INDEX:
                {
                    return handleCrayPointerStmtObjectList583(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.CRAY_POINTER_STMT_OBJECT_584_INDEX:
                {
                    return handleCrayPointerStmtObject584(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.CODIMENSION_STMT_585_INDEX:
                {
                    return handleCodimensionStmt585(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.CODIMENSION_STMT_586_INDEX:
                {
                    return handleCodimensionStmt586(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.CODIMENSION_DECL_LIST_587_INDEX:
                {
                    return handleCodimensionDeclList587(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.CODIMENSION_DECL_LIST_588_INDEX:
                {
                    return handleCodimensionDeclList588(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.CODIMENSION_DECL_589_INDEX:
                {
                    return handleCodimensionDecl589(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.CONTIGUOUS_STMT_590_INDEX:
                {
                    return handleContiguousStmt590(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.CONTIGUOUS_STMT_591_INDEX:
                {
                    return handleContiguousStmt591(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.OBJECT_NAME_LIST_592_INDEX:
                {
                    return handleObjectNameList592(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.OBJECT_NAME_LIST_593_INDEX:
                {
                    return handleObjectNameList593(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.PROTECTED_STMT_594_INDEX:
                {
                    return handleProtectedStmt594(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.PROTECTED_STMT_595_INDEX:
                {
                    return handleProtectedStmt595(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.TARGET_STMT_596_INDEX:
                {
                    return handleTargetStmt596(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.TARGET_STMT_597_INDEX:
                {
                    return handleTargetStmt597(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.TARGET_OBJECT_LIST_598_INDEX:
                {
                    return handleTargetObjectList598(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.TARGET_OBJECT_LIST_599_INDEX:
                {
                    return handleTargetObjectList599(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.TARGET_OBJECT_600_INDEX:
                {
                    return handleTargetObject600(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.TARGET_OBJECT_601_INDEX:
                {
                    return handleTargetObject601(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.TARGET_OBJECT_602_INDEX:
                {
                    return handleTargetObject602(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.TARGET_OBJECT_603_INDEX:
                {
                    return handleTargetObject603(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.TARGET_NAME_604_INDEX:
                {
                    return handleTargetName604(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.VALUE_STMT_605_INDEX:
                {
                    return handleValueStmt605(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.VALUE_STMT_606_INDEX:
                {
                    return handleValueStmt606(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.VOLATILE_STMT_607_INDEX:
                {
                    return handleVolatileStmt607(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.VOLATILE_STMT_608_INDEX:
                {
                    return handleVolatileStmt608(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.PARAMETER_STMT_609_INDEX:
                {
                    return handleParameterStmt609(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.NAMED_CONSTANT_DEF_LIST_610_INDEX:
                {
                    return handleNamedConstantDefList610(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.NAMED_CONSTANT_DEF_LIST_611_INDEX:
                {
                    return handleNamedConstantDefList611(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.NAMED_CONSTANT_DEF_612_INDEX:
                {
                    return handleNamedConstantDef612(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.DATA_STMT_613_INDEX:
                {
                    return handleDataStmt613(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.DATALIST_614_INDEX:
                {
                    return handleDatalist614(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.DATALIST_615_INDEX:
                {
                    return handleDatalist615(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.DATALIST_616_INDEX:
                {
                    return handleDatalist616(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.DATA_STMT_SET_617_INDEX:
                {
                    return handleDataStmtSet617(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.DATA_STMT_OBJECT_LIST_618_INDEX:
                {
                    return handleDataStmtObjectList618(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.DATA_STMT_OBJECT_LIST_619_INDEX:
                {
                    return handleDataStmtObjectList619(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.DATA_STMT_OBJECT_620_INDEX:
                {
                    return handleDataStmtObject620(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.DATA_STMT_OBJECT_621_INDEX:
                {
                    return handleDataStmtObject621(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.DATA_IMPLIED_DO_622_INDEX:
                {
                    return handleDataImpliedDo622(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.DATA_IMPLIED_DO_623_INDEX:
                {
                    return handleDataImpliedDo623(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.DATA_IDO_OBJECT_LIST_624_INDEX:
                {
                    return handleDataIDoObjectList624(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.DATA_IDO_OBJECT_LIST_625_INDEX:
                {
                    return handleDataIDoObjectList625(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.DATA_IDO_OBJECT_626_INDEX:
                {
                    return handleDataIDoObject626(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.DATA_IDO_OBJECT_627_INDEX:
                {
                    return handleDataIDoObject627(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.DATA_IDO_OBJECT_628_INDEX:
                {
                    return handleDataIDoObject628(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.DATA_STMT_VALUE_LIST_629_INDEX:
                {
                    return handleDataStmtValueList629(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.DATA_STMT_VALUE_LIST_630_INDEX:
                {
                    return handleDataStmtValueList630(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.DATA_STMT_VALUE_631_INDEX:
                {
                    return handleDataStmtValue631(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.DATA_STMT_VALUE_632_INDEX:
                {
                    return handleDataStmtValue632(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.DATA_STMT_VALUE_633_INDEX:
                {
                    return handleDataStmtValue633(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.DATA_STMT_CONSTANT_634_INDEX:
                {
                    return handleDataStmtConstant634(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.DATA_STMT_CONSTANT_635_INDEX:
                {
                    return handleDataStmtConstant635(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.IMPLICIT_STMT_636_INDEX:
                {
                    return handleImplicitStmt636(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.IMPLICIT_STMT_637_INDEX:
                {
                    return handleImplicitStmt637(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.IMPLICIT_SPEC_LIST_638_INDEX:
                {
                    return handleImplicitSpecList638(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.IMPLICIT_SPEC_LIST_639_INDEX:
                {
                    return handleImplicitSpecList639(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.IMPLICIT_SPEC_640_INDEX:
                {
                    return handleImplicitSpec640(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.NAMELIST_STMT_641_INDEX:
                {
                    return handleNamelistStmt641(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.NAMELIST_GROUPS_642_INDEX:
                {
                    return handleNamelistGroups642(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.NAMELIST_GROUPS_643_INDEX:
                {
                    return handleNamelistGroups643(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.NAMELIST_GROUPS_644_INDEX:
                {
                    return handleNamelistGroups644(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.NAMELIST_GROUPS_645_INDEX:
                {
                    return handleNamelistGroups645(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.NAMELIST_GROUP_OBJECT_646_INDEX:
                {
                    return handleNamelistGroupObject646(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.EQUIVALENCE_STMT_647_INDEX:
                {
                    return handleEquivalenceStmt647(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.EQUIVALENCE_SET_LIST_648_INDEX:
                {
                    return handleEquivalenceSetList648(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.EQUIVALENCE_SET_LIST_649_INDEX:
                {
                    return handleEquivalenceSetList649(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.EQUIVALENCE_SET_650_INDEX:
                {
                    return handleEquivalenceSet650(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.EQUIVALENCE_OBJECT_LIST_651_INDEX:
                {
                    return handleEquivalenceObjectList651(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.EQUIVALENCE_OBJECT_LIST_652_INDEX:
                {
                    return handleEquivalenceObjectList652(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.EQUIVALENCE_OBJECT_653_INDEX:
                {
                    return handleEquivalenceObject653(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.COMMON_STMT_654_INDEX:
                {
                    return handleCommonStmt654(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.COMMON_BLOCK_LIST_655_INDEX:
                {
                    return handleCommonBlockList655(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.COMMON_BLOCK_LIST_656_INDEX:
                {
                    return handleCommonBlockList656(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.COMMON_BLOCK_657_INDEX:
                {
                    return handleCommonBlock657(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.COMMON_BLOCK_658_INDEX:
                {
                    return handleCommonBlock658(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.COMMON_BLOCK_659_INDEX:
                {
                    return handleCommonBlock659(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.COMMON_BLOCK_OBJECT_LIST_660_INDEX:
                {
                    return handleCommonBlockObjectList660(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.COMMON_BLOCK_OBJECT_LIST_661_INDEX:
                {
                    return handleCommonBlockObjectList661(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.COMMON_BLOCK_OBJECT_662_INDEX:
                {
                    return handleCommonBlockObject662(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.COMMON_BLOCK_OBJECT_663_INDEX:
                {
                    return handleCommonBlockObject663(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.COMMON_BLOCK_OBJECT_664_INDEX:
                {
                    return handleCommonBlockObject664(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.COMMON_BLOCK_OBJECT_665_INDEX:
                {
                    return handleCommonBlockObject665(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.VARIABLE_666_INDEX:
                {
                    return handleVariable666(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.VARIABLE_667_INDEX:
                {
                    return handleVariable667(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.VARIABLE_668_INDEX:
                {
                    return handleVariable668(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.VARIABLE_669_INDEX:
                {
                    return handleVariable669(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.VARIABLE_670_INDEX:
                {
                    return handleVariable670(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.VARIABLE_671_INDEX:
                {
                    return handleVariable671(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.VARIABLE_672_INDEX:
                {
                    return handleVariable672(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.SUBSTR_CONST_673_INDEX:
                {
                    return handleSubstrConst673(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.VARIABLE_NAME_674_INDEX:
                {
                    return handleVariableName674(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.SCALAR_VARIABLE_675_INDEX:
                {
                    return handleScalarVariable675(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.SCALAR_VARIABLE_676_INDEX:
                {
                    return handleScalarVariable676(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.SUBSTRING_RANGE_677_INDEX:
                {
                    return handleSubstringRange677(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.DATA_REF_678_INDEX:
                {
                    return handleDataRef678(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.DATA_REF_679_INDEX:
                {
                    return handleDataRef679(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.DATA_REF_680_INDEX:
                {
                    return handleDataRef680(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.DATA_REF_681_INDEX:
                {
                    return handleDataRef681(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.DATA_REF_682_INDEX:
                {
                    return handleDataRef682(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.DATA_REF_683_INDEX:
                {
                    return handleDataRef683(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.SFDATA_REF_684_INDEX:
                {
                    return handleSFDataRef684(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.SFDATA_REF_685_INDEX:
                {
                    return handleSFDataRef685(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.SFDATA_REF_686_INDEX:
                {
                    return handleSFDataRef686(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.SFDATA_REF_687_INDEX:
                {
                    return handleSFDataRef687(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.SFDATA_REF_688_INDEX:
                {
                    return handleSFDataRef688(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.SFDATA_REF_689_INDEX:
                {
                    return handleSFDataRef689(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.SFDATA_REF_690_INDEX:
                {
                    return handleSFDataRef690(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.SFDATA_REF_691_INDEX:
                {
                    return handleSFDataRef691(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.STRUCTURE_COMPONENT_692_INDEX:
                {
                    return handleStructureComponent692(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.STRUCTURE_COMPONENT_693_INDEX:
                {
                    return handleStructureComponent693(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.FIELD_SELECTOR_694_INDEX:
                {
                    return handleFieldSelector694(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.FIELD_SELECTOR_695_INDEX:
                {
                    return handleFieldSelector695(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.FIELD_SELECTOR_696_INDEX:
                {
                    return handleFieldSelector696(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.FIELD_SELECTOR_697_INDEX:
                {
                    return handleFieldSelector697(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ARRAY_ELEMENT_698_INDEX:
                {
                    return handleArrayElement698(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ARRAY_ELEMENT_699_INDEX:
                {
                    return handleArrayElement699(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ARRAY_ELEMENT_700_INDEX:
                {
                    return handleArrayElement700(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ARRAY_ELEMENT_701_INDEX:
                {
                    return handleArrayElement701(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.SUBSCRIPT_702_INDEX:
                {
                    return handleSubscript702(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.SECTION_SUBSCRIPT_LIST_703_INDEX:
                {
                    return handleSectionSubscriptList703(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.SECTION_SUBSCRIPT_LIST_704_INDEX:
                {
                    return handleSectionSubscriptList704(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.SECTION_SUBSCRIPT_705_INDEX:
                {
                    return handleSectionSubscript705(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.SECTION_SUBSCRIPT_706_INDEX:
                {
                    return handleSectionSubscript706(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.SUBSCRIPT_TRIPLET_707_INDEX:
                {
                    return handleSubscriptTriplet707(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.SUBSCRIPT_TRIPLET_708_INDEX:
                {
                    return handleSubscriptTriplet708(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.SUBSCRIPT_TRIPLET_709_INDEX:
                {
                    return handleSubscriptTriplet709(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.SUBSCRIPT_TRIPLET_710_INDEX:
                {
                    return handleSubscriptTriplet710(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.SUBSCRIPT_TRIPLET_711_INDEX:
                {
                    return handleSubscriptTriplet711(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.SUBSCRIPT_TRIPLET_712_INDEX:
                {
                    return handleSubscriptTriplet712(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.SUBSCRIPT_TRIPLET_713_INDEX:
                {
                    return handleSubscriptTriplet713(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.SUBSCRIPT_TRIPLET_714_INDEX:
                {
                    return handleSubscriptTriplet714(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ALLOCATE_STMT_715_INDEX:
                {
                    return handleAllocateStmt715(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ALLOCATE_STMT_716_INDEX:
                {
                    return handleAllocateStmt716(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ALLOCATION_LIST_717_INDEX:
                {
                    return handleAllocationList717(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ALLOCATION_LIST_718_INDEX:
                {
                    return handleAllocationList718(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ALLOCATION_719_INDEX:
                {
                    return handleAllocation719(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ALLOCATION_720_INDEX:
                {
                    return handleAllocation720(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ALLOCATED_SHAPE_721_INDEX:
                {
                    return handleAllocatedShape721(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ALLOCATED_SHAPE_722_INDEX:
                {
                    return handleAllocatedShape722(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ALLOCATED_SHAPE_723_INDEX:
                {
                    return handleAllocatedShape723(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ALLOCATE_OBJECT_LIST_724_INDEX:
                {
                    return handleAllocateObjectList724(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ALLOCATE_OBJECT_LIST_725_INDEX:
                {
                    return handleAllocateObjectList725(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ALLOCATE_OBJECT_726_INDEX:
                {
                    return handleAllocateObject726(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ALLOCATE_OBJECT_727_INDEX:
                {
                    return handleAllocateObject727(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ALLOCATE_COARRAY_SPEC_728_INDEX:
                {
                    return handleAllocateCoarraySpec728(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ALLOCATE_COARRAY_SPEC_729_INDEX:
                {
                    return handleAllocateCoarraySpec729(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ALLOCATE_COARRAY_SPEC_730_INDEX:
                {
                    return handleAllocateCoarraySpec730(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ALLOCATE_COARRAY_SPEC_731_INDEX:
                {
                    return handleAllocateCoarraySpec731(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.IMAGE_SELECTOR_732_INDEX:
                {
                    return handleImageSelector732(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.NULLIFY_STMT_733_INDEX:
                {
                    return handleNullifyStmt733(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.POINTER_OBJECT_LIST_734_INDEX:
                {
                    return handlePointerObjectList734(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.POINTER_OBJECT_LIST_735_INDEX:
                {
                    return handlePointerObjectList735(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.POINTER_OBJECT_736_INDEX:
                {
                    return handlePointerObject736(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.POINTER_OBJECT_737_INDEX:
                {
                    return handlePointerObject737(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.POINTER_FIELD_738_INDEX:
                {
                    return handlePointerField738(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.POINTER_FIELD_739_INDEX:
                {
                    return handlePointerField739(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.POINTER_FIELD_740_INDEX:
                {
                    return handlePointerField740(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.POINTER_FIELD_741_INDEX:
                {
                    return handlePointerField741(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.POINTER_FIELD_742_INDEX:
                {
                    return handlePointerField742(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.POINTER_FIELD_743_INDEX:
                {
                    return handlePointerField743(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.POINTER_FIELD_744_INDEX:
                {
                    return handlePointerField744(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.DEALLOCATE_STMT_745_INDEX:
                {
                    return handleDeallocateStmt745(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.DEALLOCATE_STMT_746_INDEX:
                {
                    return handleDeallocateStmt746(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.PRIMARY_747_INDEX:
                {
                    return handlePrimary747(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.PRIMARY_748_INDEX:
                {
                    return handlePrimary748(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.PRIMARY_749_INDEX:
                {
                    return handlePrimary749(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.PRIMARY_750_INDEX:
                {
                    return handlePrimary750(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.PRIMARY_751_INDEX:
                {
                    return handlePrimary751(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.PRIMARY_752_INDEX:
                {
                    return handlePrimary752(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.PRIMARY_753_INDEX:
                {
                    return handlePrimary753(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.PRIMARY_754_INDEX:
                {
                    return handlePrimary754(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.PRIMARY_755_INDEX:
                {
                    return handlePrimary755(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.PRIMARY_756_INDEX:
                {
                    return handlePrimary756(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.PRIMARY_757_INDEX:
                {
                    return handlePrimary757(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.PRIMARY_758_INDEX:
                {
                    return handlePrimary758(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.PRIMARY_759_INDEX:
                {
                    return handlePrimary759(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.PRIMARY_760_INDEX:
                {
                    return handlePrimary760(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.PRIMARY_761_INDEX:
                {
                    return handlePrimary761(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.PRIMARY_762_INDEX:
                {
                    return handlePrimary762(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.PRIMARY_763_INDEX:
                {
                    return handlePrimary763(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.PRIMARY_764_INDEX:
                {
                    return handlePrimary764(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.PRIMARY_765_INDEX:
                {
                    return handlePrimary765(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.PRIMARY_766_INDEX:
                {
                    return handlePrimary766(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.PRIMARY_767_INDEX:
                {
                    return handlePrimary767(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.PRIMARY_768_INDEX:
                {
                    return handlePrimary768(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.PRIMARY_769_INDEX:
                {
                    return handlePrimary769(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.PRIMARY_770_INDEX:
                {
                    return handlePrimary770(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.PRIMARY_771_INDEX:
                {
                    return handlePrimary771(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.PRIMARY_772_INDEX:
                {
                    return handlePrimary772(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.PRIMARY_773_INDEX:
                {
                    return handlePrimary773(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.PRIMARY_774_INDEX:
                {
                    return handlePrimary774(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.PRIMARY_775_INDEX:
                {
                    return handlePrimary775(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.PRIMARY_776_INDEX:
                {
                    return handlePrimary776(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.PRIMARY_777_INDEX:
                {
                    return handlePrimary777(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.PRIMARY_778_INDEX:
                {
                    return handlePrimary778(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.PRIMARY_779_INDEX:
                {
                    return handlePrimary779(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.PRIMARY_780_INDEX:
                {
                    return handlePrimary780(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.PRIMARY_781_INDEX:
                {
                    return handlePrimary781(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.PRIMARY_782_INDEX:
                {
                    return handlePrimary782(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.CPRIMARY_783_INDEX:
                {
                    return handleCPrimary783(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.CPRIMARY_784_INDEX:
                {
                    return handleCPrimary784(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.COPERAND_785_INDEX:
                {
                    return handleCOperand785(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.COPERAND_786_INDEX:
                {
                    return handleCOperand786(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.COPERAND_787_INDEX:
                {
                    return handleCOperand787(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.COPERAND_788_INDEX:
                {
                    return handleCOperand788(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.COPERAND_789_INDEX:
                {
                    return handleCOperand789(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.COPERAND_790_INDEX:
                {
                    return handleCOperand790(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.COPERAND_791_INDEX:
                {
                    return handleCOperand791(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.COPERAND_792_INDEX:
                {
                    return handleCOperand792(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.COPERAND_793_INDEX:
                {
                    return handleCOperand793(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.COPERAND_794_INDEX:
                {
                    return handleCOperand794(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.COPERAND_795_INDEX:
                {
                    return handleCOperand795(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.COPERAND_796_INDEX:
                {
                    return handleCOperand796(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.COPERAND_797_INDEX:
                {
                    return handleCOperand797(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.COPERAND_798_INDEX:
                {
                    return handleCOperand798(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.UFPRIMARY_799_INDEX:
                {
                    return handleUFPrimary799(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.UFPRIMARY_800_INDEX:
                {
                    return handleUFPrimary800(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.UFPRIMARY_801_INDEX:
                {
                    return handleUFPrimary801(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.UFPRIMARY_802_INDEX:
                {
                    return handleUFPrimary802(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.UFPRIMARY_803_INDEX:
                {
                    return handleUFPrimary803(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.UFPRIMARY_804_INDEX:
                {
                    return handleUFPrimary804(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.UFPRIMARY_805_INDEX:
                {
                    return handleUFPrimary805(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.UFPRIMARY_806_INDEX:
                {
                    return handleUFPrimary806(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.UFPRIMARY_807_INDEX:
                {
                    return handleUFPrimary807(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.UFPRIMARY_808_INDEX:
                {
                    return handleUFPrimary808(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.UFPRIMARY_809_INDEX:
                {
                    return handleUFPrimary809(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.UFPRIMARY_810_INDEX:
                {
                    return handleUFPrimary810(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.UFPRIMARY_811_INDEX:
                {
                    return handleUFPrimary811(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.UFPRIMARY_812_INDEX:
                {
                    return handleUFPrimary812(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.UFPRIMARY_813_INDEX:
                {
                    return handleUFPrimary813(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.UFPRIMARY_814_INDEX:
                {
                    return handleUFPrimary814(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.UFPRIMARY_815_INDEX:
                {
                    return handleUFPrimary815(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.UFPRIMARY_816_INDEX:
                {
                    return handleUFPrimary816(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.UFPRIMARY_817_INDEX:
                {
                    return handleUFPrimary817(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.UFPRIMARY_818_INDEX:
                {
                    return handleUFPrimary818(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.UFPRIMARY_819_INDEX:
                {
                    return handleUFPrimary819(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.UFPRIMARY_820_INDEX:
                {
                    return handleUFPrimary820(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.LEVEL_1_EXPR_821_INDEX:
                {
                    return handleLevel1Expr821(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.LEVEL_1_EXPR_822_INDEX:
                {
                    return handleLevel1Expr822(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.MULT_OPERAND_823_INDEX:
                {
                    return handleMultOperand823(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.MULT_OPERAND_824_INDEX:
                {
                    return handleMultOperand824(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.UFFACTOR_825_INDEX:
                {
                    return handleUFFactor825(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.UFFACTOR_826_INDEX:
                {
                    return handleUFFactor826(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ADD_OPERAND_827_INDEX:
                {
                    return handleAddOperand827(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ADD_OPERAND_828_INDEX:
                {
                    return handleAddOperand828(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.UFTERM_829_INDEX:
                {
                    return handleUFTerm829(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.UFTERM_830_INDEX:
                {
                    return handleUFTerm830(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.UFTERM_831_INDEX:
                {
                    return handleUFTerm831(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.LEVEL_2_EXPR_832_INDEX:
                {
                    return handleLevel2Expr832(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.LEVEL_2_EXPR_833_INDEX:
                {
                    return handleLevel2Expr833(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.LEVEL_2_EXPR_834_INDEX:
                {
                    return handleLevel2Expr834(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.UFEXPR_835_INDEX:
                {
                    return handleUFExpr835(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.UFEXPR_836_INDEX:
                {
                    return handleUFExpr836(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.UFEXPR_837_INDEX:
                {
                    return handleUFExpr837(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.LEVEL_3_EXPR_838_INDEX:
                {
                    return handleLevel3Expr838(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.LEVEL_3_EXPR_839_INDEX:
                {
                    return handleLevel3Expr839(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.CEXPR_840_INDEX:
                {
                    return handleCExpr840(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.CEXPR_841_INDEX:
                {
                    return handleCExpr841(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.LEVEL_4_EXPR_842_INDEX:
                {
                    return handleLevel4Expr842(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.LEVEL_4_EXPR_843_INDEX:
                {
                    return handleLevel4Expr843(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.AND_OPERAND_844_INDEX:
                {
                    return handleAndOperand844(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.AND_OPERAND_845_INDEX:
                {
                    return handleAndOperand845(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.OR_OPERAND_846_INDEX:
                {
                    return handleOrOperand846(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.OR_OPERAND_847_INDEX:
                {
                    return handleOrOperand847(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.EQUIV_OPERAND_848_INDEX:
                {
                    return handleEquivOperand848(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.EQUIV_OPERAND_849_INDEX:
                {
                    return handleEquivOperand849(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.LEVEL_5_EXPR_850_INDEX:
                {
                    return handleLevel5Expr850(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.LEVEL_5_EXPR_851_INDEX:
                {
                    return handleLevel5Expr851(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.EXPR_852_INDEX:
                {
                    return handleExpr852(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.EXPR_853_INDEX:
                {
                    return handleExpr853(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.SFEXPR_LIST_854_INDEX:
                {
                    return handleSFExprList854(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.SFEXPR_LIST_855_INDEX:
                {
                    return handleSFExprList855(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.SFEXPR_LIST_856_INDEX:
                {
                    return handleSFExprList856(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.SFEXPR_LIST_857_INDEX:
                {
                    return handleSFExprList857(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.SFEXPR_LIST_858_INDEX:
                {
                    return handleSFExprList858(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.SFEXPR_LIST_859_INDEX:
                {
                    return handleSFExprList859(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.SFEXPR_LIST_860_INDEX:
                {
                    return handleSFExprList860(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.SFEXPR_LIST_861_INDEX:
                {
                    return handleSFExprList861(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.SFEXPR_LIST_862_INDEX:
                {
                    return handleSFExprList862(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.SFEXPR_LIST_863_INDEX:
                {
                    return handleSFExprList863(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.SFEXPR_LIST_864_INDEX:
                {
                    return handleSFExprList864(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.SFEXPR_LIST_865_INDEX:
                {
                    return handleSFExprList865(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.SFEXPR_LIST_866_INDEX:
                {
                    return handleSFExprList866(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.SFEXPR_LIST_867_INDEX:
                {
                    return handleSFExprList867(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.SFEXPR_LIST_868_INDEX:
                {
                    return handleSFExprList868(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ASSIGNMENT_STMT_869_INDEX:
                {
                    return handleAssignmentStmt869(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ASSIGNMENT_STMT_870_INDEX:
                {
                    return handleAssignmentStmt870(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ASSIGNMENT_STMT_871_INDEX:
                {
                    return handleAssignmentStmt871(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ASSIGNMENT_STMT_872_INDEX:
                {
                    return handleAssignmentStmt872(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ASSIGNMENT_STMT_873_INDEX:
                {
                    return handleAssignmentStmt873(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ASSIGNMENT_STMT_874_INDEX:
                {
                    return handleAssignmentStmt874(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ASSIGNMENT_STMT_875_INDEX:
                {
                    return handleAssignmentStmt875(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ASSIGNMENT_STMT_876_INDEX:
                {
                    return handleAssignmentStmt876(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ASSIGNMENT_STMT_877_INDEX:
                {
                    return handleAssignmentStmt877(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ASSIGNMENT_STMT_878_INDEX:
                {
                    return handleAssignmentStmt878(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ASSIGNMENT_STMT_879_INDEX:
                {
                    return handleAssignmentStmt879(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ASSIGNMENT_STMT_880_INDEX:
                {
                    return handleAssignmentStmt880(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ASSIGNMENT_STMT_881_INDEX:
                {
                    return handleAssignmentStmt881(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ASSIGNMENT_STMT_882_INDEX:
                {
                    return handleAssignmentStmt882(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ASSIGNMENT_STMT_883_INDEX:
                {
                    return handleAssignmentStmt883(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ASSIGNMENT_STMT_884_INDEX:
                {
                    return handleAssignmentStmt884(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ASSIGNMENT_STMT_885_INDEX:
                {
                    return handleAssignmentStmt885(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ASSIGNMENT_STMT_886_INDEX:
                {
                    return handleAssignmentStmt886(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ASSIGNMENT_STMT_887_INDEX:
                {
                    return handleAssignmentStmt887(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ASSIGNMENT_STMT_888_INDEX:
                {
                    return handleAssignmentStmt888(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ASSIGNMENT_STMT_889_INDEX:
                {
                    return handleAssignmentStmt889(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ASSIGNMENT_STMT_890_INDEX:
                {
                    return handleAssignmentStmt890(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ASSIGNMENT_STMT_891_INDEX:
                {
                    return handleAssignmentStmt891(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ASSIGNMENT_STMT_892_INDEX:
                {
                    return handleAssignmentStmt892(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ASSIGNMENT_STMT_893_INDEX:
                {
                    return handleAssignmentStmt893(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ASSIGNMENT_STMT_894_INDEX:
                {
                    return handleAssignmentStmt894(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.SFEXPR_895_INDEX:
                {
                    return handleSFExpr895(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.SFEXPR_896_INDEX:
                {
                    return handleSFExpr896(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.SFEXPR_897_INDEX:
                {
                    return handleSFExpr897(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.SFTERM_898_INDEX:
                {
                    return handleSFTerm898(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.SFTERM_899_INDEX:
                {
                    return handleSFTerm899(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.SFFACTOR_900_INDEX:
                {
                    return handleSFFactor900(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.SFFACTOR_901_INDEX:
                {
                    return handleSFFactor901(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.SFPRIMARY_902_INDEX:
                {
                    return handleSFPrimary902(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.SFPRIMARY_903_INDEX:
                {
                    return handleSFPrimary903(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.SFPRIMARY_904_INDEX:
                {
                    return handleSFPrimary904(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.SFPRIMARY_905_INDEX:
                {
                    return handleSFPrimary905(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.SFPRIMARY_906_INDEX:
                {
                    return handleSFPrimary906(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.SFPRIMARY_907_INDEX:
                {
                    return handleSFPrimary907(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.POINTER_ASSIGNMENT_STMT_908_INDEX:
                {
                    return handlePointerAssignmentStmt908(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.POINTER_ASSIGNMENT_STMT_909_INDEX:
                {
                    return handlePointerAssignmentStmt909(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.POINTER_ASSIGNMENT_STMT_910_INDEX:
                {
                    return handlePointerAssignmentStmt910(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.POINTER_ASSIGNMENT_STMT_911_INDEX:
                {
                    return handlePointerAssignmentStmt911(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.POINTER_ASSIGNMENT_STMT_912_INDEX:
                {
                    return handlePointerAssignmentStmt912(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.POINTER_ASSIGNMENT_STMT_913_INDEX:
                {
                    return handlePointerAssignmentStmt913(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.POINTER_ASSIGNMENT_STMT_914_INDEX:
                {
                    return handlePointerAssignmentStmt914(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.POINTER_ASSIGNMENT_STMT_915_INDEX:
                {
                    return handlePointerAssignmentStmt915(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.TARGET_916_INDEX:
                {
                    return handleTarget916(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.TARGET_917_INDEX:
                {
                    return handleTarget917(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.WHERE_STMT_918_INDEX:
                {
                    return handleWhereStmt918(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.WHERE_CONSTRUCT_919_INDEX:
                {
                    return handleWhereConstruct919(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.WHERE_RANGE_920_INDEX:
                {
                    return handleWhereRange920(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.WHERE_RANGE_921_INDEX:
                {
                    return handleWhereRange921(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.WHERE_RANGE_922_INDEX:
                {
                    return handleWhereRange922(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.WHERE_RANGE_923_INDEX:
                {
                    return handleWhereRange923(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.WHERE_RANGE_924_INDEX:
                {
                    return handleWhereRange924(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.WHERE_RANGE_925_INDEX:
                {
                    return handleWhereRange925(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.MASKED_ELSE_WHERE_CONSTRUCT_926_INDEX:
                {
                    return handleMaskedElseWhereConstruct926(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ELSE_WHERE_CONSTRUCT_927_INDEX:
                {
                    return handleElseWhereConstruct927(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ELSE_WHERE_PART_928_INDEX:
                {
                    return handleElseWherePart928(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ELSE_WHERE_PART_929_INDEX:
                {
                    return handleElseWherePart929(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.WHERE_BODY_CONSTRUCT_BLOCK_930_INDEX:
                {
                    return handleWhereBodyConstructBlock930(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.WHERE_BODY_CONSTRUCT_BLOCK_931_INDEX:
                {
                    return handleWhereBodyConstructBlock931(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.WHERE_CONSTRUCT_STMT_932_INDEX:
                {
                    return handleWhereConstructStmt932(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.WHERE_CONSTRUCT_STMT_933_INDEX:
                {
                    return handleWhereConstructStmt933(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.WHERE_BODY_CONSTRUCT_934_INDEX:
                {
                    return handleWhereBodyConstruct934(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.WHERE_BODY_CONSTRUCT_935_INDEX:
                {
                    return handleWhereBodyConstruct935(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.WHERE_BODY_CONSTRUCT_936_INDEX:
                {
                    return handleWhereBodyConstruct936(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.MASK_EXPR_937_INDEX:
                {
                    return handleMaskExpr937(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.MASKED_ELSE_WHERE_STMT_938_INDEX:
                {
                    return handleMaskedElseWhereStmt938(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.MASKED_ELSE_WHERE_STMT_939_INDEX:
                {
                    return handleMaskedElseWhereStmt939(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.MASKED_ELSE_WHERE_STMT_940_INDEX:
                {
                    return handleMaskedElseWhereStmt940(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.MASKED_ELSE_WHERE_STMT_941_INDEX:
                {
                    return handleMaskedElseWhereStmt941(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ELSE_WHERE_STMT_942_INDEX:
                {
                    return handleElseWhereStmt942(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ELSE_WHERE_STMT_943_INDEX:
                {
                    return handleElseWhereStmt943(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ELSE_WHERE_STMT_944_INDEX:
                {
                    return handleElseWhereStmt944(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ELSE_WHERE_STMT_945_INDEX:
                {
                    return handleElseWhereStmt945(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.END_WHERE_STMT_946_INDEX:
                {
                    return handleEndWhereStmt946(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.END_WHERE_STMT_947_INDEX:
                {
                    return handleEndWhereStmt947(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.END_WHERE_STMT_948_INDEX:
                {
                    return handleEndWhereStmt948(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.END_WHERE_STMT_949_INDEX:
                {
                    return handleEndWhereStmt949(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.FORALL_CONSTRUCT_950_INDEX:
                {
                    return handleForallConstruct950(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.FORALL_CONSTRUCT_951_INDEX:
                {
                    return handleForallConstruct951(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.FORALL_BODY_952_INDEX:
                {
                    return handleForallBody952(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.FORALL_BODY_953_INDEX:
                {
                    return handleForallBody953(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.FORALL_CONSTRUCT_STMT_954_INDEX:
                {
                    return handleForallConstructStmt954(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.FORALL_CONSTRUCT_STMT_955_INDEX:
                {
                    return handleForallConstructStmt955(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.FORALL_HEADER_956_INDEX:
                {
                    return handleForallHeader956(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.FORALL_HEADER_957_INDEX:
                {
                    return handleForallHeader957(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.SCALAR_MASK_EXPR_958_INDEX:
                {
                    return handleScalarMaskExpr958(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.FORALL_TRIPLET_SPEC_LIST_959_INDEX:
                {
                    return handleForallTripletSpecList959(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.FORALL_TRIPLET_SPEC_LIST_960_INDEX:
                {
                    return handleForallTripletSpecList960(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.FORALL_TRIPLET_SPEC_LIST_961_INDEX:
                {
                    return handleForallTripletSpecList961(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.FORALL_TRIPLET_SPEC_LIST_962_INDEX:
                {
                    return handleForallTripletSpecList962(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.FORALL_BODY_CONSTRUCT_963_INDEX:
                {
                    return handleForallBodyConstruct963(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.FORALL_BODY_CONSTRUCT_964_INDEX:
                {
                    return handleForallBodyConstruct964(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.FORALL_BODY_CONSTRUCT_965_INDEX:
                {
                    return handleForallBodyConstruct965(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.FORALL_BODY_CONSTRUCT_966_INDEX:
                {
                    return handleForallBodyConstruct966(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.FORALL_BODY_CONSTRUCT_967_INDEX:
                {
                    return handleForallBodyConstruct967(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.FORALL_BODY_CONSTRUCT_968_INDEX:
                {
                    return handleForallBodyConstruct968(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.END_FORALL_STMT_969_INDEX:
                {
                    return handleEndForallStmt969(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.END_FORALL_STMT_970_INDEX:
                {
                    return handleEndForallStmt970(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.END_FORALL_STMT_971_INDEX:
                {
                    return handleEndForallStmt971(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.END_FORALL_STMT_972_INDEX:
                {
                    return handleEndForallStmt972(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.FORALL_STMT_973_INDEX:
                {
                    return handleForallStmt973(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.FORALL_STMT_974_INDEX:
                {
                    return handleForallStmt974(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.IF_CONSTRUCT_975_INDEX:
                {
                    return handleIfConstruct975(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.THEN_PART_976_INDEX:
                {
                    return handleThenPart976(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.THEN_PART_977_INDEX:
                {
                    return handleThenPart977(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.THEN_PART_978_INDEX:
                {
                    return handleThenPart978(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.THEN_PART_979_INDEX:
                {
                    return handleThenPart979(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.THEN_PART_980_INDEX:
                {
                    return handleThenPart980(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.THEN_PART_981_INDEX:
                {
                    return handleThenPart981(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ELSE_IF_CONSTRUCT_982_INDEX:
                {
                    return handleElseIfConstruct982(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ELSE_CONSTRUCT_983_INDEX:
                {
                    return handleElseConstruct983(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ELSE_PART_984_INDEX:
                {
                    return handleElsePart984(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ELSE_PART_985_INDEX:
                {
                    return handleElsePart985(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.CONDITIONAL_BODY_986_INDEX:
                {
                    return handleConditionalBody986(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.CONDITIONAL_BODY_987_INDEX:
                {
                    return handleConditionalBody987(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.IF_THEN_STMT_988_INDEX:
                {
                    return handleIfThenStmt988(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.IF_THEN_STMT_989_INDEX:
                {
                    return handleIfThenStmt989(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.IF_THEN_STMT_990_INDEX:
                {
                    return handleIfThenStmt990(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.IF_THEN_STMT_991_INDEX:
                {
                    return handleIfThenStmt991(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ELSE_IF_STMT_992_INDEX:
                {
                    return handleElseIfStmt992(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ELSE_IF_STMT_993_INDEX:
                {
                    return handleElseIfStmt993(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ELSE_IF_STMT_994_INDEX:
                {
                    return handleElseIfStmt994(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ELSE_IF_STMT_995_INDEX:
                {
                    return handleElseIfStmt995(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ELSE_STMT_996_INDEX:
                {
                    return handleElseStmt996(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ELSE_STMT_997_INDEX:
                {
                    return handleElseStmt997(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.END_IF_STMT_998_INDEX:
                {
                    return handleEndIfStmt998(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.END_IF_STMT_999_INDEX:
                {
                    return handleEndIfStmt999(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.END_IF_STMT_1000_INDEX:
                {
                    return handleEndIfStmt1000(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.END_IF_STMT_1001_INDEX:
                {
                    return handleEndIfStmt1001(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.IF_STMT_1002_INDEX:
                {
                    return handleIfStmt1002(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.BLOCK_CONSTRUCT_1003_INDEX:
                {
                    return handleBlockConstruct1003(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.BLOCK_CONSTRUCT_1004_INDEX:
                {
                    return handleBlockConstruct1004(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.BLOCK_STMT_1005_INDEX:
                {
                    return handleBlockStmt1005(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.BLOCK_STMT_1006_INDEX:
                {
                    return handleBlockStmt1006(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.END_BLOCK_STMT_1007_INDEX:
                {
                    return handleEndBlockStmt1007(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.END_BLOCK_STMT_1008_INDEX:
                {
                    return handleEndBlockStmt1008(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.END_BLOCK_STMT_1009_INDEX:
                {
                    return handleEndBlockStmt1009(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.END_BLOCK_STMT_1010_INDEX:
                {
                    return handleEndBlockStmt1010(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.CRITICAL_CONSTRUCT_1011_INDEX:
                {
                    return handleCriticalConstruct1011(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.CRITICAL_CONSTRUCT_1012_INDEX:
                {
                    return handleCriticalConstruct1012(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.CRITICAL_STMT_1013_INDEX:
                {
                    return handleCriticalStmt1013(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.CRITICAL_STMT_1014_INDEX:
                {
                    return handleCriticalStmt1014(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.END_CRITICAL_STMT_1015_INDEX:
                {
                    return handleEndCriticalStmt1015(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.END_CRITICAL_STMT_1016_INDEX:
                {
                    return handleEndCriticalStmt1016(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.END_CRITICAL_STMT_1017_INDEX:
                {
                    return handleEndCriticalStmt1017(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.END_CRITICAL_STMT_1018_INDEX:
                {
                    return handleEndCriticalStmt1018(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.CASE_CONSTRUCT_1019_INDEX:
                {
                    return handleCaseConstruct1019(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.SELECT_CASE_RANGE_1020_INDEX:
                {
                    return handleSelectCaseRange1020(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.SELECT_CASE_RANGE_1021_INDEX:
                {
                    return handleSelectCaseRange1021(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.SELECT_CASE_BODY_1022_INDEX:
                {
                    return handleSelectCaseBody1022(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.SELECT_CASE_BODY_1023_INDEX:
                {
                    return handleSelectCaseBody1023(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.CASE_BODY_CONSTRUCT_1024_INDEX:
                {
                    return handleCaseBodyConstruct1024(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.CASE_BODY_CONSTRUCT_1025_INDEX:
                {
                    return handleCaseBodyConstruct1025(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.SELECT_CASE_STMT_1026_INDEX:
                {
                    return handleSelectCaseStmt1026(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.SELECT_CASE_STMT_1027_INDEX:
                {
                    return handleSelectCaseStmt1027(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.SELECT_CASE_STMT_1028_INDEX:
                {
                    return handleSelectCaseStmt1028(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.SELECT_CASE_STMT_1029_INDEX:
                {
                    return handleSelectCaseStmt1029(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.CASE_STMT_1030_INDEX:
                {
                    return handleCaseStmt1030(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.CASE_STMT_1031_INDEX:
                {
                    return handleCaseStmt1031(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.END_SELECT_STMT_1032_INDEX:
                {
                    return handleEndSelectStmt1032(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.END_SELECT_STMT_1033_INDEX:
                {
                    return handleEndSelectStmt1033(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.END_SELECT_STMT_1034_INDEX:
                {
                    return handleEndSelectStmt1034(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.END_SELECT_STMT_1035_INDEX:
                {
                    return handleEndSelectStmt1035(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.CASE_SELECTOR_1036_INDEX:
                {
                    return handleCaseSelector1036(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.CASE_SELECTOR_1037_INDEX:
                {
                    return handleCaseSelector1037(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.CASE_VALUE_RANGE_LIST_1038_INDEX:
                {
                    return handleCaseValueRangeList1038(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.CASE_VALUE_RANGE_LIST_1039_INDEX:
                {
                    return handleCaseValueRangeList1039(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.CASE_VALUE_RANGE_1040_INDEX:
                {
                    return handleCaseValueRange1040(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.CASE_VALUE_RANGE_1041_INDEX:
                {
                    return handleCaseValueRange1041(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.CASE_VALUE_RANGE_1042_INDEX:
                {
                    return handleCaseValueRange1042(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.CASE_VALUE_RANGE_1043_INDEX:
                {
                    return handleCaseValueRange1043(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ASSOCIATE_CONSTRUCT_1044_INDEX:
                {
                    return handleAssociateConstruct1044(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ASSOCIATE_CONSTRUCT_1045_INDEX:
                {
                    return handleAssociateConstruct1045(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ASSOCIATE_STMT_1046_INDEX:
                {
                    return handleAssociateStmt1046(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ASSOCIATE_STMT_1047_INDEX:
                {
                    return handleAssociateStmt1047(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ASSOCIATION_LIST_1048_INDEX:
                {
                    return handleAssociationList1048(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ASSOCIATION_LIST_1049_INDEX:
                {
                    return handleAssociationList1049(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ASSOCIATION_1050_INDEX:
                {
                    return handleAssociation1050(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.SELECTOR_1051_INDEX:
                {
                    return handleSelector1051(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ASSOCIATE_BODY_1052_INDEX:
                {
                    return handleAssociateBody1052(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ASSOCIATE_BODY_1053_INDEX:
                {
                    return handleAssociateBody1053(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.END_ASSOCIATE_STMT_1054_INDEX:
                {
                    return handleEndAssociateStmt1054(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.END_ASSOCIATE_STMT_1055_INDEX:
                {
                    return handleEndAssociateStmt1055(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.SELECT_TYPE_CONSTRUCT_1056_INDEX:
                {
                    return handleSelectTypeConstruct1056(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.SELECT_TYPE_CONSTRUCT_1057_INDEX:
                {
                    return handleSelectTypeConstruct1057(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.SELECT_TYPE_BODY_1058_INDEX:
                {
                    return handleSelectTypeBody1058(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.SELECT_TYPE_BODY_1059_INDEX:
                {
                    return handleSelectTypeBody1059(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.TYPE_GUARD_BLOCK_1060_INDEX:
                {
                    return handleTypeGuardBlock1060(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.TYPE_GUARD_BLOCK_1061_INDEX:
                {
                    return handleTypeGuardBlock1061(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.SELECT_TYPE_STMT_1062_INDEX:
                {
                    return handleSelectTypeStmt1062(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.SELECT_TYPE_STMT_1063_INDEX:
                {
                    return handleSelectTypeStmt1063(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.SELECT_TYPE_STMT_1064_INDEX:
                {
                    return handleSelectTypeStmt1064(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.SELECT_TYPE_STMT_1065_INDEX:
                {
                    return handleSelectTypeStmt1065(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.TYPE_GUARD_STMT_1066_INDEX:
                {
                    return handleTypeGuardStmt1066(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.TYPE_GUARD_STMT_1067_INDEX:
                {
                    return handleTypeGuardStmt1067(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.TYPE_GUARD_STMT_1068_INDEX:
                {
                    return handleTypeGuardStmt1068(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.TYPE_GUARD_STMT_1069_INDEX:
                {
                    return handleTypeGuardStmt1069(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.TYPE_GUARD_STMT_1070_INDEX:
                {
                    return handleTypeGuardStmt1070(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.TYPE_GUARD_STMT_1071_INDEX:
                {
                    return handleTypeGuardStmt1071(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.END_SELECT_TYPE_STMT_1072_INDEX:
                {
                    return handleEndSelectTypeStmt1072(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.END_SELECT_TYPE_STMT_1073_INDEX:
                {
                    return handleEndSelectTypeStmt1073(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.END_SELECT_TYPE_STMT_1074_INDEX:
                {
                    return handleEndSelectTypeStmt1074(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.END_SELECT_TYPE_STMT_1075_INDEX:
                {
                    return handleEndSelectTypeStmt1075(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.DO_CONSTRUCT_1076_INDEX:
                {
                    return handleDoConstruct1076(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.BLOCK_DO_CONSTRUCT_1077_INDEX:
                {
                    return handleBlockDoConstruct1077(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.LABEL_DO_STMT_1078_INDEX:
                {
                    return handleLabelDoStmt1078(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.LABEL_DO_STMT_1079_INDEX:
                {
                    return handleLabelDoStmt1079(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.LABEL_DO_STMT_1080_INDEX:
                {
                    return handleLabelDoStmt1080(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.LABEL_DO_STMT_1081_INDEX:
                {
                    return handleLabelDoStmt1081(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.LABEL_DO_STMT_1082_INDEX:
                {
                    return handleLabelDoStmt1082(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.LABEL_DO_STMT_1083_INDEX:
                {
                    return handleLabelDoStmt1083(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.LABEL_DO_STMT_1084_INDEX:
                {
                    return handleLabelDoStmt1084(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.LABEL_DO_STMT_1085_INDEX:
                {
                    return handleLabelDoStmt1085(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.COMMA_LOOP_CONTROL_1086_INDEX:
                {
                    return handleCommaLoopControl1086(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.COMMA_LOOP_CONTROL_1087_INDEX:
                {
                    return handleCommaLoopControl1087(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.LOOP_CONTROL_1088_INDEX:
                {
                    return handleLoopControl1088(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.LOOP_CONTROL_1089_INDEX:
                {
                    return handleLoopControl1089(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.LOOP_CONTROL_1090_INDEX:
                {
                    return handleLoopControl1090(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.END_DO_STMT_1091_INDEX:
                {
                    return handleEndDoStmt1091(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.END_DO_STMT_1092_INDEX:
                {
                    return handleEndDoStmt1092(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.END_DO_STMT_1093_INDEX:
                {
                    return handleEndDoStmt1093(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.END_DO_STMT_1094_INDEX:
                {
                    return handleEndDoStmt1094(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.CYCLE_STMT_1095_INDEX:
                {
                    return handleCycleStmt1095(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.CYCLE_STMT_1096_INDEX:
                {
                    return handleCycleStmt1096(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.EXIT_STMT_1097_INDEX:
                {
                    return handleExitStmt1097(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.EXIT_STMT_1098_INDEX:
                {
                    return handleExitStmt1098(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.GOTO_STMT_1099_INDEX:
                {
                    return handleGotoStmt1099(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.GO_TO_KW_1100_INDEX:
                {
                    return handleGoToKw1100(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.GO_TO_KW_1101_INDEX:
                {
                    return handleGoToKw1101(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.COMPUTED_GOTO_STMT_1102_INDEX:
                {
                    return handleComputedGotoStmt1102(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.COMPUTED_GOTO_STMT_1103_INDEX:
                {
                    return handleComputedGotoStmt1103(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.COMMA_EXP_1104_INDEX:
                {
                    return handleCommaExp1104(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.LBL_REF_LIST_1105_INDEX:
                {
                    return handleLblRefList1105(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.LBL_REF_LIST_1106_INDEX:
                {
                    return handleLblRefList1106(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.LBL_REF_1107_INDEX:
                {
                    return handleLblRef1107(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ARITHMETIC_IF_STMT_1108_INDEX:
                {
                    return handleArithmeticIfStmt1108(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.CONTINUE_STMT_1109_INDEX:
                {
                    return handleContinueStmt1109(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.STOP_STMT_1110_INDEX:
                {
                    return handleStopStmt1110(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.STOP_STMT_1111_INDEX:
                {
                    return handleStopStmt1111(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.STOP_STMT_1112_INDEX:
                {
                    return handleStopStmt1112(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.STOP_STMT_1113_INDEX:
                {
                    return handleStopStmt1113(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ALL_STOP_STMT_1114_INDEX:
                {
                    return handleAllStopStmt1114(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ALL_STOP_STMT_1115_INDEX:
                {
                    return handleAllStopStmt1115(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ALL_STOP_STMT_1116_INDEX:
                {
                    return handleAllStopStmt1116(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ALL_STOP_STMT_1117_INDEX:
                {
                    return handleAllStopStmt1117(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ALL_STOP_STMT_1118_INDEX:
                {
                    return handleAllStopStmt1118(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ALL_STOP_STMT_1119_INDEX:
                {
                    return handleAllStopStmt1119(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ALL_STOP_STMT_1120_INDEX:
                {
                    return handleAllStopStmt1120(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ALL_STOP_STMT_1121_INDEX:
                {
                    return handleAllStopStmt1121(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.SYNC_ALL_STMT_1122_INDEX:
                {
                    return handleSyncAllStmt1122(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.SYNC_ALL_STMT_1123_INDEX:
                {
                    return handleSyncAllStmt1123(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.SYNC_ALL_STMT_1124_INDEX:
                {
                    return handleSyncAllStmt1124(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.SYNC_ALL_STMT_1125_INDEX:
                {
                    return handleSyncAllStmt1125(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.SYNC_STAT_LIST_1126_INDEX:
                {
                    return handleSyncStatList1126(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.SYNC_STAT_LIST_1127_INDEX:
                {
                    return handleSyncStatList1127(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.SYNC_STAT_1128_INDEX:
                {
                    return handleSyncStat1128(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.SYNC_IMAGES_STMT_1129_INDEX:
                {
                    return handleSyncImagesStmt1129(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.SYNC_IMAGES_STMT_1130_INDEX:
                {
                    return handleSyncImagesStmt1130(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.SYNC_IMAGES_STMT_1131_INDEX:
                {
                    return handleSyncImagesStmt1131(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.SYNC_IMAGES_STMT_1132_INDEX:
                {
                    return handleSyncImagesStmt1132(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.IMAGE_SET_1133_INDEX:
                {
                    return handleImageSet1133(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.IMAGE_SET_1134_INDEX:
                {
                    return handleImageSet1134(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.SYNC_MEMORY_STMT_1135_INDEX:
                {
                    return handleSyncMemoryStmt1135(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.SYNC_MEMORY_STMT_1136_INDEX:
                {
                    return handleSyncMemoryStmt1136(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.SYNC_MEMORY_STMT_1137_INDEX:
                {
                    return handleSyncMemoryStmt1137(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.SYNC_MEMORY_STMT_1138_INDEX:
                {
                    return handleSyncMemoryStmt1138(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.LOCK_STMT_1139_INDEX:
                {
                    return handleLockStmt1139(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.LOCK_STMT_1140_INDEX:
                {
                    return handleLockStmt1140(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.UNLOCK_STMT_1141_INDEX:
                {
                    return handleUnlockStmt1141(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.UNLOCK_STMT_1142_INDEX:
                {
                    return handleUnlockStmt1142(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.UNIT_IDENTIFIER_1143_INDEX:
                {
                    return handleUnitIdentifier1143(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.UNIT_IDENTIFIER_1144_INDEX:
                {
                    return handleUnitIdentifier1144(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.OPEN_STMT_1145_INDEX:
                {
                    return handleOpenStmt1145(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.CONNECT_SPEC_LIST_1146_INDEX:
                {
                    return handleConnectSpecList1146(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.CONNECT_SPEC_LIST_1147_INDEX:
                {
                    return handleConnectSpecList1147(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.CONNECT_SPEC_1148_INDEX:
                {
                    return handleConnectSpec1148(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.CONNECT_SPEC_1149_INDEX:
                {
                    return handleConnectSpec1149(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.CONNECT_SPEC_1150_INDEX:
                {
                    return handleConnectSpec1150(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.CONNECT_SPEC_1151_INDEX:
                {
                    return handleConnectSpec1151(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.CONNECT_SPEC_1152_INDEX:
                {
                    return handleConnectSpec1152(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.CONNECT_SPEC_1153_INDEX:
                {
                    return handleConnectSpec1153(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.CONNECT_SPEC_1154_INDEX:
                {
                    return handleConnectSpec1154(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.CONNECT_SPEC_1155_INDEX:
                {
                    return handleConnectSpec1155(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.CONNECT_SPEC_1156_INDEX:
                {
                    return handleConnectSpec1156(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.CONNECT_SPEC_1157_INDEX:
                {
                    return handleConnectSpec1157(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.CONNECT_SPEC_1158_INDEX:
                {
                    return handleConnectSpec1158(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.CONNECT_SPEC_1159_INDEX:
                {
                    return handleConnectSpec1159(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.CONNECT_SPEC_1160_INDEX:
                {
                    return handleConnectSpec1160(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.CONNECT_SPEC_1161_INDEX:
                {
                    return handleConnectSpec1161(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.CONNECT_SPEC_1162_INDEX:
                {
                    return handleConnectSpec1162(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.CONNECT_SPEC_1163_INDEX:
                {
                    return handleConnectSpec1163(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.CONNECT_SPEC_1164_INDEX:
                {
                    return handleConnectSpec1164(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.CONNECT_SPEC_1165_INDEX:
                {
                    return handleConnectSpec1165(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.CONNECT_SPEC_1166_INDEX:
                {
                    return handleConnectSpec1166(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.CONNECT_SPEC_1167_INDEX:
                {
                    return handleConnectSpec1167(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.CONNECT_SPEC_1168_INDEX:
                {
                    return handleConnectSpec1168(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.CLOSE_STMT_1169_INDEX:
                {
                    return handleCloseStmt1169(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.CLOSE_SPEC_LIST_1170_INDEX:
                {
                    return handleCloseSpecList1170(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.CLOSE_SPEC_LIST_1171_INDEX:
                {
                    return handleCloseSpecList1171(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.CLOSE_SPEC_LIST_1172_INDEX:
                {
                    return handleCloseSpecList1172(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.CLOSE_SPEC_1173_INDEX:
                {
                    return handleCloseSpec1173(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.CLOSE_SPEC_1174_INDEX:
                {
                    return handleCloseSpec1174(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.CLOSE_SPEC_1175_INDEX:
                {
                    return handleCloseSpec1175(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.CLOSE_SPEC_1176_INDEX:
                {
                    return handleCloseSpec1176(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.CLOSE_SPEC_1177_INDEX:
                {
                    return handleCloseSpec1177(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.READ_STMT_1178_INDEX:
                {
                    return handleReadStmt1178(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.READ_STMT_1179_INDEX:
                {
                    return handleReadStmt1179(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.READ_STMT_1180_INDEX:
                {
                    return handleReadStmt1180(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.READ_STMT_1181_INDEX:
                {
                    return handleReadStmt1181(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.READ_STMT_1182_INDEX:
                {
                    return handleReadStmt1182(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.RD_CTL_SPEC_1183_INDEX:
                {
                    return handleRdCtlSpec1183(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.RD_CTL_SPEC_1184_INDEX:
                {
                    return handleRdCtlSpec1184(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.RD_UNIT_ID_1185_INDEX:
                {
                    return handleRdUnitId1185(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.RD_UNIT_ID_1186_INDEX:
                {
                    return handleRdUnitId1186(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.RD_IO_CTL_SPEC_LIST_1187_INDEX:
                {
                    return handleRdIoCtlSpecList1187(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.RD_IO_CTL_SPEC_LIST_1188_INDEX:
                {
                    return handleRdIoCtlSpecList1188(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.RD_IO_CTL_SPEC_LIST_1189_INDEX:
                {
                    return handleRdIoCtlSpecList1189(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.RD_IO_CTL_SPEC_LIST_1190_INDEX:
                {
                    return handleRdIoCtlSpecList1190(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.RD_FMT_ID_1191_INDEX:
                {
                    return handleRdFmtId1191(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.RD_FMT_ID_1192_INDEX:
                {
                    return handleRdFmtId1192(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.RD_FMT_ID_1193_INDEX:
                {
                    return handleRdFmtId1193(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.RD_FMT_ID_1194_INDEX:
                {
                    return handleRdFmtId1194(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.RD_FMT_ID_1195_INDEX:
                {
                    return handleRdFmtId1195(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.RD_FMT_ID_EXPR_1196_INDEX:
                {
                    return handleRdFmtIdExpr1196(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.WRITE_STMT_1197_INDEX:
                {
                    return handleWriteStmt1197(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.WRITE_STMT_1198_INDEX:
                {
                    return handleWriteStmt1198(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.WRITE_STMT_1199_INDEX:
                {
                    return handleWriteStmt1199(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.PRINT_STMT_1200_INDEX:
                {
                    return handlePrintStmt1200(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.PRINT_STMT_1201_INDEX:
                {
                    return handlePrintStmt1201(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.IO_CONTROL_SPEC_LIST_1202_INDEX:
                {
                    return handleIoControlSpecList1202(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.IO_CONTROL_SPEC_LIST_1203_INDEX:
                {
                    return handleIoControlSpecList1203(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.IO_CONTROL_SPEC_LIST_1204_INDEX:
                {
                    return handleIoControlSpecList1204(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.IO_CONTROL_SPEC_LIST_1205_INDEX:
                {
                    return handleIoControlSpecList1205(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.IO_CONTROL_SPEC_LIST_1206_INDEX:
                {
                    return handleIoControlSpecList1206(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.IO_CONTROL_SPEC_1207_INDEX:
                {
                    return handleIoControlSpec1207(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.IO_CONTROL_SPEC_1208_INDEX:
                {
                    return handleIoControlSpec1208(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.IO_CONTROL_SPEC_1209_INDEX:
                {
                    return handleIoControlSpec1209(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.IO_CONTROL_SPEC_1210_INDEX:
                {
                    return handleIoControlSpec1210(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.IO_CONTROL_SPEC_1211_INDEX:
                {
                    return handleIoControlSpec1211(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.IO_CONTROL_SPEC_1212_INDEX:
                {
                    return handleIoControlSpec1212(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.IO_CONTROL_SPEC_1213_INDEX:
                {
                    return handleIoControlSpec1213(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.IO_CONTROL_SPEC_1214_INDEX:
                {
                    return handleIoControlSpec1214(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.IO_CONTROL_SPEC_1215_INDEX:
                {
                    return handleIoControlSpec1215(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.IO_CONTROL_SPEC_1216_INDEX:
                {
                    return handleIoControlSpec1216(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.IO_CONTROL_SPEC_1217_INDEX:
                {
                    return handleIoControlSpec1217(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.IO_CONTROL_SPEC_1218_INDEX:
                {
                    return handleIoControlSpec1218(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.IO_CONTROL_SPEC_1219_INDEX:
                {
                    return handleIoControlSpec1219(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.IO_CONTROL_SPEC_1220_INDEX:
                {
                    return handleIoControlSpec1220(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.IO_CONTROL_SPEC_1221_INDEX:
                {
                    return handleIoControlSpec1221(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.IO_CONTROL_SPEC_1222_INDEX:
                {
                    return handleIoControlSpec1222(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.IO_CONTROL_SPEC_1223_INDEX:
                {
                    return handleIoControlSpec1223(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.FORMAT_IDENTIFIER_1224_INDEX:
                {
                    return handleFormatIdentifier1224(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.FORMAT_IDENTIFIER_1225_INDEX:
                {
                    return handleFormatIdentifier1225(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.FORMAT_IDENTIFIER_1226_INDEX:
                {
                    return handleFormatIdentifier1226(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.INPUT_ITEM_LIST_1227_INDEX:
                {
                    return handleInputItemList1227(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.INPUT_ITEM_LIST_1228_INDEX:
                {
                    return handleInputItemList1228(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.INPUT_ITEM_1229_INDEX:
                {
                    return handleInputItem1229(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.INPUT_ITEM_1230_INDEX:
                {
                    return handleInputItem1230(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.OUTPUT_ITEM_LIST_1231_INDEX:
                {
                    return handleOutputItemList1231(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.OUTPUT_ITEM_LIST_1232_INDEX:
                {
                    return handleOutputItemList1232(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.OUTPUT_ITEM_LIST_1_1233_INDEX:
                {
                    return handleOutputItemList11233(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.OUTPUT_ITEM_LIST_1_1234_INDEX:
                {
                    return handleOutputItemList11234(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.OUTPUT_ITEM_LIST_1_1235_INDEX:
                {
                    return handleOutputItemList11235(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.OUTPUT_ITEM_LIST_1_1236_INDEX:
                {
                    return handleOutputItemList11236(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.OUTPUT_ITEM_LIST_1_1237_INDEX:
                {
                    return handleOutputItemList11237(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.INPUT_IMPLIED_DO_1238_INDEX:
                {
                    return handleInputImpliedDo1238(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.INPUT_IMPLIED_DO_1239_INDEX:
                {
                    return handleInputImpliedDo1239(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.OUTPUT_IMPLIED_DO_1240_INDEX:
                {
                    return handleOutputImpliedDo1240(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.OUTPUT_IMPLIED_DO_1241_INDEX:
                {
                    return handleOutputImpliedDo1241(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.OUTPUT_IMPLIED_DO_1242_INDEX:
                {
                    return handleOutputImpliedDo1242(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.OUTPUT_IMPLIED_DO_1243_INDEX:
                {
                    return handleOutputImpliedDo1243(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.WAIT_STMT_1244_INDEX:
                {
                    return handleWaitStmt1244(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.WAIT_SPEC_LIST_1245_INDEX:
                {
                    return handleWaitSpecList1245(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.WAIT_SPEC_LIST_1246_INDEX:
                {
                    return handleWaitSpecList1246(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.WAIT_SPEC_1247_INDEX:
                {
                    return handleWaitSpec1247(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.WAIT_SPEC_1248_INDEX:
                {
                    return handleWaitSpec1248(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.BACKSPACE_STMT_1249_INDEX:
                {
                    return handleBackspaceStmt1249(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.BACKSPACE_STMT_1250_INDEX:
                {
                    return handleBackspaceStmt1250(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ENDFILE_STMT_1251_INDEX:
                {
                    return handleEndfileStmt1251(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ENDFILE_STMT_1252_INDEX:
                {
                    return handleEndfileStmt1252(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ENDFILE_STMT_1253_INDEX:
                {
                    return handleEndfileStmt1253(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ENDFILE_STMT_1254_INDEX:
                {
                    return handleEndfileStmt1254(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.REWIND_STMT_1255_INDEX:
                {
                    return handleRewindStmt1255(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.REWIND_STMT_1256_INDEX:
                {
                    return handleRewindStmt1256(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.POSITION_SPEC_LIST_1257_INDEX:
                {
                    return handlePositionSpecList1257(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.POSITION_SPEC_LIST_1258_INDEX:
                {
                    return handlePositionSpecList1258(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.POSITION_SPEC_LIST_1259_INDEX:
                {
                    return handlePositionSpecList1259(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.POSITION_SPEC_1260_INDEX:
                {
                    return handlePositionSpec1260(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.POSITION_SPEC_1261_INDEX:
                {
                    return handlePositionSpec1261(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.POSITION_SPEC_1262_INDEX:
                {
                    return handlePositionSpec1262(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.INQUIRE_STMT_1263_INDEX:
                {
                    return handleInquireStmt1263(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.INQUIRE_STMT_1264_INDEX:
                {
                    return handleInquireStmt1264(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.INQUIRE_SPEC_LIST_1265_INDEX:
                {
                    return handleInquireSpecList1265(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.INQUIRE_SPEC_LIST_1266_INDEX:
                {
                    return handleInquireSpecList1266(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.INQUIRE_SPEC_LIST_1267_INDEX:
                {
                    return handleInquireSpecList1267(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.INQUIRE_SPEC_1268_INDEX:
                {
                    return handleInquireSpec1268(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.INQUIRE_SPEC_1269_INDEX:
                {
                    return handleInquireSpec1269(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.INQUIRE_SPEC_1270_INDEX:
                {
                    return handleInquireSpec1270(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.INQUIRE_SPEC_1271_INDEX:
                {
                    return handleInquireSpec1271(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.INQUIRE_SPEC_1272_INDEX:
                {
                    return handleInquireSpec1272(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.INQUIRE_SPEC_1273_INDEX:
                {
                    return handleInquireSpec1273(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.INQUIRE_SPEC_1274_INDEX:
                {
                    return handleInquireSpec1274(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.INQUIRE_SPEC_1275_INDEX:
                {
                    return handleInquireSpec1275(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.INQUIRE_SPEC_1276_INDEX:
                {
                    return handleInquireSpec1276(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.INQUIRE_SPEC_1277_INDEX:
                {
                    return handleInquireSpec1277(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.INQUIRE_SPEC_1278_INDEX:
                {
                    return handleInquireSpec1278(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.INQUIRE_SPEC_1279_INDEX:
                {
                    return handleInquireSpec1279(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.INQUIRE_SPEC_1280_INDEX:
                {
                    return handleInquireSpec1280(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.INQUIRE_SPEC_1281_INDEX:
                {
                    return handleInquireSpec1281(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.INQUIRE_SPEC_1282_INDEX:
                {
                    return handleInquireSpec1282(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.INQUIRE_SPEC_1283_INDEX:
                {
                    return handleInquireSpec1283(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.INQUIRE_SPEC_1284_INDEX:
                {
                    return handleInquireSpec1284(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.INQUIRE_SPEC_1285_INDEX:
                {
                    return handleInquireSpec1285(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.INQUIRE_SPEC_1286_INDEX:
                {
                    return handleInquireSpec1286(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.INQUIRE_SPEC_1287_INDEX:
                {
                    return handleInquireSpec1287(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.INQUIRE_SPEC_1288_INDEX:
                {
                    return handleInquireSpec1288(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.INQUIRE_SPEC_1289_INDEX:
                {
                    return handleInquireSpec1289(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.INQUIRE_SPEC_1290_INDEX:
                {
                    return handleInquireSpec1290(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.INQUIRE_SPEC_1291_INDEX:
                {
                    return handleInquireSpec1291(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.INQUIRE_SPEC_1292_INDEX:
                {
                    return handleInquireSpec1292(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.INQUIRE_SPEC_1293_INDEX:
                {
                    return handleInquireSpec1293(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.INQUIRE_SPEC_1294_INDEX:
                {
                    return handleInquireSpec1294(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.INQUIRE_SPEC_1295_INDEX:
                {
                    return handleInquireSpec1295(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.INQUIRE_SPEC_1296_INDEX:
                {
                    return handleInquireSpec1296(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.INQUIRE_SPEC_1297_INDEX:
                {
                    return handleInquireSpec1297(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.INQUIRE_SPEC_1298_INDEX:
                {
                    return handleInquireSpec1298(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.INQUIRE_SPEC_1299_INDEX:
                {
                    return handleInquireSpec1299(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.INQUIRE_SPEC_1300_INDEX:
                {
                    return handleInquireSpec1300(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.INQUIRE_SPEC_1301_INDEX:
                {
                    return handleInquireSpec1301(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.INQUIRE_SPEC_1302_INDEX:
                {
                    return handleInquireSpec1302(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.INQUIRE_SPEC_1303_INDEX:
                {
                    return handleInquireSpec1303(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.FORMAT_STMT_1304_INDEX:
                {
                    return handleFormatStmt1304(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.FORMAT_STMT_1305_INDEX:
                {
                    return handleFormatStmt1305(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.FMT_SPEC_1306_INDEX:
                {
                    return handleFmtSpec1306(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.FMT_SPEC_1307_INDEX:
                {
                    return handleFmtSpec1307(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.FMT_SPEC_1308_INDEX:
                {
                    return handleFmtSpec1308(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.FMT_SPEC_1309_INDEX:
                {
                    return handleFmtSpec1309(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.FMT_SPEC_1310_INDEX:
                {
                    return handleFmtSpec1310(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.FMT_SPEC_1311_INDEX:
                {
                    return handleFmtSpec1311(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.FMT_SPEC_1312_INDEX:
                {
                    return handleFmtSpec1312(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.FMT_SPEC_1313_INDEX:
                {
                    return handleFmtSpec1313(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.FORMAT_EDIT_1314_INDEX:
                {
                    return handleFormatEdit1314(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.FORMAT_EDIT_1315_INDEX:
                {
                    return handleFormatEdit1315(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.FORMAT_EDIT_1316_INDEX:
                {
                    return handleFormatEdit1316(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.FORMAT_EDIT_1317_INDEX:
                {
                    return handleFormatEdit1317(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.FORMAT_EDIT_1318_INDEX:
                {
                    return handleFormatEdit1318(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.FORMAT_EDIT_1319_INDEX:
                {
                    return handleFormatEdit1319(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.EDIT_ELEMENT_1320_INDEX:
                {
                    return handleEditElement1320(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.EDIT_ELEMENT_1321_INDEX:
                {
                    return handleEditElement1321(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.EDIT_ELEMENT_1322_INDEX:
                {
                    return handleEditElement1322(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.EDIT_ELEMENT_1323_INDEX:
                {
                    return handleEditElement1323(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.EDIT_ELEMENT_1324_INDEX:
                {
                    return handleEditElement1324(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.FORMATSEP_1325_INDEX:
                {
                    return handleFormatsep1325(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.FORMATSEP_1326_INDEX:
                {
                    return handleFormatsep1326(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.PROGRAM_STMT_1327_INDEX:
                {
                    return handleProgramStmt1327(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.END_PROGRAM_STMT_1328_INDEX:
                {
                    return handleEndProgramStmt1328(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.END_PROGRAM_STMT_1329_INDEX:
                {
                    return handleEndProgramStmt1329(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.END_PROGRAM_STMT_1330_INDEX:
                {
                    return handleEndProgramStmt1330(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.END_PROGRAM_STMT_1331_INDEX:
                {
                    return handleEndProgramStmt1331(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.END_PROGRAM_STMT_1332_INDEX:
                {
                    return handleEndProgramStmt1332(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.MODULE_STMT_1333_INDEX:
                {
                    return handleModuleStmt1333(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.END_MODULE_STMT_1334_INDEX:
                {
                    return handleEndModuleStmt1334(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.END_MODULE_STMT_1335_INDEX:
                {
                    return handleEndModuleStmt1335(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.END_MODULE_STMT_1336_INDEX:
                {
                    return handleEndModuleStmt1336(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.END_MODULE_STMT_1337_INDEX:
                {
                    return handleEndModuleStmt1337(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.END_MODULE_STMT_1338_INDEX:
                {
                    return handleEndModuleStmt1338(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.USE_STMT_1339_INDEX:
                {
                    return handleUseStmt1339(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.USE_STMT_1340_INDEX:
                {
                    return handleUseStmt1340(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.USE_STMT_1341_INDEX:
                {
                    return handleUseStmt1341(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.USE_STMT_1342_INDEX:
                {
                    return handleUseStmt1342(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.USE_STMT_1343_INDEX:
                {
                    return handleUseStmt1343(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.USE_STMT_1344_INDEX:
                {
                    return handleUseStmt1344(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.USE_STMT_1345_INDEX:
                {
                    return handleUseStmt1345(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.USE_STMT_1346_INDEX:
                {
                    return handleUseStmt1346(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.USE_STMT_1347_INDEX:
                {
                    return handleUseStmt1347(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.USE_STMT_1348_INDEX:
                {
                    return handleUseStmt1348(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.USE_STMT_1349_INDEX:
                {
                    return handleUseStmt1349(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.USE_STMT_1350_INDEX:
                {
                    return handleUseStmt1350(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.MODULE_NATURE_1351_INDEX:
                {
                    return handleModuleNature1351(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.MODULE_NATURE_1352_INDEX:
                {
                    return handleModuleNature1352(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.RENAME_LIST_1353_INDEX:
                {
                    return handleRenameList1353(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.RENAME_LIST_1354_INDEX:
                {
                    return handleRenameList1354(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ONLY_LIST_1355_INDEX:
                {
                    return handleOnlyList1355(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ONLY_LIST_1356_INDEX:
                {
                    return handleOnlyList1356(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.RENAME_1357_INDEX:
                {
                    return handleRename1357(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.RENAME_1358_INDEX:
                {
                    return handleRename1358(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ONLY_1359_INDEX:
                {
                    return handleOnly1359(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ONLY_1360_INDEX:
                {
                    return handleOnly1360(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ONLY_1361_INDEX:
                {
                    return handleOnly1361(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ONLY_1362_INDEX:
                {
                    return handleOnly1362(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.BLOCK_DATA_STMT_1363_INDEX:
                {
                    return handleBlockDataStmt1363(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.BLOCK_DATA_STMT_1364_INDEX:
                {
                    return handleBlockDataStmt1364(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.BLOCK_DATA_STMT_1365_INDEX:
                {
                    return handleBlockDataStmt1365(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.BLOCK_DATA_STMT_1366_INDEX:
                {
                    return handleBlockDataStmt1366(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.END_BLOCK_DATA_STMT_1367_INDEX:
                {
                    return handleEndBlockDataStmt1367(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.END_BLOCK_DATA_STMT_1368_INDEX:
                {
                    return handleEndBlockDataStmt1368(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.END_BLOCK_DATA_STMT_1369_INDEX:
                {
                    return handleEndBlockDataStmt1369(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.END_BLOCK_DATA_STMT_1370_INDEX:
                {
                    return handleEndBlockDataStmt1370(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.END_BLOCK_DATA_STMT_1371_INDEX:
                {
                    return handleEndBlockDataStmt1371(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.END_BLOCK_DATA_STMT_1372_INDEX:
                {
                    return handleEndBlockDataStmt1372(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.END_BLOCK_DATA_STMT_1373_INDEX:
                {
                    return handleEndBlockDataStmt1373(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.END_BLOCK_DATA_STMT_1374_INDEX:
                {
                    return handleEndBlockDataStmt1374(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.END_BLOCK_DATA_STMT_1375_INDEX:
                {
                    return handleEndBlockDataStmt1375(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.INTERFACE_BLOCK_1376_INDEX:
                {
                    return handleInterfaceBlock1376(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.INTERFACE_RANGE_1377_INDEX:
                {
                    return handleInterfaceRange1377(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.INTERFACE_BLOCK_BODY_1378_INDEX:
                {
                    return handleInterfaceBlockBody1378(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.INTERFACE_BLOCK_BODY_1379_INDEX:
                {
                    return handleInterfaceBlockBody1379(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.INTERFACE_SPECIFICATION_1380_INDEX:
                {
                    return handleInterfaceSpecification1380(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.INTERFACE_SPECIFICATION_1381_INDEX:
                {
                    return handleInterfaceSpecification1381(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.INTERFACE_STMT_1382_INDEX:
                {
                    return handleInterfaceStmt1382(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.INTERFACE_STMT_1383_INDEX:
                {
                    return handleInterfaceStmt1383(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.INTERFACE_STMT_1384_INDEX:
                {
                    return handleInterfaceStmt1384(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.INTERFACE_STMT_1385_INDEX:
                {
                    return handleInterfaceStmt1385(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.END_INTERFACE_STMT_1386_INDEX:
                {
                    return handleEndInterfaceStmt1386(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.END_INTERFACE_STMT_1387_INDEX:
                {
                    return handleEndInterfaceStmt1387(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.END_INTERFACE_STMT_1388_INDEX:
                {
                    return handleEndInterfaceStmt1388(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.END_INTERFACE_STMT_1389_INDEX:
                {
                    return handleEndInterfaceStmt1389(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.INTERFACE_BODY_1390_INDEX:
                {
                    return handleInterfaceBody1390(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.INTERFACE_BODY_1391_INDEX:
                {
                    return handleInterfaceBody1391(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.FUNCTION_INTERFACE_RANGE_1392_INDEX:
                {
                    return handleFunctionInterfaceRange1392(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.FUNCTION_INTERFACE_RANGE_1393_INDEX:
                {
                    return handleFunctionInterfaceRange1393(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.SUBROUTINE_INTERFACE_RANGE_1394_INDEX:
                {
                    return handleSubroutineInterfaceRange1394(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.SUBROUTINE_INTERFACE_RANGE_1395_INDEX:
                {
                    return handleSubroutineInterfaceRange1395(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.SUBPROGRAM_INTERFACE_BODY_1396_INDEX:
                {
                    return handleSubprogramInterfaceBody1396(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.SUBPROGRAM_INTERFACE_BODY_1397_INDEX:
                {
                    return handleSubprogramInterfaceBody1397(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.MODULE_PROCEDURE_STMT_1398_INDEX:
                {
                    return handleModuleProcedureStmt1398(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.PROCEDURE_NAME_LIST_1399_INDEX:
                {
                    return handleProcedureNameList1399(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.PROCEDURE_NAME_LIST_1400_INDEX:
                {
                    return handleProcedureNameList1400(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.PROCEDURE_NAME_1401_INDEX:
                {
                    return handleProcedureName1401(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.GENERIC_SPEC_1402_INDEX:
                {
                    return handleGenericSpec1402(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.GENERIC_SPEC_1403_INDEX:
                {
                    return handleGenericSpec1403(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.GENERIC_SPEC_1404_INDEX:
                {
                    return handleGenericSpec1404(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.GENERIC_SPEC_1405_INDEX:
                {
                    return handleGenericSpec1405(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.IMPORT_STMT_1406_INDEX:
                {
                    return handleImportStmt1406(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.IMPORT_STMT_1407_INDEX:
                {
                    return handleImportStmt1407(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.IMPORT_STMT_1408_INDEX:
                {
                    return handleImportStmt1408(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.IMPORT_LIST_1409_INDEX:
                {
                    return handleImportList1409(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.IMPORT_LIST_1410_INDEX:
                {
                    return handleImportList1410(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.PROCEDURE_DECLARATION_STMT_1411_INDEX:
                {
                    return handleProcedureDeclarationStmt1411(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.PROCEDURE_DECLARATION_STMT_1412_INDEX:
                {
                    return handleProcedureDeclarationStmt1412(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.PROCEDURE_DECLARATION_STMT_1413_INDEX:
                {
                    return handleProcedureDeclarationStmt1413(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.PROCEDURE_DECLARATION_STMT_1414_INDEX:
                {
                    return handleProcedureDeclarationStmt1414(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.PROCEDURE_DECLARATION_STMT_1415_INDEX:
                {
                    return handleProcedureDeclarationStmt1415(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.PROCEDURE_DECLARATION_STMT_1416_INDEX:
                {
                    return handleProcedureDeclarationStmt1416(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.PROC_ATTR_SPEC_LIST_1417_INDEX:
                {
                    return handleProcAttrSpecList1417(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.PROC_ATTR_SPEC_LIST_1418_INDEX:
                {
                    return handleProcAttrSpecList1418(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.PROC_ATTR_SPEC_1419_INDEX:
                {
                    return handleProcAttrSpec1419(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.PROC_ATTR_SPEC_1420_INDEX:
                {
                    return handleProcAttrSpec1420(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.PROC_ATTR_SPEC_1421_INDEX:
                {
                    return handleProcAttrSpec1421(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.PROC_ATTR_SPEC_1422_INDEX:
                {
                    return handleProcAttrSpec1422(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.PROC_ATTR_SPEC_1423_INDEX:
                {
                    return handleProcAttrSpec1423(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.EXTERNAL_STMT_1424_INDEX:
                {
                    return handleExternalStmt1424(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.EXTERNAL_STMT_1425_INDEX:
                {
                    return handleExternalStmt1425(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.EXTERNAL_NAME_LIST_1426_INDEX:
                {
                    return handleExternalNameList1426(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.EXTERNAL_NAME_LIST_1427_INDEX:
                {
                    return handleExternalNameList1427(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.INTRINSIC_STMT_1428_INDEX:
                {
                    return handleIntrinsicStmt1428(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.INTRINSIC_STMT_1429_INDEX:
                {
                    return handleIntrinsicStmt1429(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.INTRINSIC_LIST_1430_INDEX:
                {
                    return handleIntrinsicList1430(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.INTRINSIC_LIST_1431_INDEX:
                {
                    return handleIntrinsicList1431(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.FUNCTION_REFERENCE_1432_INDEX:
                {
                    return handleFunctionReference1432(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.FUNCTION_REFERENCE_1433_INDEX:
                {
                    return handleFunctionReference1433(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.CALL_STMT_1434_INDEX:
                {
                    return handleCallStmt1434(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.CALL_STMT_1435_INDEX:
                {
                    return handleCallStmt1435(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.CALL_STMT_1436_INDEX:
                {
                    return handleCallStmt1436(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.CALL_STMT_1437_INDEX:
                {
                    return handleCallStmt1437(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.DERIVED_TYPE_QUALIFIERS_1438_INDEX:
                {
                    return handleDerivedTypeQualifiers1438(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.DERIVED_TYPE_QUALIFIERS_1439_INDEX:
                {
                    return handleDerivedTypeQualifiers1439(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.DERIVED_TYPE_QUALIFIERS_1440_INDEX:
                {
                    return handleDerivedTypeQualifiers1440(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.DERIVED_TYPE_QUALIFIERS_1441_INDEX:
                {
                    return handleDerivedTypeQualifiers1441(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.PARENTHESIZED_SUBROUTINE_ARG_LIST_1442_INDEX:
                {
                    return handleParenthesizedSubroutineArgList1442(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.PARENTHESIZED_SUBROUTINE_ARG_LIST_1443_INDEX:
                {
                    return handleParenthesizedSubroutineArgList1443(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.SUBROUTINE_ARG_LIST_1444_INDEX:
                {
                    return handleSubroutineArgList1444(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.SUBROUTINE_ARG_LIST_1445_INDEX:
                {
                    return handleSubroutineArgList1445(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.FUNCTION_ARG_LIST_1446_INDEX:
                {
                    return handleFunctionArgList1446(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.FUNCTION_ARG_LIST_1447_INDEX:
                {
                    return handleFunctionArgList1447(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.FUNCTION_ARG_LIST_1448_INDEX:
                {
                    return handleFunctionArgList1448(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.FUNCTION_ARG_1449_INDEX:
                {
                    return handleFunctionArg1449(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.SUBROUTINE_ARG_1450_INDEX:
                {
                    return handleSubroutineArg1450(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.SUBROUTINE_ARG_1451_INDEX:
                {
                    return handleSubroutineArg1451(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.SUBROUTINE_ARG_1452_INDEX:
                {
                    return handleSubroutineArg1452(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.SUBROUTINE_ARG_1453_INDEX:
                {
                    return handleSubroutineArg1453(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.SUBROUTINE_ARG_1454_INDEX:
                {
                    return handleSubroutineArg1454(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.SUBROUTINE_ARG_1455_INDEX:
                {
                    return handleSubroutineArg1455(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.FUNCTION_STMT_1456_INDEX:
                {
                    return handleFunctionStmt1456(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.FUNCTION_STMT_1457_INDEX:
                {
                    return handleFunctionStmt1457(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.FUNCTION_STMT_1458_INDEX:
                {
                    return handleFunctionStmt1458(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.FUNCTION_STMT_1459_INDEX:
                {
                    return handleFunctionStmt1459(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.FUNCTION_STMT_1460_INDEX:
                {
                    return handleFunctionStmt1460(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.FUNCTION_STMT_1461_INDEX:
                {
                    return handleFunctionStmt1461(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.FUNCTION_STMT_1462_INDEX:
                {
                    return handleFunctionStmt1462(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.FUNCTION_STMT_1463_INDEX:
                {
                    return handleFunctionStmt1463(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.FUNCTION_STMT_1464_INDEX:
                {
                    return handleFunctionStmt1464(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.FUNCTION_STMT_1465_INDEX:
                {
                    return handleFunctionStmt1465(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.FUNCTION_PARS_1466_INDEX:
                {
                    return handleFunctionPars1466(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.FUNCTION_PARS_1467_INDEX:
                {
                    return handleFunctionPars1467(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.FUNCTION_PAR_1468_INDEX:
                {
                    return handleFunctionPar1468(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.FUNCTION_PREFIX_1469_INDEX:
                {
                    return handleFunctionPrefix1469(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.FUNCTION_PREFIX_1470_INDEX:
                {
                    return handleFunctionPrefix1470(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.PREFIX_SPEC_LIST_1471_INDEX:
                {
                    return handlePrefixSpecList1471(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.PREFIX_SPEC_LIST_1472_INDEX:
                {
                    return handlePrefixSpecList1472(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.PREFIX_SPEC_1473_INDEX:
                {
                    return handlePrefixSpec1473(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.PREFIX_SPEC_1474_INDEX:
                {
                    return handlePrefixSpec1474(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.PREFIX_SPEC_1475_INDEX:
                {
                    return handlePrefixSpec1475(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.PREFIX_SPEC_1476_INDEX:
                {
                    return handlePrefixSpec1476(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.PREFIX_SPEC_1477_INDEX:
                {
                    return handlePrefixSpec1477(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.PREFIX_SPEC_1478_INDEX:
                {
                    return handlePrefixSpec1478(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.END_FUNCTION_STMT_1479_INDEX:
                {
                    return handleEndFunctionStmt1479(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.END_FUNCTION_STMT_1480_INDEX:
                {
                    return handleEndFunctionStmt1480(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.END_FUNCTION_STMT_1481_INDEX:
                {
                    return handleEndFunctionStmt1481(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.END_FUNCTION_STMT_1482_INDEX:
                {
                    return handleEndFunctionStmt1482(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.END_FUNCTION_STMT_1483_INDEX:
                {
                    return handleEndFunctionStmt1483(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.SUBROUTINE_STMT_1484_INDEX:
                {
                    return handleSubroutineStmt1484(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.SUBROUTINE_STMT_1485_INDEX:
                {
                    return handleSubroutineStmt1485(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.SUBROUTINE_STMT_1486_INDEX:
                {
                    return handleSubroutineStmt1486(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.SUBROUTINE_STMT_1487_INDEX:
                {
                    return handleSubroutineStmt1487(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.SUBROUTINE_STMT_1488_INDEX:
                {
                    return handleSubroutineStmt1488(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.SUBROUTINE_PREFIX_1489_INDEX:
                {
                    return handleSubroutinePrefix1489(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.SUBROUTINE_PREFIX_1490_INDEX:
                {
                    return handleSubroutinePrefix1490(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.SUBROUTINE_PARS_1491_INDEX:
                {
                    return handleSubroutinePars1491(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.SUBROUTINE_PARS_1492_INDEX:
                {
                    return handleSubroutinePars1492(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.SUBROUTINE_PAR_1493_INDEX:
                {
                    return handleSubroutinePar1493(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.SUBROUTINE_PAR_1494_INDEX:
                {
                    return handleSubroutinePar1494(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.END_SUBROUTINE_STMT_1495_INDEX:
                {
                    return handleEndSubroutineStmt1495(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.END_SUBROUTINE_STMT_1496_INDEX:
                {
                    return handleEndSubroutineStmt1496(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.END_SUBROUTINE_STMT_1497_INDEX:
                {
                    return handleEndSubroutineStmt1497(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.END_SUBROUTINE_STMT_1498_INDEX:
                {
                    return handleEndSubroutineStmt1498(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.END_SUBROUTINE_STMT_1499_INDEX:
                {
                    return handleEndSubroutineStmt1499(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ENTRY_STMT_1500_INDEX:
                {
                    return handleEntryStmt1500(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ENTRY_STMT_1501_INDEX:
                {
                    return handleEntryStmt1501(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.RETURN_STMT_1502_INDEX:
                {
                    return handleReturnStmt1502(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.RETURN_STMT_1503_INDEX:
                {
                    return handleReturnStmt1503(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.CONTAINS_STMT_1504_INDEX:
                {
                    return handleContainsStmt1504(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.STMT_FUNCTION_STMT_1505_INDEX:
                {
                    return handleStmtFunctionStmt1505(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.STMT_FUNCTION_RANGE_1506_INDEX:
                {
                    return handleStmtFunctionRange1506(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.STMT_FUNCTION_RANGE_1507_INDEX:
                {
                    return handleStmtFunctionRange1507(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.SFDUMMY_ARG_NAME_LIST_1508_INDEX:
                {
                    return handleSFDummyArgNameList1508(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.SFDUMMY_ARG_NAME_LIST_1509_INDEX:
                {
                    return handleSFDummyArgNameList1509(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ARRAY_NAME_1510_INDEX:
                {
                    return handleArrayName1510(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.BLOCK_DATA_NAME_1511_INDEX:
                {
                    return handleBlockDataName1511(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.COMMON_BLOCK_NAME_1512_INDEX:
                {
                    return handleCommonBlockName1512(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.COMPONENT_NAME_1513_INDEX:
                {
                    return handleComponentName1513(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.DUMMY_ARG_NAME_1514_INDEX:
                {
                    return handleDummyArgName1514(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.END_NAME_1515_INDEX:
                {
                    return handleEndName1515(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ENTRY_NAME_1516_INDEX:
                {
                    return handleEntryName1516(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.EXTERNAL_NAME_1517_INDEX:
                {
                    return handleExternalName1517(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.FUNCTION_NAME_1518_INDEX:
                {
                    return handleFunctionName1518(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.GENERIC_NAME_1519_INDEX:
                {
                    return handleGenericName1519(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.IMPLIED_DO_VARIABLE_1520_INDEX:
                {
                    return handleImpliedDoVariable1520(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.INTRINSIC_PROCEDURE_NAME_1521_INDEX:
                {
                    return handleIntrinsicProcedureName1521(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.MODULE_NAME_1522_INDEX:
                {
                    return handleModuleName1522(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.NAMELIST_GROUP_NAME_1523_INDEX:
                {
                    return handleNamelistGroupName1523(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.OBJECT_NAME_1524_INDEX:
                {
                    return handleObjectName1524(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.PROGRAM_NAME_1525_INDEX:
                {
                    return handleProgramName1525(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.SFDUMMY_ARG_NAME_1526_INDEX:
                {
                    return handleSFDummyArgName1526(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.SFVAR_NAME_1527_INDEX:
                {
                    return handleSFVarName1527(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.SUBROUTINE_NAME_1528_INDEX:
                {
                    return handleSubroutineName1528(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.SUBROUTINE_NAME_USE_1529_INDEX:
                {
                    return handleSubroutineNameUse1529(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.TYPE_NAME_1530_INDEX:
                {
                    return handleTypeName1530(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.USE_NAME_1531_INDEX:
                {
                    return handleUseName1531(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.LBL_DEF_1532_INDEX:
                {
                    return handleLblDef1532(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.LBL_DEF_1533_INDEX:
                {
                    return handleLblDef1533(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.PAUSE_STMT_1534_INDEX:
                {
                    return handlePauseStmt1534(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.PAUSE_STMT_1535_INDEX:
                {
                    return handlePauseStmt1535(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.PAUSE_STMT_1536_INDEX:
                {
                    return handlePauseStmt1536(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ASSIGN_STMT_1537_INDEX:
                {
                    return handleAssignStmt1537(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ASSIGNED_GOTO_STMT_1538_INDEX:
                {
                    return handleAssignedGotoStmt1538(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ASSIGNED_GOTO_STMT_1539_INDEX:
                {
                    return handleAssignedGotoStmt1539(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ASSIGNED_GOTO_STMT_1540_INDEX:
                {
                    return handleAssignedGotoStmt1540(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.VARIABLE_COMMA_1541_INDEX:
                {
                    return handleVariableComma1541(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.PROGRAM_UNIT_ERROR_0_INDEX:
                {
                    return handleProgramUnitError0(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.BODY_CONSTRUCT_ERROR_1_INDEX:
                {
                    return handleBodyConstructError1(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.TYPE_DECLARATION_STMT_ERROR_2_INDEX:
                {
                    return handleTypeDeclarationStmtError2(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.DATA_STMT_ERROR_3_INDEX:
                {
                    return handleDataStmtError3(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ALLOCATE_STMT_ERROR_4_INDEX:
                {
                    return handleAllocateStmtError4(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ASSIGNMENT_STMT_ERROR_5_INDEX:
                {
                    return handleAssignmentStmtError5(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.FORALL_CONSTRUCT_STMT_ERROR_6_INDEX:
                {
                    return handleForallConstructStmtError6(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.FORALL_CONSTRUCT_STMT_ERROR_7_INDEX:
                {
                    return handleForallConstructStmtError7(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.IF_THEN_ERROR_ERROR_8_INDEX:
                {
                    return handleIfThenErrorError8(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ELSE_IF_STMT_ERROR_9_INDEX:
                {
                    return handleElseIfStmtError9(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ELSE_IF_STMT_ERROR_10_INDEX:
                {
                    return handleElseIfStmtError10(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.ELSE_STMT_ERROR_11_INDEX:
                {
                    return handleElseStmtError11(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.IF_STMT_ERROR_12_INDEX:
                {
                    return handleIfStmtError12(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.SELECT_CASE_STMT_ERROR_13_INDEX:
                {
                    return handleSelectCaseStmtError13(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.SELECT_CASE_STMT_ERROR_14_INDEX:
                {
                    return handleSelectCaseStmtError14(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.SELECT_CASE_STMT_ERROR_15_INDEX:
                {
                    return handleSelectCaseStmtError15(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.SELECT_CASE_STMT_ERROR_16_INDEX:
                {
                    return handleSelectCaseStmtError16(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.CASE_STMT_ERROR_17_INDEX:
                {
                    return handleCaseStmtError17(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.FORMAT_STMT_ERROR_18_INDEX:
                {
                    return handleFormatStmtError18(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.FUNCTION_STMT_ERROR_19_INDEX:
                {
                    return handleFunctionStmtError19(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                case Production.SUBROUTINE_STMT_ERROR_20_INDEX:
                {
                    return handleSubroutineStmtError20(productionIndex, valueStack, valueStackOffset, valueStackSize, errorInfo);
                }
                default:
                    throw new IllegalStateException();
            }
        }

        public Object handleExecutableProgram1(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTExecutableProgramNode node = new ASTExecutableProgramNode();
                    node.programUnitList = (IASTListNode<IProgramUnit>)valueStack.get(valueStackOffset + 0);
                    if (node.programUnitList != null) node.programUnitList.setParent(node);
                    return node;

        }
        public Object handleExecutableProgram2(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTExecutableProgramNode node = new ASTExecutableProgramNode();
                    node.emptyProgram = (ASTEmptyProgramNode)valueStack.get(valueStackOffset + 0);
                    if (node.emptyProgram != null) node.emptyProgram.setParent(node);
                    return node;

        }
        public Object handleEmptyProgram3(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTEmptyProgramNode node = new ASTEmptyProgramNode();
                    return node;

        }
        public Object handleEmptyProgram4(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTEmptyProgramNode node = new ASTEmptyProgramNode();
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleProgramUnitList5(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 7
                    IASTListNode<IProgramUnit> list = new ASTListNode<IProgramUnit>();
                    IProgramUnit elt = (IProgramUnit)valueStack.get(valueStackOffset + 0);
                    list.add(elt);
                    if (elt != null) elt.setParent(list);
                    return list;

        }
        public Object handleProgramUnitList6(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 8
                    IASTListNode<IProgramUnit> list = (IASTListNode<IProgramUnit>)valueStack.get(valueStackOffset);
                    IProgramUnit elt = (IProgramUnit)valueStack.get(valueStackOffset + 1);
                    list.add(elt);
                    if (elt != null) elt.setParent(list);
                    return list;

        }
        public Object handleProgramUnit7(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 5
                    ASTMainProgramNode result = (ASTMainProgramNode)valueStack.get(valueStackOffset + 0);
                    return result;

        }
        public Object handleProgramUnit8(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 5
                    ASTFunctionSubprogramNode result = (ASTFunctionSubprogramNode)valueStack.get(valueStackOffset + 0);
                    return result;

        }
        public Object handleProgramUnit9(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 5
                    ASTSubroutineSubprogramNode result = (ASTSubroutineSubprogramNode)valueStack.get(valueStackOffset + 0);
                    return result;

        }
        public Object handleProgramUnit10(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 5
                    ASTModuleNode result = (ASTModuleNode)valueStack.get(valueStackOffset + 0);
                    return result;

        }
        public Object handleProgramUnit11(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 5
                    ASTSubmoduleNode result = (ASTSubmoduleNode)valueStack.get(valueStackOffset + 0);
                    return result;

        }
        public Object handleProgramUnit12(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 5
                    ASTBlockDataSubprogramNode result = (ASTBlockDataSubprogramNode)valueStack.get(valueStackOffset + 0);
                    return result;

        }
        public Object handleMainProgram13(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTMainProgramNode node = new ASTMainProgramNode();
                    node.body = (IASTListNode<IBodyConstruct>)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("body");
                    if (node.body != null) node.body.setParent(node);
                    node.containsStmt = (ASTContainsStmtNode)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("containsStmt");
                    if (node.containsStmt != null) node.containsStmt.setParent(node);
                    node.internalSubprograms = (IASTListNode<IInternalSubprogram>)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("internalSubprograms");
                    if (node.internalSubprograms != null) node.internalSubprograms.setParent(node);
                    node.endProgramStmt = (ASTEndProgramStmtNode)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("endProgramStmt");
                    if (node.endProgramStmt != null) node.endProgramStmt.setParent(node);
                    return node;

        }
        public Object handleMainProgram14(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTMainProgramNode node = new ASTMainProgramNode();
                    node.programStmt = (ASTProgramStmtNode)valueStack.get(valueStackOffset + 0);
                    if (node.programStmt != null) node.programStmt.setParent(node);
                    node.body = (IASTListNode<IBodyConstruct>)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("body");
                    if (node.body != null) node.body.setParent(node);
                    node.containsStmt = (ASTContainsStmtNode)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("containsStmt");
                    if (node.containsStmt != null) node.containsStmt.setParent(node);
                    node.internalSubprograms = (IASTListNode<IInternalSubprogram>)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("internalSubprograms");
                    if (node.internalSubprograms != null) node.internalSubprograms.setParent(node);
                    node.endProgramStmt = (ASTEndProgramStmtNode)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("endProgramStmt");
                    if (node.endProgramStmt != null) node.endProgramStmt.setParent(node);
                    return node;

        }
        public Object handleMainRange15(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 3 and 4
                    Map<String, Object> node = new HashMap<String, Object>();
                    node.put("body", (IASTListNode<IBodyConstruct>)valueStack.get(valueStackOffset + 0));
                    node.put("endProgramStmt", (ASTEndProgramStmtNode)valueStack.get(valueStackOffset + 1));
                    ASTListNode<IASTNode> embeddedList = new ASTListNode<IASTNode>();
                    embeddedList.add((IASTNode)(node.get("body")));
                    embeddedList.add((IASTNode)(node.get("containsStmt")));
                    embeddedList.add((IASTNode)(node.get("internalSubprograms")));
                    embeddedList.add((IASTNode)(node.get("endProgramStmt")));
                    node.put("errorRecoveryList", embeddedList);
                    return node;

        }
        public Object handleMainRange16(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 3 and 4
                    Map<String, Object> node = new HashMap<String, Object>();
                    node.put("body", (IASTListNode<IBodyConstruct>)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("body"));
                    node.put("containsStmt", (ASTContainsStmtNode)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("containsStmt"));
                    node.put("internalSubprograms", (IASTListNode<IInternalSubprogram>)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("internalSubprograms"));
                    node.put("endProgramStmt", (ASTEndProgramStmtNode)valueStack.get(valueStackOffset + 1));
                    ASTListNode<IASTNode> embeddedList = new ASTListNode<IASTNode>();
                    embeddedList.add((IASTNode)(node.get("body")));
                    embeddedList.add((IASTNode)(node.get("containsStmt")));
                    embeddedList.add((IASTNode)(node.get("internalSubprograms")));
                    embeddedList.add((IASTNode)(node.get("endProgramStmt")));
                    node.put("errorRecoveryList", embeddedList);
                    return node;

        }
        public Object handleMainRange17(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 3 and 4
                    Map<String, Object> node = new HashMap<String, Object>();
                    node.put("endProgramStmt", (ASTEndProgramStmtNode)valueStack.get(valueStackOffset + 0));
                    ASTListNode<IASTNode> embeddedList = new ASTListNode<IASTNode>();
                    embeddedList.add((IASTNode)(node.get("body")));
                    embeddedList.add((IASTNode)(node.get("containsStmt")));
                    embeddedList.add((IASTNode)(node.get("internalSubprograms")));
                    embeddedList.add((IASTNode)(node.get("endProgramStmt")));
                    node.put("errorRecoveryList", embeddedList);
                    return node;

        }
        public Object handleBody18(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 7
                    IASTListNode<IBodyConstruct> list = new ASTListNode<IBodyConstruct>();
                    IBodyConstruct elt = (IBodyConstruct)valueStack.get(valueStackOffset + 0);
                    list.add(elt);
                    if (elt != null) elt.setParent(list);
                    return list;

        }
        public Object handleBody19(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 8
                    IASTListNode<IBodyConstruct> list = (IASTListNode<IBodyConstruct>)valueStack.get(valueStackOffset);
                    IBodyConstruct elt = (IBodyConstruct)valueStack.get(valueStackOffset + 1);
                    list.add(elt);
                    if (elt != null) elt.setParent(list);
                    return list;

        }
        public Object handleBodyConstruct20(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 5
                    ISpecificationPartConstruct result = (ISpecificationPartConstruct)valueStack.get(valueStackOffset + 0);
                    return result;

        }
        public Object handleBodyConstruct21(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 5
                    IExecutableConstruct result = (IExecutableConstruct)valueStack.get(valueStackOffset + 0);
                    return result;

        }
        public Object handleFunctionSubprogram22(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTFunctionSubprogramNode node = new ASTFunctionSubprogramNode();
                    node.functionStmt = (ASTFunctionStmtNode)valueStack.get(valueStackOffset + 0);
                    if (node.functionStmt != null) node.functionStmt.setParent(node);
                    node.body = (IASTListNode<IBodyConstruct>)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("body");
                    if (node.body != null) node.body.setParent(node);
                    node.containsStmt = (ASTContainsStmtNode)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("containsStmt");
                    if (node.containsStmt != null) node.containsStmt.setParent(node);
                    node.internalSubprograms = (IASTListNode<IInternalSubprogram>)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("internalSubprograms");
                    if (node.internalSubprograms != null) node.internalSubprograms.setParent(node);
                    node.endFunctionStmt = (ASTEndFunctionStmtNode)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("endFunctionStmt");
                    if (node.endFunctionStmt != null) node.endFunctionStmt.setParent(node);
                    return node;

        }
        public Object handleFunctionRange23(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 3 and 4
                    Map<String, Object> node = new HashMap<String, Object>();
                    node.put("body", (IASTListNode<IBodyConstruct>)valueStack.get(valueStackOffset + 0));
                    node.put("endFunctionStmt", (ASTEndFunctionStmtNode)valueStack.get(valueStackOffset + 1));
                    ASTListNode<IASTNode> embeddedList = new ASTListNode<IASTNode>();
                    embeddedList.add((IASTNode)(node.get("body")));
                    embeddedList.add((IASTNode)(node.get("containsStmt")));
                    embeddedList.add((IASTNode)(node.get("internalSubprograms")));
                    embeddedList.add((IASTNode)(node.get("endFunctionStmt")));
                    node.put("errorRecoveryList", embeddedList);
                    return node;

        }
        public Object handleFunctionRange24(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 3 and 4
                    Map<String, Object> node = new HashMap<String, Object>();
                    node.put("endFunctionStmt", (ASTEndFunctionStmtNode)valueStack.get(valueStackOffset + 0));
                    ASTListNode<IASTNode> embeddedList = new ASTListNode<IASTNode>();
                    embeddedList.add((IASTNode)(node.get("body")));
                    embeddedList.add((IASTNode)(node.get("containsStmt")));
                    embeddedList.add((IASTNode)(node.get("internalSubprograms")));
                    embeddedList.add((IASTNode)(node.get("endFunctionStmt")));
                    node.put("errorRecoveryList", embeddedList);
                    return node;

        }
        public Object handleFunctionRange25(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 3 and 4
                    Map<String, Object> node = new HashMap<String, Object>();
                    node.put("body", (IASTListNode<IBodyConstruct>)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("body"));
                    node.put("containsStmt", (ASTContainsStmtNode)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("containsStmt"));
                    node.put("internalSubprograms", (IASTListNode<IInternalSubprogram>)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("internalSubprograms"));
                    node.put("endFunctionStmt", (ASTEndFunctionStmtNode)valueStack.get(valueStackOffset + 1));
                    ASTListNode<IASTNode> embeddedList = new ASTListNode<IASTNode>();
                    embeddedList.add((IASTNode)(node.get("body")));
                    embeddedList.add((IASTNode)(node.get("containsStmt")));
                    embeddedList.add((IASTNode)(node.get("internalSubprograms")));
                    embeddedList.add((IASTNode)(node.get("endFunctionStmt")));
                    node.put("errorRecoveryList", embeddedList);
                    return node;

        }
        public Object handleSubroutineSubprogram26(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTSubroutineSubprogramNode node = new ASTSubroutineSubprogramNode();
                    node.subroutineStmt = (ASTSubroutineStmtNode)valueStack.get(valueStackOffset + 0);
                    if (node.subroutineStmt != null) node.subroutineStmt.setParent(node);
                    node.body = (IASTListNode<IBodyConstruct>)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("body");
                    if (node.body != null) node.body.setParent(node);
                    node.containsStmt = (ASTContainsStmtNode)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("containsStmt");
                    if (node.containsStmt != null) node.containsStmt.setParent(node);
                    node.internalSubprograms = (IASTListNode<IInternalSubprogram>)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("internalSubprograms");
                    if (node.internalSubprograms != null) node.internalSubprograms.setParent(node);
                    node.endSubroutineStmt = (ASTEndSubroutineStmtNode)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("endSubroutineStmt");
                    if (node.endSubroutineStmt != null) node.endSubroutineStmt.setParent(node);
                    return node;

        }
        public Object handleSubroutineRange27(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 3 and 4
                    Map<String, Object> node = new HashMap<String, Object>();
                    node.put("body", (IASTListNode<IBodyConstruct>)valueStack.get(valueStackOffset + 0));
                    node.put("endSubroutineStmt", (ASTEndSubroutineStmtNode)valueStack.get(valueStackOffset + 1));
                    ASTListNode<IASTNode> embeddedList = new ASTListNode<IASTNode>();
                    embeddedList.add((IASTNode)(node.get("body")));
                    embeddedList.add((IASTNode)(node.get("containsStmt")));
                    embeddedList.add((IASTNode)(node.get("internalSubprograms")));
                    embeddedList.add((IASTNode)(node.get("endSubroutineStmt")));
                    node.put("errorRecoveryList", embeddedList);
                    return node;

        }
        public Object handleSubroutineRange28(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 3 and 4
                    Map<String, Object> node = new HashMap<String, Object>();
                    node.put("endSubroutineStmt", (ASTEndSubroutineStmtNode)valueStack.get(valueStackOffset + 0));
                    ASTListNode<IASTNode> embeddedList = new ASTListNode<IASTNode>();
                    embeddedList.add((IASTNode)(node.get("body")));
                    embeddedList.add((IASTNode)(node.get("containsStmt")));
                    embeddedList.add((IASTNode)(node.get("internalSubprograms")));
                    embeddedList.add((IASTNode)(node.get("endSubroutineStmt")));
                    node.put("errorRecoveryList", embeddedList);
                    return node;

        }
        public Object handleSubroutineRange29(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 3 and 4
                    Map<String, Object> node = new HashMap<String, Object>();
                    node.put("body", (IASTListNode<IBodyConstruct>)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("body"));
                    node.put("containsStmt", (ASTContainsStmtNode)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("containsStmt"));
                    node.put("internalSubprograms", (IASTListNode<IInternalSubprogram>)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("internalSubprograms"));
                    node.put("endSubroutineStmt", (ASTEndSubroutineStmtNode)valueStack.get(valueStackOffset + 1));
                    ASTListNode<IASTNode> embeddedList = new ASTListNode<IASTNode>();
                    embeddedList.add((IASTNode)(node.get("body")));
                    embeddedList.add((IASTNode)(node.get("containsStmt")));
                    embeddedList.add((IASTNode)(node.get("internalSubprograms")));
                    embeddedList.add((IASTNode)(node.get("endSubroutineStmt")));
                    node.put("errorRecoveryList", embeddedList);
                    return node;

        }
        public Object handleSeparateModuleSubprogram30(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTSeparateModuleSubprogramNode node = new ASTSeparateModuleSubprogramNode();
                    node.mpSubprogramStmt = (ASTMpSubprogramStmtNode)valueStack.get(valueStackOffset + 0);
                    if (node.mpSubprogramStmt != null) node.mpSubprogramStmt.setParent(node);
                    node.body = (IASTListNode<IBodyConstruct>)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("body");
                    if (node.body != null) node.body.setParent(node);
                    node.containsStmt = (ASTContainsStmtNode)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("containsStmt");
                    if (node.containsStmt != null) node.containsStmt.setParent(node);
                    node.internalSubprograms = (IASTListNode<IInternalSubprogram>)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("internalSubprograms");
                    if (node.internalSubprograms != null) node.internalSubprograms.setParent(node);
                    node.endMpSubprogramStmt = (ASTEndMpSubprogramStmtNode)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("endMpSubprogramStmt");
                    if (node.endMpSubprogramStmt != null) node.endMpSubprogramStmt.setParent(node);
                    return node;

        }
        public Object handleMpSubprogramRange31(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 3 and 4
                    Map<String, Object> node = new HashMap<String, Object>();
                    node.put("body", (IASTListNode<IBodyConstruct>)valueStack.get(valueStackOffset + 0));
                    node.put("endMpSubprogramStmt", (ASTEndMpSubprogramStmtNode)valueStack.get(valueStackOffset + 1));
                    ASTListNode<IASTNode> embeddedList = new ASTListNode<IASTNode>();
                    embeddedList.add((IASTNode)(node.get("body")));
                    embeddedList.add((IASTNode)(node.get("containsStmt")));
                    embeddedList.add((IASTNode)(node.get("internalSubprograms")));
                    embeddedList.add((IASTNode)(node.get("endMpSubprogramStmt")));
                    node.put("errorRecoveryList", embeddedList);
                    return node;

        }
        public Object handleMpSubprogramRange32(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 3 and 4
                    Map<String, Object> node = new HashMap<String, Object>();
                    node.put("endMpSubprogramStmt", (ASTEndMpSubprogramStmtNode)valueStack.get(valueStackOffset + 0));
                    ASTListNode<IASTNode> embeddedList = new ASTListNode<IASTNode>();
                    embeddedList.add((IASTNode)(node.get("body")));
                    embeddedList.add((IASTNode)(node.get("containsStmt")));
                    embeddedList.add((IASTNode)(node.get("internalSubprograms")));
                    embeddedList.add((IASTNode)(node.get("endMpSubprogramStmt")));
                    node.put("errorRecoveryList", embeddedList);
                    return node;

        }
        public Object handleMpSubprogramRange33(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 3 and 4
                    Map<String, Object> node = new HashMap<String, Object>();
                    node.put("body", (IASTListNode<IBodyConstruct>)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("body"));
                    node.put("containsStmt", (ASTContainsStmtNode)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("containsStmt"));
                    node.put("internalSubprograms", (IASTListNode<IInternalSubprogram>)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("internalSubprograms"));
                    node.put("endMpSubprogramStmt", (ASTEndMpSubprogramStmtNode)valueStack.get(valueStackOffset + 1));
                    ASTListNode<IASTNode> embeddedList = new ASTListNode<IASTNode>();
                    embeddedList.add((IASTNode)(node.get("body")));
                    embeddedList.add((IASTNode)(node.get("containsStmt")));
                    embeddedList.add((IASTNode)(node.get("internalSubprograms")));
                    embeddedList.add((IASTNode)(node.get("endMpSubprogramStmt")));
                    node.put("errorRecoveryList", embeddedList);
                    return node;

        }
        public Object handleMpSubprogramStmt34(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTMpSubprogramStmtNode node = new ASTMpSubprogramStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTModule = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTModule != null) node.hiddenTModule.setParent(node);
                    node.hiddenTProcedure = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTProcedure != null) node.hiddenTProcedure.setParent(node);
                    node.procedureName = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.procedureName != null) node.procedureName.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleEndMpSubprogramStmt35(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTEndMpSubprogramStmtNode node = new ASTEndMpSubprogramStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTEnd = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTEnd != null) node.hiddenTEnd.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleEndMpSubprogramStmt36(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTEndMpSubprogramStmtNode node = new ASTEndMpSubprogramStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTEndprocedure = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTEndprocedure != null) node.hiddenTEndprocedure.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleEndMpSubprogramStmt37(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTEndMpSubprogramStmtNode node = new ASTEndMpSubprogramStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTEndprocedure = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTEndprocedure != null) node.hiddenTEndprocedure.setParent(node);
                    node.endName = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 2)).get("endName");
                    if (node.endName != null) node.endName.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleEndMpSubprogramStmt38(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTEndMpSubprogramStmtNode node = new ASTEndMpSubprogramStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTEnd = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTEnd != null) node.hiddenTEnd.setParent(node);
                    node.hiddenTProcedure = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTProcedure != null) node.hiddenTProcedure.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleEndMpSubprogramStmt39(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTEndMpSubprogramStmtNode node = new ASTEndMpSubprogramStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTEnd = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTEnd != null) node.hiddenTEnd.setParent(node);
                    node.hiddenTProcedure = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTProcedure != null) node.hiddenTProcedure.setParent(node);
                    node.endName = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 3)).get("endName");
                    if (node.endName != null) node.endName.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleModule40(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTModuleNode node = new ASTModuleNode();
                    node.moduleStmt = (ASTModuleStmtNode)valueStack.get(valueStackOffset + 0);
                    if (node.moduleStmt != null) node.moduleStmt.setParent(node);
                    node.moduleBody = (IASTListNode<IModuleBodyConstruct>)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("moduleBody");
                    if (node.moduleBody != null) node.moduleBody.setParent(node);
                    node.endModuleStmt = (ASTEndModuleStmtNode)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("endModuleStmt");
                    if (node.endModuleStmt != null) node.endModuleStmt.setParent(node);
                    return node;

        }
        public Object handleModuleBlock41(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 3 and 4
                    Map<String, Object> node = new HashMap<String, Object>();
                    node.put("moduleBody", (IASTListNode<IModuleBodyConstruct>)valueStack.get(valueStackOffset + 0));
                    node.put("endModuleStmt", (ASTEndModuleStmtNode)valueStack.get(valueStackOffset + 1));
                    ASTListNode<IASTNode> embeddedList = new ASTListNode<IASTNode>();
                    embeddedList.add((IASTNode)(node.get("moduleBody")));
                    embeddedList.add((IASTNode)(node.get("endModuleStmt")));
                    node.put("errorRecoveryList", embeddedList);
                    return node;

        }
        public Object handleModuleBlock42(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 3 and 4
                    Map<String, Object> node = new HashMap<String, Object>();
                    node.put("endModuleStmt", (ASTEndModuleStmtNode)valueStack.get(valueStackOffset + 0));
                    ASTListNode<IASTNode> embeddedList = new ASTListNode<IASTNode>();
                    embeddedList.add((IASTNode)(node.get("moduleBody")));
                    embeddedList.add((IASTNode)(node.get("endModuleStmt")));
                    node.put("errorRecoveryList", embeddedList);
                    return node;

        }
        public Object handleModuleBody43(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 8
                    IASTListNode<IModuleBodyConstruct> list = (IASTListNode<IModuleBodyConstruct>)valueStack.get(valueStackOffset);
                    IModuleBodyConstruct elt = (IModuleBodyConstruct)valueStack.get(valueStackOffset + 1);
                    list.add(elt);
                    if (elt != null) elt.setParent(list);
                    return list;

        }
        public Object handleModuleBody44(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 7
                    IASTListNode<IModuleBodyConstruct> list = new ASTListNode<IModuleBodyConstruct>();
                    IModuleBodyConstruct elt = (IModuleBodyConstruct)valueStack.get(valueStackOffset + 0);
                    list.add(elt);
                    if (elt != null) elt.setParent(list);
                    return list;

        }
        public Object handleModuleBodyConstruct45(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 5
                    ISpecificationPartConstruct result = (ISpecificationPartConstruct)valueStack.get(valueStackOffset + 0);
                    return result;

        }
        public Object handleModuleBodyConstruct46(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 5
                    IModuleSubprogramPartConstruct result = (IModuleSubprogramPartConstruct)valueStack.get(valueStackOffset + 0);
                    return result;

        }
        public Object handleSubmodule47(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTSubmoduleNode node = new ASTSubmoduleNode();
                    node.submoduleStmt = (ASTSubmoduleStmtNode)valueStack.get(valueStackOffset + 0);
                    if (node.submoduleStmt != null) node.submoduleStmt.setParent(node);
                    node.moduleBody = (IASTListNode<IModuleBodyConstruct>)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("moduleBody");
                    if (node.moduleBody != null) node.moduleBody.setParent(node);
                    node.endSubmoduleStmt = (ASTEndSubmoduleStmtNode)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("endSubmoduleStmt");
                    if (node.endSubmoduleStmt != null) node.endSubmoduleStmt.setParent(node);
                    return node;

        }
        public Object handleSubmoduleBlock48(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 3 and 4
                    Map<String, Object> node = new HashMap<String, Object>();
                    node.put("moduleBody", (IASTListNode<IModuleBodyConstruct>)valueStack.get(valueStackOffset + 0));
                    node.put("endSubmoduleStmt", (ASTEndSubmoduleStmtNode)valueStack.get(valueStackOffset + 1));
                    ASTListNode<IASTNode> embeddedList = new ASTListNode<IASTNode>();
                    embeddedList.add((IASTNode)(node.get("moduleBody")));
                    embeddedList.add((IASTNode)(node.get("endSubmoduleStmt")));
                    node.put("errorRecoveryList", embeddedList);
                    return node;

        }
        public Object handleSubmoduleBlock49(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 3 and 4
                    Map<String, Object> node = new HashMap<String, Object>();
                    node.put("endSubmoduleStmt", (ASTEndSubmoduleStmtNode)valueStack.get(valueStackOffset + 0));
                    ASTListNode<IASTNode> embeddedList = new ASTListNode<IASTNode>();
                    embeddedList.add((IASTNode)(node.get("moduleBody")));
                    embeddedList.add((IASTNode)(node.get("endSubmoduleStmt")));
                    node.put("errorRecoveryList", embeddedList);
                    return node;

        }
        public Object handleSubmoduleStmt50(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTSubmoduleStmtNode node = new ASTSubmoduleStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTSubmodule = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTSubmodule != null) node.hiddenTSubmodule.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.parentIdentifier = (ASTParentIdentifierNode)valueStack.get(valueStackOffset + 3);
                    if (node.parentIdentifier != null) node.parentIdentifier.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    node.submoduleName = (ASTModuleNameNode)valueStack.get(valueStackOffset + 5);
                    if (node.submoduleName != null) node.submoduleName.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 6);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleParentIdentifier51(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTParentIdentifierNode node = new ASTParentIdentifierNode();
                    node.ancestorModuleName = (ASTModuleNameNode)valueStack.get(valueStackOffset + 0);
                    if (node.ancestorModuleName != null) node.ancestorModuleName.setParent(node);
                    return node;

        }
        public Object handleParentIdentifier52(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTParentIdentifierNode node = new ASTParentIdentifierNode();
                    node.ancestorModuleName = (ASTModuleNameNode)valueStack.get(valueStackOffset + 0);
                    if (node.ancestorModuleName != null) node.ancestorModuleName.setParent(node);
                    node.hiddenTColon = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTColon != null) node.hiddenTColon.setParent(node);
                    node.parentSubmoduleName = (ASTModuleNameNode)valueStack.get(valueStackOffset + 2);
                    if (node.parentSubmoduleName != null) node.parentSubmoduleName.setParent(node);
                    return node;

        }
        public Object handleEndSubmoduleStmt53(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTEndSubmoduleStmtNode node = new ASTEndSubmoduleStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTEnd = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTEnd != null) node.hiddenTEnd.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleEndSubmoduleStmt54(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTEndSubmoduleStmtNode node = new ASTEndSubmoduleStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTEndsubmodule = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTEndsubmodule != null) node.hiddenTEndsubmodule.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleEndSubmoduleStmt55(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTEndSubmoduleStmtNode node = new ASTEndSubmoduleStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTEndsubmodule = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTEndsubmodule != null) node.hiddenTEndsubmodule.setParent(node);
                    node.endName = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 2)).get("endName");
                    if (node.endName != null) node.endName.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleEndSubmoduleStmt56(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTEndSubmoduleStmtNode node = new ASTEndSubmoduleStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTEnd = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTEnd != null) node.hiddenTEnd.setParent(node);
                    node.hiddenTSubmodule = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTSubmodule != null) node.hiddenTSubmodule.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleEndSubmoduleStmt57(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTEndSubmoduleStmtNode node = new ASTEndSubmoduleStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTEnd = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTEnd != null) node.hiddenTEnd.setParent(node);
                    node.hiddenTSubmodule = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTSubmodule != null) node.hiddenTSubmodule.setParent(node);
                    node.endName = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 3)).get("endName");
                    if (node.endName != null) node.endName.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleBlockDataSubprogram58(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTBlockDataSubprogramNode node = new ASTBlockDataSubprogramNode();
                    node.blockDataStmt = (ASTBlockDataStmtNode)valueStack.get(valueStackOffset + 0);
                    if (node.blockDataStmt != null) node.blockDataStmt.setParent(node);
                    node.blockDataBody = (IASTListNode<IBlockDataBodyConstruct>)valueStack.get(valueStackOffset + 1);
                    if (node.blockDataBody != null) node.blockDataBody.setParent(node);
                    node.endBlockDataStmt = (ASTEndBlockDataStmtNode)valueStack.get(valueStackOffset + 2);
                    if (node.endBlockDataStmt != null) node.endBlockDataStmt.setParent(node);
                    return node;

        }
        public Object handleBlockDataSubprogram59(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTBlockDataSubprogramNode node = new ASTBlockDataSubprogramNode();
                    node.blockDataStmt = (ASTBlockDataStmtNode)valueStack.get(valueStackOffset + 0);
                    if (node.blockDataStmt != null) node.blockDataStmt.setParent(node);
                    node.endBlockDataStmt = (ASTEndBlockDataStmtNode)valueStack.get(valueStackOffset + 1);
                    if (node.endBlockDataStmt != null) node.endBlockDataStmt.setParent(node);
                    return node;

        }
        public Object handleBlockDataBody60(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 7
                    IASTListNode<IBlockDataBodyConstruct> list = new ASTListNode<IBlockDataBodyConstruct>();
                    IBlockDataBodyConstruct elt = (IBlockDataBodyConstruct)valueStack.get(valueStackOffset + 0);
                    list.add(elt);
                    if (elt != null) elt.setParent(list);
                    return list;

        }
        public Object handleBlockDataBody61(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 8
                    IASTListNode<IBlockDataBodyConstruct> list = (IASTListNode<IBlockDataBodyConstruct>)valueStack.get(valueStackOffset);
                    IBlockDataBodyConstruct elt = (IBlockDataBodyConstruct)valueStack.get(valueStackOffset + 1);
                    list.add(elt);
                    if (elt != null) elt.setParent(list);
                    return list;

        }
        public Object handleBlockDataBodyConstruct62(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 5
                    ISpecificationPartConstruct result = (ISpecificationPartConstruct)valueStack.get(valueStackOffset + 0);
                    return result;

        }
        public Object handleSpecificationPartConstruct63(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 5
                    ASTUseStmtNode result = (ASTUseStmtNode)valueStack.get(valueStackOffset + 0);
                    return result;

        }
        public Object handleSpecificationPartConstruct64(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 5
                    ASTImportStmtNode result = (ASTImportStmtNode)valueStack.get(valueStackOffset + 0);
                    return result;

        }
        public Object handleSpecificationPartConstruct65(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 5
                    ASTImplicitStmtNode result = (ASTImplicitStmtNode)valueStack.get(valueStackOffset + 0);
                    return result;

        }
        public Object handleSpecificationPartConstruct66(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 5
                    ASTParameterStmtNode result = (ASTParameterStmtNode)valueStack.get(valueStackOffset + 0);
                    return result;

        }
        public Object handleSpecificationPartConstruct67(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 5
                    ASTFormatStmtNode result = (ASTFormatStmtNode)valueStack.get(valueStackOffset + 0);
                    return result;

        }
        public Object handleSpecificationPartConstruct68(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 5
                    ASTEntryStmtNode result = (ASTEntryStmtNode)valueStack.get(valueStackOffset + 0);
                    return result;

        }
        public Object handleSpecificationPartConstruct69(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 5
                    IDeclarationConstruct result = (IDeclarationConstruct)valueStack.get(valueStackOffset + 0);
                    return result;

        }
        public Object handleDeclarationConstruct70(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 5
                    ASTDerivedTypeDefNode result = (ASTDerivedTypeDefNode)valueStack.get(valueStackOffset + 0);
                    return result;

        }
        public Object handleDeclarationConstruct71(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 5
                    ASTEnumDefNode result = (ASTEnumDefNode)valueStack.get(valueStackOffset + 0);
                    return result;

        }
        public Object handleDeclarationConstruct72(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 5
                    ASTInterfaceBlockNode result = (ASTInterfaceBlockNode)valueStack.get(valueStackOffset + 0);
                    return result;

        }
        public Object handleDeclarationConstruct73(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 5
                    ASTTypeDeclarationStmtNode result = (ASTTypeDeclarationStmtNode)valueStack.get(valueStackOffset + 0);
                    return result;

        }
        public Object handleDeclarationConstruct74(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 5
                    ISpecificationStmt result = (ISpecificationStmt)valueStack.get(valueStackOffset + 0);
                    return result;

        }
        public Object handleDeclarationConstruct75(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 5
                    ASTProcedureDeclarationStmtNode result = (ASTProcedureDeclarationStmtNode)valueStack.get(valueStackOffset + 0);
                    return result;

        }
        public Object handleExecutionPartConstruct76(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 5
                    IObsoleteExecutionPartConstruct result = (IObsoleteExecutionPartConstruct)valueStack.get(valueStackOffset + 0);
                    return result;

        }
        public Object handleExecutionPartConstruct77(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 5
                    IExecutableConstruct result = (IExecutableConstruct)valueStack.get(valueStackOffset + 0);
                    return result;

        }
        public Object handleExecutionPartConstruct78(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 5
                    ASTFormatStmtNode result = (ASTFormatStmtNode)valueStack.get(valueStackOffset + 0);
                    return result;

        }
        public Object handleExecutionPartConstruct79(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 5
                    ASTEntryStmtNode result = (ASTEntryStmtNode)valueStack.get(valueStackOffset + 0);
                    return result;

        }
        public Object handleObsoleteExecutionPartConstruct80(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 5
                    ASTDataStmtNode result = (ASTDataStmtNode)valueStack.get(valueStackOffset + 0);
                    return result;

        }
        public Object handleBodyPlusInternals81(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 3 and 4
                    Map<String, Object> node = new HashMap<String, Object>();
                    node.put("body", (IASTListNode<IBodyConstruct>)valueStack.get(valueStackOffset + 0));
                    node.put("containsStmt", (ASTContainsStmtNode)valueStack.get(valueStackOffset + 1));
                    node.put("internalSubprograms", (IASTListNode<IInternalSubprogram>)valueStack.get(valueStackOffset + 2));
                    ASTListNode<IASTNode> embeddedList = new ASTListNode<IASTNode>();
                    embeddedList.add((IASTNode)(node.get("body")));
                    embeddedList.add((IASTNode)(node.get("containsStmt")));
                    embeddedList.add((IASTNode)(node.get("internalSubprograms")));
                    node.put("errorRecoveryList", embeddedList);
                    return node;

        }
        public Object handleBodyPlusInternals82(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 3 and 4
                    Map<String, Object> node = new HashMap<String, Object>();
                    node.put("containsStmt", (ASTContainsStmtNode)valueStack.get(valueStackOffset + 0));
                    node.put("internalSubprograms", (IASTListNode<IInternalSubprogram>)valueStack.get(valueStackOffset + 1));
                    ASTListNode<IASTNode> embeddedList = new ASTListNode<IASTNode>();
                    embeddedList.add((IASTNode)(node.get("body")));
                    embeddedList.add((IASTNode)(node.get("containsStmt")));
                    embeddedList.add((IASTNode)(node.get("internalSubprograms")));
                    node.put("errorRecoveryList", embeddedList);
                    return node;

        }
        public Object handleInternalSubprograms83(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 7
                    IASTListNode<IInternalSubprogram> list = new ASTListNode<IInternalSubprogram>();
                    IInternalSubprogram elt = (IInternalSubprogram)valueStack.get(valueStackOffset + 0);
                    list.add(elt);
                    if (elt != null) elt.setParent(list);
                    return list;

        }
        public Object handleInternalSubprograms84(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 8
                    IASTListNode<IInternalSubprogram> list = (IASTListNode<IInternalSubprogram>)valueStack.get(valueStackOffset);
                    IInternalSubprogram elt = (IInternalSubprogram)valueStack.get(valueStackOffset + 1);
                    list.add(elt);
                    if (elt != null) elt.setParent(list);
                    return list;

        }
        public Object handleInternalSubprogram85(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 5
                    ASTFunctionSubprogramNode result = (ASTFunctionSubprogramNode)valueStack.get(valueStackOffset + 0);
                    return result;

        }
        public Object handleInternalSubprogram86(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 5
                    ASTSubroutineSubprogramNode result = (ASTSubroutineSubprogramNode)valueStack.get(valueStackOffset + 0);
                    return result;

        }
        public Object handleModuleSubprogramPartConstruct87(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 5
                    ASTContainsStmtNode result = (ASTContainsStmtNode)valueStack.get(valueStackOffset + 0);
                    return result;

        }
        public Object handleModuleSubprogramPartConstruct88(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 5
                    IModuleSubprogram result = (IModuleSubprogram)valueStack.get(valueStackOffset + 0);
                    return result;

        }
        public Object handleModuleSubprogramPartConstruct89(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 5
                    ASTSeparateModuleSubprogramNode result = (ASTSeparateModuleSubprogramNode)valueStack.get(valueStackOffset + 0);
                    return result;

        }
        public Object handleModuleSubprogram90(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 5
                    ASTFunctionSubprogramNode result = (ASTFunctionSubprogramNode)valueStack.get(valueStackOffset + 0);
                    return result;

        }
        public Object handleModuleSubprogram91(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 5
                    ASTSubroutineSubprogramNode result = (ASTSubroutineSubprogramNode)valueStack.get(valueStackOffset + 0);
                    return result;

        }
        public Object handleSpecificationStmt92(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 5
                    ASTAccessStmtNode result = (ASTAccessStmtNode)valueStack.get(valueStackOffset + 0);
                    return result;

        }
        public Object handleSpecificationStmt93(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 5
                    ASTAllocatableStmtNode result = (ASTAllocatableStmtNode)valueStack.get(valueStackOffset + 0);
                    return result;

        }
        public Object handleSpecificationStmt94(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 5
                    ASTAsynchronousStmtNode result = (ASTAsynchronousStmtNode)valueStack.get(valueStackOffset + 0);
                    return result;

        }
        public Object handleSpecificationStmt95(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 5
                    ASTBindStmtNode result = (ASTBindStmtNode)valueStack.get(valueStackOffset + 0);
                    return result;

        }
        public Object handleSpecificationStmt96(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 5
                    ASTCodimensionStmtNode result = (ASTCodimensionStmtNode)valueStack.get(valueStackOffset + 0);
                    return result;

        }
        public Object handleSpecificationStmt97(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 5
                    ASTCommonStmtNode result = (ASTCommonStmtNode)valueStack.get(valueStackOffset + 0);
                    return result;

        }
        public Object handleSpecificationStmt98(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 5
                    ASTContiguousStmtNode result = (ASTContiguousStmtNode)valueStack.get(valueStackOffset + 0);
                    return result;

        }
        public Object handleSpecificationStmt99(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 5
                    ASTDataStmtNode result = (ASTDataStmtNode)valueStack.get(valueStackOffset + 0);
                    return result;

        }
        public Object handleSpecificationStmt100(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 5
                    ASTDimensionStmtNode result = (ASTDimensionStmtNode)valueStack.get(valueStackOffset + 0);
                    return result;

        }
        public Object handleSpecificationStmt101(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 5
                    ASTEquivalenceStmtNode result = (ASTEquivalenceStmtNode)valueStack.get(valueStackOffset + 0);
                    return result;

        }
        public Object handleSpecificationStmt102(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 5
                    ASTExternalStmtNode result = (ASTExternalStmtNode)valueStack.get(valueStackOffset + 0);
                    return result;

        }
        public Object handleSpecificationStmt103(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 5
                    ASTIntentStmtNode result = (ASTIntentStmtNode)valueStack.get(valueStackOffset + 0);
                    return result;

        }
        public Object handleSpecificationStmt104(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 5
                    ASTIntrinsicStmtNode result = (ASTIntrinsicStmtNode)valueStack.get(valueStackOffset + 0);
                    return result;

        }
        public Object handleSpecificationStmt105(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 5
                    ASTNamelistStmtNode result = (ASTNamelistStmtNode)valueStack.get(valueStackOffset + 0);
                    return result;

        }
        public Object handleSpecificationStmt106(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 5
                    ASTOptionalStmtNode result = (ASTOptionalStmtNode)valueStack.get(valueStackOffset + 0);
                    return result;

        }
        public Object handleSpecificationStmt107(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 5
                    ASTPointerStmtNode result = (ASTPointerStmtNode)valueStack.get(valueStackOffset + 0);
                    return result;

        }
        public Object handleSpecificationStmt108(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 5
                    ASTCrayPointerStmtNode result = (ASTCrayPointerStmtNode)valueStack.get(valueStackOffset + 0);
                    return result;

        }
        public Object handleSpecificationStmt109(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 5
                    ASTProtectedStmtNode result = (ASTProtectedStmtNode)valueStack.get(valueStackOffset + 0);
                    return result;

        }
        public Object handleSpecificationStmt110(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 5
                    ASTSaveStmtNode result = (ASTSaveStmtNode)valueStack.get(valueStackOffset + 0);
                    return result;

        }
        public Object handleSpecificationStmt111(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 5
                    ASTTargetStmtNode result = (ASTTargetStmtNode)valueStack.get(valueStackOffset + 0);
                    return result;

        }
        public Object handleSpecificationStmt112(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 5
                    ASTVolatileStmtNode result = (ASTVolatileStmtNode)valueStack.get(valueStackOffset + 0);
                    return result;

        }
        public Object handleSpecificationStmt113(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 5
                    ASTValueStmtNode result = (ASTValueStmtNode)valueStack.get(valueStackOffset + 0);
                    return result;

        }
        public Object handleSpecificationStmt114(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 5
                    ASTUnprocessedIncludeStmtNode result = (ASTUnprocessedIncludeStmtNode)valueStack.get(valueStackOffset + 0);
                    return result;

        }
        public Object handleUnprocessedIncludeStmt115(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTUnprocessedIncludeStmtNode node = new ASTUnprocessedIncludeStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.tIdent = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.tIdent != null) node.tIdent.setParent(node);
                    node.tScon = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.tScon != null) node.tScon.setParent(node);
                    node.tEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.tEos != null) node.tEos.setParent(node);
                    return node;

        }
        public Object handleExecutableConstruct116(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 5
                    IActionStmt result = (IActionStmt)valueStack.get(valueStackOffset + 0);
                    return result;

        }
        public Object handleExecutableConstruct117(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 5
                    ASTAssociateConstructNode result = (ASTAssociateConstructNode)valueStack.get(valueStackOffset + 0);
                    return result;

        }
        public Object handleExecutableConstruct118(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 5
                    ASTBlockConstructNode result = (ASTBlockConstructNode)valueStack.get(valueStackOffset + 0);
                    return result;

        }
        public Object handleExecutableConstruct119(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 5
                    ASTCaseConstructNode result = (ASTCaseConstructNode)valueStack.get(valueStackOffset + 0);
                    return result;

        }
        public Object handleExecutableConstruct120(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 5
                    ASTCriticalConstructNode result = (ASTCriticalConstructNode)valueStack.get(valueStackOffset + 0);
                    return result;

        }
        public Object handleExecutableConstruct121(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 5
                    ASTDoConstructNode result = (ASTDoConstructNode)valueStack.get(valueStackOffset + 0);
                    return result;

        }
        public Object handleExecutableConstruct122(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 5
                    ASTForallConstructNode result = (ASTForallConstructNode)valueStack.get(valueStackOffset + 0);
                    return result;

        }
        public Object handleExecutableConstruct123(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 5
                    ASTIfConstructNode result = (ASTIfConstructNode)valueStack.get(valueStackOffset + 0);
                    return result;

        }
        public Object handleExecutableConstruct124(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 5
                    ASTSelectTypeConstructNode result = (ASTSelectTypeConstructNode)valueStack.get(valueStackOffset + 0);
                    return result;

        }
        public Object handleExecutableConstruct125(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 5
                    ASTWhereConstructNode result = (ASTWhereConstructNode)valueStack.get(valueStackOffset + 0);
                    return result;

        }
        public Object handleExecutableConstruct126(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 5
                    ASTEndDoStmtNode result = (ASTEndDoStmtNode)valueStack.get(valueStackOffset + 0);
                    return result;

        }
        public Object handleActionStmt127(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 5
                    IObsoleteActionStmt result = (IObsoleteActionStmt)valueStack.get(valueStackOffset + 0);
                    return result;

        }
        public Object handleActionStmt128(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 5
                    ASTAllocateStmtNode result = (ASTAllocateStmtNode)valueStack.get(valueStackOffset + 0);
                    return result;

        }
        public Object handleActionStmt129(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 5
                    ASTAllStopStmtNode result = (ASTAllStopStmtNode)valueStack.get(valueStackOffset + 0);
                    return result;

        }
        public Object handleActionStmt130(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 5
                    ASTAssignmentStmtNode result = (ASTAssignmentStmtNode)valueStack.get(valueStackOffset + 0);
                    return result;

        }
        public Object handleActionStmt131(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 5
                    ASTBackspaceStmtNode result = (ASTBackspaceStmtNode)valueStack.get(valueStackOffset + 0);
                    return result;

        }
        public Object handleActionStmt132(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 5
                    ASTCallStmtNode result = (ASTCallStmtNode)valueStack.get(valueStackOffset + 0);
                    return result;

        }
        public Object handleActionStmt133(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 5
                    ASTCloseStmtNode result = (ASTCloseStmtNode)valueStack.get(valueStackOffset + 0);
                    return result;

        }
        public Object handleActionStmt134(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 5
                    ASTContinueStmtNode result = (ASTContinueStmtNode)valueStack.get(valueStackOffset + 0);
                    return result;

        }
        public Object handleActionStmt135(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 5
                    ASTCycleStmtNode result = (ASTCycleStmtNode)valueStack.get(valueStackOffset + 0);
                    return result;

        }
        public Object handleActionStmt136(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 5
                    ASTDeallocateStmtNode result = (ASTDeallocateStmtNode)valueStack.get(valueStackOffset + 0);
                    return result;

        }
        public Object handleActionStmt137(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 5
                    ASTEndfileStmtNode result = (ASTEndfileStmtNode)valueStack.get(valueStackOffset + 0);
                    return result;

        }
        public Object handleActionStmt138(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 5
                    ASTExitStmtNode result = (ASTExitStmtNode)valueStack.get(valueStackOffset + 0);
                    return result;

        }
        public Object handleActionStmt139(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 5
                    ASTForallStmtNode result = (ASTForallStmtNode)valueStack.get(valueStackOffset + 0);
                    return result;

        }
        public Object handleActionStmt140(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 5
                    ASTGotoStmtNode result = (ASTGotoStmtNode)valueStack.get(valueStackOffset + 0);
                    return result;

        }
        public Object handleActionStmt141(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 5
                    ASTIfStmtNode result = (ASTIfStmtNode)valueStack.get(valueStackOffset + 0);
                    return result;

        }
        public Object handleActionStmt142(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 5
                    ASTInquireStmtNode result = (ASTInquireStmtNode)valueStack.get(valueStackOffset + 0);
                    return result;

        }
        public Object handleActionStmt143(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 5
                    ASTLockStmtNode result = (ASTLockStmtNode)valueStack.get(valueStackOffset + 0);
                    return result;

        }
        public Object handleActionStmt144(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 5
                    ASTNullifyStmtNode result = (ASTNullifyStmtNode)valueStack.get(valueStackOffset + 0);
                    return result;

        }
        public Object handleActionStmt145(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 5
                    ASTOpenStmtNode result = (ASTOpenStmtNode)valueStack.get(valueStackOffset + 0);
                    return result;

        }
        public Object handleActionStmt146(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 5
                    ASTAssignmentStmtNode result = (ASTAssignmentStmtNode)valueStack.get(valueStackOffset + 0);
                    return result;

        }
        public Object handleActionStmt147(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 5
                    ASTPrintStmtNode result = (ASTPrintStmtNode)valueStack.get(valueStackOffset + 0);
                    return result;

        }
        public Object handleActionStmt148(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 5
                    ASTReadStmtNode result = (ASTReadStmtNode)valueStack.get(valueStackOffset + 0);
                    return result;

        }
        public Object handleActionStmt149(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 5
                    ASTReturnStmtNode result = (ASTReturnStmtNode)valueStack.get(valueStackOffset + 0);
                    return result;

        }
        public Object handleActionStmt150(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 5
                    ASTRewindStmtNode result = (ASTRewindStmtNode)valueStack.get(valueStackOffset + 0);
                    return result;

        }
        public Object handleActionStmt151(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 5
                    ASTStopStmtNode result = (ASTStopStmtNode)valueStack.get(valueStackOffset + 0);
                    return result;

        }
        public Object handleActionStmt152(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 5
                    ASTSyncAllStmtNode result = (ASTSyncAllStmtNode)valueStack.get(valueStackOffset + 0);
                    return result;

        }
        public Object handleActionStmt153(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 5
                    ASTSyncImagesStmtNode result = (ASTSyncImagesStmtNode)valueStack.get(valueStackOffset + 0);
                    return result;

        }
        public Object handleActionStmt154(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 5
                    ASTSyncMemoryStmtNode result = (ASTSyncMemoryStmtNode)valueStack.get(valueStackOffset + 0);
                    return result;

        }
        public Object handleActionStmt155(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 5
                    ASTUnlockStmtNode result = (ASTUnlockStmtNode)valueStack.get(valueStackOffset + 0);
                    return result;

        }
        public Object handleActionStmt156(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 5
                    ASTWaitStmtNode result = (ASTWaitStmtNode)valueStack.get(valueStackOffset + 0);
                    return result;

        }
        public Object handleActionStmt157(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 5
                    ASTWhereStmtNode result = (ASTWhereStmtNode)valueStack.get(valueStackOffset + 0);
                    return result;

        }
        public Object handleActionStmt158(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 5
                    ASTWriteStmtNode result = (ASTWriteStmtNode)valueStack.get(valueStackOffset + 0);
                    return result;

        }
        public Object handleActionStmt159(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 5
                    ASTAssignStmtNode result = (ASTAssignStmtNode)valueStack.get(valueStackOffset + 0);
                    return result;

        }
        public Object handleActionStmt160(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 5
                    ASTAssignedGotoStmtNode result = (ASTAssignedGotoStmtNode)valueStack.get(valueStackOffset + 0);
                    return result;

        }
        public Object handleActionStmt161(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 5
                    ASTPauseStmtNode result = (ASTPauseStmtNode)valueStack.get(valueStackOffset + 0);
                    return result;

        }
        public Object handleObsoleteActionStmt162(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 5
                    ASTStmtFunctionStmtNode result = (ASTStmtFunctionStmtNode)valueStack.get(valueStackOffset + 0);
                    return result;

        }
        public Object handleObsoleteActionStmt163(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 5
                    ASTArithmeticIfStmtNode result = (ASTArithmeticIfStmtNode)valueStack.get(valueStackOffset + 0);
                    return result;

        }
        public Object handleObsoleteActionStmt164(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 5
                    ASTComputedGotoStmtNode result = (ASTComputedGotoStmtNode)valueStack.get(valueStackOffset + 0);
                    return result;

        }
        public Object handleName165(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 3 and 4
                    Map<String, Object> node = new HashMap<String, Object>();
                    node.put("name", (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0));
                    ASTListNode<IASTNode> embeddedList = new ASTListNode<IASTNode>();
                    embeddedList.add((IASTNode)(node.get("name")));
                    node.put("errorRecoveryList", embeddedList);
                    return node;

        }
        public Object handleConstant166(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTConstantNode node = new ASTConstantNode();
                    node.name = (ASTNamedConstantUseNode)valueStack.get(valueStackOffset + 0);
                    if (node.name != null) node.name.setParent(node);
                    return node;

        }
        public Object handleConstant167(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTConstantNode node = new ASTConstantNode();
                    node.unsignedArithmeticConstant = (IUnsignedArithmeticConst)valueStack.get(valueStackOffset + 0);
                    if (node.unsignedArithmeticConstant != null) node.unsignedArithmeticConstant.setParent(node);
                    return node;

        }
        public Object handleConstant168(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTConstantNode node = new ASTConstantNode();
                    node.hasPlus = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.hasPlus != null) node.hasPlus.setParent(node);
                    node.unsignedArithmeticConstant = (IUnsignedArithmeticConst)valueStack.get(valueStackOffset + 1);
                    if (node.unsignedArithmeticConstant != null) node.unsignedArithmeticConstant.setParent(node);
                    return node;

        }
        public Object handleConstant169(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTConstantNode node = new ASTConstantNode();
                    node.hasMinus = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.hasMinus != null) node.hasMinus.setParent(node);
                    node.unsignedArithmeticConstant = (IUnsignedArithmeticConst)valueStack.get(valueStackOffset + 1);
                    if (node.unsignedArithmeticConstant != null) node.unsignedArithmeticConstant.setParent(node);
                    return node;

        }
        public Object handleConstant170(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTConstantNode node = new ASTConstantNode();
                    node.stringConst = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.stringConst != null) node.stringConst.setParent(node);
                    return node;

        }
        public Object handleConstant171(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTConstantNode node = new ASTConstantNode();
                    node.hasIntKind = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.hasIntKind != null) node.hasIntKind.setParent(node);
                    node.hiddenTUnderscore = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTUnderscore != null) node.hiddenTUnderscore.setParent(node);
                    node.stringConst = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.stringConst != null) node.stringConst.setParent(node);
                    return node;

        }
        public Object handleConstant172(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTConstantNode node = new ASTConstantNode();
                    node.namedConstantKind = (ASTNamedConstantUseNode)valueStack.get(valueStackOffset + 0);
                    if (node.namedConstantKind != null) node.namedConstantKind.setParent(node);
                    node.hiddenTUnderscore = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTUnderscore != null) node.hiddenTUnderscore.setParent(node);
                    node.stringConst = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.stringConst != null) node.stringConst.setParent(node);
                    return node;

        }
        public Object handleConstant173(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTConstantNode node = new ASTConstantNode();
                    node.logicalConst = (ASTLogicalConstNode)valueStack.get(valueStackOffset + 0);
                    if (node.logicalConst != null) node.logicalConst.setParent(node);
                    return node;

        }
        public Object handleConstant174(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTConstantNode node = new ASTConstantNode();
                    node.structureConstructor = (ASTStructureConstructorNode)valueStack.get(valueStackOffset + 0);
                    if (node.structureConstructor != null) node.structureConstructor.setParent(node);
                    return node;

        }
        public Object handleConstant175(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTConstantNode node = new ASTConstantNode();
                    node.bozLiteralConstant = (ASTBozLiteralConstNode)valueStack.get(valueStackOffset + 0);
                    if (node.bozLiteralConstant != null) node.bozLiteralConstant.setParent(node);
                    return node;

        }
        public Object handleConstant176(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTConstantNode node = new ASTConstantNode();
                    node.hollerithConst = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.hollerithConst != null) node.hollerithConst.setParent(node);
                    return node;

        }
        public Object handleNamedConstant177(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 3 and 4
                    Map<String, Object> node = new HashMap<String, Object>();
                    node.put("namedConstant", (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0));
                    ASTListNode<IASTNode> embeddedList = new ASTListNode<IASTNode>();
                    embeddedList.add((IASTNode)(node.get("namedConstant")));
                    node.put("errorRecoveryList", embeddedList);
                    return node;

        }
        public Object handleNamedConstantUse178(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTNamedConstantUseNode node = new ASTNamedConstantUseNode();
                    node.name = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.name != null) node.name.setParent(node);
                    return node;

        }
        public Object handlePowerOp179(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTOperatorNode node = new ASTOperatorNode();
                    node.hasPowerOp = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.hasPowerOp != null) node.hasPowerOp.setParent(node);
                    return node;

        }
        public Object handleMultOp180(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTOperatorNode node = new ASTOperatorNode();
                    node.hasTimesOp = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.hasTimesOp != null) node.hasTimesOp.setParent(node);
                    return node;

        }
        public Object handleMultOp181(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTOperatorNode node = new ASTOperatorNode();
                    node.hasDivideOp = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.hasDivideOp != null) node.hasDivideOp.setParent(node);
                    return node;

        }
        public Object handleAddOp182(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTOperatorNode node = new ASTOperatorNode();
                    node.hasPlusOp = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.hasPlusOp != null) node.hasPlusOp.setParent(node);
                    return node;

        }
        public Object handleAddOp183(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTOperatorNode node = new ASTOperatorNode();
                    node.hasMinusOp = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.hasMinusOp != null) node.hasMinusOp.setParent(node);
                    return node;

        }
        public Object handleSign184(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTSignNode node = new ASTSignNode();
                    node.hasPlusSign = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.hasPlusSign != null) node.hasPlusSign.setParent(node);
                    return node;

        }
        public Object handleSign185(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTSignNode node = new ASTSignNode();
                    node.hasMinusSign = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.hasMinusSign != null) node.hasMinusSign.setParent(node);
                    return node;

        }
        public Object handleConcatOp186(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 3 and 4
                    Map<String, Object> node = new HashMap<String, Object>();
                    node.put("hasConcatOp", (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0));
                    ASTListNode<IASTNode> embeddedList = new ASTListNode<IASTNode>();
                    embeddedList.add((IASTNode)(node.get("hasMinusOp")));
                    embeddedList.add((IASTNode)(node.get("hasSlashEqOp")));
                    embeddedList.add((IASTNode)(node.get("hasAndOp")));
                    embeddedList.add((IASTNode)(node.get("definedUnaryOp")));
                    embeddedList.add((IASTNode)(node.get("hasEqOp")));
                    embeddedList.add((IASTNode)(node.get("hasPlusOp")));
                    embeddedList.add((IASTNode)(node.get("hasDivideOp")));
                    embeddedList.add((IASTNode)(node.get("hasNeqvOp")));
                    embeddedList.add((IASTNode)(node.get("hasEqEqOp")));
                    embeddedList.add((IASTNode)(node.get("hasGeOp")));
                    embeddedList.add((IASTNode)(node.get("hasNotOp")));
                    embeddedList.add((IASTNode)(node.get("hasEqvOp")));
                    embeddedList.add((IASTNode)(node.get("hasConcatOp")));
                    embeddedList.add((IASTNode)(node.get("hasPowerOp")));
                    embeddedList.add((IASTNode)(node.get("hasGtOp")));
                    embeddedList.add((IASTNode)(node.get("hasLtOp")));
                    embeddedList.add((IASTNode)(node.get("hasNeOp")));
                    embeddedList.add((IASTNode)(node.get("hasOrOp")));
                    embeddedList.add((IASTNode)(node.get("customDefinedOp")));
                    embeddedList.add((IASTNode)(node.get("hasTimesOp")));
                    embeddedList.add((IASTNode)(node.get("definedBinaryOp")));
                    embeddedList.add((IASTNode)(node.get("hasLeOp")));
                    node.put("errorRecoveryList", embeddedList);
                    return node;

        }
        public Object handleRelOp187(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTOperatorNode node = new ASTOperatorNode();
                    node.hasEqOp = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.hasEqOp != null) node.hasEqOp.setParent(node);
                    return node;

        }
        public Object handleRelOp188(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTOperatorNode node = new ASTOperatorNode();
                    node.hasNeOp = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.hasNeOp != null) node.hasNeOp.setParent(node);
                    return node;

        }
        public Object handleRelOp189(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTOperatorNode node = new ASTOperatorNode();
                    node.hasLtOp = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.hasLtOp != null) node.hasLtOp.setParent(node);
                    return node;

        }
        public Object handleRelOp190(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTOperatorNode node = new ASTOperatorNode();
                    node.hasLtOp = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.hasLtOp != null) node.hasLtOp.setParent(node);
                    return node;

        }
        public Object handleRelOp191(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTOperatorNode node = new ASTOperatorNode();
                    node.hasLeOp = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.hasLeOp != null) node.hasLeOp.setParent(node);
                    return node;

        }
        public Object handleRelOp192(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTOperatorNode node = new ASTOperatorNode();
                    node.hasLeOp = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.hasLeOp != null) node.hasLeOp.setParent(node);
                    return node;

        }
        public Object handleRelOp193(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTOperatorNode node = new ASTOperatorNode();
                    node.hasGtOp = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.hasGtOp != null) node.hasGtOp.setParent(node);
                    return node;

        }
        public Object handleRelOp194(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTOperatorNode node = new ASTOperatorNode();
                    node.hasGtOp = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.hasGtOp != null) node.hasGtOp.setParent(node);
                    return node;

        }
        public Object handleRelOp195(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTOperatorNode node = new ASTOperatorNode();
                    node.hasGeOp = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.hasGeOp != null) node.hasGeOp.setParent(node);
                    return node;

        }
        public Object handleRelOp196(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTOperatorNode node = new ASTOperatorNode();
                    node.hasGeOp = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.hasGeOp != null) node.hasGeOp.setParent(node);
                    return node;

        }
        public Object handleRelOp197(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTOperatorNode node = new ASTOperatorNode();
                    node.hasEqEqOp = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.hasEqEqOp != null) node.hasEqEqOp.setParent(node);
                    return node;

        }
        public Object handleRelOp198(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTOperatorNode node = new ASTOperatorNode();
                    node.hasSlashEqOp = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.hasSlashEqOp != null) node.hasSlashEqOp.setParent(node);
                    return node;

        }
        public Object handleNotOp199(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTOperatorNode node = new ASTOperatorNode();
                    node.hasNotOp = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.hasNotOp != null) node.hasNotOp.setParent(node);
                    return node;

        }
        public Object handleAndOp200(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTOperatorNode node = new ASTOperatorNode();
                    node.hasAndOp = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.hasAndOp != null) node.hasAndOp.setParent(node);
                    return node;

        }
        public Object handleOrOp201(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTOperatorNode node = new ASTOperatorNode();
                    node.hasOrOp = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.hasOrOp != null) node.hasOrOp.setParent(node);
                    return node;

        }
        public Object handleEquivOp202(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTOperatorNode node = new ASTOperatorNode();
                    node.hasEqvOp = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.hasEqvOp != null) node.hasEqvOp.setParent(node);
                    return node;

        }
        public Object handleEquivOp203(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTOperatorNode node = new ASTOperatorNode();
                    node.hasNeqvOp = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.hasNeqvOp != null) node.hasNeqvOp.setParent(node);
                    return node;

        }
        public Object handleDefinedOperator204(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTOperatorNode node = new ASTOperatorNode();
                    node.customDefinedOp = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.customDefinedOp != null) node.customDefinedOp.setParent(node);
                    return node;

        }
        public Object handleDefinedOperator205(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 5
                    ASTOperatorNode result = new ASTOperatorNode();
                    result.hasMinusOp = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("hasMinusOp");
                    if (result.hasMinusOp != null) result.hasMinusOp.setParent(result);
                    result.hasSlashEqOp = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("hasSlashEqOp");
                    if (result.hasSlashEqOp != null) result.hasSlashEqOp.setParent(result);
                    result.hasAndOp = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("hasAndOp");
                    if (result.hasAndOp != null) result.hasAndOp.setParent(result);
                    result.definedUnaryOp = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("definedUnaryOp");
                    if (result.definedUnaryOp != null) result.definedUnaryOp.setParent(result);
                    result.hasEqOp = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("hasEqOp");
                    if (result.hasEqOp != null) result.hasEqOp.setParent(result);
                    result.hasPlusOp = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("hasPlusOp");
                    if (result.hasPlusOp != null) result.hasPlusOp.setParent(result);
                    result.hasDivideOp = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("hasDivideOp");
                    if (result.hasDivideOp != null) result.hasDivideOp.setParent(result);
                    result.hasNeqvOp = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("hasNeqvOp");
                    if (result.hasNeqvOp != null) result.hasNeqvOp.setParent(result);
                    result.hasEqEqOp = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("hasEqEqOp");
                    if (result.hasEqEqOp != null) result.hasEqEqOp.setParent(result);
                    result.hasGeOp = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("hasGeOp");
                    if (result.hasGeOp != null) result.hasGeOp.setParent(result);
                    result.hasNotOp = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("hasNotOp");
                    if (result.hasNotOp != null) result.hasNotOp.setParent(result);
                    result.hasEqvOp = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("hasEqvOp");
                    if (result.hasEqvOp != null) result.hasEqvOp.setParent(result);
                    result.hasConcatOp = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("hasConcatOp");
                    if (result.hasConcatOp != null) result.hasConcatOp.setParent(result);
                    result.hasPowerOp = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("hasPowerOp");
                    if (result.hasPowerOp != null) result.hasPowerOp.setParent(result);
                    result.hasGtOp = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("hasGtOp");
                    if (result.hasGtOp != null) result.hasGtOp.setParent(result);
                    result.hasLtOp = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("hasLtOp");
                    if (result.hasLtOp != null) result.hasLtOp.setParent(result);
                    result.hasNeOp = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("hasNeOp");
                    if (result.hasNeOp != null) result.hasNeOp.setParent(result);
                    result.hasOrOp = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("hasOrOp");
                    if (result.hasOrOp != null) result.hasOrOp.setParent(result);
                    result.customDefinedOp = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("customDefinedOp");
                    if (result.customDefinedOp != null) result.customDefinedOp.setParent(result);
                    result.hasTimesOp = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("hasTimesOp");
                    if (result.hasTimesOp != null) result.hasTimesOp.setParent(result);
                    result.definedBinaryOp = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("definedBinaryOp");
                    if (result.definedBinaryOp != null) result.definedBinaryOp.setParent(result);
                    result.hasLeOp = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("hasLeOp");
                    if (result.hasLeOp != null) result.hasLeOp.setParent(result);
                    return result;

        }
        public Object handleDefinedOperator206(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 5
                    ASTOperatorNode result = (ASTOperatorNode)valueStack.get(valueStackOffset + 0);
                    return result;

        }
        public Object handleDefinedOperator207(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 5
                    ASTOperatorNode result = (ASTOperatorNode)valueStack.get(valueStackOffset + 0);
                    return result;

        }
        public Object handleDefinedOperator208(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 5
                    ASTOperatorNode result = (ASTOperatorNode)valueStack.get(valueStackOffset + 0);
                    return result;

        }
        public Object handleDefinedOperator209(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 5
                    ASTOperatorNode result = (ASTOperatorNode)valueStack.get(valueStackOffset + 0);
                    return result;

        }
        public Object handleDefinedOperator210(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 5
                    ASTOperatorNode result = (ASTOperatorNode)valueStack.get(valueStackOffset + 0);
                    return result;

        }
        public Object handleDefinedOperator211(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 5
                    ASTOperatorNode result = (ASTOperatorNode)valueStack.get(valueStackOffset + 0);
                    return result;

        }
        public Object handleDefinedOperator212(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 5
                    ASTOperatorNode result = (ASTOperatorNode)valueStack.get(valueStackOffset + 0);
                    return result;

        }
        public Object handleDefinedOperator213(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 5
                    ASTOperatorNode result = (ASTOperatorNode)valueStack.get(valueStackOffset + 0);
                    return result;

        }
        public Object handleDefinedUnaryOp214(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTOperatorNode node = new ASTOperatorNode();
                    node.definedUnaryOp = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.definedUnaryOp != null) node.definedUnaryOp.setParent(node);
                    return node;

        }
        public Object handleDefinedBinaryOp215(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTOperatorNode node = new ASTOperatorNode();
                    node.definedBinaryOp = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.definedBinaryOp != null) node.definedBinaryOp.setParent(node);
                    return node;

        }
        public Object handleLabel216(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 3 and 4
                    Map<String, Object> node = new HashMap<String, Object>();
                    node.put("label", (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0));
                    ASTListNode<IASTNode> embeddedList = new ASTListNode<IASTNode>();
                    embeddedList.add((IASTNode)(node.get("label")));
                    node.put("errorRecoveryList", embeddedList);
                    return node;

        }
        public Object handleUnsignedArithmeticConstant217(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTIntConstNode node = new ASTIntConstNode();
                    node.intConst = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.intConst != null) node.intConst.setParent(node);
                    return node;

        }
        public Object handleUnsignedArithmeticConstant218(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTRealConstNode node = new ASTRealConstNode();
                    node.realConst = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.realConst != null) node.realConst.setParent(node);
                    return node;

        }
        public Object handleUnsignedArithmeticConstant219(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTDblConstNode node = new ASTDblConstNode();
                    node.dblConst = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.dblConst != null) node.dblConst.setParent(node);
                    return node;

        }
        public Object handleUnsignedArithmeticConstant220(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 5
                    ASTComplexConstNode result = (ASTComplexConstNode)valueStack.get(valueStackOffset + 0);
                    return result;

        }
        public Object handleUnsignedArithmeticConstant221(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTIntConstNode node = new ASTIntConstNode();
                    node.intConst = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.intConst != null) node.intConst.setParent(node);
                    node.hiddenTUnderscore = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTUnderscore != null) node.hiddenTUnderscore.setParent(node);
                    node.namedConstKind = (ASTNamedConstantUseNode)((Map<String, Object>)valueStack.get(valueStackOffset + 2)).get("namedConstKind");
                    if (node.namedConstKind != null) node.namedConstKind.setParent(node);
                    node.intKind = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 2)).get("intKind");
                    if (node.intKind != null) node.intKind.setParent(node);
                    return node;

        }
        public Object handleUnsignedArithmeticConstant222(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTRealConstNode node = new ASTRealConstNode();
                    node.realConst = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.realConst != null) node.realConst.setParent(node);
                    node.hiddenTUnderscore = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTUnderscore != null) node.hiddenTUnderscore.setParent(node);
                    node.namedConstKind = (ASTNamedConstantUseNode)((Map<String, Object>)valueStack.get(valueStackOffset + 2)).get("namedConstKind");
                    if (node.namedConstKind != null) node.namedConstKind.setParent(node);
                    node.intKind = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 2)).get("intKind");
                    if (node.intKind != null) node.intKind.setParent(node);
                    return node;

        }
        public Object handleUnsignedArithmeticConstant223(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTDblConstNode node = new ASTDblConstNode();
                    node.dblConst = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.dblConst != null) node.dblConst.setParent(node);
                    node.hiddenTUnderscore = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTUnderscore != null) node.hiddenTUnderscore.setParent(node);
                    node.namedConstKind = (ASTNamedConstantUseNode)((Map<String, Object>)valueStack.get(valueStackOffset + 2)).get("namedConstKind");
                    if (node.namedConstKind != null) node.namedConstKind.setParent(node);
                    node.intKind = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 2)).get("intKind");
                    if (node.intKind != null) node.intKind.setParent(node);
                    return node;

        }
        public Object handleKindParam224(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 3 and 4
                    Map<String, Object> node = new HashMap<String, Object>();
                    node.put("intKind", (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0));
                    ASTListNode<IASTNode> embeddedList = new ASTListNode<IASTNode>();
                    embeddedList.add((IASTNode)(node.get("namedConstKind")));
                    embeddedList.add((IASTNode)(node.get("intKind")));
                    node.put("errorRecoveryList", embeddedList);
                    return node;

        }
        public Object handleKindParam225(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 3 and 4
                    Map<String, Object> node = new HashMap<String, Object>();
                    node.put("namedConstKind", (ASTNamedConstantUseNode)valueStack.get(valueStackOffset + 0));
                    ASTListNode<IASTNode> embeddedList = new ASTListNode<IASTNode>();
                    embeddedList.add((IASTNode)(node.get("namedConstKind")));
                    embeddedList.add((IASTNode)(node.get("intKind")));
                    node.put("errorRecoveryList", embeddedList);
                    return node;

        }
        public Object handleBozLiteralConstant226(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTBozLiteralConstNode node = new ASTBozLiteralConstNode();
                    node.binaryConst = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.binaryConst != null) node.binaryConst.setParent(node);
                    return node;

        }
        public Object handleBozLiteralConstant227(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTBozLiteralConstNode node = new ASTBozLiteralConstNode();
                    node.octalConst = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.octalConst != null) node.octalConst.setParent(node);
                    return node;

        }
        public Object handleBozLiteralConstant228(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTBozLiteralConstNode node = new ASTBozLiteralConstNode();
                    node.hexConst = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.hexConst != null) node.hexConst.setParent(node);
                    return node;

        }
        public Object handleComplexConst229(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTComplexConstNode node = new ASTComplexConstNode();
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.realPart = (IExpr)valueStack.get(valueStackOffset + 1);
                    if (node.realPart != null) node.realPart.setParent(node);
                    node.hiddenTComma = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTComma != null) node.hiddenTComma.setParent(node);
                    node.complexPart = (IExpr)valueStack.get(valueStackOffset + 3);
                    if (node.complexPart != null) node.complexPart.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    return node;

        }
        public Object handleLogicalConstant230(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTLogicalConstNode node = new ASTLogicalConstNode();
                    node.isTrue = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.isTrue != null) node.isTrue.setParent(node);
                    return node;

        }
        public Object handleLogicalConstant231(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTLogicalConstNode node = new ASTLogicalConstNode();
                    node.isFalse = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.isFalse != null) node.isFalse.setParent(node);
                    return node;

        }
        public Object handleLogicalConstant232(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTLogicalConstNode node = new ASTLogicalConstNode();
                    node.isTrue = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.isTrue != null) node.isTrue.setParent(node);
                    node.hiddenTUnderscore = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTUnderscore != null) node.hiddenTUnderscore.setParent(node);
                    node.namedConstKind = (ASTNamedConstantUseNode)((Map<String, Object>)valueStack.get(valueStackOffset + 2)).get("namedConstKind");
                    if (node.namedConstKind != null) node.namedConstKind.setParent(node);
                    node.intKind = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 2)).get("intKind");
                    if (node.intKind != null) node.intKind.setParent(node);
                    return node;

        }
        public Object handleLogicalConstant233(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTLogicalConstNode node = new ASTLogicalConstNode();
                    node.isFalse = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.isFalse != null) node.isFalse.setParent(node);
                    node.hiddenTUnderscore = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTUnderscore != null) node.hiddenTUnderscore.setParent(node);
                    node.namedConstKind = (ASTNamedConstantUseNode)((Map<String, Object>)valueStack.get(valueStackOffset + 2)).get("namedConstKind");
                    if (node.namedConstKind != null) node.namedConstKind.setParent(node);
                    node.intKind = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 2)).get("intKind");
                    if (node.intKind != null) node.intKind.setParent(node);
                    return node;

        }
        public Object handleDerivedTypeDef234(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTDerivedTypeDefNode node = new ASTDerivedTypeDefNode();
                    node.derivedTypeStmt = (ASTDerivedTypeStmtNode)valueStack.get(valueStackOffset + 0);
                    if (node.derivedTypeStmt != null) node.derivedTypeStmt.setParent(node);
                    node.endTypeStmt = (ASTEndTypeStmtNode)valueStack.get(valueStackOffset + 1);
                    if (node.endTypeStmt != null) node.endTypeStmt.setParent(node);
                    return node;

        }
        public Object handleDerivedTypeDef235(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTDerivedTypeDefNode node = new ASTDerivedTypeDefNode();
                    node.derivedTypeStmt = (ASTDerivedTypeStmtNode)valueStack.get(valueStackOffset + 0);
                    if (node.derivedTypeStmt != null) node.derivedTypeStmt.setParent(node);
                    node.typeBoundProcedurePart = (ASTTypeBoundProcedurePartNode)valueStack.get(valueStackOffset + 1);
                    if (node.typeBoundProcedurePart != null) node.typeBoundProcedurePart.setParent(node);
                    node.endTypeStmt = (ASTEndTypeStmtNode)valueStack.get(valueStackOffset + 2);
                    if (node.endTypeStmt != null) node.endTypeStmt.setParent(node);
                    return node;

        }
        public Object handleDerivedTypeDef236(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTDerivedTypeDefNode node = new ASTDerivedTypeDefNode();
                    node.derivedTypeStmt = (ASTDerivedTypeStmtNode)valueStack.get(valueStackOffset + 0);
                    if (node.derivedTypeStmt != null) node.derivedTypeStmt.setParent(node);
                    node.derivedTypeBody = (IASTListNode<IDerivedTypeBodyConstruct>)valueStack.get(valueStackOffset + 1);
                    if (node.derivedTypeBody != null) node.derivedTypeBody.setParent(node);
                    node.endTypeStmt = (ASTEndTypeStmtNode)valueStack.get(valueStackOffset + 2);
                    if (node.endTypeStmt != null) node.endTypeStmt.setParent(node);
                    return node;

        }
        public Object handleDerivedTypeDef237(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTDerivedTypeDefNode node = new ASTDerivedTypeDefNode();
                    node.derivedTypeStmt = (ASTDerivedTypeStmtNode)valueStack.get(valueStackOffset + 0);
                    if (node.derivedTypeStmt != null) node.derivedTypeStmt.setParent(node);
                    node.derivedTypeBody = (IASTListNode<IDerivedTypeBodyConstruct>)valueStack.get(valueStackOffset + 1);
                    if (node.derivedTypeBody != null) node.derivedTypeBody.setParent(node);
                    node.typeBoundProcedurePart = (ASTTypeBoundProcedurePartNode)valueStack.get(valueStackOffset + 2);
                    if (node.typeBoundProcedurePart != null) node.typeBoundProcedurePart.setParent(node);
                    node.endTypeStmt = (ASTEndTypeStmtNode)valueStack.get(valueStackOffset + 3);
                    if (node.endTypeStmt != null) node.endTypeStmt.setParent(node);
                    return node;

        }
        public Object handleDerivedTypeDef238(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTDerivedTypeDefNode node = new ASTDerivedTypeDefNode();
                    node.derivedTypeStmt = (ASTDerivedTypeStmtNode)valueStack.get(valueStackOffset + 0);
                    if (node.derivedTypeStmt != null) node.derivedTypeStmt.setParent(node);
                    node.typeParamDefStmt = (ASTTypeParamDefStmtNode)valueStack.get(valueStackOffset + 1);
                    if (node.typeParamDefStmt != null) node.typeParamDefStmt.setParent(node);
                    node.endTypeStmt = (ASTEndTypeStmtNode)valueStack.get(valueStackOffset + 2);
                    if (node.endTypeStmt != null) node.endTypeStmt.setParent(node);
                    return node;

        }
        public Object handleDerivedTypeDef239(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTDerivedTypeDefNode node = new ASTDerivedTypeDefNode();
                    node.derivedTypeStmt = (ASTDerivedTypeStmtNode)valueStack.get(valueStackOffset + 0);
                    if (node.derivedTypeStmt != null) node.derivedTypeStmt.setParent(node);
                    node.typeParamDefStmt = (ASTTypeParamDefStmtNode)valueStack.get(valueStackOffset + 1);
                    if (node.typeParamDefStmt != null) node.typeParamDefStmt.setParent(node);
                    node.typeBoundProcedurePart = (ASTTypeBoundProcedurePartNode)valueStack.get(valueStackOffset + 2);
                    if (node.typeBoundProcedurePart != null) node.typeBoundProcedurePart.setParent(node);
                    node.endTypeStmt = (ASTEndTypeStmtNode)valueStack.get(valueStackOffset + 3);
                    if (node.endTypeStmt != null) node.endTypeStmt.setParent(node);
                    return node;

        }
        public Object handleDerivedTypeDef240(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTDerivedTypeDefNode node = new ASTDerivedTypeDefNode();
                    node.derivedTypeStmt = (ASTDerivedTypeStmtNode)valueStack.get(valueStackOffset + 0);
                    if (node.derivedTypeStmt != null) node.derivedTypeStmt.setParent(node);
                    node.typeParamDefStmt = (ASTTypeParamDefStmtNode)valueStack.get(valueStackOffset + 1);
                    if (node.typeParamDefStmt != null) node.typeParamDefStmt.setParent(node);
                    node.derivedTypeBody = (IASTListNode<IDerivedTypeBodyConstruct>)valueStack.get(valueStackOffset + 2);
                    if (node.derivedTypeBody != null) node.derivedTypeBody.setParent(node);
                    node.endTypeStmt = (ASTEndTypeStmtNode)valueStack.get(valueStackOffset + 3);
                    if (node.endTypeStmt != null) node.endTypeStmt.setParent(node);
                    return node;

        }
        public Object handleDerivedTypeDef241(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTDerivedTypeDefNode node = new ASTDerivedTypeDefNode();
                    node.derivedTypeStmt = (ASTDerivedTypeStmtNode)valueStack.get(valueStackOffset + 0);
                    if (node.derivedTypeStmt != null) node.derivedTypeStmt.setParent(node);
                    node.typeParamDefStmt = (ASTTypeParamDefStmtNode)valueStack.get(valueStackOffset + 1);
                    if (node.typeParamDefStmt != null) node.typeParamDefStmt.setParent(node);
                    node.derivedTypeBody = (IASTListNode<IDerivedTypeBodyConstruct>)valueStack.get(valueStackOffset + 2);
                    if (node.derivedTypeBody != null) node.derivedTypeBody.setParent(node);
                    node.typeBoundProcedurePart = (ASTTypeBoundProcedurePartNode)valueStack.get(valueStackOffset + 3);
                    if (node.typeBoundProcedurePart != null) node.typeBoundProcedurePart.setParent(node);
                    node.endTypeStmt = (ASTEndTypeStmtNode)valueStack.get(valueStackOffset + 4);
                    if (node.endTypeStmt != null) node.endTypeStmt.setParent(node);
                    return node;

        }
        public Object handleDerivedTypeBody242(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 7
                    IASTListNode<IDerivedTypeBodyConstruct> list = new ASTListNode<IDerivedTypeBodyConstruct>();
                    IDerivedTypeBodyConstruct elt = (IDerivedTypeBodyConstruct)valueStack.get(valueStackOffset + 0);
                    list.add(elt);
                    if (elt != null) elt.setParent(list);
                    return list;

        }
        public Object handleDerivedTypeBody243(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 8
                    IASTListNode<IDerivedTypeBodyConstruct> list = (IASTListNode<IDerivedTypeBodyConstruct>)valueStack.get(valueStackOffset);
                    IDerivedTypeBodyConstruct elt = (IDerivedTypeBodyConstruct)valueStack.get(valueStackOffset + 1);
                    list.add(elt);
                    if (elt != null) elt.setParent(list);
                    return list;

        }
        public Object handleDerivedTypeBodyConstruct244(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 5
                    ASTPrivateSequenceStmtNode result = (ASTPrivateSequenceStmtNode)valueStack.get(valueStackOffset + 0);
                    return result;

        }
        public Object handleDerivedTypeBodyConstruct245(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 5
                    IComponentDefStmt result = (IComponentDefStmt)valueStack.get(valueStackOffset + 0);
                    return result;

        }
        public Object handleDerivedTypeStmt246(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTDerivedTypeStmtNode node = new ASTDerivedTypeStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTType = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTType != null) node.hiddenTType.setParent(node);
                    node.typeName = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 2)).get("typeName");
                    if (node.typeName != null) node.typeName.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleDerivedTypeStmt247(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTDerivedTypeStmtNode node = new ASTDerivedTypeStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTType = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTType != null) node.hiddenTType.setParent(node);
                    node.hiddenTColon = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTColon != null) node.hiddenTColon.setParent(node);
                    node.hiddenTColon2 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTColon2 != null) node.hiddenTColon2.setParent(node);
                    node.typeName = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 4)).get("typeName");
                    if (node.typeName != null) node.typeName.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 5);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleDerivedTypeStmt248(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTDerivedTypeStmtNode node = new ASTDerivedTypeStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTType = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTType != null) node.hiddenTType.setParent(node);
                    node.hiddenTComma = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTComma != null) node.hiddenTComma.setParent(node);
                    node.typeAttrSpecList = (IASTListNode<ASTTypeAttrSpecNode>)valueStack.get(valueStackOffset + 3);
                    if (node.typeAttrSpecList != null) node.typeAttrSpecList.setParent(node);
                    node.hiddenTColon = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenTColon != null) node.hiddenTColon.setParent(node);
                    node.hiddenTColon2 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 5);
                    if (node.hiddenTColon2 != null) node.hiddenTColon2.setParent(node);
                    node.typeName = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 6)).get("typeName");
                    if (node.typeName != null) node.typeName.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 7);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleDerivedTypeStmt249(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTDerivedTypeStmtNode node = new ASTDerivedTypeStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTType = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTType != null) node.hiddenTType.setParent(node);
                    node.typeName = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 2)).get("typeName");
                    if (node.typeName != null) node.typeName.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.typeParamNameList = (IASTListNode<ASTTypeParamNameNode>)valueStack.get(valueStackOffset + 4);
                    if (node.typeParamNameList != null) node.typeParamNameList.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 5);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 6);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleDerivedTypeStmt250(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTDerivedTypeStmtNode node = new ASTDerivedTypeStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTType = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTType != null) node.hiddenTType.setParent(node);
                    node.hiddenTColon = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTColon != null) node.hiddenTColon.setParent(node);
                    node.hiddenTColon2 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTColon2 != null) node.hiddenTColon2.setParent(node);
                    node.typeName = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 4)).get("typeName");
                    if (node.typeName != null) node.typeName.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 5);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.typeParamNameList = (IASTListNode<ASTTypeParamNameNode>)valueStack.get(valueStackOffset + 6);
                    if (node.typeParamNameList != null) node.typeParamNameList.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 7);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 8);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleDerivedTypeStmt251(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTDerivedTypeStmtNode node = new ASTDerivedTypeStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTType = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTType != null) node.hiddenTType.setParent(node);
                    node.hiddenTComma = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTComma != null) node.hiddenTComma.setParent(node);
                    node.typeAttrSpecList = (IASTListNode<ASTTypeAttrSpecNode>)valueStack.get(valueStackOffset + 3);
                    if (node.typeAttrSpecList != null) node.typeAttrSpecList.setParent(node);
                    node.hiddenTColon = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenTColon != null) node.hiddenTColon.setParent(node);
                    node.hiddenTColon2 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 5);
                    if (node.hiddenTColon2 != null) node.hiddenTColon2.setParent(node);
                    node.typeName = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 6)).get("typeName");
                    if (node.typeName != null) node.typeName.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 7);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.typeParamNameList = (IASTListNode<ASTTypeParamNameNode>)valueStack.get(valueStackOffset + 8);
                    if (node.typeParamNameList != null) node.typeParamNameList.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 9);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 10);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleTypeParamNameList252(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 8 with separator
                    ASTSeparatedListNode<ASTTypeParamNameNode> list = (ASTSeparatedListNode<ASTTypeParamNameNode>)valueStack.get(valueStackOffset);
                    org.eclipse.photran.internal.core.lexer.Token token = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    ASTTypeParamNameNode elt = (ASTTypeParamNameNode)valueStack.get(valueStackOffset + 2);
                    list.add(token, elt);
                    token.setParent(list);
                    if (elt != null) elt.setParent(list);
                    return list;

        }
        public Object handleTypeParamNameList253(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 7 with separator
                    ASTSeparatedListNode<ASTTypeParamNameNode> list = new ASTSeparatedListNode<ASTTypeParamNameNode>();
                    ASTTypeParamNameNode elt = (ASTTypeParamNameNode)valueStack.get(valueStackOffset + 0);
                    list.add(null, elt);
                    if (elt != null) elt.setParent(list);
                    return list;

        }
        public Object handleTypeAttrSpecList254(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 8 with separator
                    ASTSeparatedListNode<ASTTypeAttrSpecNode> list = (ASTSeparatedListNode<ASTTypeAttrSpecNode>)valueStack.get(valueStackOffset);
                    org.eclipse.photran.internal.core.lexer.Token token = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    ASTTypeAttrSpecNode elt = (ASTTypeAttrSpecNode)valueStack.get(valueStackOffset + 2);
                    list.add(token, elt);
                    token.setParent(list);
                    if (elt != null) elt.setParent(list);
                    return list;

        }
        public Object handleTypeAttrSpecList255(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 7 with separator
                    ASTSeparatedListNode<ASTTypeAttrSpecNode> list = new ASTSeparatedListNode<ASTTypeAttrSpecNode>();
                    ASTTypeAttrSpecNode elt = (ASTTypeAttrSpecNode)valueStack.get(valueStackOffset + 0);
                    list.add(null, elt);
                    if (elt != null) elt.setParent(list);
                    return list;

        }
        public Object handleTypeAttrSpec256(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTTypeAttrSpecNode node = new ASTTypeAttrSpecNode();
                    node.accessSpec = (ASTAccessSpecNode)valueStack.get(valueStackOffset + 0);
                    if (node.accessSpec != null) node.accessSpec.setParent(node);
                    return node;

        }
        public Object handleTypeAttrSpec257(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTTypeAttrSpecNode node = new ASTTypeAttrSpecNode();
                    node.isExtends = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.isExtends != null) node.isExtends.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.parentTypeName = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.parentTypeName != null) node.parentTypeName.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    return node;

        }
        public Object handleTypeAttrSpec258(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTTypeAttrSpecNode node = new ASTTypeAttrSpecNode();
                    node.isAbstract = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.isAbstract != null) node.isAbstract.setParent(node);
                    return node;

        }
        public Object handleTypeAttrSpec259(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTTypeAttrSpecNode node = new ASTTypeAttrSpecNode();
                    node.isBind = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.isBind != null) node.isBind.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.language = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.language != null) node.language.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    return node;

        }
        public Object handleTypeParamName260(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTTypeParamNameNode node = new ASTTypeParamNameNode();
                    node.typeParamName = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.typeParamName != null) node.typeParamName.setParent(node);
                    return node;

        }
        public Object handlePrivateSequenceStmt261(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTPrivateSequenceStmtNode node = new ASTPrivateSequenceStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.privateToken = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.privateToken != null) node.privateToken.setParent(node);
                    node.isPrivate = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.isPrivate != null) node.isPrivate.setParent(node);
                    return node;

        }
        public Object handlePrivateSequenceStmt262(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTPrivateSequenceStmtNode node = new ASTPrivateSequenceStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.sequenceToken = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.sequenceToken != null) node.sequenceToken.setParent(node);
                    node.isSequence = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.isSequence != null) node.isSequence.setParent(node);
                    return node;

        }
        public Object handleTypeParamDefStmt263(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTTypeParamDefStmtNode node = new ASTTypeParamDefStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.typeSpec = (ASTTypeSpecNode)valueStack.get(valueStackOffset + 1);
                    if (node.typeSpec != null) node.typeSpec.setParent(node);
                    node.hiddenTComma = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTComma != null) node.hiddenTComma.setParent(node);
                    node.typeParamAttrSpec = (ASTTypeParamAttrSpecNode)valueStack.get(valueStackOffset + 3);
                    if (node.typeParamAttrSpec != null) node.typeParamAttrSpec.setParent(node);
                    node.hiddenTColon = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenTColon != null) node.hiddenTColon.setParent(node);
                    node.hiddenTColon2 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 5);
                    if (node.hiddenTColon2 != null) node.hiddenTColon2.setParent(node);
                    node.typeParamDeclList = (IASTListNode<ASTTypeParamDeclNode>)valueStack.get(valueStackOffset + 6);
                    if (node.typeParamDeclList != null) node.typeParamDeclList.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 7);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleTypeParamDeclList264(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 8 with separator
                    ASTSeparatedListNode<ASTTypeParamDeclNode> list = (ASTSeparatedListNode<ASTTypeParamDeclNode>)valueStack.get(valueStackOffset);
                    org.eclipse.photran.internal.core.lexer.Token token = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    ASTTypeParamDeclNode elt = (ASTTypeParamDeclNode)valueStack.get(valueStackOffset + 2);
                    list.add(token, elt);
                    token.setParent(list);
                    if (elt != null) elt.setParent(list);
                    return list;

        }
        public Object handleTypeParamDeclList265(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 7 with separator
                    ASTSeparatedListNode<ASTTypeParamDeclNode> list = new ASTSeparatedListNode<ASTTypeParamDeclNode>();
                    ASTTypeParamDeclNode elt = (ASTTypeParamDeclNode)valueStack.get(valueStackOffset + 0);
                    list.add(null, elt);
                    if (elt != null) elt.setParent(list);
                    return list;

        }
        public Object handleTypeParamDecl266(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTTypeParamDeclNode node = new ASTTypeParamDeclNode();
                    node.typeParamName = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.typeParamName != null) node.typeParamName.setParent(node);
                    return node;

        }
        public Object handleTypeParamDecl267(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTTypeParamDeclNode node = new ASTTypeParamDeclNode();
                    node.typeParamName = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.typeParamName != null) node.typeParamName.setParent(node);
                    node.hiddenTEquals = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTEquals != null) node.hiddenTEquals.setParent(node);
                    node.expr = (IExpr)valueStack.get(valueStackOffset + 2);
                    if (node.expr != null) node.expr.setParent(node);
                    return node;

        }
        public Object handleTypeParamAttrSpec268(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTTypeParamAttrSpecNode node = new ASTTypeParamAttrSpecNode();
                    node.isKind = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.isKind != null) node.isKind.setParent(node);
                    return node;

        }
        public Object handleTypeParamAttrSpec269(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTTypeParamAttrSpecNode node = new ASTTypeParamAttrSpecNode();
                    node.isLen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.isLen != null) node.isLen.setParent(node);
                    return node;

        }
        public Object handleComponentDefStmt270(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 5
                    ASTDataComponentDefStmtNode result = (ASTDataComponentDefStmtNode)valueStack.get(valueStackOffset + 0);
                    return result;

        }
        public Object handleComponentDefStmt271(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 5
                    ASTProcComponentDefStmtNode result = (ASTProcComponentDefStmtNode)valueStack.get(valueStackOffset + 0);
                    return result;

        }
        public Object handleDataComponentDefStmt272(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTDataComponentDefStmtNode node = new ASTDataComponentDefStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.typeSpec = (ASTTypeSpecNode)valueStack.get(valueStackOffset + 1);
                    if (node.typeSpec != null) node.typeSpec.setParent(node);
                    node.hiddenTComma = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTComma != null) node.hiddenTComma.setParent(node);
                    node.componentAttrSpecList = (IASTListNode<ASTComponentAttrSpecNode>)valueStack.get(valueStackOffset + 3);
                    if (node.componentAttrSpecList != null) node.componentAttrSpecList.setParent(node);
                    node.hiddenTColon = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenTColon != null) node.hiddenTColon.setParent(node);
                    node.hiddenTColon2 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 5);
                    if (node.hiddenTColon2 != null) node.hiddenTColon2.setParent(node);
                    node.componentDeclList = (IASTListNode<ASTComponentDeclNode>)valueStack.get(valueStackOffset + 6);
                    if (node.componentDeclList != null) node.componentDeclList.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 7);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleDataComponentDefStmt273(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTDataComponentDefStmtNode node = new ASTDataComponentDefStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.typeSpec = (ASTTypeSpecNode)valueStack.get(valueStackOffset + 1);
                    if (node.typeSpec != null) node.typeSpec.setParent(node);
                    node.hiddenTColon = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTColon != null) node.hiddenTColon.setParent(node);
                    node.hiddenTColon2 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTColon2 != null) node.hiddenTColon2.setParent(node);
                    node.componentDeclList = (IASTListNode<ASTComponentDeclNode>)valueStack.get(valueStackOffset + 4);
                    if (node.componentDeclList != null) node.componentDeclList.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 5);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleDataComponentDefStmt274(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTDataComponentDefStmtNode node = new ASTDataComponentDefStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.typeSpec = (ASTTypeSpecNode)valueStack.get(valueStackOffset + 1);
                    if (node.typeSpec != null) node.typeSpec.setParent(node);
                    node.componentDeclList = (IASTListNode<ASTComponentDeclNode>)valueStack.get(valueStackOffset + 2);
                    if (node.componentDeclList != null) node.componentDeclList.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleComponentAttrSpecList275(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 7 with separator
                    ASTSeparatedListNode<ASTComponentAttrSpecNode> list = new ASTSeparatedListNode<ASTComponentAttrSpecNode>();
                    ASTComponentAttrSpecNode elt = (ASTComponentAttrSpecNode)valueStack.get(valueStackOffset + 0);
                    list.add(null, elt);
                    if (elt != null) elt.setParent(list);
                    return list;

        }
        public Object handleComponentAttrSpecList276(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 8 with separator
                    ASTSeparatedListNode<ASTComponentAttrSpecNode> list = (ASTSeparatedListNode<ASTComponentAttrSpecNode>)valueStack.get(valueStackOffset);
                    org.eclipse.photran.internal.core.lexer.Token token = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    ASTComponentAttrSpecNode elt = (ASTComponentAttrSpecNode)valueStack.get(valueStackOffset + 2);
                    list.add(token, elt);
                    token.setParent(list);
                    if (elt != null) elt.setParent(list);
                    return list;

        }
        public Object handleComponentAttrSpec277(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTComponentAttrSpecNode node = new ASTComponentAttrSpecNode();
                    node.pointer = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.pointer != null) node.pointer.setParent(node);
                    return node;

        }
        public Object handleComponentAttrSpec278(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTComponentAttrSpecNode node = new ASTComponentAttrSpecNode();
                    node.dimension = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.dimension != null) node.dimension.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.componentArraySpec = (ASTComponentArraySpecNode)valueStack.get(valueStackOffset + 2);
                    if (node.componentArraySpec != null) node.componentArraySpec.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    return node;

        }
        public Object handleComponentAttrSpec279(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTComponentAttrSpecNode node = new ASTComponentAttrSpecNode();
                    node.allocatable = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.allocatable != null) node.allocatable.setParent(node);
                    return node;

        }
        public Object handleComponentAttrSpec280(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTComponentAttrSpecNode node = new ASTComponentAttrSpecNode();
                    node.accessSpec = (ASTAccessSpecNode)valueStack.get(valueStackOffset + 0);
                    if (node.accessSpec != null) node.accessSpec.setParent(node);
                    return node;

        }
        public Object handleComponentAttrSpec281(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTComponentAttrSpecNode node = new ASTComponentAttrSpecNode();
                    node.codimension = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.codimension != null) node.codimension.setParent(node);
                    node.hiddenTLbracket = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTLbracket != null) node.hiddenTLbracket.setParent(node);
                    node.coarraySpec = (ASTCoarraySpecNode)valueStack.get(valueStackOffset + 2);
                    if (node.coarraySpec != null) node.coarraySpec.setParent(node);
                    node.hiddenTRbracket = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTRbracket != null) node.hiddenTRbracket.setParent(node);
                    return node;

        }
        public Object handleComponentAttrSpec282(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTComponentAttrSpecNode node = new ASTComponentAttrSpecNode();
                    node.contiguous = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.contiguous != null) node.contiguous.setParent(node);
                    return node;

        }
        public Object handleComponentArraySpec283(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTComponentArraySpecNode node = new ASTComponentArraySpecNode();
                    node.explicitShapeSpecList = (IASTListNode<ASTExplicitShapeSpecNode>)valueStack.get(valueStackOffset + 0);
                    if (node.explicitShapeSpecList != null) node.explicitShapeSpecList.setParent(node);
                    return node;

        }
        public Object handleComponentArraySpec284(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTComponentArraySpecNode node = new ASTComponentArraySpecNode();
                    node.deferredShapeSpecList = (IASTListNode<ASTDeferredShapeSpecListNode>)valueStack.get(valueStackOffset + 0);
                    if (node.deferredShapeSpecList != null) node.deferredShapeSpecList.setParent(node);
                    return node;

        }
        public Object handleComponentDeclList285(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 7 with separator
                    ASTSeparatedListNode<ASTComponentDeclNode> list = new ASTSeparatedListNode<ASTComponentDeclNode>();
                    ASTComponentDeclNode elt = (ASTComponentDeclNode)valueStack.get(valueStackOffset + 0);
                    list.add(null, elt);
                    if (elt != null) elt.setParent(list);
                    return list;

        }
        public Object handleComponentDeclList286(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 8 with separator
                    ASTSeparatedListNode<ASTComponentDeclNode> list = (ASTSeparatedListNode<ASTComponentDeclNode>)valueStack.get(valueStackOffset);
                    org.eclipse.photran.internal.core.lexer.Token token = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    ASTComponentDeclNode elt = (ASTComponentDeclNode)valueStack.get(valueStackOffset + 2);
                    list.add(token, elt);
                    token.setParent(list);
                    if (elt != null) elt.setParent(list);
                    return list;

        }
        public Object handleComponentDecl287(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTComponentDeclNode node = new ASTComponentDeclNode();
                    node.componentName = (ASTComponentNameNode)valueStack.get(valueStackOffset + 0);
                    if (node.componentName != null) node.componentName.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.componentArraySpec = (ASTComponentArraySpecNode)valueStack.get(valueStackOffset + 2);
                    if (node.componentArraySpec != null) node.componentArraySpec.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    node.hiddenTAsterisk = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenTAsterisk != null) node.hiddenTAsterisk.setParent(node);
                    ASTCharLengthNode tmp5 = new ASTCharLengthNode();
                    tmp5.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 5)).get("hiddenTLparen");
                    if (tmp5.hiddenTLparen != null) tmp5.hiddenTLparen.setParent(tmp5);
                    tmp5.isColon = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 5)).get("isColon");
                    if (tmp5.isColon != null) tmp5.isColon.setParent(tmp5);
                    tmp5.constIntLength = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 5)).get("constIntLength");
                    if (tmp5.constIntLength != null) tmp5.constIntLength.setParent(tmp5);
                    tmp5.isAssumedLength = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 5)).get("isAssumedLength");
                    if (tmp5.isAssumedLength != null) tmp5.isAssumedLength.setParent(tmp5);
                    tmp5.lengthExpr = (IExpr)((Map<String, Object>)valueStack.get(valueStackOffset + 5)).get("lengthExpr");
                    if (tmp5.lengthExpr != null) tmp5.lengthExpr.setParent(tmp5);
                    tmp5.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 5)).get("hiddenTRparen");
                    if (tmp5.hiddenTRparen != null) tmp5.hiddenTRparen.setParent(tmp5);
                    tmp5.constNameLength = (ASTNameNode)((Map<String, Object>)valueStack.get(valueStackOffset + 5)).get("constNameLength");
                    if (tmp5.constNameLength != null) tmp5.constNameLength.setParent(tmp5);
                    node.charLength = tmp5;
                    if (tmp5 != null) tmp5.setParent(node);
                    node.componentInitialization = (ASTComponentInitializationNode)valueStack.get(valueStackOffset + 6);
                    if (node.componentInitialization != null) node.componentInitialization.setParent(node);
                    return node;

        }
        public Object handleComponentDecl288(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTComponentDeclNode node = new ASTComponentDeclNode();
                    node.componentName = (ASTComponentNameNode)valueStack.get(valueStackOffset + 0);
                    if (node.componentName != null) node.componentName.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.componentArraySpec = (ASTComponentArraySpecNode)valueStack.get(valueStackOffset + 2);
                    if (node.componentArraySpec != null) node.componentArraySpec.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    node.hiddenTAsterisk = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenTAsterisk != null) node.hiddenTAsterisk.setParent(node);
                    ASTCharLengthNode tmp5 = new ASTCharLengthNode();
                    tmp5.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 5)).get("hiddenTLparen");
                    if (tmp5.hiddenTLparen != null) tmp5.hiddenTLparen.setParent(tmp5);
                    tmp5.isColon = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 5)).get("isColon");
                    if (tmp5.isColon != null) tmp5.isColon.setParent(tmp5);
                    tmp5.constIntLength = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 5)).get("constIntLength");
                    if (tmp5.constIntLength != null) tmp5.constIntLength.setParent(tmp5);
                    tmp5.isAssumedLength = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 5)).get("isAssumedLength");
                    if (tmp5.isAssumedLength != null) tmp5.isAssumedLength.setParent(tmp5);
                    tmp5.lengthExpr = (IExpr)((Map<String, Object>)valueStack.get(valueStackOffset + 5)).get("lengthExpr");
                    if (tmp5.lengthExpr != null) tmp5.lengthExpr.setParent(tmp5);
                    tmp5.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 5)).get("hiddenTRparen");
                    if (tmp5.hiddenTRparen != null) tmp5.hiddenTRparen.setParent(tmp5);
                    tmp5.constNameLength = (ASTNameNode)((Map<String, Object>)valueStack.get(valueStackOffset + 5)).get("constNameLength");
                    if (tmp5.constNameLength != null) tmp5.constNameLength.setParent(tmp5);
                    node.charLength = tmp5;
                    if (tmp5 != null) tmp5.setParent(node);
                    return node;

        }
        public Object handleComponentDecl289(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTComponentDeclNode node = new ASTComponentDeclNode();
                    node.componentName = (ASTComponentNameNode)valueStack.get(valueStackOffset + 0);
                    if (node.componentName != null) node.componentName.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.componentArraySpec = (ASTComponentArraySpecNode)valueStack.get(valueStackOffset + 2);
                    if (node.componentArraySpec != null) node.componentArraySpec.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    node.componentInitialization = (ASTComponentInitializationNode)valueStack.get(valueStackOffset + 4);
                    if (node.componentInitialization != null) node.componentInitialization.setParent(node);
                    return node;

        }
        public Object handleComponentDecl290(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTComponentDeclNode node = new ASTComponentDeclNode();
                    node.componentName = (ASTComponentNameNode)valueStack.get(valueStackOffset + 0);
                    if (node.componentName != null) node.componentName.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.componentArraySpec = (ASTComponentArraySpecNode)valueStack.get(valueStackOffset + 2);
                    if (node.componentArraySpec != null) node.componentArraySpec.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    return node;

        }
        public Object handleComponentDecl291(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTComponentDeclNode node = new ASTComponentDeclNode();
                    node.componentName = (ASTComponentNameNode)valueStack.get(valueStackOffset + 0);
                    if (node.componentName != null) node.componentName.setParent(node);
                    node.hiddenTAsterisk = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTAsterisk != null) node.hiddenTAsterisk.setParent(node);
                    ASTCharLengthNode tmp2 = new ASTCharLengthNode();
                    tmp2.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 2)).get("hiddenTLparen");
                    if (tmp2.hiddenTLparen != null) tmp2.hiddenTLparen.setParent(tmp2);
                    tmp2.isColon = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 2)).get("isColon");
                    if (tmp2.isColon != null) tmp2.isColon.setParent(tmp2);
                    tmp2.constIntLength = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 2)).get("constIntLength");
                    if (tmp2.constIntLength != null) tmp2.constIntLength.setParent(tmp2);
                    tmp2.isAssumedLength = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 2)).get("isAssumedLength");
                    if (tmp2.isAssumedLength != null) tmp2.isAssumedLength.setParent(tmp2);
                    tmp2.lengthExpr = (IExpr)((Map<String, Object>)valueStack.get(valueStackOffset + 2)).get("lengthExpr");
                    if (tmp2.lengthExpr != null) tmp2.lengthExpr.setParent(tmp2);
                    tmp2.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 2)).get("hiddenTRparen");
                    if (tmp2.hiddenTRparen != null) tmp2.hiddenTRparen.setParent(tmp2);
                    tmp2.constNameLength = (ASTNameNode)((Map<String, Object>)valueStack.get(valueStackOffset + 2)).get("constNameLength");
                    if (tmp2.constNameLength != null) tmp2.constNameLength.setParent(tmp2);
                    node.charLength = tmp2;
                    if (tmp2 != null) tmp2.setParent(node);
                    node.componentInitialization = (ASTComponentInitializationNode)valueStack.get(valueStackOffset + 3);
                    if (node.componentInitialization != null) node.componentInitialization.setParent(node);
                    return node;

        }
        public Object handleComponentDecl292(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTComponentDeclNode node = new ASTComponentDeclNode();
                    node.componentName = (ASTComponentNameNode)valueStack.get(valueStackOffset + 0);
                    if (node.componentName != null) node.componentName.setParent(node);
                    node.hiddenTAsterisk = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTAsterisk != null) node.hiddenTAsterisk.setParent(node);
                    ASTCharLengthNode tmp2 = new ASTCharLengthNode();
                    tmp2.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 2)).get("hiddenTLparen");
                    if (tmp2.hiddenTLparen != null) tmp2.hiddenTLparen.setParent(tmp2);
                    tmp2.isColon = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 2)).get("isColon");
                    if (tmp2.isColon != null) tmp2.isColon.setParent(tmp2);
                    tmp2.constIntLength = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 2)).get("constIntLength");
                    if (tmp2.constIntLength != null) tmp2.constIntLength.setParent(tmp2);
                    tmp2.isAssumedLength = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 2)).get("isAssumedLength");
                    if (tmp2.isAssumedLength != null) tmp2.isAssumedLength.setParent(tmp2);
                    tmp2.lengthExpr = (IExpr)((Map<String, Object>)valueStack.get(valueStackOffset + 2)).get("lengthExpr");
                    if (tmp2.lengthExpr != null) tmp2.lengthExpr.setParent(tmp2);
                    tmp2.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 2)).get("hiddenTRparen");
                    if (tmp2.hiddenTRparen != null) tmp2.hiddenTRparen.setParent(tmp2);
                    tmp2.constNameLength = (ASTNameNode)((Map<String, Object>)valueStack.get(valueStackOffset + 2)).get("constNameLength");
                    if (tmp2.constNameLength != null) tmp2.constNameLength.setParent(tmp2);
                    node.charLength = tmp2;
                    if (tmp2 != null) tmp2.setParent(node);
                    return node;

        }
        public Object handleComponentDecl293(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTComponentDeclNode node = new ASTComponentDeclNode();
                    node.componentName = (ASTComponentNameNode)valueStack.get(valueStackOffset + 0);
                    if (node.componentName != null) node.componentName.setParent(node);
                    node.componentInitialization = (ASTComponentInitializationNode)valueStack.get(valueStackOffset + 1);
                    if (node.componentInitialization != null) node.componentInitialization.setParent(node);
                    return node;

        }
        public Object handleComponentDecl294(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTComponentDeclNode node = new ASTComponentDeclNode();
                    node.componentName = (ASTComponentNameNode)valueStack.get(valueStackOffset + 0);
                    if (node.componentName != null) node.componentName.setParent(node);
                    return node;

        }
        public Object handleComponentDecl295(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTComponentDeclNode node = new ASTComponentDeclNode();
                    node.componentName = (ASTComponentNameNode)valueStack.get(valueStackOffset + 0);
                    if (node.componentName != null) node.componentName.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.componentArraySpec = (ASTComponentArraySpecNode)valueStack.get(valueStackOffset + 2);
                    if (node.componentArraySpec != null) node.componentArraySpec.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    node.hiddenTLbracket = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenTLbracket != null) node.hiddenTLbracket.setParent(node);
                    node.coarraySpec = (ASTCoarraySpecNode)valueStack.get(valueStackOffset + 5);
                    if (node.coarraySpec != null) node.coarraySpec.setParent(node);
                    node.hiddenTRbracket = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 6);
                    if (node.hiddenTRbracket != null) node.hiddenTRbracket.setParent(node);
                    node.hiddenTAsterisk = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 7);
                    if (node.hiddenTAsterisk != null) node.hiddenTAsterisk.setParent(node);
                    ASTCharLengthNode tmp8 = new ASTCharLengthNode();
                    tmp8.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 8)).get("hiddenTLparen");
                    if (tmp8.hiddenTLparen != null) tmp8.hiddenTLparen.setParent(tmp8);
                    tmp8.isColon = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 8)).get("isColon");
                    if (tmp8.isColon != null) tmp8.isColon.setParent(tmp8);
                    tmp8.constIntLength = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 8)).get("constIntLength");
                    if (tmp8.constIntLength != null) tmp8.constIntLength.setParent(tmp8);
                    tmp8.isAssumedLength = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 8)).get("isAssumedLength");
                    if (tmp8.isAssumedLength != null) tmp8.isAssumedLength.setParent(tmp8);
                    tmp8.lengthExpr = (IExpr)((Map<String, Object>)valueStack.get(valueStackOffset + 8)).get("lengthExpr");
                    if (tmp8.lengthExpr != null) tmp8.lengthExpr.setParent(tmp8);
                    tmp8.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 8)).get("hiddenTRparen");
                    if (tmp8.hiddenTRparen != null) tmp8.hiddenTRparen.setParent(tmp8);
                    tmp8.constNameLength = (ASTNameNode)((Map<String, Object>)valueStack.get(valueStackOffset + 8)).get("constNameLength");
                    if (tmp8.constNameLength != null) tmp8.constNameLength.setParent(tmp8);
                    node.charLength = tmp8;
                    if (tmp8 != null) tmp8.setParent(node);
                    node.componentInitialization = (ASTComponentInitializationNode)valueStack.get(valueStackOffset + 9);
                    if (node.componentInitialization != null) node.componentInitialization.setParent(node);
                    return node;

        }
        public Object handleComponentDecl296(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTComponentDeclNode node = new ASTComponentDeclNode();
                    node.componentName = (ASTComponentNameNode)valueStack.get(valueStackOffset + 0);
                    if (node.componentName != null) node.componentName.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.componentArraySpec = (ASTComponentArraySpecNode)valueStack.get(valueStackOffset + 2);
                    if (node.componentArraySpec != null) node.componentArraySpec.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    node.hiddenTLbracket = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenTLbracket != null) node.hiddenTLbracket.setParent(node);
                    node.coarraySpec = (ASTCoarraySpecNode)valueStack.get(valueStackOffset + 5);
                    if (node.coarraySpec != null) node.coarraySpec.setParent(node);
                    node.hiddenTRbracket = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 6);
                    if (node.hiddenTRbracket != null) node.hiddenTRbracket.setParent(node);
                    node.hiddenTAsterisk = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 7);
                    if (node.hiddenTAsterisk != null) node.hiddenTAsterisk.setParent(node);
                    ASTCharLengthNode tmp8 = new ASTCharLengthNode();
                    tmp8.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 8)).get("hiddenTLparen");
                    if (tmp8.hiddenTLparen != null) tmp8.hiddenTLparen.setParent(tmp8);
                    tmp8.isColon = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 8)).get("isColon");
                    if (tmp8.isColon != null) tmp8.isColon.setParent(tmp8);
                    tmp8.constIntLength = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 8)).get("constIntLength");
                    if (tmp8.constIntLength != null) tmp8.constIntLength.setParent(tmp8);
                    tmp8.isAssumedLength = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 8)).get("isAssumedLength");
                    if (tmp8.isAssumedLength != null) tmp8.isAssumedLength.setParent(tmp8);
                    tmp8.lengthExpr = (IExpr)((Map<String, Object>)valueStack.get(valueStackOffset + 8)).get("lengthExpr");
                    if (tmp8.lengthExpr != null) tmp8.lengthExpr.setParent(tmp8);
                    tmp8.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 8)).get("hiddenTRparen");
                    if (tmp8.hiddenTRparen != null) tmp8.hiddenTRparen.setParent(tmp8);
                    tmp8.constNameLength = (ASTNameNode)((Map<String, Object>)valueStack.get(valueStackOffset + 8)).get("constNameLength");
                    if (tmp8.constNameLength != null) tmp8.constNameLength.setParent(tmp8);
                    node.charLength = tmp8;
                    if (tmp8 != null) tmp8.setParent(node);
                    return node;

        }
        public Object handleComponentDecl297(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTComponentDeclNode node = new ASTComponentDeclNode();
                    node.componentName = (ASTComponentNameNode)valueStack.get(valueStackOffset + 0);
                    if (node.componentName != null) node.componentName.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.componentArraySpec = (ASTComponentArraySpecNode)valueStack.get(valueStackOffset + 2);
                    if (node.componentArraySpec != null) node.componentArraySpec.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    node.hiddenTLbracket = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenTLbracket != null) node.hiddenTLbracket.setParent(node);
                    node.coarraySpec = (ASTCoarraySpecNode)valueStack.get(valueStackOffset + 5);
                    if (node.coarraySpec != null) node.coarraySpec.setParent(node);
                    node.hiddenTRbracket = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 6);
                    if (node.hiddenTRbracket != null) node.hiddenTRbracket.setParent(node);
                    node.componentInitialization = (ASTComponentInitializationNode)valueStack.get(valueStackOffset + 7);
                    if (node.componentInitialization != null) node.componentInitialization.setParent(node);
                    return node;

        }
        public Object handleComponentDecl298(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTComponentDeclNode node = new ASTComponentDeclNode();
                    node.componentName = (ASTComponentNameNode)valueStack.get(valueStackOffset + 0);
                    if (node.componentName != null) node.componentName.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.componentArraySpec = (ASTComponentArraySpecNode)valueStack.get(valueStackOffset + 2);
                    if (node.componentArraySpec != null) node.componentArraySpec.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    node.hiddenTLbracket = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenTLbracket != null) node.hiddenTLbracket.setParent(node);
                    node.coarraySpec = (ASTCoarraySpecNode)valueStack.get(valueStackOffset + 5);
                    if (node.coarraySpec != null) node.coarraySpec.setParent(node);
                    node.hiddenTRbracket = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 6);
                    if (node.hiddenTRbracket != null) node.hiddenTRbracket.setParent(node);
                    return node;

        }
        public Object handleComponentDecl299(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTComponentDeclNode node = new ASTComponentDeclNode();
                    node.componentName = (ASTComponentNameNode)valueStack.get(valueStackOffset + 0);
                    if (node.componentName != null) node.componentName.setParent(node);
                    node.hiddenTLbracket = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTLbracket != null) node.hiddenTLbracket.setParent(node);
                    node.coarraySpec = (ASTCoarraySpecNode)valueStack.get(valueStackOffset + 2);
                    if (node.coarraySpec != null) node.coarraySpec.setParent(node);
                    node.hiddenTRbracket = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTRbracket != null) node.hiddenTRbracket.setParent(node);
                    node.hiddenTAsterisk = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenTAsterisk != null) node.hiddenTAsterisk.setParent(node);
                    ASTCharLengthNode tmp5 = new ASTCharLengthNode();
                    tmp5.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 5)).get("hiddenTLparen");
                    if (tmp5.hiddenTLparen != null) tmp5.hiddenTLparen.setParent(tmp5);
                    tmp5.isColon = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 5)).get("isColon");
                    if (tmp5.isColon != null) tmp5.isColon.setParent(tmp5);
                    tmp5.constIntLength = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 5)).get("constIntLength");
                    if (tmp5.constIntLength != null) tmp5.constIntLength.setParent(tmp5);
                    tmp5.isAssumedLength = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 5)).get("isAssumedLength");
                    if (tmp5.isAssumedLength != null) tmp5.isAssumedLength.setParent(tmp5);
                    tmp5.lengthExpr = (IExpr)((Map<String, Object>)valueStack.get(valueStackOffset + 5)).get("lengthExpr");
                    if (tmp5.lengthExpr != null) tmp5.lengthExpr.setParent(tmp5);
                    tmp5.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 5)).get("hiddenTRparen");
                    if (tmp5.hiddenTRparen != null) tmp5.hiddenTRparen.setParent(tmp5);
                    tmp5.constNameLength = (ASTNameNode)((Map<String, Object>)valueStack.get(valueStackOffset + 5)).get("constNameLength");
                    if (tmp5.constNameLength != null) tmp5.constNameLength.setParent(tmp5);
                    node.charLength = tmp5;
                    if (tmp5 != null) tmp5.setParent(node);
                    node.componentInitialization = (ASTComponentInitializationNode)valueStack.get(valueStackOffset + 6);
                    if (node.componentInitialization != null) node.componentInitialization.setParent(node);
                    return node;

        }
        public Object handleComponentDecl300(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTComponentDeclNode node = new ASTComponentDeclNode();
                    node.componentName = (ASTComponentNameNode)valueStack.get(valueStackOffset + 0);
                    if (node.componentName != null) node.componentName.setParent(node);
                    node.hiddenTLbracket = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTLbracket != null) node.hiddenTLbracket.setParent(node);
                    node.coarraySpec = (ASTCoarraySpecNode)valueStack.get(valueStackOffset + 2);
                    if (node.coarraySpec != null) node.coarraySpec.setParent(node);
                    node.hiddenTRbracket = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTRbracket != null) node.hiddenTRbracket.setParent(node);
                    node.hiddenTAsterisk = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenTAsterisk != null) node.hiddenTAsterisk.setParent(node);
                    ASTCharLengthNode tmp5 = new ASTCharLengthNode();
                    tmp5.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 5)).get("hiddenTLparen");
                    if (tmp5.hiddenTLparen != null) tmp5.hiddenTLparen.setParent(tmp5);
                    tmp5.isColon = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 5)).get("isColon");
                    if (tmp5.isColon != null) tmp5.isColon.setParent(tmp5);
                    tmp5.constIntLength = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 5)).get("constIntLength");
                    if (tmp5.constIntLength != null) tmp5.constIntLength.setParent(tmp5);
                    tmp5.isAssumedLength = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 5)).get("isAssumedLength");
                    if (tmp5.isAssumedLength != null) tmp5.isAssumedLength.setParent(tmp5);
                    tmp5.lengthExpr = (IExpr)((Map<String, Object>)valueStack.get(valueStackOffset + 5)).get("lengthExpr");
                    if (tmp5.lengthExpr != null) tmp5.lengthExpr.setParent(tmp5);
                    tmp5.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 5)).get("hiddenTRparen");
                    if (tmp5.hiddenTRparen != null) tmp5.hiddenTRparen.setParent(tmp5);
                    tmp5.constNameLength = (ASTNameNode)((Map<String, Object>)valueStack.get(valueStackOffset + 5)).get("constNameLength");
                    if (tmp5.constNameLength != null) tmp5.constNameLength.setParent(tmp5);
                    node.charLength = tmp5;
                    if (tmp5 != null) tmp5.setParent(node);
                    return node;

        }
        public Object handleComponentDecl301(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTComponentDeclNode node = new ASTComponentDeclNode();
                    node.componentName = (ASTComponentNameNode)valueStack.get(valueStackOffset + 0);
                    if (node.componentName != null) node.componentName.setParent(node);
                    node.hiddenTLbracket = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTLbracket != null) node.hiddenTLbracket.setParent(node);
                    node.coarraySpec = (ASTCoarraySpecNode)valueStack.get(valueStackOffset + 2);
                    if (node.coarraySpec != null) node.coarraySpec.setParent(node);
                    node.hiddenTRbracket = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTRbracket != null) node.hiddenTRbracket.setParent(node);
                    node.componentInitialization = (ASTComponentInitializationNode)valueStack.get(valueStackOffset + 4);
                    if (node.componentInitialization != null) node.componentInitialization.setParent(node);
                    return node;

        }
        public Object handleComponentDecl302(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTComponentDeclNode node = new ASTComponentDeclNode();
                    node.componentName = (ASTComponentNameNode)valueStack.get(valueStackOffset + 0);
                    if (node.componentName != null) node.componentName.setParent(node);
                    node.hiddenTLbracket = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTLbracket != null) node.hiddenTLbracket.setParent(node);
                    node.coarraySpec = (ASTCoarraySpecNode)valueStack.get(valueStackOffset + 2);
                    if (node.coarraySpec != null) node.coarraySpec.setParent(node);
                    node.hiddenTRbracket = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTRbracket != null) node.hiddenTRbracket.setParent(node);
                    return node;

        }
        public Object handleComponentInitialization303(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTComponentInitializationNode node = new ASTComponentInitializationNode();
                    node.assignsExpr = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.assignsExpr != null) node.assignsExpr.setParent(node);
                    node.assignedExpr = (IExpr)valueStack.get(valueStackOffset + 1);
                    if (node.assignedExpr != null) node.assignedExpr.setParent(node);
                    return node;

        }
        public Object handleComponentInitialization304(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTComponentInitializationNode node = new ASTComponentInitializationNode();
                    node.assignsNull = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.assignsNull != null) node.assignsNull.setParent(node);
                    node.hiddenTNull = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTNull != null) node.hiddenTNull.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    return node;

        }
        public Object handleEndTypeStmt305(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTEndTypeStmtNode node = new ASTEndTypeStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTEndtype = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTEndtype != null) node.hiddenTEndtype.setParent(node);
                    ASTTypeNameNode tmp2 = new ASTTypeNameNode();
                    tmp2.typeName = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 2)).get("typeName");
                    if (tmp2.typeName != null) tmp2.typeName.setParent(tmp2);
                    node.typeName = tmp2;
                    if (tmp2 != null) tmp2.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleEndTypeStmt306(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTEndTypeStmtNode node = new ASTEndTypeStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTEnd = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTEnd != null) node.hiddenTEnd.setParent(node);
                    node.hiddenTType = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTType != null) node.hiddenTType.setParent(node);
                    ASTTypeNameNode tmp3 = new ASTTypeNameNode();
                    tmp3.typeName = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 3)).get("typeName");
                    if (tmp3.typeName != null) tmp3.typeName.setParent(tmp3);
                    node.typeName = tmp3;
                    if (tmp3 != null) tmp3.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleEndTypeStmt307(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTEndTypeStmtNode node = new ASTEndTypeStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTEndtype = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTEndtype != null) node.hiddenTEndtype.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleEndTypeStmt308(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTEndTypeStmtNode node = new ASTEndTypeStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTEnd = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTEnd != null) node.hiddenTEnd.setParent(node);
                    node.hiddenTType = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTType != null) node.hiddenTType.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleProcComponentDefStmt309(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTProcComponentDefStmtNode node = new ASTProcComponentDefStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTProcedure = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTProcedure != null) node.hiddenTProcedure.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.procInterface = (ASTProcInterfaceNode)valueStack.get(valueStackOffset + 3);
                    if (node.procInterface != null) node.procInterface.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    node.hiddenTComma = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 5);
                    if (node.hiddenTComma != null) node.hiddenTComma.setParent(node);
                    node.procComponentAttrSpecList = (IASTListNode<ASTProcComponentAttrSpecNode>)valueStack.get(valueStackOffset + 6);
                    if (node.procComponentAttrSpecList != null) node.procComponentAttrSpecList.setParent(node);
                    node.hiddenTColon = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 7);
                    if (node.hiddenTColon != null) node.hiddenTColon.setParent(node);
                    node.hiddenTColon2 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 8);
                    if (node.hiddenTColon2 != null) node.hiddenTColon2.setParent(node);
                    node.procDeclList = (IASTListNode<ASTProcDeclNode>)valueStack.get(valueStackOffset + 9);
                    if (node.procDeclList != null) node.procDeclList.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 10);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleProcComponentDefStmt310(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTProcComponentDefStmtNode node = new ASTProcComponentDefStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTProcedure = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTProcedure != null) node.hiddenTProcedure.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    node.hiddenTComma = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenTComma != null) node.hiddenTComma.setParent(node);
                    node.procComponentAttrSpecList = (IASTListNode<ASTProcComponentAttrSpecNode>)valueStack.get(valueStackOffset + 5);
                    if (node.procComponentAttrSpecList != null) node.procComponentAttrSpecList.setParent(node);
                    node.hiddenTColon = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 6);
                    if (node.hiddenTColon != null) node.hiddenTColon.setParent(node);
                    node.hiddenTColon2 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 7);
                    if (node.hiddenTColon2 != null) node.hiddenTColon2.setParent(node);
                    node.procDeclList = (IASTListNode<ASTProcDeclNode>)valueStack.get(valueStackOffset + 8);
                    if (node.procDeclList != null) node.procDeclList.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 9);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleProcInterface311(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTProcInterfaceNode node = new ASTProcInterfaceNode();
                    node.interfaceName = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.interfaceName != null) node.interfaceName.setParent(node);
                    return node;

        }
        public Object handleProcInterface312(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTProcInterfaceNode node = new ASTProcInterfaceNode();
                    node.typeSpec = (ASTTypeSpecNode)valueStack.get(valueStackOffset + 0);
                    if (node.typeSpec != null) node.typeSpec.setParent(node);
                    return node;

        }
        public Object handleProcDeclList313(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 8 with separator
                    ASTSeparatedListNode<ASTProcDeclNode> list = (ASTSeparatedListNode<ASTProcDeclNode>)valueStack.get(valueStackOffset);
                    org.eclipse.photran.internal.core.lexer.Token token = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    ASTProcDeclNode elt = (ASTProcDeclNode)valueStack.get(valueStackOffset + 2);
                    list.add(token, elt);
                    token.setParent(list);
                    if (elt != null) elt.setParent(list);
                    return list;

        }
        public Object handleProcDeclList314(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 7 with separator
                    ASTSeparatedListNode<ASTProcDeclNode> list = new ASTSeparatedListNode<ASTProcDeclNode>();
                    ASTProcDeclNode elt = (ASTProcDeclNode)valueStack.get(valueStackOffset + 0);
                    list.add(null, elt);
                    if (elt != null) elt.setParent(list);
                    return list;

        }
        public Object handleProcDecl315(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTProcDeclNode node = new ASTProcDeclNode();
                    node.procedureEntityName = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.procedureEntityName != null) node.procedureEntityName.setParent(node);
                    return node;

        }
        public Object handleProcDecl316(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTProcDeclNode node = new ASTProcDeclNode();
                    node.procedureEntityName = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.procedureEntityName != null) node.procedureEntityName.setParent(node);
                    node.hiddenTEqgreaterthan = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTEqgreaterthan != null) node.hiddenTEqgreaterthan.setParent(node);
                    node.assignsNull = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.assignsNull != null) node.assignsNull.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    return node;

        }
        public Object handleProcComponentAttrSpecList317(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 8 with separator
                    ASTSeparatedListNode<ASTProcComponentAttrSpecNode> list = (ASTSeparatedListNode<ASTProcComponentAttrSpecNode>)valueStack.get(valueStackOffset);
                    org.eclipse.photran.internal.core.lexer.Token token = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    ASTProcComponentAttrSpecNode elt = (ASTProcComponentAttrSpecNode)valueStack.get(valueStackOffset + 2);
                    list.add(token, elt);
                    token.setParent(list);
                    if (elt != null) elt.setParent(list);
                    return list;

        }
        public Object handleProcComponentAttrSpecList318(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 7 with separator
                    ASTSeparatedListNode<ASTProcComponentAttrSpecNode> list = new ASTSeparatedListNode<ASTProcComponentAttrSpecNode>();
                    ASTProcComponentAttrSpecNode elt = (ASTProcComponentAttrSpecNode)valueStack.get(valueStackOffset + 0);
                    list.add(null, elt);
                    if (elt != null) elt.setParent(list);
                    return list;

        }
        public Object handleProcComponentAttrSpec319(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTProcComponentAttrSpecNode node = new ASTProcComponentAttrSpecNode();
                    node.isPointer = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.isPointer != null) node.isPointer.setParent(node);
                    return node;

        }
        public Object handleProcComponentAttrSpec320(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTProcComponentAttrSpecNode node = new ASTProcComponentAttrSpecNode();
                    node.isPass = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.isPass != null) node.isPass.setParent(node);
                    return node;

        }
        public Object handleProcComponentAttrSpec321(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTProcComponentAttrSpecNode node = new ASTProcComponentAttrSpecNode();
                    node.isPass = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.isPass != null) node.isPass.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.argName = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.argName != null) node.argName.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    return node;

        }
        public Object handleProcComponentAttrSpec322(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTProcComponentAttrSpecNode node = new ASTProcComponentAttrSpecNode();
                    node.isNoPass = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.isNoPass != null) node.isNoPass.setParent(node);
                    return node;

        }
        public Object handleProcComponentAttrSpec323(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTProcComponentAttrSpecNode node = new ASTProcComponentAttrSpecNode();
                    node.accessSpec = (ASTAccessSpecNode)valueStack.get(valueStackOffset + 0);
                    if (node.accessSpec != null) node.accessSpec.setParent(node);
                    return node;

        }
        public Object handleTypeBoundProcedurePart324(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTTypeBoundProcedurePartNode node = new ASTTypeBoundProcedurePartNode();
                    node.containsStmt = (ASTContainsStmtNode)valueStack.get(valueStackOffset + 0);
                    if (node.containsStmt != null) node.containsStmt.setParent(node);
                    node.bindingPrivateStmt = (ASTBindingPrivateStmtNode)valueStack.get(valueStackOffset + 1);
                    if (node.bindingPrivateStmt != null) node.bindingPrivateStmt.setParent(node);
                    node.procBindingStmts = (IASTListNode<IProcBindingStmt>)valueStack.get(valueStackOffset + 2);
                    if (node.procBindingStmts != null) node.procBindingStmts.setParent(node);
                    return node;

        }
        public Object handleTypeBoundProcedurePart325(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTTypeBoundProcedurePartNode node = new ASTTypeBoundProcedurePartNode();
                    node.containsStmt = (ASTContainsStmtNode)valueStack.get(valueStackOffset + 0);
                    if (node.containsStmt != null) node.containsStmt.setParent(node);
                    node.procBindingStmts = (IASTListNode<IProcBindingStmt>)valueStack.get(valueStackOffset + 1);
                    if (node.procBindingStmts != null) node.procBindingStmts.setParent(node);
                    return node;

        }
        public Object handleBindingPrivateStmt326(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTBindingPrivateStmtNode node = new ASTBindingPrivateStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.privateToken = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.privateToken != null) node.privateToken.setParent(node);
                    node.isPrivate = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.isPrivate != null) node.isPrivate.setParent(node);
                    return node;

        }
        public Object handleProcBindingStmts327(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 8
                    IASTListNode<IProcBindingStmt> list = (IASTListNode<IProcBindingStmt>)valueStack.get(valueStackOffset);
                    IProcBindingStmt elt = (IProcBindingStmt)valueStack.get(valueStackOffset + 1);
                    list.add(elt);
                    if (elt != null) elt.setParent(list);
                    return list;

        }
        public Object handleProcBindingStmts328(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 7
                    IASTListNode<IProcBindingStmt> list = new ASTListNode<IProcBindingStmt>();
                    IProcBindingStmt elt = (IProcBindingStmt)valueStack.get(valueStackOffset + 0);
                    list.add(elt);
                    if (elt != null) elt.setParent(list);
                    return list;

        }
        public Object handleProcBindingStmt329(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 5
                    ASTSpecificBindingNode result = (ASTSpecificBindingNode)valueStack.get(valueStackOffset + 0);
                    return result;

        }
        public Object handleProcBindingStmt330(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 5
                    ASTGenericBindingNode result = (ASTGenericBindingNode)valueStack.get(valueStackOffset + 0);
                    return result;

        }
        public Object handleProcBindingStmt331(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 5
                    ASTFinalBindingNode result = (ASTFinalBindingNode)valueStack.get(valueStackOffset + 0);
                    return result;

        }
        public Object handleSpecificBinding332(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTSpecificBindingNode node = new ASTSpecificBindingNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTProcedure = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTProcedure != null) node.hiddenTProcedure.setParent(node);
                    node.bindingName = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.bindingName != null) node.bindingName.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleSpecificBinding333(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTSpecificBindingNode node = new ASTSpecificBindingNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTProcedure = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTProcedure != null) node.hiddenTProcedure.setParent(node);
                    node.bindingName = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.bindingName != null) node.bindingName.setParent(node);
                    node.hiddenTEqgreaterthan = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTEqgreaterthan != null) node.hiddenTEqgreaterthan.setParent(node);
                    node.procedureName = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.procedureName != null) node.procedureName.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 5);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleSpecificBinding334(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTSpecificBindingNode node = new ASTSpecificBindingNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTProcedure = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTProcedure != null) node.hiddenTProcedure.setParent(node);
                    node.hiddenTColon = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTColon != null) node.hiddenTColon.setParent(node);
                    node.hiddenTColon2 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTColon2 != null) node.hiddenTColon2.setParent(node);
                    node.bindingName = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.bindingName != null) node.bindingName.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 5);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleSpecificBinding335(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTSpecificBindingNode node = new ASTSpecificBindingNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTProcedure = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTProcedure != null) node.hiddenTProcedure.setParent(node);
                    node.hiddenTColon = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTColon != null) node.hiddenTColon.setParent(node);
                    node.hiddenTColon2 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTColon2 != null) node.hiddenTColon2.setParent(node);
                    node.bindingName = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.bindingName != null) node.bindingName.setParent(node);
                    node.hiddenTEqgreaterthan = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 5);
                    if (node.hiddenTEqgreaterthan != null) node.hiddenTEqgreaterthan.setParent(node);
                    node.procedureName = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 6);
                    if (node.procedureName != null) node.procedureName.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 7);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleSpecificBinding336(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTSpecificBindingNode node = new ASTSpecificBindingNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTProcedure = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTProcedure != null) node.hiddenTProcedure.setParent(node);
                    node.hiddenTComma = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTComma != null) node.hiddenTComma.setParent(node);
                    node.bindingAttrList = (IASTListNode<ASTBindingAttrNode>)valueStack.get(valueStackOffset + 3);
                    if (node.bindingAttrList != null) node.bindingAttrList.setParent(node);
                    node.hiddenTColon = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenTColon != null) node.hiddenTColon.setParent(node);
                    node.hiddenTColon2 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 5);
                    if (node.hiddenTColon2 != null) node.hiddenTColon2.setParent(node);
                    node.bindingName = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 6);
                    if (node.bindingName != null) node.bindingName.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 7);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleSpecificBinding337(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTSpecificBindingNode node = new ASTSpecificBindingNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTProcedure = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTProcedure != null) node.hiddenTProcedure.setParent(node);
                    node.hiddenTComma = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTComma != null) node.hiddenTComma.setParent(node);
                    node.bindingAttrList = (IASTListNode<ASTBindingAttrNode>)valueStack.get(valueStackOffset + 3);
                    if (node.bindingAttrList != null) node.bindingAttrList.setParent(node);
                    node.hiddenTColon = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenTColon != null) node.hiddenTColon.setParent(node);
                    node.hiddenTColon2 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 5);
                    if (node.hiddenTColon2 != null) node.hiddenTColon2.setParent(node);
                    node.bindingName = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 6);
                    if (node.bindingName != null) node.bindingName.setParent(node);
                    node.hiddenTEqgreaterthan = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 7);
                    if (node.hiddenTEqgreaterthan != null) node.hiddenTEqgreaterthan.setParent(node);
                    node.procedureName = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 8);
                    if (node.procedureName != null) node.procedureName.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 9);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleSpecificBinding338(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTSpecificBindingNode node = new ASTSpecificBindingNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTProcedure = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTProcedure != null) node.hiddenTProcedure.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.interfaceName = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.interfaceName != null) node.interfaceName.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    node.bindingName = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 5);
                    if (node.bindingName != null) node.bindingName.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 6);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleSpecificBinding339(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTSpecificBindingNode node = new ASTSpecificBindingNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTProcedure = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTProcedure != null) node.hiddenTProcedure.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.interfaceName = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.interfaceName != null) node.interfaceName.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    node.bindingName = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 5);
                    if (node.bindingName != null) node.bindingName.setParent(node);
                    node.hiddenTEqgreaterthan = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 6);
                    if (node.hiddenTEqgreaterthan != null) node.hiddenTEqgreaterthan.setParent(node);
                    node.procedureName = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 7);
                    if (node.procedureName != null) node.procedureName.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 8);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleSpecificBinding340(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTSpecificBindingNode node = new ASTSpecificBindingNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTProcedure = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTProcedure != null) node.hiddenTProcedure.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.interfaceName = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.interfaceName != null) node.interfaceName.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    node.hiddenTColon = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 5);
                    if (node.hiddenTColon != null) node.hiddenTColon.setParent(node);
                    node.hiddenTColon2 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 6);
                    if (node.hiddenTColon2 != null) node.hiddenTColon2.setParent(node);
                    node.bindingName = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 7);
                    if (node.bindingName != null) node.bindingName.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 8);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleSpecificBinding341(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTSpecificBindingNode node = new ASTSpecificBindingNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTProcedure = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTProcedure != null) node.hiddenTProcedure.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.interfaceName = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.interfaceName != null) node.interfaceName.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    node.hiddenTColon = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 5);
                    if (node.hiddenTColon != null) node.hiddenTColon.setParent(node);
                    node.hiddenTColon2 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 6);
                    if (node.hiddenTColon2 != null) node.hiddenTColon2.setParent(node);
                    node.bindingName = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 7);
                    if (node.bindingName != null) node.bindingName.setParent(node);
                    node.hiddenTEqgreaterthan = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 8);
                    if (node.hiddenTEqgreaterthan != null) node.hiddenTEqgreaterthan.setParent(node);
                    node.procedureName = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 9);
                    if (node.procedureName != null) node.procedureName.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 10);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleSpecificBinding342(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTSpecificBindingNode node = new ASTSpecificBindingNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTProcedure = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTProcedure != null) node.hiddenTProcedure.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.interfaceName = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.interfaceName != null) node.interfaceName.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    node.hiddenTComma = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 5);
                    if (node.hiddenTComma != null) node.hiddenTComma.setParent(node);
                    node.bindingAttrList = (IASTListNode<ASTBindingAttrNode>)valueStack.get(valueStackOffset + 6);
                    if (node.bindingAttrList != null) node.bindingAttrList.setParent(node);
                    node.hiddenTColon = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 7);
                    if (node.hiddenTColon != null) node.hiddenTColon.setParent(node);
                    node.hiddenTColon2 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 8);
                    if (node.hiddenTColon2 != null) node.hiddenTColon2.setParent(node);
                    node.bindingName = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 9);
                    if (node.bindingName != null) node.bindingName.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 10);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleSpecificBinding343(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTSpecificBindingNode node = new ASTSpecificBindingNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTProcedure = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTProcedure != null) node.hiddenTProcedure.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.interfaceName = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.interfaceName != null) node.interfaceName.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    node.hiddenTComma = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 5);
                    if (node.hiddenTComma != null) node.hiddenTComma.setParent(node);
                    node.bindingAttrList = (IASTListNode<ASTBindingAttrNode>)valueStack.get(valueStackOffset + 6);
                    if (node.bindingAttrList != null) node.bindingAttrList.setParent(node);
                    node.hiddenTColon = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 7);
                    if (node.hiddenTColon != null) node.hiddenTColon.setParent(node);
                    node.hiddenTColon2 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 8);
                    if (node.hiddenTColon2 != null) node.hiddenTColon2.setParent(node);
                    node.bindingName = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 9);
                    if (node.bindingName != null) node.bindingName.setParent(node);
                    node.hiddenTEqgreaterthan = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 10);
                    if (node.hiddenTEqgreaterthan != null) node.hiddenTEqgreaterthan.setParent(node);
                    node.procedureName = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 11);
                    if (node.procedureName != null) node.procedureName.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 12);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleGenericBinding344(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTGenericBindingNode node = new ASTGenericBindingNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTGeneric = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTGeneric != null) node.hiddenTGeneric.setParent(node);
                    node.hiddenTComma = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTComma != null) node.hiddenTComma.setParent(node);
                    node.accessSpec = (ASTAccessSpecNode)valueStack.get(valueStackOffset + 3);
                    if (node.accessSpec != null) node.accessSpec.setParent(node);
                    node.hiddenTColon = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenTColon != null) node.hiddenTColon.setParent(node);
                    node.hiddenTColon2 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 5);
                    if (node.hiddenTColon2 != null) node.hiddenTColon2.setParent(node);
                    node.genericSpec = (ASTGenericSpecNode)valueStack.get(valueStackOffset + 6);
                    if (node.genericSpec != null) node.genericSpec.setParent(node);
                    node.hiddenTEqgreaterthan = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 7);
                    if (node.hiddenTEqgreaterthan != null) node.hiddenTEqgreaterthan.setParent(node);
                    node.bindingNameList = (IASTListNode<org.eclipse.photran.internal.core.lexer.Token>)valueStack.get(valueStackOffset + 8);
                    if (node.bindingNameList != null) node.bindingNameList.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 9);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleGenericBinding345(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTGenericBindingNode node = new ASTGenericBindingNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTGeneric = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTGeneric != null) node.hiddenTGeneric.setParent(node);
                    node.hiddenTColon = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTColon != null) node.hiddenTColon.setParent(node);
                    node.hiddenTColon2 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTColon2 != null) node.hiddenTColon2.setParent(node);
                    node.genericSpec = (ASTGenericSpecNode)valueStack.get(valueStackOffset + 4);
                    if (node.genericSpec != null) node.genericSpec.setParent(node);
                    node.hiddenTEqgreaterthan = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 5);
                    if (node.hiddenTEqgreaterthan != null) node.hiddenTEqgreaterthan.setParent(node);
                    node.bindingNameList = (IASTListNode<org.eclipse.photran.internal.core.lexer.Token>)valueStack.get(valueStackOffset + 6);
                    if (node.bindingNameList != null) node.bindingNameList.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 7);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleGenericBinding346(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTGenericBindingNode node = new ASTGenericBindingNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTGeneric = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTGeneric != null) node.hiddenTGeneric.setParent(node);
                    node.hiddenTComma = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTComma != null) node.hiddenTComma.setParent(node);
                    node.accessSpec = (ASTAccessSpecNode)valueStack.get(valueStackOffset + 3);
                    if (node.accessSpec != null) node.accessSpec.setParent(node);
                    node.hiddenTColon = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenTColon != null) node.hiddenTColon.setParent(node);
                    node.hiddenTColon2 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 5);
                    if (node.hiddenTColon2 != null) node.hiddenTColon2.setParent(node);
                    node.genericName = (ASTGenericNameNode)valueStack.get(valueStackOffset + 6);
                    if (node.genericName != null) node.genericName.setParent(node);
                    node.hiddenTEqgreaterthan = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 7);
                    if (node.hiddenTEqgreaterthan != null) node.hiddenTEqgreaterthan.setParent(node);
                    node.bindingNameList = (IASTListNode<org.eclipse.photran.internal.core.lexer.Token>)valueStack.get(valueStackOffset + 8);
                    if (node.bindingNameList != null) node.bindingNameList.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 9);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleGenericBinding347(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTGenericBindingNode node = new ASTGenericBindingNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTGeneric = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTGeneric != null) node.hiddenTGeneric.setParent(node);
                    node.hiddenTColon = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTColon != null) node.hiddenTColon.setParent(node);
                    node.hiddenTColon2 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTColon2 != null) node.hiddenTColon2.setParent(node);
                    node.genericName = (ASTGenericNameNode)valueStack.get(valueStackOffset + 4);
                    if (node.genericName != null) node.genericName.setParent(node);
                    node.hiddenTEqgreaterthan = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 5);
                    if (node.hiddenTEqgreaterthan != null) node.hiddenTEqgreaterthan.setParent(node);
                    node.bindingNameList = (IASTListNode<org.eclipse.photran.internal.core.lexer.Token>)valueStack.get(valueStackOffset + 6);
                    if (node.bindingNameList != null) node.bindingNameList.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 7);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleBindingNameList348(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 8 with separator
                    ASTSeparatedListNode<org.eclipse.photran.internal.core.lexer.Token> list = (ASTSeparatedListNode<org.eclipse.photran.internal.core.lexer.Token>)valueStack.get(valueStackOffset);
                    org.eclipse.photran.internal.core.lexer.Token token = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    org.eclipse.photran.internal.core.lexer.Token elt = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    list.add(token, elt);
                    token.setParent(list);
                    if (elt != null) elt.setParent(list);
                    return list;

        }
        public Object handleBindingNameList349(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 7 with separator
                    ASTSeparatedListNode<org.eclipse.photran.internal.core.lexer.Token> list = new ASTSeparatedListNode<org.eclipse.photran.internal.core.lexer.Token>();
                    org.eclipse.photran.internal.core.lexer.Token elt = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    list.add(null, elt);
                    if (elt != null) elt.setParent(list);
                    return list;

        }
        public Object handleBindingAttrList350(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 8 with separator
                    ASTSeparatedListNode<ASTBindingAttrNode> list = (ASTSeparatedListNode<ASTBindingAttrNode>)valueStack.get(valueStackOffset);
                    org.eclipse.photran.internal.core.lexer.Token token = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    ASTBindingAttrNode elt = (ASTBindingAttrNode)valueStack.get(valueStackOffset + 2);
                    list.add(token, elt);
                    token.setParent(list);
                    if (elt != null) elt.setParent(list);
                    return list;

        }
        public Object handleBindingAttrList351(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 7 with separator
                    ASTSeparatedListNode<ASTBindingAttrNode> list = new ASTSeparatedListNode<ASTBindingAttrNode>();
                    ASTBindingAttrNode elt = (ASTBindingAttrNode)valueStack.get(valueStackOffset + 0);
                    list.add(null, elt);
                    if (elt != null) elt.setParent(list);
                    return list;

        }
        public Object handleBindingAttr352(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTBindingAttrNode node = new ASTBindingAttrNode();
                    node.isPass = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.isPass != null) node.isPass.setParent(node);
                    return node;

        }
        public Object handleBindingAttr353(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTBindingAttrNode node = new ASTBindingAttrNode();
                    node.isPass = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.isPass != null) node.isPass.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.argName = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.argName != null) node.argName.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    return node;

        }
        public Object handleBindingAttr354(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTBindingAttrNode node = new ASTBindingAttrNode();
                    node.isNoPass = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.isNoPass != null) node.isNoPass.setParent(node);
                    return node;

        }
        public Object handleBindingAttr355(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTBindingAttrNode node = new ASTBindingAttrNode();
                    node.isNonOverridable = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.isNonOverridable != null) node.isNonOverridable.setParent(node);
                    return node;

        }
        public Object handleBindingAttr356(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTBindingAttrNode node = new ASTBindingAttrNode();
                    node.isDeferred = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.isDeferred != null) node.isDeferred.setParent(node);
                    return node;

        }
        public Object handleBindingAttr357(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTBindingAttrNode node = new ASTBindingAttrNode();
                    node.accessSpec = (ASTAccessSpecNode)valueStack.get(valueStackOffset + 0);
                    if (node.accessSpec != null) node.accessSpec.setParent(node);
                    return node;

        }
        public Object handleFinalBinding358(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTFinalBindingNode node = new ASTFinalBindingNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTFinal = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTFinal != null) node.hiddenTFinal.setParent(node);
                    node.hiddenTColon = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTColon != null) node.hiddenTColon.setParent(node);
                    node.hiddenTColon2 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTColon2 != null) node.hiddenTColon2.setParent(node);
                    node.finalSubroutineNameList = (IASTListNode<org.eclipse.photran.internal.core.lexer.Token>)valueStack.get(valueStackOffset + 4);
                    if (node.finalSubroutineNameList != null) node.finalSubroutineNameList.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 5);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleFinalBinding359(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTFinalBindingNode node = new ASTFinalBindingNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTFinal = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTFinal != null) node.hiddenTFinal.setParent(node);
                    node.finalSubroutineNameList = (IASTListNode<org.eclipse.photran.internal.core.lexer.Token>)valueStack.get(valueStackOffset + 2);
                    if (node.finalSubroutineNameList != null) node.finalSubroutineNameList.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleFinalSubroutineNameList360(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 8 with separator
                    ASTSeparatedListNode<org.eclipse.photran.internal.core.lexer.Token> list = (ASTSeparatedListNode<org.eclipse.photran.internal.core.lexer.Token>)valueStack.get(valueStackOffset);
                    org.eclipse.photran.internal.core.lexer.Token token = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    org.eclipse.photran.internal.core.lexer.Token elt = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    list.add(token, elt);
                    token.setParent(list);
                    if (elt != null) elt.setParent(list);
                    return list;

        }
        public Object handleFinalSubroutineNameList361(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 7 with separator
                    ASTSeparatedListNode<org.eclipse.photran.internal.core.lexer.Token> list = new ASTSeparatedListNode<org.eclipse.photran.internal.core.lexer.Token>();
                    org.eclipse.photran.internal.core.lexer.Token elt = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    list.add(null, elt);
                    if (elt != null) elt.setParent(list);
                    return list;

        }
        public Object handleStructureConstructor362(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTStructureConstructorNode node = new ASTStructureConstructorNode();
                    node.typeName = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("typeName");
                    if (node.typeName != null) node.typeName.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.typeParamSpecList = (IASTListNode<ASTTypeParamSpecNode>)valueStack.get(valueStackOffset + 2);
                    if (node.typeParamSpecList != null) node.typeParamSpecList.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    return node;

        }
        public Object handleStructureConstructor363(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTStructureConstructorNode node = new ASTStructureConstructorNode();
                    node.typeName = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("typeName");
                    if (node.typeName != null) node.typeName.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.typeParamSpecList = (IASTListNode<ASTTypeParamSpecNode>)valueStack.get(valueStackOffset + 2);
                    if (node.typeParamSpecList != null) node.typeParamSpecList.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    node.hiddenTLparen2 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenTLparen2 != null) node.hiddenTLparen2.setParent(node);
                    node.typeParamSpecList2 = (IASTListNode<ASTTypeParamSpecNode>)valueStack.get(valueStackOffset + 5);
                    if (node.typeParamSpecList2 != null) node.typeParamSpecList2.setParent(node);
                    node.hiddenTRparen2 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 6);
                    if (node.hiddenTRparen2 != null) node.hiddenTRparen2.setParent(node);
                    return node;

        }
        public Object handleEnumDef364(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTEnumDefNode node = new ASTEnumDefNode();
                    node.enumDefStmt = (ASTEnumDefStmtNode)valueStack.get(valueStackOffset + 0);
                    if (node.enumDefStmt != null) node.enumDefStmt.setParent(node);
                    node.enumeratorDefStmts = (IASTListNode<ASTEnumeratorDefStmtNode>)valueStack.get(valueStackOffset + 1);
                    if (node.enumeratorDefStmts != null) node.enumeratorDefStmts.setParent(node);
                    node.endEnumStmt = (ASTEndEnumStmtNode)valueStack.get(valueStackOffset + 2);
                    if (node.endEnumStmt != null) node.endEnumStmt.setParent(node);
                    return node;

        }
        public Object handleEnumeratorDefStmts365(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 8
                    IASTListNode<ASTEnumeratorDefStmtNode> list = (IASTListNode<ASTEnumeratorDefStmtNode>)valueStack.get(valueStackOffset);
                    ASTEnumeratorDefStmtNode elt = (ASTEnumeratorDefStmtNode)valueStack.get(valueStackOffset + 1);
                    list.add(elt);
                    if (elt != null) elt.setParent(list);
                    return list;

        }
        public Object handleEnumeratorDefStmts366(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 7
                    IASTListNode<ASTEnumeratorDefStmtNode> list = new ASTListNode<ASTEnumeratorDefStmtNode>();
                    ASTEnumeratorDefStmtNode elt = (ASTEnumeratorDefStmtNode)valueStack.get(valueStackOffset + 0);
                    list.add(elt);
                    if (elt != null) elt.setParent(list);
                    return list;

        }
        public Object handleEnumDefStmt367(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTEnumDefStmtNode node = new ASTEnumDefStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTEnum = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTEnum != null) node.hiddenTEnum.setParent(node);
                    node.hiddenTComma = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTComma != null) node.hiddenTComma.setParent(node);
                    node.hiddenTBind = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTBind != null) node.hiddenTBind.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.hiddenTIdent = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 5);
                    if (node.hiddenTIdent != null) node.hiddenTIdent.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 6);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 7);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleEnumeratorDefStmt368(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTEnumeratorDefStmtNode node = new ASTEnumeratorDefStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTEnumerator = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTEnumerator != null) node.hiddenTEnumerator.setParent(node);
                    node.enumeratorList = (IASTListNode<ASTEnumeratorNode>)valueStack.get(valueStackOffset + 2);
                    if (node.enumeratorList != null) node.enumeratorList.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleEnumeratorDefStmt369(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTEnumeratorDefStmtNode node = new ASTEnumeratorDefStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTEnumerator = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTEnumerator != null) node.hiddenTEnumerator.setParent(node);
                    node.hiddenTColon = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTColon != null) node.hiddenTColon.setParent(node);
                    node.hiddenTColon2 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTColon2 != null) node.hiddenTColon2.setParent(node);
                    node.enumeratorList = (IASTListNode<ASTEnumeratorNode>)valueStack.get(valueStackOffset + 4);
                    if (node.enumeratorList != null) node.enumeratorList.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 5);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleEnumerator370(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTEnumeratorNode node = new ASTEnumeratorNode();
                    ASTNamedConstantNode tmp0 = new ASTNamedConstantNode();
                    tmp0.namedConstant = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("namedConstant");
                    if (tmp0.namedConstant != null) tmp0.namedConstant.setParent(tmp0);
                    node.namedConstant = tmp0;
                    if (tmp0 != null) tmp0.setParent(node);
                    return node;

        }
        public Object handleEnumerator371(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTEnumeratorNode node = new ASTEnumeratorNode();
                    ASTNamedConstantNode tmp0 = new ASTNamedConstantNode();
                    tmp0.namedConstant = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("namedConstant");
                    if (tmp0.namedConstant != null) tmp0.namedConstant.setParent(tmp0);
                    node.namedConstant = tmp0;
                    if (tmp0 != null) tmp0.setParent(node);
                    node.hiddenTEquals = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTEquals != null) node.hiddenTEquals.setParent(node);
                    node.expr = (IExpr)valueStack.get(valueStackOffset + 2);
                    if (node.expr != null) node.expr.setParent(node);
                    return node;

        }
        public Object handleEnumeratorList372(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 8 with separator
                    ASTSeparatedListNode<ASTEnumeratorNode> list = (ASTSeparatedListNode<ASTEnumeratorNode>)valueStack.get(valueStackOffset);
                    org.eclipse.photran.internal.core.lexer.Token token = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    ASTEnumeratorNode elt = (ASTEnumeratorNode)valueStack.get(valueStackOffset + 2);
                    list.add(token, elt);
                    token.setParent(list);
                    if (elt != null) elt.setParent(list);
                    return list;

        }
        public Object handleEnumeratorList373(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 7 with separator
                    ASTSeparatedListNode<ASTEnumeratorNode> list = new ASTSeparatedListNode<ASTEnumeratorNode>();
                    ASTEnumeratorNode elt = (ASTEnumeratorNode)valueStack.get(valueStackOffset + 0);
                    list.add(null, elt);
                    if (elt != null) elt.setParent(list);
                    return list;

        }
        public Object handleEndEnumStmt374(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTEndEnumStmtNode node = new ASTEndEnumStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTEnd = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTEnd != null) node.hiddenTEnd.setParent(node);
                    node.hiddenTEnum = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTEnum != null) node.hiddenTEnum.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleArrayConstructor375(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTArrayConstructorNode node = new ASTArrayConstructorNode();
                    node.hiddenTLparenslash = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.hiddenTLparenslash != null) node.hiddenTLparenslash.setParent(node);
                    node.acValueList = (IASTListNode<ASTAcValueNode>)valueStack.get(valueStackOffset + 1);
                    if (node.acValueList != null) node.acValueList.setParent(node);
                    node.hiddenTSlashrparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTSlashrparen != null) node.hiddenTSlashrparen.setParent(node);
                    return node;

        }
        public Object handleArrayConstructor376(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTArrayConstructorNode node = new ASTArrayConstructorNode();
                    node.hiddenTLbracket = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.hiddenTLbracket != null) node.hiddenTLbracket.setParent(node);
                    node.acValueList = (IASTListNode<ASTAcValueNode>)valueStack.get(valueStackOffset + 1);
                    if (node.acValueList != null) node.acValueList.setParent(node);
                    node.hiddenTRbracket = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTRbracket != null) node.hiddenTRbracket.setParent(node);
                    return node;

        }
        public Object handleAcValueList377(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 7 with separator
                    ASTSeparatedListNode<ASTAcValueNode> list = new ASTSeparatedListNode<ASTAcValueNode>();
                    ASTAcValueNode elt = (ASTAcValueNode)valueStack.get(valueStackOffset + 0);
                    list.add(null, elt);
                    if (elt != null) elt.setParent(list);
                    return list;

        }
        public Object handleAcValueList378(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 8 with separator
                    ASTSeparatedListNode<ASTAcValueNode> list = (ASTSeparatedListNode<ASTAcValueNode>)valueStack.get(valueStackOffset);
                    org.eclipse.photran.internal.core.lexer.Token token = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    ASTAcValueNode elt = (ASTAcValueNode)valueStack.get(valueStackOffset + 2);
                    list.add(token, elt);
                    token.setParent(list);
                    if (elt != null) elt.setParent(list);
                    return list;

        }
        public Object handleAcValue379(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTAcValueNode node = new ASTAcValueNode();
                    node.expr = (IExpr)valueStack.get(valueStackOffset + 0);
                    if (node.expr != null) node.expr.setParent(node);
                    return node;

        }
        public Object handleAcValue380(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTAcValueNode node = new ASTAcValueNode();
                    node.acImpliedDo = (ASTAcImpliedDoNode)valueStack.get(valueStackOffset + 0);
                    if (node.acImpliedDo != null) node.acImpliedDo.setParent(node);
                    return node;

        }
        public Object handleAcImpliedDo381(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTAcImpliedDoNode node = new ASTAcImpliedDoNode();
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.expr = (IExpr)valueStack.get(valueStackOffset + 1);
                    if (node.expr != null) node.expr.setParent(node);
                    node.hiddenTComma = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTComma != null) node.hiddenTComma.setParent(node);
                    ASTImpliedDoVariableNode tmp3 = new ASTImpliedDoVariableNode();
                    tmp3.impliedDoVariable = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 3)).get("impliedDoVariable");
                    if (tmp3.impliedDoVariable != null) tmp3.impliedDoVariable.setParent(tmp3);
                    node.impliedDoVariable = tmp3;
                    if (tmp3 != null) tmp3.setParent(node);
                    node.hiddenTEquals = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenTEquals != null) node.hiddenTEquals.setParent(node);
                    node.lb = (IExpr)valueStack.get(valueStackOffset + 5);
                    if (node.lb != null) node.lb.setParent(node);
                    node.hiddenTComma2 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 6);
                    if (node.hiddenTComma2 != null) node.hiddenTComma2.setParent(node);
                    node.ub = (IExpr)valueStack.get(valueStackOffset + 7);
                    if (node.ub != null) node.ub.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 8);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    return node;

        }
        public Object handleAcImpliedDo382(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTAcImpliedDoNode node = new ASTAcImpliedDoNode();
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.expr = (IExpr)valueStack.get(valueStackOffset + 1);
                    if (node.expr != null) node.expr.setParent(node);
                    node.hiddenTComma = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTComma != null) node.hiddenTComma.setParent(node);
                    ASTImpliedDoVariableNode tmp3 = new ASTImpliedDoVariableNode();
                    tmp3.impliedDoVariable = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 3)).get("impliedDoVariable");
                    if (tmp3.impliedDoVariable != null) tmp3.impliedDoVariable.setParent(tmp3);
                    node.impliedDoVariable = tmp3;
                    if (tmp3 != null) tmp3.setParent(node);
                    node.hiddenTEquals = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenTEquals != null) node.hiddenTEquals.setParent(node);
                    node.lb = (IExpr)valueStack.get(valueStackOffset + 5);
                    if (node.lb != null) node.lb.setParent(node);
                    node.hiddenTComma2 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 6);
                    if (node.hiddenTComma2 != null) node.hiddenTComma2.setParent(node);
                    node.ub = (IExpr)valueStack.get(valueStackOffset + 7);
                    if (node.ub != null) node.ub.setParent(node);
                    node.hiddenTComma3 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 8);
                    if (node.hiddenTComma3 != null) node.hiddenTComma3.setParent(node);
                    node.step = (IExpr)valueStack.get(valueStackOffset + 9);
                    if (node.step != null) node.step.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 10);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    return node;

        }
        public Object handleAcImpliedDo383(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTAcImpliedDoNode node = new ASTAcImpliedDoNode();
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.nestedImpliedDo = (ASTAcImpliedDoNode)valueStack.get(valueStackOffset + 1);
                    if (node.nestedImpliedDo != null) node.nestedImpliedDo.setParent(node);
                    node.hiddenTComma = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTComma != null) node.hiddenTComma.setParent(node);
                    ASTImpliedDoVariableNode tmp3 = new ASTImpliedDoVariableNode();
                    tmp3.impliedDoVariable = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 3)).get("impliedDoVariable");
                    if (tmp3.impliedDoVariable != null) tmp3.impliedDoVariable.setParent(tmp3);
                    node.impliedDoVariable = tmp3;
                    if (tmp3 != null) tmp3.setParent(node);
                    node.hiddenTEquals = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenTEquals != null) node.hiddenTEquals.setParent(node);
                    node.lb = (IExpr)valueStack.get(valueStackOffset + 5);
                    if (node.lb != null) node.lb.setParent(node);
                    node.hiddenTComma2 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 6);
                    if (node.hiddenTComma2 != null) node.hiddenTComma2.setParent(node);
                    node.ub = (IExpr)valueStack.get(valueStackOffset + 7);
                    if (node.ub != null) node.ub.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 8);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    return node;

        }
        public Object handleAcImpliedDo384(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTAcImpliedDoNode node = new ASTAcImpliedDoNode();
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.nestedImpliedDo = (ASTAcImpliedDoNode)valueStack.get(valueStackOffset + 1);
                    if (node.nestedImpliedDo != null) node.nestedImpliedDo.setParent(node);
                    node.hiddenTComma = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTComma != null) node.hiddenTComma.setParent(node);
                    ASTImpliedDoVariableNode tmp3 = new ASTImpliedDoVariableNode();
                    tmp3.impliedDoVariable = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 3)).get("impliedDoVariable");
                    if (tmp3.impliedDoVariable != null) tmp3.impliedDoVariable.setParent(tmp3);
                    node.impliedDoVariable = tmp3;
                    if (tmp3 != null) tmp3.setParent(node);
                    node.hiddenTEquals = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenTEquals != null) node.hiddenTEquals.setParent(node);
                    node.lb = (IExpr)valueStack.get(valueStackOffset + 5);
                    if (node.lb != null) node.lb.setParent(node);
                    node.hiddenTComma2 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 6);
                    if (node.hiddenTComma2 != null) node.hiddenTComma2.setParent(node);
                    node.ub = (IExpr)valueStack.get(valueStackOffset + 7);
                    if (node.ub != null) node.ub.setParent(node);
                    node.hiddenTComma3 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 8);
                    if (node.hiddenTComma3 != null) node.hiddenTComma3.setParent(node);
                    node.step = (IExpr)valueStack.get(valueStackOffset + 9);
                    if (node.step != null) node.step.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 10);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    return node;

        }
        public Object handleTypeDeclarationStmt385(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTTypeDeclarationStmtNode node = new ASTTypeDeclarationStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.typeSpec = (ASTTypeSpecNode)valueStack.get(valueStackOffset + 1);
                    if (node.typeSpec != null) node.typeSpec.setParent(node);
                    node.attrSpecSeq = (IASTListNode<ASTAttrSpecSeqNode>)valueStack.get(valueStackOffset + 2);
                    if (node.attrSpecSeq != null) node.attrSpecSeq.setParent(node);
                    node.hiddenTColon = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTColon != null) node.hiddenTColon.setParent(node);
                    node.hiddenTColon2 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenTColon2 != null) node.hiddenTColon2.setParent(node);
                    node.entityDeclList = (IASTListNode<ASTEntityDeclNode>)valueStack.get(valueStackOffset + 5);
                    if (node.entityDeclList != null) node.entityDeclList.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 6);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleTypeDeclarationStmt386(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTTypeDeclarationStmtNode node = new ASTTypeDeclarationStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.typeSpec = (ASTTypeSpecNode)valueStack.get(valueStackOffset + 1);
                    if (node.typeSpec != null) node.typeSpec.setParent(node);
                    node.hiddenTColon = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTColon != null) node.hiddenTColon.setParent(node);
                    node.hiddenTColon2 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTColon2 != null) node.hiddenTColon2.setParent(node);
                    node.entityDeclList = (IASTListNode<ASTEntityDeclNode>)valueStack.get(valueStackOffset + 4);
                    if (node.entityDeclList != null) node.entityDeclList.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 5);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleTypeDeclarationStmt387(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTTypeDeclarationStmtNode node = new ASTTypeDeclarationStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.typeSpec = (ASTTypeSpecNode)valueStack.get(valueStackOffset + 1);
                    if (node.typeSpec != null) node.typeSpec.setParent(node);
                    node.entityDeclList = (IASTListNode<ASTEntityDeclNode>)valueStack.get(valueStackOffset + 2);
                    if (node.entityDeclList != null) node.entityDeclList.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleTypeDeclarationStmt388(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTTypeDeclarationStmtNode node = new ASTTypeDeclarationStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.typeSpec = (ASTTypeSpecNode)valueStack.get(valueStackOffset + 1);
                    if (node.typeSpec != null) node.typeSpec.setParent(node);
                    node.hiddenTComma = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTComma != null) node.hiddenTComma.setParent(node);
                    node.entityDeclList = (IASTListNode<ASTEntityDeclNode>)valueStack.get(valueStackOffset + 3);
                    if (node.entityDeclList != null) node.entityDeclList.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleAttrSpecSeq389(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 10
                    ASTAttrSpecSeqNode node = new ASTAttrSpecSeqNode();
                    node.hiddenTComma = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.hiddenTComma != null) node.hiddenTComma.setParent(node);
                    node.attrSpec = (ASTAttrSpecNode)valueStack.get(valueStackOffset + 1);
                    if (node.attrSpec != null) node.attrSpec.setParent(node);
                    ASTListNode<ASTAttrSpecSeqNode> list = new ASTListNode<ASTAttrSpecSeqNode>();
                    list.add(node);
                    node.setParent(list);
                    return list;

        }
        public Object handleAttrSpecSeq390(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 11
                    ASTAttrSpecSeqNode node = new ASTAttrSpecSeqNode();
                    node.hiddenTComma = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTComma != null) node.hiddenTComma.setParent(node);
                    node.attrSpec = (ASTAttrSpecNode)valueStack.get(valueStackOffset + 2);
                    if (node.attrSpec != null) node.attrSpec.setParent(node);
                    ASTListNode<ASTAttrSpecSeqNode> list = (ASTListNode<ASTAttrSpecSeqNode>)valueStack.get(valueStackOffset);
                    list.add(node);
                    node.setParent(list);
                    return list;

        }
        public Object handleTypeSpec391(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTTypeSpecNode node = new ASTTypeSpecNode();
                    node.isInteger = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.isInteger != null) node.isInteger.setParent(node);
                    return node;

        }
        public Object handleTypeSpec392(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTTypeSpecNode node = new ASTTypeSpecNode();
                    node.isReal = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.isReal != null) node.isReal.setParent(node);
                    return node;

        }
        public Object handleTypeSpec393(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTTypeSpecNode node = new ASTTypeSpecNode();
                    node.isDblComplex = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.isDblComplex != null) node.isDblComplex.setParent(node);
                    return node;

        }
        public Object handleTypeSpec394(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTTypeSpecNode node = new ASTTypeSpecNode();
                    node.isDouble = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.isDouble != null) node.isDouble.setParent(node);
                    return node;

        }
        public Object handleTypeSpec395(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTTypeSpecNode node = new ASTTypeSpecNode();
                    node.isComplex = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.isComplex != null) node.isComplex.setParent(node);
                    return node;

        }
        public Object handleTypeSpec396(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTTypeSpecNode node = new ASTTypeSpecNode();
                    node.isLogical = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.isLogical != null) node.isLogical.setParent(node);
                    return node;

        }
        public Object handleTypeSpec397(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTTypeSpecNode node = new ASTTypeSpecNode();
                    node.isCharacter = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.isCharacter != null) node.isCharacter.setParent(node);
                    return node;

        }
        public Object handleTypeSpec398(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTTypeSpecNode node = new ASTTypeSpecNode();
                    node.isInteger = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.isInteger != null) node.isInteger.setParent(node);
                    node.kindSelector = (ASTKindSelectorNode)valueStack.get(valueStackOffset + 1);
                    if (node.kindSelector != null) node.kindSelector.setParent(node);
                    return node;

        }
        public Object handleTypeSpec399(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTTypeSpecNode node = new ASTTypeSpecNode();
                    node.isReal = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.isReal != null) node.isReal.setParent(node);
                    node.kindSelector = (ASTKindSelectorNode)valueStack.get(valueStackOffset + 1);
                    if (node.kindSelector != null) node.kindSelector.setParent(node);
                    return node;

        }
        public Object handleTypeSpec400(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTTypeSpecNode node = new ASTTypeSpecNode();
                    node.isDouble = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.isDouble != null) node.isDouble.setParent(node);
                    node.hiddenTPrecision = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTPrecision != null) node.hiddenTPrecision.setParent(node);
                    return node;

        }
        public Object handleTypeSpec401(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTTypeSpecNode node = new ASTTypeSpecNode();
                    node.isComplex = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.isComplex != null) node.isComplex.setParent(node);
                    node.kindSelector = (ASTKindSelectorNode)valueStack.get(valueStackOffset + 1);
                    if (node.kindSelector != null) node.kindSelector.setParent(node);
                    return node;

        }
        public Object handleTypeSpec402(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTTypeSpecNode node = new ASTTypeSpecNode();
                    node.isDblComplex = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.isDblComplex != null) node.isDblComplex.setParent(node);
                    node.hiddenTComplex = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTComplex != null) node.hiddenTComplex.setParent(node);
                    return node;

        }
        public Object handleTypeSpec403(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTTypeSpecNode node = new ASTTypeSpecNode();
                    node.isCharacter = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.isCharacter != null) node.isCharacter.setParent(node);
                    node.charSelector = (ASTCharSelectorNode)valueStack.get(valueStackOffset + 1);
                    if (node.charSelector != null) node.charSelector.setParent(node);
                    return node;

        }
        public Object handleTypeSpec404(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTTypeSpecNode node = new ASTTypeSpecNode();
                    node.isLogical = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.isLogical != null) node.isLogical.setParent(node);
                    node.kindSelector = (ASTKindSelectorNode)valueStack.get(valueStackOffset + 1);
                    if (node.kindSelector != null) node.kindSelector.setParent(node);
                    return node;

        }
        public Object handleTypeSpec405(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTTypeSpecNode node = new ASTTypeSpecNode();
                    node.isDerivedType = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.isDerivedType != null) node.isDerivedType.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.typeName = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 2)).get("typeName");
                    if (node.typeName != null) node.typeName.setParent(node);
                    node.hiddenHiddenLParen2 = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 2)).get("hiddenHiddenLParen2");
                    if (node.hiddenHiddenLParen2 != null) node.hiddenHiddenLParen2.setParent(node);
                    node.typeParamSpecList = (IASTListNode<ASTTypeParamSpecNode>)((Map<String, Object>)valueStack.get(valueStackOffset + 2)).get("typeParamSpecList");
                    if (node.typeParamSpecList != null) node.typeParamSpecList.setParent(node);
                    node.hiddenHiddenRParen2 = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 2)).get("hiddenHiddenRParen2");
                    if (node.hiddenHiddenRParen2 != null) node.hiddenHiddenRParen2.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    return node;

        }
        public Object handleTypeSpec406(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTTypeSpecNode node = new ASTTypeSpecNode();
                    node.isDerivedType = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.isDerivedType != null) node.isDerivedType.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.typeName = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 2)).get("typeName");
                    if (node.typeName != null) node.typeName.setParent(node);
                    node.hiddenHiddenLParen2 = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 2)).get("hiddenHiddenLParen2");
                    if (node.hiddenHiddenLParen2 != null) node.hiddenHiddenLParen2.setParent(node);
                    node.typeParamSpecList = (IASTListNode<ASTTypeParamSpecNode>)((Map<String, Object>)valueStack.get(valueStackOffset + 2)).get("typeParamSpecList");
                    if (node.typeParamSpecList != null) node.typeParamSpecList.setParent(node);
                    node.hiddenHiddenRParen2 = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 2)).get("hiddenHiddenRParen2");
                    if (node.hiddenHiddenRParen2 != null) node.hiddenHiddenRParen2.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    return node;

        }
        public Object handleTypeSpec407(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTTypeSpecNode node = new ASTTypeSpecNode();
                    node.isDerivedType = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.isDerivedType != null) node.isDerivedType.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.isAsterisk = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.isAsterisk != null) node.isAsterisk.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    return node;

        }
        public Object handleTypeSpecNoPrefix408(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTTypeSpecNode node = new ASTTypeSpecNode();
                    node.isInteger = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.isInteger != null) node.isInteger.setParent(node);
                    return node;

        }
        public Object handleTypeSpecNoPrefix409(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTTypeSpecNode node = new ASTTypeSpecNode();
                    node.isReal = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.isReal != null) node.isReal.setParent(node);
                    return node;

        }
        public Object handleTypeSpecNoPrefix410(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTTypeSpecNode node = new ASTTypeSpecNode();
                    node.isDblComplex = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.isDblComplex != null) node.isDblComplex.setParent(node);
                    return node;

        }
        public Object handleTypeSpecNoPrefix411(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTTypeSpecNode node = new ASTTypeSpecNode();
                    node.isDouble = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.isDouble != null) node.isDouble.setParent(node);
                    return node;

        }
        public Object handleTypeSpecNoPrefix412(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTTypeSpecNode node = new ASTTypeSpecNode();
                    node.isComplex = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.isComplex != null) node.isComplex.setParent(node);
                    return node;

        }
        public Object handleTypeSpecNoPrefix413(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTTypeSpecNode node = new ASTTypeSpecNode();
                    node.isLogical = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.isLogical != null) node.isLogical.setParent(node);
                    return node;

        }
        public Object handleTypeSpecNoPrefix414(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTTypeSpecNode node = new ASTTypeSpecNode();
                    node.isCharacter = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.isCharacter != null) node.isCharacter.setParent(node);
                    return node;

        }
        public Object handleTypeSpecNoPrefix415(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTTypeSpecNode node = new ASTTypeSpecNode();
                    node.isInteger = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.isInteger != null) node.isInteger.setParent(node);
                    node.kindSelector = (ASTKindSelectorNode)valueStack.get(valueStackOffset + 1);
                    if (node.kindSelector != null) node.kindSelector.setParent(node);
                    return node;

        }
        public Object handleTypeSpecNoPrefix416(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTTypeSpecNode node = new ASTTypeSpecNode();
                    node.isReal = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.isReal != null) node.isReal.setParent(node);
                    node.kindSelector = (ASTKindSelectorNode)valueStack.get(valueStackOffset + 1);
                    if (node.kindSelector != null) node.kindSelector.setParent(node);
                    return node;

        }
        public Object handleTypeSpecNoPrefix417(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTTypeSpecNode node = new ASTTypeSpecNode();
                    node.isDblComplex = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.isDblComplex != null) node.isDblComplex.setParent(node);
                    node.hiddenTComplex = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTComplex != null) node.hiddenTComplex.setParent(node);
                    return node;

        }
        public Object handleTypeSpecNoPrefix418(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTTypeSpecNode node = new ASTTypeSpecNode();
                    node.isDouble = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.isDouble != null) node.isDouble.setParent(node);
                    node.hiddenTPrecision = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTPrecision != null) node.hiddenTPrecision.setParent(node);
                    return node;

        }
        public Object handleTypeSpecNoPrefix419(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTTypeSpecNode node = new ASTTypeSpecNode();
                    node.isComplex = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.isComplex != null) node.isComplex.setParent(node);
                    node.kindSelector = (ASTKindSelectorNode)valueStack.get(valueStackOffset + 1);
                    if (node.kindSelector != null) node.kindSelector.setParent(node);
                    return node;

        }
        public Object handleTypeSpecNoPrefix420(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTTypeSpecNode node = new ASTTypeSpecNode();
                    node.isCharacter = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.isCharacter != null) node.isCharacter.setParent(node);
                    node.charSelector = (ASTCharSelectorNode)valueStack.get(valueStackOffset + 1);
                    if (node.charSelector != null) node.charSelector.setParent(node);
                    return node;

        }
        public Object handleTypeSpecNoPrefix421(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTTypeSpecNode node = new ASTTypeSpecNode();
                    node.isLogical = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.isLogical != null) node.isLogical.setParent(node);
                    node.kindSelector = (ASTKindSelectorNode)valueStack.get(valueStackOffset + 1);
                    if (node.kindSelector != null) node.kindSelector.setParent(node);
                    return node;

        }
        public Object handleTypeSpecNoPrefix422(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTTypeSpecNode node = new ASTTypeSpecNode();
                    node.typeName = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("typeName");
                    if (node.typeName != null) node.typeName.setParent(node);
                    node.hiddenHiddenLParen2 = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("hiddenHiddenLParen2");
                    if (node.hiddenHiddenLParen2 != null) node.hiddenHiddenLParen2.setParent(node);
                    node.typeParamSpecList = (IASTListNode<ASTTypeParamSpecNode>)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("typeParamSpecList");
                    if (node.typeParamSpecList != null) node.typeParamSpecList.setParent(node);
                    node.hiddenHiddenRParen2 = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("hiddenHiddenRParen2");
                    if (node.hiddenHiddenRParen2 != null) node.hiddenHiddenRParen2.setParent(node);
                    return node;

        }
        public Object handleDerivedTypeSpec423(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 3 and 4
                    Map<String, Object> node = new HashMap<String, Object>();
                    node.put("typeName", (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("typeName"));
                    ASTListNode<IASTNode> embeddedList = new ASTListNode<IASTNode>();
                    embeddedList.add((IASTNode)(node.get("typeName")));
                    embeddedList.add((IASTNode)(node.get("hiddenHiddenLParen2")));
                    embeddedList.add((IASTNode)(node.get("typeParamSpecList")));
                    embeddedList.add((IASTNode)(node.get("hiddenHiddenRParen2")));
                    node.put("errorRecoveryList", embeddedList);
                    return node;

        }
        public Object handleDerivedTypeSpec424(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 3 and 4
                    Map<String, Object> node = new HashMap<String, Object>();
                    node.put("typeName", (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("typeName"));
                    node.put("hiddenHiddenLParen2", (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1));
                    node.put("typeParamSpecList", (IASTListNode<ASTTypeParamSpecNode>)valueStack.get(valueStackOffset + 2));
                    node.put("hiddenHiddenRParen2", (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3));
                    ASTListNode<IASTNode> embeddedList = new ASTListNode<IASTNode>();
                    embeddedList.add((IASTNode)(node.get("typeName")));
                    embeddedList.add((IASTNode)(node.get("hiddenHiddenLParen2")));
                    embeddedList.add((IASTNode)(node.get("typeParamSpecList")));
                    embeddedList.add((IASTNode)(node.get("hiddenHiddenRParen2")));
                    node.put("errorRecoveryList", embeddedList);
                    return node;

        }
        public Object handleTypeParamSpecList425(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 7 with separator
                    ASTSeparatedListNode<ASTTypeParamSpecNode> list = new ASTSeparatedListNode<ASTTypeParamSpecNode>();
                    ASTTypeParamSpecNode elt = (ASTTypeParamSpecNode)valueStack.get(valueStackOffset + 0);
                    list.add(null, elt);
                    if (elt != null) elt.setParent(list);
                    return list;

        }
        public Object handleTypeParamSpecList426(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 8 with separator
                    ASTSeparatedListNode<ASTTypeParamSpecNode> list = (ASTSeparatedListNode<ASTTypeParamSpecNode>)valueStack.get(valueStackOffset);
                    org.eclipse.photran.internal.core.lexer.Token token = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    ASTTypeParamSpecNode elt = (ASTTypeParamSpecNode)valueStack.get(valueStackOffset + 2);
                    list.add(token, elt);
                    token.setParent(list);
                    if (elt != null) elt.setParent(list);
                    return list;

        }
        public Object handleTypeParamSpec427(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTTypeParamSpecNode node = new ASTTypeParamSpecNode();
                    ASTNameNode tmp0 = new ASTNameNode();
                    tmp0.name = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("name");
                    if (tmp0.name != null) tmp0.name.setParent(tmp0);
                    node.name = tmp0;
                    if (tmp0 != null) tmp0.setParent(node);
                    node.hiddenTEquals = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTEquals != null) node.hiddenTEquals.setParent(node);
                    node.typeParamValue = (ASTTypeParamValueNode)valueStack.get(valueStackOffset + 2);
                    if (node.typeParamValue != null) node.typeParamValue.setParent(node);
                    return node;

        }
        public Object handleTypeParamSpec428(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTTypeParamSpecNode node = new ASTTypeParamSpecNode();
                    node.typeParamValue = (ASTTypeParamValueNode)valueStack.get(valueStackOffset + 0);
                    if (node.typeParamValue != null) node.typeParamValue.setParent(node);
                    return node;

        }
        public Object handleTypeParamValue429(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTTypeParamValueNode node = new ASTTypeParamValueNode();
                    node.expr = (IExpr)valueStack.get(valueStackOffset + 0);
                    if (node.expr != null) node.expr.setParent(node);
                    return node;

        }
        public Object handleTypeParamValue430(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTTypeParamValueNode node = new ASTTypeParamValueNode();
                    node.isAsterisk = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.isAsterisk != null) node.isAsterisk.setParent(node);
                    return node;

        }
        public Object handleTypeParamValue431(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTTypeParamValueNode node = new ASTTypeParamValueNode();
                    node.isColon = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.isColon != null) node.isColon.setParent(node);
                    return node;

        }
        public Object handleAttrSpec432(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTAttrSpecNode node = new ASTAttrSpecNode();
                    node.accessSpec = (ASTAccessSpecNode)valueStack.get(valueStackOffset + 0);
                    if (node.accessSpec != null) node.accessSpec.setParent(node);
                    return node;

        }
        public Object handleAttrSpec433(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTAttrSpecNode node = new ASTAttrSpecNode();
                    node.isParameter = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.isParameter != null) node.isParameter.setParent(node);
                    return node;

        }
        public Object handleAttrSpec434(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTAttrSpecNode node = new ASTAttrSpecNode();
                    node.isAllocatable = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.isAllocatable != null) node.isAllocatable.setParent(node);
                    return node;

        }
        public Object handleAttrSpec435(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTAttrSpecNode node = new ASTAttrSpecNode();
                    node.isDimension = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.isDimension != null) node.isDimension.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.arraySpec = (ASTArraySpecNode)valueStack.get(valueStackOffset + 2);
                    if (node.arraySpec != null) node.arraySpec.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    return node;

        }
        public Object handleAttrSpec436(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTAttrSpecNode node = new ASTAttrSpecNode();
                    node.isExternal = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.isExternal != null) node.isExternal.setParent(node);
                    return node;

        }
        public Object handleAttrSpec437(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTAttrSpecNode node = new ASTAttrSpecNode();
                    node.isIntent = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.isIntent != null) node.isIntent.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.intentSpec = (ASTIntentSpecNode)valueStack.get(valueStackOffset + 2);
                    if (node.intentSpec != null) node.intentSpec.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    return node;

        }
        public Object handleAttrSpec438(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTAttrSpecNode node = new ASTAttrSpecNode();
                    node.isIntrinsic = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.isIntrinsic != null) node.isIntrinsic.setParent(node);
                    return node;

        }
        public Object handleAttrSpec439(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTAttrSpecNode node = new ASTAttrSpecNode();
                    node.isOptional = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.isOptional != null) node.isOptional.setParent(node);
                    return node;

        }
        public Object handleAttrSpec440(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTAttrSpecNode node = new ASTAttrSpecNode();
                    node.isPointer = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.isPointer != null) node.isPointer.setParent(node);
                    return node;

        }
        public Object handleAttrSpec441(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTAttrSpecNode node = new ASTAttrSpecNode();
                    node.isSave = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.isSave != null) node.isSave.setParent(node);
                    return node;

        }
        public Object handleAttrSpec442(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTAttrSpecNode node = new ASTAttrSpecNode();
                    node.isTarget = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.isTarget != null) node.isTarget.setParent(node);
                    return node;

        }
        public Object handleAttrSpec443(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTAttrSpecNode node = new ASTAttrSpecNode();
                    node.isAsync = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.isAsync != null) node.isAsync.setParent(node);
                    return node;

        }
        public Object handleAttrSpec444(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTAttrSpecNode node = new ASTAttrSpecNode();
                    node.isProtected = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.isProtected != null) node.isProtected.setParent(node);
                    return node;

        }
        public Object handleAttrSpec445(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTAttrSpecNode node = new ASTAttrSpecNode();
                    node.isValue = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.isValue != null) node.isValue.setParent(node);
                    return node;

        }
        public Object handleAttrSpec446(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTAttrSpecNode node = new ASTAttrSpecNode();
                    node.isVolatile = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.isVolatile != null) node.isVolatile.setParent(node);
                    return node;

        }
        public Object handleAttrSpec447(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTAttrSpecNode node = new ASTAttrSpecNode();
                    node.languageBindingSpec = (ASTLanguageBindingSpecNode)valueStack.get(valueStackOffset + 0);
                    if (node.languageBindingSpec != null) node.languageBindingSpec.setParent(node);
                    return node;

        }
        public Object handleAttrSpec448(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTAttrSpecNode node = new ASTAttrSpecNode();
                    node.isCodimension = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.isCodimension != null) node.isCodimension.setParent(node);
                    node.hiddenTLbracket = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTLbracket != null) node.hiddenTLbracket.setParent(node);
                    node.coarraySpec = (ASTCoarraySpecNode)valueStack.get(valueStackOffset + 2);
                    if (node.coarraySpec != null) node.coarraySpec.setParent(node);
                    node.hiddenTRbracket = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTRbracket != null) node.hiddenTRbracket.setParent(node);
                    return node;

        }
        public Object handleAttrSpec449(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTAttrSpecNode node = new ASTAttrSpecNode();
                    node.isContiguous = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.isContiguous != null) node.isContiguous.setParent(node);
                    return node;

        }
        public Object handleLanguageBindingSpec450(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTLanguageBindingSpecNode node = new ASTLanguageBindingSpecNode();
                    node.isBind = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.isBind != null) node.isBind.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.language = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.language != null) node.language.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    return node;

        }
        public Object handleLanguageBindingSpec451(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTLanguageBindingSpecNode node = new ASTLanguageBindingSpecNode();
                    node.isBind = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.isBind != null) node.isBind.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.language = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.language != null) node.language.setParent(node);
                    node.hiddenTComma = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTComma != null) node.hiddenTComma.setParent(node);
                    node.hiddenTIdent = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenTIdent != null) node.hiddenTIdent.setParent(node);
                    node.hiddenTEquals = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 5);
                    if (node.hiddenTEquals != null) node.hiddenTEquals.setParent(node);
                    node.expr = (IExpr)valueStack.get(valueStackOffset + 6);
                    if (node.expr != null) node.expr.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 7);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    return node;

        }
        public Object handleEntityDeclList452(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 7 with separator
                    ASTSeparatedListNode<ASTEntityDeclNode> list = new ASTSeparatedListNode<ASTEntityDeclNode>();
                    ASTEntityDeclNode elt = (ASTEntityDeclNode)valueStack.get(valueStackOffset + 0);
                    list.add(null, elt);
                    if (elt != null) elt.setParent(list);
                    return list;

        }
        public Object handleEntityDeclList453(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 8 with separator
                    ASTSeparatedListNode<ASTEntityDeclNode> list = (ASTSeparatedListNode<ASTEntityDeclNode>)valueStack.get(valueStackOffset);
                    org.eclipse.photran.internal.core.lexer.Token token = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    ASTEntityDeclNode elt = (ASTEntityDeclNode)valueStack.get(valueStackOffset + 2);
                    list.add(token, elt);
                    token.setParent(list);
                    if (elt != null) elt.setParent(list);
                    return list;

        }
        public Object handleEntityDecl454(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTEntityDeclNode node = new ASTEntityDeclNode();
                    node.objectName = (ASTObjectNameNode)valueStack.get(valueStackOffset + 0);
                    if (node.objectName != null) node.objectName.setParent(node);
                    return node;

        }
        public Object handleEntityDecl455(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTEntityDeclNode node = new ASTEntityDeclNode();
                    node.objectName = (ASTObjectNameNode)valueStack.get(valueStackOffset + 0);
                    if (node.objectName != null) node.objectName.setParent(node);
                    node.initialization = (ASTInitializationNode)valueStack.get(valueStackOffset + 1);
                    if (node.initialization != null) node.initialization.setParent(node);
                    return node;

        }
        public Object handleEntityDecl456(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTEntityDeclNode node = new ASTEntityDeclNode();
                    node.objectName = (ASTObjectNameNode)valueStack.get(valueStackOffset + 0);
                    if (node.objectName != null) node.objectName.setParent(node);
                    node.hiddenTAsterisk = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTAsterisk != null) node.hiddenTAsterisk.setParent(node);
                    ASTCharLengthNode tmp2 = new ASTCharLengthNode();
                    tmp2.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 2)).get("hiddenTLparen");
                    if (tmp2.hiddenTLparen != null) tmp2.hiddenTLparen.setParent(tmp2);
                    tmp2.isColon = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 2)).get("isColon");
                    if (tmp2.isColon != null) tmp2.isColon.setParent(tmp2);
                    tmp2.constIntLength = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 2)).get("constIntLength");
                    if (tmp2.constIntLength != null) tmp2.constIntLength.setParent(tmp2);
                    tmp2.isAssumedLength = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 2)).get("isAssumedLength");
                    if (tmp2.isAssumedLength != null) tmp2.isAssumedLength.setParent(tmp2);
                    tmp2.lengthExpr = (IExpr)((Map<String, Object>)valueStack.get(valueStackOffset + 2)).get("lengthExpr");
                    if (tmp2.lengthExpr != null) tmp2.lengthExpr.setParent(tmp2);
                    tmp2.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 2)).get("hiddenTRparen");
                    if (tmp2.hiddenTRparen != null) tmp2.hiddenTRparen.setParent(tmp2);
                    tmp2.constNameLength = (ASTNameNode)((Map<String, Object>)valueStack.get(valueStackOffset + 2)).get("constNameLength");
                    if (tmp2.constNameLength != null) tmp2.constNameLength.setParent(tmp2);
                    node.charLength = tmp2;
                    if (tmp2 != null) tmp2.setParent(node);
                    return node;

        }
        public Object handleEntityDecl457(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTEntityDeclNode node = new ASTEntityDeclNode();
                    node.objectName = (ASTObjectNameNode)valueStack.get(valueStackOffset + 0);
                    if (node.objectName != null) node.objectName.setParent(node);
                    node.hiddenTAsterisk = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTAsterisk != null) node.hiddenTAsterisk.setParent(node);
                    ASTCharLengthNode tmp2 = new ASTCharLengthNode();
                    tmp2.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 2)).get("hiddenTLparen");
                    if (tmp2.hiddenTLparen != null) tmp2.hiddenTLparen.setParent(tmp2);
                    tmp2.isColon = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 2)).get("isColon");
                    if (tmp2.isColon != null) tmp2.isColon.setParent(tmp2);
                    tmp2.constIntLength = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 2)).get("constIntLength");
                    if (tmp2.constIntLength != null) tmp2.constIntLength.setParent(tmp2);
                    tmp2.isAssumedLength = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 2)).get("isAssumedLength");
                    if (tmp2.isAssumedLength != null) tmp2.isAssumedLength.setParent(tmp2);
                    tmp2.lengthExpr = (IExpr)((Map<String, Object>)valueStack.get(valueStackOffset + 2)).get("lengthExpr");
                    if (tmp2.lengthExpr != null) tmp2.lengthExpr.setParent(tmp2);
                    tmp2.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 2)).get("hiddenTRparen");
                    if (tmp2.hiddenTRparen != null) tmp2.hiddenTRparen.setParent(tmp2);
                    tmp2.constNameLength = (ASTNameNode)((Map<String, Object>)valueStack.get(valueStackOffset + 2)).get("constNameLength");
                    if (tmp2.constNameLength != null) tmp2.constNameLength.setParent(tmp2);
                    node.charLength = tmp2;
                    if (tmp2 != null) tmp2.setParent(node);
                    node.initialization = (ASTInitializationNode)valueStack.get(valueStackOffset + 3);
                    if (node.initialization != null) node.initialization.setParent(node);
                    return node;

        }
        public Object handleEntityDecl458(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTEntityDeclNode node = new ASTEntityDeclNode();
                    node.objectName = (ASTObjectNameNode)valueStack.get(valueStackOffset + 0);
                    if (node.objectName != null) node.objectName.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.arraySpec = (ASTArraySpecNode)valueStack.get(valueStackOffset + 2);
                    if (node.arraySpec != null) node.arraySpec.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    return node;

        }
        public Object handleEntityDecl459(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTEntityDeclNode node = new ASTEntityDeclNode();
                    node.objectName = (ASTObjectNameNode)valueStack.get(valueStackOffset + 0);
                    if (node.objectName != null) node.objectName.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.arraySpec = (ASTArraySpecNode)valueStack.get(valueStackOffset + 2);
                    if (node.arraySpec != null) node.arraySpec.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    node.initialization = (ASTInitializationNode)valueStack.get(valueStackOffset + 4);
                    if (node.initialization != null) node.initialization.setParent(node);
                    return node;

        }
        public Object handleEntityDecl460(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTEntityDeclNode node = new ASTEntityDeclNode();
                    node.objectName = (ASTObjectNameNode)valueStack.get(valueStackOffset + 0);
                    if (node.objectName != null) node.objectName.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.arraySpec = (ASTArraySpecNode)valueStack.get(valueStackOffset + 2);
                    if (node.arraySpec != null) node.arraySpec.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    node.hiddenTAsterisk = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenTAsterisk != null) node.hiddenTAsterisk.setParent(node);
                    ASTCharLengthNode tmp5 = new ASTCharLengthNode();
                    tmp5.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 5)).get("hiddenTLparen");
                    if (tmp5.hiddenTLparen != null) tmp5.hiddenTLparen.setParent(tmp5);
                    tmp5.isColon = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 5)).get("isColon");
                    if (tmp5.isColon != null) tmp5.isColon.setParent(tmp5);
                    tmp5.constIntLength = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 5)).get("constIntLength");
                    if (tmp5.constIntLength != null) tmp5.constIntLength.setParent(tmp5);
                    tmp5.isAssumedLength = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 5)).get("isAssumedLength");
                    if (tmp5.isAssumedLength != null) tmp5.isAssumedLength.setParent(tmp5);
                    tmp5.lengthExpr = (IExpr)((Map<String, Object>)valueStack.get(valueStackOffset + 5)).get("lengthExpr");
                    if (tmp5.lengthExpr != null) tmp5.lengthExpr.setParent(tmp5);
                    tmp5.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 5)).get("hiddenTRparen");
                    if (tmp5.hiddenTRparen != null) tmp5.hiddenTRparen.setParent(tmp5);
                    tmp5.constNameLength = (ASTNameNode)((Map<String, Object>)valueStack.get(valueStackOffset + 5)).get("constNameLength");
                    if (tmp5.constNameLength != null) tmp5.constNameLength.setParent(tmp5);
                    node.charLength = tmp5;
                    if (tmp5 != null) tmp5.setParent(node);
                    return node;

        }
        public Object handleEntityDecl461(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTEntityDeclNode node = new ASTEntityDeclNode();
                    node.objectName = (ASTObjectNameNode)valueStack.get(valueStackOffset + 0);
                    if (node.objectName != null) node.objectName.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.arraySpec = (ASTArraySpecNode)valueStack.get(valueStackOffset + 2);
                    if (node.arraySpec != null) node.arraySpec.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    node.hiddenTAsterisk = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenTAsterisk != null) node.hiddenTAsterisk.setParent(node);
                    ASTCharLengthNode tmp5 = new ASTCharLengthNode();
                    tmp5.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 5)).get("hiddenTLparen");
                    if (tmp5.hiddenTLparen != null) tmp5.hiddenTLparen.setParent(tmp5);
                    tmp5.isColon = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 5)).get("isColon");
                    if (tmp5.isColon != null) tmp5.isColon.setParent(tmp5);
                    tmp5.constIntLength = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 5)).get("constIntLength");
                    if (tmp5.constIntLength != null) tmp5.constIntLength.setParent(tmp5);
                    tmp5.isAssumedLength = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 5)).get("isAssumedLength");
                    if (tmp5.isAssumedLength != null) tmp5.isAssumedLength.setParent(tmp5);
                    tmp5.lengthExpr = (IExpr)((Map<String, Object>)valueStack.get(valueStackOffset + 5)).get("lengthExpr");
                    if (tmp5.lengthExpr != null) tmp5.lengthExpr.setParent(tmp5);
                    tmp5.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 5)).get("hiddenTRparen");
                    if (tmp5.hiddenTRparen != null) tmp5.hiddenTRparen.setParent(tmp5);
                    tmp5.constNameLength = (ASTNameNode)((Map<String, Object>)valueStack.get(valueStackOffset + 5)).get("constNameLength");
                    if (tmp5.constNameLength != null) tmp5.constNameLength.setParent(tmp5);
                    node.charLength = tmp5;
                    if (tmp5 != null) tmp5.setParent(node);
                    node.initialization = (ASTInitializationNode)valueStack.get(valueStackOffset + 6);
                    if (node.initialization != null) node.initialization.setParent(node);
                    return node;

        }
        public Object handleEntityDecl462(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTEntityDeclNode node = new ASTEntityDeclNode();
                    node.objectName = (ASTObjectNameNode)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("objectName");
                    if (node.objectName != null) node.objectName.setParent(node);
                    node.hiddenAsterisk2 = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("hiddenAsterisk2");
                    if (node.hiddenAsterisk2 != null) node.hiddenAsterisk2.setParent(node);
                    node.initialCharLength = (ASTCharLengthNode)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("initialCharLength");
                    if (node.initialCharLength != null) node.initialCharLength.setParent(node);
                    node.hiddenLparen2 = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("hiddenLparen2");
                    if (node.hiddenLparen2 != null) node.hiddenLparen2.setParent(node);
                    node.arraySpec = (ASTArraySpecNode)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("arraySpec");
                    if (node.arraySpec != null) node.arraySpec.setParent(node);
                    node.hiddenRparen2 = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("hiddenRparen2");
                    if (node.hiddenRparen2 != null) node.hiddenRparen2.setParent(node);
                    node.initialization = (ASTInitializationNode)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("initialization");
                    if (node.initialization != null) node.initialization.setParent(node);
                    return node;

        }
        public Object handleEntityDecl463(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTEntityDeclNode node = new ASTEntityDeclNode();
                    node.objectName = (ASTObjectNameNode)valueStack.get(valueStackOffset + 0);
                    if (node.objectName != null) node.objectName.setParent(node);
                    node.hiddenTLbracket = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTLbracket != null) node.hiddenTLbracket.setParent(node);
                    node.coarraySpec = (ASTCoarraySpecNode)valueStack.get(valueStackOffset + 2);
                    if (node.coarraySpec != null) node.coarraySpec.setParent(node);
                    node.hiddenTRbracket = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTRbracket != null) node.hiddenTRbracket.setParent(node);
                    return node;

        }
        public Object handleEntityDecl464(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTEntityDeclNode node = new ASTEntityDeclNode();
                    node.objectName = (ASTObjectNameNode)valueStack.get(valueStackOffset + 0);
                    if (node.objectName != null) node.objectName.setParent(node);
                    node.hiddenTLbracket = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTLbracket != null) node.hiddenTLbracket.setParent(node);
                    node.coarraySpec = (ASTCoarraySpecNode)valueStack.get(valueStackOffset + 2);
                    if (node.coarraySpec != null) node.coarraySpec.setParent(node);
                    node.hiddenTRbracket = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTRbracket != null) node.hiddenTRbracket.setParent(node);
                    node.initialization = (ASTInitializationNode)valueStack.get(valueStackOffset + 4);
                    if (node.initialization != null) node.initialization.setParent(node);
                    return node;

        }
        public Object handleEntityDecl465(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTEntityDeclNode node = new ASTEntityDeclNode();
                    node.objectName = (ASTObjectNameNode)valueStack.get(valueStackOffset + 0);
                    if (node.objectName != null) node.objectName.setParent(node);
                    node.hiddenTLbracket = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTLbracket != null) node.hiddenTLbracket.setParent(node);
                    node.coarraySpec = (ASTCoarraySpecNode)valueStack.get(valueStackOffset + 2);
                    if (node.coarraySpec != null) node.coarraySpec.setParent(node);
                    node.hiddenTRbracket = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTRbracket != null) node.hiddenTRbracket.setParent(node);
                    node.hiddenTAsterisk = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenTAsterisk != null) node.hiddenTAsterisk.setParent(node);
                    ASTCharLengthNode tmp5 = new ASTCharLengthNode();
                    tmp5.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 5)).get("hiddenTLparen");
                    if (tmp5.hiddenTLparen != null) tmp5.hiddenTLparen.setParent(tmp5);
                    tmp5.isColon = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 5)).get("isColon");
                    if (tmp5.isColon != null) tmp5.isColon.setParent(tmp5);
                    tmp5.constIntLength = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 5)).get("constIntLength");
                    if (tmp5.constIntLength != null) tmp5.constIntLength.setParent(tmp5);
                    tmp5.isAssumedLength = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 5)).get("isAssumedLength");
                    if (tmp5.isAssumedLength != null) tmp5.isAssumedLength.setParent(tmp5);
                    tmp5.lengthExpr = (IExpr)((Map<String, Object>)valueStack.get(valueStackOffset + 5)).get("lengthExpr");
                    if (tmp5.lengthExpr != null) tmp5.lengthExpr.setParent(tmp5);
                    tmp5.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 5)).get("hiddenTRparen");
                    if (tmp5.hiddenTRparen != null) tmp5.hiddenTRparen.setParent(tmp5);
                    tmp5.constNameLength = (ASTNameNode)((Map<String, Object>)valueStack.get(valueStackOffset + 5)).get("constNameLength");
                    if (tmp5.constNameLength != null) tmp5.constNameLength.setParent(tmp5);
                    node.charLength = tmp5;
                    if (tmp5 != null) tmp5.setParent(node);
                    return node;

        }
        public Object handleEntityDecl466(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTEntityDeclNode node = new ASTEntityDeclNode();
                    node.objectName = (ASTObjectNameNode)valueStack.get(valueStackOffset + 0);
                    if (node.objectName != null) node.objectName.setParent(node);
                    node.hiddenTLbracket = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTLbracket != null) node.hiddenTLbracket.setParent(node);
                    node.coarraySpec = (ASTCoarraySpecNode)valueStack.get(valueStackOffset + 2);
                    if (node.coarraySpec != null) node.coarraySpec.setParent(node);
                    node.hiddenTRbracket = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTRbracket != null) node.hiddenTRbracket.setParent(node);
                    node.hiddenTAsterisk = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenTAsterisk != null) node.hiddenTAsterisk.setParent(node);
                    ASTCharLengthNode tmp5 = new ASTCharLengthNode();
                    tmp5.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 5)).get("hiddenTLparen");
                    if (tmp5.hiddenTLparen != null) tmp5.hiddenTLparen.setParent(tmp5);
                    tmp5.isColon = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 5)).get("isColon");
                    if (tmp5.isColon != null) tmp5.isColon.setParent(tmp5);
                    tmp5.constIntLength = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 5)).get("constIntLength");
                    if (tmp5.constIntLength != null) tmp5.constIntLength.setParent(tmp5);
                    tmp5.isAssumedLength = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 5)).get("isAssumedLength");
                    if (tmp5.isAssumedLength != null) tmp5.isAssumedLength.setParent(tmp5);
                    tmp5.lengthExpr = (IExpr)((Map<String, Object>)valueStack.get(valueStackOffset + 5)).get("lengthExpr");
                    if (tmp5.lengthExpr != null) tmp5.lengthExpr.setParent(tmp5);
                    tmp5.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 5)).get("hiddenTRparen");
                    if (tmp5.hiddenTRparen != null) tmp5.hiddenTRparen.setParent(tmp5);
                    tmp5.constNameLength = (ASTNameNode)((Map<String, Object>)valueStack.get(valueStackOffset + 5)).get("constNameLength");
                    if (tmp5.constNameLength != null) tmp5.constNameLength.setParent(tmp5);
                    node.charLength = tmp5;
                    if (tmp5 != null) tmp5.setParent(node);
                    node.initialization = (ASTInitializationNode)valueStack.get(valueStackOffset + 6);
                    if (node.initialization != null) node.initialization.setParent(node);
                    return node;

        }
        public Object handleEntityDecl467(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTEntityDeclNode node = new ASTEntityDeclNode();
                    node.objectName = (ASTObjectNameNode)valueStack.get(valueStackOffset + 0);
                    if (node.objectName != null) node.objectName.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.arraySpec = (ASTArraySpecNode)valueStack.get(valueStackOffset + 2);
                    if (node.arraySpec != null) node.arraySpec.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    node.hiddenTLbracket = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenTLbracket != null) node.hiddenTLbracket.setParent(node);
                    node.coarraySpec = (ASTCoarraySpecNode)valueStack.get(valueStackOffset + 5);
                    if (node.coarraySpec != null) node.coarraySpec.setParent(node);
                    node.hiddenTRbracket = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 6);
                    if (node.hiddenTRbracket != null) node.hiddenTRbracket.setParent(node);
                    return node;

        }
        public Object handleEntityDecl468(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTEntityDeclNode node = new ASTEntityDeclNode();
                    node.objectName = (ASTObjectNameNode)valueStack.get(valueStackOffset + 0);
                    if (node.objectName != null) node.objectName.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.arraySpec = (ASTArraySpecNode)valueStack.get(valueStackOffset + 2);
                    if (node.arraySpec != null) node.arraySpec.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    node.hiddenTLbracket = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenTLbracket != null) node.hiddenTLbracket.setParent(node);
                    node.coarraySpec = (ASTCoarraySpecNode)valueStack.get(valueStackOffset + 5);
                    if (node.coarraySpec != null) node.coarraySpec.setParent(node);
                    node.hiddenTRbracket = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 6);
                    if (node.hiddenTRbracket != null) node.hiddenTRbracket.setParent(node);
                    node.initialization = (ASTInitializationNode)valueStack.get(valueStackOffset + 7);
                    if (node.initialization != null) node.initialization.setParent(node);
                    return node;

        }
        public Object handleEntityDecl469(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTEntityDeclNode node = new ASTEntityDeclNode();
                    node.objectName = (ASTObjectNameNode)valueStack.get(valueStackOffset + 0);
                    if (node.objectName != null) node.objectName.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.arraySpec = (ASTArraySpecNode)valueStack.get(valueStackOffset + 2);
                    if (node.arraySpec != null) node.arraySpec.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    node.hiddenTLbracket = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenTLbracket != null) node.hiddenTLbracket.setParent(node);
                    node.coarraySpec = (ASTCoarraySpecNode)valueStack.get(valueStackOffset + 5);
                    if (node.coarraySpec != null) node.coarraySpec.setParent(node);
                    node.hiddenTRbracket = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 6);
                    if (node.hiddenTRbracket != null) node.hiddenTRbracket.setParent(node);
                    node.hiddenTAsterisk = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 7);
                    if (node.hiddenTAsterisk != null) node.hiddenTAsterisk.setParent(node);
                    ASTCharLengthNode tmp8 = new ASTCharLengthNode();
                    tmp8.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 8)).get("hiddenTLparen");
                    if (tmp8.hiddenTLparen != null) tmp8.hiddenTLparen.setParent(tmp8);
                    tmp8.isColon = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 8)).get("isColon");
                    if (tmp8.isColon != null) tmp8.isColon.setParent(tmp8);
                    tmp8.constIntLength = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 8)).get("constIntLength");
                    if (tmp8.constIntLength != null) tmp8.constIntLength.setParent(tmp8);
                    tmp8.isAssumedLength = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 8)).get("isAssumedLength");
                    if (tmp8.isAssumedLength != null) tmp8.isAssumedLength.setParent(tmp8);
                    tmp8.lengthExpr = (IExpr)((Map<String, Object>)valueStack.get(valueStackOffset + 8)).get("lengthExpr");
                    if (tmp8.lengthExpr != null) tmp8.lengthExpr.setParent(tmp8);
                    tmp8.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 8)).get("hiddenTRparen");
                    if (tmp8.hiddenTRparen != null) tmp8.hiddenTRparen.setParent(tmp8);
                    tmp8.constNameLength = (ASTNameNode)((Map<String, Object>)valueStack.get(valueStackOffset + 8)).get("constNameLength");
                    if (tmp8.constNameLength != null) tmp8.constNameLength.setParent(tmp8);
                    node.charLength = tmp8;
                    if (tmp8 != null) tmp8.setParent(node);
                    return node;

        }
        public Object handleEntityDecl470(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTEntityDeclNode node = new ASTEntityDeclNode();
                    node.objectName = (ASTObjectNameNode)valueStack.get(valueStackOffset + 0);
                    if (node.objectName != null) node.objectName.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.arraySpec = (ASTArraySpecNode)valueStack.get(valueStackOffset + 2);
                    if (node.arraySpec != null) node.arraySpec.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    node.hiddenTLbracket = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenTLbracket != null) node.hiddenTLbracket.setParent(node);
                    node.coarraySpec = (ASTCoarraySpecNode)valueStack.get(valueStackOffset + 5);
                    if (node.coarraySpec != null) node.coarraySpec.setParent(node);
                    node.hiddenTRbracket = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 6);
                    if (node.hiddenTRbracket != null) node.hiddenTRbracket.setParent(node);
                    node.hiddenTAsterisk = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 7);
                    if (node.hiddenTAsterisk != null) node.hiddenTAsterisk.setParent(node);
                    ASTCharLengthNode tmp8 = new ASTCharLengthNode();
                    tmp8.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 8)).get("hiddenTLparen");
                    if (tmp8.hiddenTLparen != null) tmp8.hiddenTLparen.setParent(tmp8);
                    tmp8.isColon = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 8)).get("isColon");
                    if (tmp8.isColon != null) tmp8.isColon.setParent(tmp8);
                    tmp8.constIntLength = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 8)).get("constIntLength");
                    if (tmp8.constIntLength != null) tmp8.constIntLength.setParent(tmp8);
                    tmp8.isAssumedLength = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 8)).get("isAssumedLength");
                    if (tmp8.isAssumedLength != null) tmp8.isAssumedLength.setParent(tmp8);
                    tmp8.lengthExpr = (IExpr)((Map<String, Object>)valueStack.get(valueStackOffset + 8)).get("lengthExpr");
                    if (tmp8.lengthExpr != null) tmp8.lengthExpr.setParent(tmp8);
                    tmp8.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 8)).get("hiddenTRparen");
                    if (tmp8.hiddenTRparen != null) tmp8.hiddenTRparen.setParent(tmp8);
                    tmp8.constNameLength = (ASTNameNode)((Map<String, Object>)valueStack.get(valueStackOffset + 8)).get("constNameLength");
                    if (tmp8.constNameLength != null) tmp8.constNameLength.setParent(tmp8);
                    node.charLength = tmp8;
                    if (tmp8 != null) tmp8.setParent(node);
                    node.initialization = (ASTInitializationNode)valueStack.get(valueStackOffset + 9);
                    if (node.initialization != null) node.initialization.setParent(node);
                    return node;

        }
        public Object handleEntityDecl471(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTEntityDeclNode node = new ASTEntityDeclNode();
                    node.objectName = (ASTObjectNameNode)valueStack.get(valueStackOffset + 0);
                    if (node.objectName != null) node.objectName.setParent(node);
                    node.hiddenTSlash = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTSlash != null) node.hiddenTSlash.setParent(node);
                    node.dataStmtValueList = (IASTListNode<ASTDataStmtValueNode>)valueStack.get(valueStackOffset + 2);
                    if (node.dataStmtValueList != null) node.dataStmtValueList.setParent(node);
                    node.hiddenTSlash2 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTSlash2 != null) node.hiddenTSlash2.setParent(node);
                    return node;

        }
        public Object handleEntityDecl472(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTEntityDeclNode node = new ASTEntityDeclNode();
                    node.objectName = (ASTObjectNameNode)valueStack.get(valueStackOffset + 0);
                    if (node.objectName != null) node.objectName.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.arraySpec = (ASTArraySpecNode)valueStack.get(valueStackOffset + 2);
                    if (node.arraySpec != null) node.arraySpec.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    node.hiddenTSlash = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenTSlash != null) node.hiddenTSlash.setParent(node);
                    node.dataStmtValueList = (IASTListNode<ASTDataStmtValueNode>)valueStack.get(valueStackOffset + 5);
                    if (node.dataStmtValueList != null) node.dataStmtValueList.setParent(node);
                    node.hiddenTSlash2 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 6);
                    if (node.hiddenTSlash2 != null) node.hiddenTSlash2.setParent(node);
                    return node;

        }
        public Object handleEntityDecl473(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTEntityDeclNode node = new ASTEntityDeclNode();
                    node.objectName = (ASTObjectNameNode)valueStack.get(valueStackOffset + 0);
                    if (node.objectName != null) node.objectName.setParent(node);
                    node.hiddenTAsterisk = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTAsterisk != null) node.hiddenTAsterisk.setParent(node);
                    ASTCharLengthNode tmp2 = new ASTCharLengthNode();
                    tmp2.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 2)).get("hiddenTLparen");
                    if (tmp2.hiddenTLparen != null) tmp2.hiddenTLparen.setParent(tmp2);
                    tmp2.isColon = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 2)).get("isColon");
                    if (tmp2.isColon != null) tmp2.isColon.setParent(tmp2);
                    tmp2.constIntLength = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 2)).get("constIntLength");
                    if (tmp2.constIntLength != null) tmp2.constIntLength.setParent(tmp2);
                    tmp2.isAssumedLength = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 2)).get("isAssumedLength");
                    if (tmp2.isAssumedLength != null) tmp2.isAssumedLength.setParent(tmp2);
                    tmp2.lengthExpr = (IExpr)((Map<String, Object>)valueStack.get(valueStackOffset + 2)).get("lengthExpr");
                    if (tmp2.lengthExpr != null) tmp2.lengthExpr.setParent(tmp2);
                    tmp2.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 2)).get("hiddenTRparen");
                    if (tmp2.hiddenTRparen != null) tmp2.hiddenTRparen.setParent(tmp2);
                    tmp2.constNameLength = (ASTNameNode)((Map<String, Object>)valueStack.get(valueStackOffset + 2)).get("constNameLength");
                    if (tmp2.constNameLength != null) tmp2.constNameLength.setParent(tmp2);
                    node.charLength = tmp2;
                    if (tmp2 != null) tmp2.setParent(node);
                    node.hiddenTSlash = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTSlash != null) node.hiddenTSlash.setParent(node);
                    node.dataStmtValueList = (IASTListNode<ASTDataStmtValueNode>)valueStack.get(valueStackOffset + 4);
                    if (node.dataStmtValueList != null) node.dataStmtValueList.setParent(node);
                    node.hiddenTSlash2 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 5);
                    if (node.hiddenTSlash2 != null) node.hiddenTSlash2.setParent(node);
                    return node;

        }
        public Object handleEntityDecl474(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTEntityDeclNode node = new ASTEntityDeclNode();
                    node.objectName = (ASTObjectNameNode)valueStack.get(valueStackOffset + 0);
                    if (node.objectName != null) node.objectName.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.arraySpec = (ASTArraySpecNode)valueStack.get(valueStackOffset + 2);
                    if (node.arraySpec != null) node.arraySpec.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    node.hiddenTAsterisk = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenTAsterisk != null) node.hiddenTAsterisk.setParent(node);
                    ASTCharLengthNode tmp5 = new ASTCharLengthNode();
                    tmp5.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 5)).get("hiddenTLparen");
                    if (tmp5.hiddenTLparen != null) tmp5.hiddenTLparen.setParent(tmp5);
                    tmp5.isColon = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 5)).get("isColon");
                    if (tmp5.isColon != null) tmp5.isColon.setParent(tmp5);
                    tmp5.constIntLength = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 5)).get("constIntLength");
                    if (tmp5.constIntLength != null) tmp5.constIntLength.setParent(tmp5);
                    tmp5.isAssumedLength = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 5)).get("isAssumedLength");
                    if (tmp5.isAssumedLength != null) tmp5.isAssumedLength.setParent(tmp5);
                    tmp5.lengthExpr = (IExpr)((Map<String, Object>)valueStack.get(valueStackOffset + 5)).get("lengthExpr");
                    if (tmp5.lengthExpr != null) tmp5.lengthExpr.setParent(tmp5);
                    tmp5.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 5)).get("hiddenTRparen");
                    if (tmp5.hiddenTRparen != null) tmp5.hiddenTRparen.setParent(tmp5);
                    tmp5.constNameLength = (ASTNameNode)((Map<String, Object>)valueStack.get(valueStackOffset + 5)).get("constNameLength");
                    if (tmp5.constNameLength != null) tmp5.constNameLength.setParent(tmp5);
                    node.charLength = tmp5;
                    if (tmp5 != null) tmp5.setParent(node);
                    node.hiddenTSlash = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 6);
                    if (node.hiddenTSlash != null) node.hiddenTSlash.setParent(node);
                    node.dataStmtValueList = (IASTListNode<ASTDataStmtValueNode>)valueStack.get(valueStackOffset + 7);
                    if (node.dataStmtValueList != null) node.dataStmtValueList.setParent(node);
                    node.hiddenTSlash2 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 8);
                    if (node.hiddenTSlash2 != null) node.hiddenTSlash2.setParent(node);
                    return node;

        }
        public Object handleInvalidEntityDecl475(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 3 and 4
                    Map<String, Object> node = new HashMap<String, Object>();
                    node.put("objectName", (ASTObjectNameNode)valueStack.get(valueStackOffset + 0));
                    node.put("hiddenAsterisk2", (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1));
                    ASTCharLengthNode tmp2 = new ASTCharLengthNode();
                    tmp2.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 2)).get("hiddenTLparen");
                    if (tmp2.hiddenTLparen != null) tmp2.hiddenTLparen.setParent(tmp2);
                    tmp2.isColon = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 2)).get("isColon");
                    if (tmp2.isColon != null) tmp2.isColon.setParent(tmp2);
                    tmp2.constIntLength = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 2)).get("constIntLength");
                    if (tmp2.constIntLength != null) tmp2.constIntLength.setParent(tmp2);
                    tmp2.isAssumedLength = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 2)).get("isAssumedLength");
                    if (tmp2.isAssumedLength != null) tmp2.isAssumedLength.setParent(tmp2);
                    tmp2.lengthExpr = (IExpr)((Map<String, Object>)valueStack.get(valueStackOffset + 2)).get("lengthExpr");
                    if (tmp2.lengthExpr != null) tmp2.lengthExpr.setParent(tmp2);
                    tmp2.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 2)).get("hiddenTRparen");
                    if (tmp2.hiddenTRparen != null) tmp2.hiddenTRparen.setParent(tmp2);
                    tmp2.constNameLength = (ASTNameNode)((Map<String, Object>)valueStack.get(valueStackOffset + 2)).get("constNameLength");
                    if (tmp2.constNameLength != null) tmp2.constNameLength.setParent(tmp2);
                    node.put("initialCharLength", tmp2);
                    node.put("hiddenLparen2", (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3));
                    node.put("arraySpec", (ASTArraySpecNode)valueStack.get(valueStackOffset + 4));
                    node.put("hiddenRparen2", (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 5));
                    ASTListNode<IASTNode> embeddedList = new ASTListNode<IASTNode>();
                    embeddedList.add((IASTNode)(node.get("objectName")));
                    embeddedList.add((IASTNode)(node.get("hiddenAsterisk2")));
                    embeddedList.add((IASTNode)(node.get("initialCharLength")));
                    embeddedList.add((IASTNode)(node.get("hiddenLparen2")));
                    embeddedList.add((IASTNode)(node.get("arraySpec")));
                    embeddedList.add((IASTNode)(node.get("hiddenRparen2")));
                    embeddedList.add((IASTNode)(node.get("initialization")));
                    node.put("errorRecoveryList", embeddedList);
                    return node;

        }
        public Object handleInvalidEntityDecl476(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 3 and 4
                    Map<String, Object> node = new HashMap<String, Object>();
                    node.put("objectName", (ASTObjectNameNode)valueStack.get(valueStackOffset + 0));
                    node.put("hiddenAsterisk2", (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1));
                    ASTCharLengthNode tmp2 = new ASTCharLengthNode();
                    tmp2.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 2)).get("hiddenTLparen");
                    if (tmp2.hiddenTLparen != null) tmp2.hiddenTLparen.setParent(tmp2);
                    tmp2.isColon = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 2)).get("isColon");
                    if (tmp2.isColon != null) tmp2.isColon.setParent(tmp2);
                    tmp2.constIntLength = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 2)).get("constIntLength");
                    if (tmp2.constIntLength != null) tmp2.constIntLength.setParent(tmp2);
                    tmp2.isAssumedLength = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 2)).get("isAssumedLength");
                    if (tmp2.isAssumedLength != null) tmp2.isAssumedLength.setParent(tmp2);
                    tmp2.lengthExpr = (IExpr)((Map<String, Object>)valueStack.get(valueStackOffset + 2)).get("lengthExpr");
                    if (tmp2.lengthExpr != null) tmp2.lengthExpr.setParent(tmp2);
                    tmp2.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 2)).get("hiddenTRparen");
                    if (tmp2.hiddenTRparen != null) tmp2.hiddenTRparen.setParent(tmp2);
                    tmp2.constNameLength = (ASTNameNode)((Map<String, Object>)valueStack.get(valueStackOffset + 2)).get("constNameLength");
                    if (tmp2.constNameLength != null) tmp2.constNameLength.setParent(tmp2);
                    node.put("initialCharLength", tmp2);
                    node.put("hiddenLparen2", (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3));
                    node.put("arraySpec", (ASTArraySpecNode)valueStack.get(valueStackOffset + 4));
                    node.put("hiddenRparen2", (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 5));
                    node.put("initialization", (ASTInitializationNode)valueStack.get(valueStackOffset + 6));
                    ASTListNode<IASTNode> embeddedList = new ASTListNode<IASTNode>();
                    embeddedList.add((IASTNode)(node.get("objectName")));
                    embeddedList.add((IASTNode)(node.get("hiddenAsterisk2")));
                    embeddedList.add((IASTNode)(node.get("initialCharLength")));
                    embeddedList.add((IASTNode)(node.get("hiddenLparen2")));
                    embeddedList.add((IASTNode)(node.get("arraySpec")));
                    embeddedList.add((IASTNode)(node.get("hiddenRparen2")));
                    embeddedList.add((IASTNode)(node.get("initialization")));
                    node.put("errorRecoveryList", embeddedList);
                    return node;

        }
        public Object handleInitialization477(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTInitializationNode node = new ASTInitializationNode();
                    node.assignsExpr = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.assignsExpr != null) node.assignsExpr.setParent(node);
                    node.assignedExpr = (IExpr)valueStack.get(valueStackOffset + 1);
                    if (node.assignedExpr != null) node.assignedExpr.setParent(node);
                    return node;

        }
        public Object handleInitialization478(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTInitializationNode node = new ASTInitializationNode();
                    node.assignsNull = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.assignsNull != null) node.assignsNull.setParent(node);
                    node.hiddenTNull = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTNull != null) node.hiddenTNull.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    return node;

        }
        public Object handleKindSelector479(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTKindSelectorNode node = new ASTKindSelectorNode();
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.hiddenTKindeq = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTKindeq != null) node.hiddenTKindeq.setParent(node);
                    node.kindExpr = (IExpr)valueStack.get(valueStackOffset + 2);
                    if (node.kindExpr != null) node.kindExpr.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    return node;

        }
        public Object handleKindSelector480(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTKindSelectorNode node = new ASTKindSelectorNode();
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.kindExpr = (IExpr)valueStack.get(valueStackOffset + 1);
                    if (node.kindExpr != null) node.kindExpr.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    return node;

        }
        public Object handleKindSelector481(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTKindSelectorNode node = new ASTKindSelectorNode();
                    node.hiddenTAsterisk = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.hiddenTAsterisk != null) node.hiddenTAsterisk.setParent(node);
                    node.kindExpr = (IExpr)valueStack.get(valueStackOffset + 1);
                    if (node.kindExpr != null) node.kindExpr.setParent(node);
                    return node;

        }
        public Object handleCharSelector482(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTCharSelectorNode node = new ASTCharSelectorNode();
                    node.hiddenTAsterisk = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.hiddenTAsterisk != null) node.hiddenTAsterisk.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("hiddenTLparen");
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.isColon = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("isColon");
                    if (node.isColon != null) node.isColon.setParent(node);
                    node.constIntLength = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("constIntLength");
                    if (node.constIntLength != null) node.constIntLength.setParent(node);
                    node.isAssumedLength = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("isAssumedLength");
                    if (node.isAssumedLength != null) node.isAssumedLength.setParent(node);
                    node.lengthExpr = (IExpr)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("lengthExpr");
                    if (node.lengthExpr != null) node.lengthExpr.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("hiddenTRparen");
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    node.constNameLength = (ASTNameNode)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("constNameLength");
                    if (node.constNameLength != null) node.constNameLength.setParent(node);
                    return node;

        }
        public Object handleCharSelector483(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTCharSelectorNode node = new ASTCharSelectorNode();
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.hiddenTLeneq = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTLeneq != null) node.hiddenTLeneq.setParent(node);
                    node.isColon = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 2)).get("isColon");
                    if (node.isColon != null) node.isColon.setParent(node);
                    node.lengthExpr = (IExpr)((Map<String, Object>)valueStack.get(valueStackOffset + 2)).get("lengthExpr");
                    if (node.lengthExpr != null) node.lengthExpr.setParent(node);
                    node.isAssumedLength = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 2)).get("isAssumedLength");
                    if (node.isAssumedLength != null) node.isAssumedLength.setParent(node);
                    node.hiddenTComma = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTComma != null) node.hiddenTComma.setParent(node);
                    node.hiddenTKindeq = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenTKindeq != null) node.hiddenTKindeq.setParent(node);
                    node.kindExpr = (IExpr)valueStack.get(valueStackOffset + 5);
                    if (node.kindExpr != null) node.kindExpr.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 6);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    return node;

        }
        public Object handleCharSelector484(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTCharSelectorNode node = new ASTCharSelectorNode();
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.hiddenTLeneq = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTLeneq != null) node.hiddenTLeneq.setParent(node);
                    node.isColon = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 2)).get("isColon");
                    if (node.isColon != null) node.isColon.setParent(node);
                    node.lengthExpr = (IExpr)((Map<String, Object>)valueStack.get(valueStackOffset + 2)).get("lengthExpr");
                    if (node.lengthExpr != null) node.lengthExpr.setParent(node);
                    node.isAssumedLength = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 2)).get("isAssumedLength");
                    if (node.isAssumedLength != null) node.isAssumedLength.setParent(node);
                    node.hiddenTComma = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTComma != null) node.hiddenTComma.setParent(node);
                    node.kindExpr = (IExpr)valueStack.get(valueStackOffset + 4);
                    if (node.kindExpr != null) node.kindExpr.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 5);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    return node;

        }
        public Object handleCharSelector485(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTCharSelectorNode node = new ASTCharSelectorNode();
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.hiddenTKindeq = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTKindeq != null) node.hiddenTKindeq.setParent(node);
                    node.kindExpr = (IExpr)valueStack.get(valueStackOffset + 2);
                    if (node.kindExpr != null) node.kindExpr.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    return node;

        }
        public Object handleCharSelector486(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTCharSelectorNode node = new ASTCharSelectorNode();
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.hiddenTLeneq = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTLeneq != null) node.hiddenTLeneq.setParent(node);
                    node.isColon = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 2)).get("isColon");
                    if (node.isColon != null) node.isColon.setParent(node);
                    node.lengthExpr = (IExpr)((Map<String, Object>)valueStack.get(valueStackOffset + 2)).get("lengthExpr");
                    if (node.lengthExpr != null) node.lengthExpr.setParent(node);
                    node.isAssumedLength = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 2)).get("isAssumedLength");
                    if (node.isAssumedLength != null) node.isAssumedLength.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    return node;

        }
        public Object handleCharSelector487(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTCharSelectorNode node = new ASTCharSelectorNode();
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.isColon = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("isColon");
                    if (node.isColon != null) node.isColon.setParent(node);
                    node.lengthExpr = (IExpr)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("lengthExpr");
                    if (node.lengthExpr != null) node.lengthExpr.setParent(node);
                    node.isAssumedLength = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("isAssumedLength");
                    if (node.isAssumedLength != null) node.isAssumedLength.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    return node;

        }
        public Object handleCharSelector488(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTCharSelectorNode node = new ASTCharSelectorNode();
                    node.hiddenTLparen2 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.hiddenTLparen2 != null) node.hiddenTLparen2.setParent(node);
                    node.hiddenTKindEq2 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTKindEq2 != null) node.hiddenTKindEq2.setParent(node);
                    node.kindExpr2 = (IExpr)valueStack.get(valueStackOffset + 2);
                    if (node.kindExpr2 != null) node.kindExpr2.setParent(node);
                    node.hiddenTComma2 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTComma2 != null) node.hiddenTComma2.setParent(node);
                    node.hiddenTLeneq = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenTLeneq != null) node.hiddenTLeneq.setParent(node);
                    node.isColon = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 5)).get("isColon");
                    if (node.isColon != null) node.isColon.setParent(node);
                    node.lengthExpr = (IExpr)((Map<String, Object>)valueStack.get(valueStackOffset + 5)).get("lengthExpr");
                    if (node.lengthExpr != null) node.lengthExpr.setParent(node);
                    node.isAssumedLength = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 5)).get("isAssumedLength");
                    if (node.isAssumedLength != null) node.isAssumedLength.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 6);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    return node;

        }
        public Object handleCharLenParamValue489(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 3 and 4
                    Map<String, Object> node = new HashMap<String, Object>();
                    node.put("lengthExpr", (IExpr)valueStack.get(valueStackOffset + 0));
                    ASTListNode<IASTNode> embeddedList = new ASTListNode<IASTNode>();
                    embeddedList.add((IASTNode)(node.get("isColon")));
                    embeddedList.add((IASTNode)(node.get("lengthExpr")));
                    embeddedList.add((IASTNode)(node.get("isAssumedLength")));
                    node.put("errorRecoveryList", embeddedList);
                    return node;

        }
        public Object handleCharLenParamValue490(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 3 and 4
                    Map<String, Object> node = new HashMap<String, Object>();
                    node.put("isAssumedLength", (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0));
                    ASTListNode<IASTNode> embeddedList = new ASTListNode<IASTNode>();
                    embeddedList.add((IASTNode)(node.get("isColon")));
                    embeddedList.add((IASTNode)(node.get("lengthExpr")));
                    embeddedList.add((IASTNode)(node.get("isAssumedLength")));
                    node.put("errorRecoveryList", embeddedList);
                    return node;

        }
        public Object handleCharLenParamValue491(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 3 and 4
                    Map<String, Object> node = new HashMap<String, Object>();
                    node.put("isColon", (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0));
                    ASTListNode<IASTNode> embeddedList = new ASTListNode<IASTNode>();
                    embeddedList.add((IASTNode)(node.get("isColon")));
                    embeddedList.add((IASTNode)(node.get("lengthExpr")));
                    embeddedList.add((IASTNode)(node.get("isAssumedLength")));
                    node.put("errorRecoveryList", embeddedList);
                    return node;

        }
        public Object handleCharLength492(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 3 and 4
                    Map<String, Object> node = new HashMap<String, Object>();
                    node.put("hiddenTLparen", (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0));
                    node.put("isColon", (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("isColon"));
                    node.put("lengthExpr", (IExpr)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("lengthExpr"));
                    node.put("isAssumedLength", (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("isAssumedLength"));
                    node.put("hiddenTRparen", (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2));
                    ASTListNode<IASTNode> embeddedList = new ASTListNode<IASTNode>();
                    embeddedList.add((IASTNode)(node.get("hiddenTLparen")));
                    embeddedList.add((IASTNode)(node.get("isColon")));
                    embeddedList.add((IASTNode)(node.get("constIntLength")));
                    embeddedList.add((IASTNode)(node.get("isAssumedLength")));
                    embeddedList.add((IASTNode)(node.get("lengthExpr")));
                    embeddedList.add((IASTNode)(node.get("hiddenTRparen")));
                    embeddedList.add((IASTNode)(node.get("constNameLength")));
                    node.put("errorRecoveryList", embeddedList);
                    return node;

        }
        public Object handleCharLength493(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 3 and 4
                    Map<String, Object> node = new HashMap<String, Object>();
                    node.put("constIntLength", (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0));
                    ASTListNode<IASTNode> embeddedList = new ASTListNode<IASTNode>();
                    embeddedList.add((IASTNode)(node.get("hiddenTLparen")));
                    embeddedList.add((IASTNode)(node.get("isColon")));
                    embeddedList.add((IASTNode)(node.get("constIntLength")));
                    embeddedList.add((IASTNode)(node.get("isAssumedLength")));
                    embeddedList.add((IASTNode)(node.get("lengthExpr")));
                    embeddedList.add((IASTNode)(node.get("hiddenTRparen")));
                    embeddedList.add((IASTNode)(node.get("constNameLength")));
                    node.put("errorRecoveryList", embeddedList);
                    return node;

        }
        public Object handleCharLength494(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 3 and 4
                    Map<String, Object> node = new HashMap<String, Object>();
                    ASTNameNode tmp0 = new ASTNameNode();
                    tmp0.name = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("name");
                    if (tmp0.name != null) tmp0.name.setParent(tmp0);
                    node.put("constNameLength", tmp0);
                    ASTListNode<IASTNode> embeddedList = new ASTListNode<IASTNode>();
                    embeddedList.add((IASTNode)(node.get("hiddenTLparen")));
                    embeddedList.add((IASTNode)(node.get("isColon")));
                    embeddedList.add((IASTNode)(node.get("constIntLength")));
                    embeddedList.add((IASTNode)(node.get("isAssumedLength")));
                    embeddedList.add((IASTNode)(node.get("lengthExpr")));
                    embeddedList.add((IASTNode)(node.get("hiddenTRparen")));
                    embeddedList.add((IASTNode)(node.get("constNameLength")));
                    node.put("errorRecoveryList", embeddedList);
                    return node;

        }
        public Object handleAccessSpec495(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTAccessSpecNode node = new ASTAccessSpecNode();
                    node.isPublic = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.isPublic != null) node.isPublic.setParent(node);
                    return node;

        }
        public Object handleAccessSpec496(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTAccessSpecNode node = new ASTAccessSpecNode();
                    node.isPrivate = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.isPrivate != null) node.isPrivate.setParent(node);
                    return node;

        }
        public Object handleCoarraySpec497(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTCoarraySpecNode node = new ASTCoarraySpecNode();
                    node.deferredCoshapeSpecList = (IASTListNode<ASTDeferredCoshapeSpecListNode>)valueStack.get(valueStackOffset + 0);
                    if (node.deferredCoshapeSpecList != null) node.deferredCoshapeSpecList.setParent(node);
                    return node;

        }
        public Object handleCoarraySpec498(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTCoarraySpecNode node = new ASTCoarraySpecNode();
                    node.explicitCoshapeSpec = (ASTExplicitCoshapeSpecNode)valueStack.get(valueStackOffset + 0);
                    if (node.explicitCoshapeSpec != null) node.explicitCoshapeSpec.setParent(node);
                    return node;

        }
        public Object handleDeferredCoshapeSpecList499(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 10
                    ASTDeferredCoshapeSpecListNode node = new ASTDeferredCoshapeSpecListNode();
                    node.hiddenTColon = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.hiddenTColon != null) node.hiddenTColon.setParent(node);
                    ASTListNode<ASTDeferredCoshapeSpecListNode> list = new ASTListNode<ASTDeferredCoshapeSpecListNode>();
                    list.add(node);
                    node.setParent(list);
                    return list;

        }
        public Object handleDeferredCoshapeSpecList500(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 11
                    ASTDeferredCoshapeSpecListNode node = new ASTDeferredCoshapeSpecListNode();
                    node.hiddenTComma = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTComma != null) node.hiddenTComma.setParent(node);
                    node.hiddenTColon = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTColon != null) node.hiddenTColon.setParent(node);
                    ASTListNode<ASTDeferredCoshapeSpecListNode> list = (ASTListNode<ASTDeferredCoshapeSpecListNode>)valueStack.get(valueStackOffset);
                    list.add(node);
                    node.setParent(list);
                    return list;

        }
        public Object handleExplicitCoshapeSpec501(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTExplicitCoshapeSpecNode node = new ASTExplicitCoshapeSpecNode();
                    node.explicitShapeSpecList = (IASTListNode<ASTExplicitShapeSpecNode>)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("explicitShapeSpecList");
                    if (node.explicitShapeSpecList != null) node.explicitShapeSpecList.setParent(node);
                    node.hiddenTComma = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("hiddenTComma");
                    if (node.hiddenTComma != null) node.hiddenTComma.setParent(node);
                    node.lb = (IExpr)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("lb");
                    if (node.lb != null) node.lb.setParent(node);
                    node.hiddenTColon = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("hiddenTColon");
                    if (node.hiddenTColon != null) node.hiddenTColon.setParent(node);
                    node.hiddenTAsterisk = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("hiddenTAsterisk");
                    if (node.hiddenTAsterisk != null) node.hiddenTAsterisk.setParent(node);
                    return node;

        }
        public Object handleIntentSpec502(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTIntentSpecNode node = new ASTIntentSpecNode();
                    node.isIntentIn = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.isIntentIn != null) node.isIntentIn.setParent(node);
                    return node;

        }
        public Object handleIntentSpec503(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTIntentSpecNode node = new ASTIntentSpecNode();
                    node.isIntentOut = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.isIntentOut != null) node.isIntentOut.setParent(node);
                    return node;

        }
        public Object handleIntentSpec504(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTIntentSpecNode node = new ASTIntentSpecNode();
                    node.isIntentInOut = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.isIntentInOut != null) node.isIntentInOut.setParent(node);
                    return node;

        }
        public Object handleIntentSpec505(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTIntentSpecNode node = new ASTIntentSpecNode();
                    node.isIntentInOut = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.isIntentInOut != null) node.isIntentInOut.setParent(node);
                    node.hiddenTOut = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTOut != null) node.hiddenTOut.setParent(node);
                    return node;

        }
        public Object handleArraySpec506(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTArraySpecNode node = new ASTArraySpecNode();
                    node.explicitShapeSpecList = (IASTListNode<ASTExplicitShapeSpecNode>)valueStack.get(valueStackOffset + 0);
                    if (node.explicitShapeSpecList != null) node.explicitShapeSpecList.setParent(node);
                    return node;

        }
        public Object handleArraySpec507(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTArraySpecNode node = new ASTArraySpecNode();
                    ASTAssumedSizeSpecNode tmp0 = new ASTAssumedSizeSpecNode();
                    tmp0.explicitShapeSpecList = (IASTListNode<ASTExplicitShapeSpecNode>)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("explicitShapeSpecList");
                    if (tmp0.explicitShapeSpecList != null) tmp0.explicitShapeSpecList.setParent(tmp0);
                    tmp0.hiddenTComma = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("hiddenTComma");
                    if (tmp0.hiddenTComma != null) tmp0.hiddenTComma.setParent(tmp0);
                    tmp0.lb = (IExpr)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("lb");
                    if (tmp0.lb != null) tmp0.lb.setParent(tmp0);
                    tmp0.hiddenTColon = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("hiddenTColon");
                    if (tmp0.hiddenTColon != null) tmp0.hiddenTColon.setParent(tmp0);
                    tmp0.hiddenTAsterisk = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("hiddenTAsterisk");
                    if (tmp0.hiddenTAsterisk != null) tmp0.hiddenTAsterisk.setParent(tmp0);
                    node.assumedSizeSpec = tmp0;
                    if (tmp0 != null) tmp0.setParent(node);
                    return node;

        }
        public Object handleArraySpec508(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTArraySpecNode node = new ASTArraySpecNode();
                    node.assumedShapeSpecList = (IASTListNode<ASTAssumedShapeSpecListNode>)valueStack.get(valueStackOffset + 0);
                    if (node.assumedShapeSpecList != null) node.assumedShapeSpecList.setParent(node);
                    return node;

        }
        public Object handleArraySpec509(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTArraySpecNode node = new ASTArraySpecNode();
                    node.deferredShapeSpecList = (IASTListNode<ASTDeferredShapeSpecListNode>)valueStack.get(valueStackOffset + 0);
                    if (node.deferredShapeSpecList != null) node.deferredShapeSpecList.setParent(node);
                    return node;

        }
        public Object handleAssumedShapeSpecList510(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 10
                    ASTAssumedShapeSpecListNode node = new ASTAssumedShapeSpecListNode();
                    node.lb = (IExpr)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("lb");
                    if (node.lb != null) node.lb.setParent(node);
                    node.hiddenTColon = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTColon != null) node.hiddenTColon.setParent(node);
                    ASTListNode<ASTAssumedShapeSpecListNode> list = new ASTListNode<ASTAssumedShapeSpecListNode>();
                    list.add(node);
                    node.setParent(list);
                    return list;

        }
        public Object handleAssumedShapeSpecList511(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 10
                    ASTAssumedShapeSpecListNode node = new ASTAssumedShapeSpecListNode();
                    node.deferredShapeSpecList = (IASTListNode<ASTDeferredShapeSpecListNode>)valueStack.get(valueStackOffset + 0);
                    if (node.deferredShapeSpecList != null) node.deferredShapeSpecList.setParent(node);
                    node.hiddenTComma = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTComma != null) node.hiddenTComma.setParent(node);
                    node.lb = (IExpr)((Map<String, Object>)valueStack.get(valueStackOffset + 2)).get("lb");
                    if (node.lb != null) node.lb.setParent(node);
                    node.hiddenTColon = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTColon != null) node.hiddenTColon.setParent(node);
                    ASTListNode<ASTAssumedShapeSpecListNode> list = new ASTListNode<ASTAssumedShapeSpecListNode>();
                    list.add(node);
                    node.setParent(list);
                    return list;

        }
        public Object handleAssumedShapeSpecList512(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 11
                    ASTAssumedShapeSpecListNode node = new ASTAssumedShapeSpecListNode();
                    node.hiddenTComma = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTComma != null) node.hiddenTComma.setParent(node);
                    node.lb = (IExpr)((Map<String, Object>)valueStack.get(valueStackOffset + 2)).get("lb");
                    if (node.lb != null) node.lb.setParent(node);
                    node.hiddenTColon = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 2)).get("hiddenTColon");
                    if (node.hiddenTColon != null) node.hiddenTColon.setParent(node);
                    ASTListNode<ASTAssumedShapeSpecListNode> list = (ASTListNode<ASTAssumedShapeSpecListNode>)valueStack.get(valueStackOffset);
                    list.add(node);
                    node.setParent(list);
                    return list;

        }
        public Object handleExplicitShapeSpecList513(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 7 with separator
                    ASTSeparatedListNode<ASTExplicitShapeSpecNode> list = new ASTSeparatedListNode<ASTExplicitShapeSpecNode>();
                    ASTExplicitShapeSpecNode elt = (ASTExplicitShapeSpecNode)valueStack.get(valueStackOffset + 0);
                    list.add(null, elt);
                    if (elt != null) elt.setParent(list);
                    return list;

        }
        public Object handleExplicitShapeSpecList514(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 8 with separator
                    ASTSeparatedListNode<ASTExplicitShapeSpecNode> list = (ASTSeparatedListNode<ASTExplicitShapeSpecNode>)valueStack.get(valueStackOffset);
                    org.eclipse.photran.internal.core.lexer.Token token = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    ASTExplicitShapeSpecNode elt = (ASTExplicitShapeSpecNode)valueStack.get(valueStackOffset + 2);
                    list.add(token, elt);
                    token.setParent(list);
                    if (elt != null) elt.setParent(list);
                    return list;

        }
        public Object handleExplicitShapeSpec515(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTExplicitShapeSpecNode node = new ASTExplicitShapeSpecNode();
                    node.lb = (IExpr)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("lb");
                    if (node.lb != null) node.lb.setParent(node);
                    node.hiddenTColon = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTColon != null) node.hiddenTColon.setParent(node);
                    node.ub = (IExpr)((Map<String, Object>)valueStack.get(valueStackOffset + 2)).get("ub");
                    if (node.ub != null) node.ub.setParent(node);
                    return node;

        }
        public Object handleExplicitShapeSpec516(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTExplicitShapeSpecNode node = new ASTExplicitShapeSpecNode();
                    node.ub = (IExpr)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("ub");
                    if (node.ub != null) node.ub.setParent(node);
                    return node;

        }
        public Object handleLowerBound517(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 3 and 4
                    Map<String, Object> node = new HashMap<String, Object>();
                    node.put("lb", (IExpr)valueStack.get(valueStackOffset + 0));
                    ASTListNode<IASTNode> embeddedList = new ASTListNode<IASTNode>();
                    embeddedList.add((IASTNode)(node.get("lb")));
                    node.put("errorRecoveryList", embeddedList);
                    return node;

        }
        public Object handleUpperBound518(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 3 and 4
                    Map<String, Object> node = new HashMap<String, Object>();
                    node.put("ub", (IExpr)valueStack.get(valueStackOffset + 0));
                    ASTListNode<IASTNode> embeddedList = new ASTListNode<IASTNode>();
                    embeddedList.add((IASTNode)(node.get("ub")));
                    node.put("errorRecoveryList", embeddedList);
                    return node;

        }
        public Object handleAssumedShapeSpec519(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 3 and 4
                    Map<String, Object> node = new HashMap<String, Object>();
                    node.put("lb", (IExpr)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("lb"));
                    node.put("hiddenTColon", (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1));
                    ASTListNode<IASTNode> embeddedList = new ASTListNode<IASTNode>();
                    embeddedList.add((IASTNode)(node.get("lb")));
                    embeddedList.add((IASTNode)(node.get("hiddenTColon")));
                    node.put("errorRecoveryList", embeddedList);
                    return node;

        }
        public Object handleAssumedShapeSpec520(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 3 and 4
                    Map<String, Object> node = new HashMap<String, Object>();
                    node.put("hiddenTColon", (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0));
                    ASTListNode<IASTNode> embeddedList = new ASTListNode<IASTNode>();
                    embeddedList.add((IASTNode)(node.get("lb")));
                    embeddedList.add((IASTNode)(node.get("hiddenTColon")));
                    node.put("errorRecoveryList", embeddedList);
                    return node;

        }
        public Object handleDeferredShapeSpecList521(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 10
                    ASTDeferredShapeSpecListNode node = new ASTDeferredShapeSpecListNode();
                    node.hiddenTColon = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("hiddenTColon");
                    if (node.hiddenTColon != null) node.hiddenTColon.setParent(node);
                    ASTListNode<ASTDeferredShapeSpecListNode> list = new ASTListNode<ASTDeferredShapeSpecListNode>();
                    list.add(node);
                    node.setParent(list);
                    return list;

        }
        public Object handleDeferredShapeSpecList522(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 11
                    ASTDeferredShapeSpecListNode node = new ASTDeferredShapeSpecListNode();
                    node.hiddenTComma = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTComma != null) node.hiddenTComma.setParent(node);
                    node.hiddenTColon = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 2)).get("hiddenTColon");
                    if (node.hiddenTColon != null) node.hiddenTColon.setParent(node);
                    ASTListNode<ASTDeferredShapeSpecListNode> list = (ASTListNode<ASTDeferredShapeSpecListNode>)valueStack.get(valueStackOffset);
                    list.add(node);
                    node.setParent(list);
                    return list;

        }
        public Object handleDeferredShapeSpec523(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 3 and 4
                    Map<String, Object> node = new HashMap<String, Object>();
                    node.put("hiddenTColon", (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0));
                    ASTListNode<IASTNode> embeddedList = new ASTListNode<IASTNode>();
                    embeddedList.add((IASTNode)(node.get("hiddenTColon")));
                    node.put("errorRecoveryList", embeddedList);
                    return node;

        }
        public Object handleAssumedSizeSpec524(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 3 and 4
                    Map<String, Object> node = new HashMap<String, Object>();
                    node.put("hiddenTAsterisk", (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0));
                    ASTListNode<IASTNode> embeddedList = new ASTListNode<IASTNode>();
                    embeddedList.add((IASTNode)(node.get("explicitShapeSpecList")));
                    embeddedList.add((IASTNode)(node.get("hiddenTComma")));
                    embeddedList.add((IASTNode)(node.get("lb")));
                    embeddedList.add((IASTNode)(node.get("hiddenTColon")));
                    embeddedList.add((IASTNode)(node.get("hiddenTAsterisk")));
                    node.put("errorRecoveryList", embeddedList);
                    return node;

        }
        public Object handleAssumedSizeSpec525(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 3 and 4
                    Map<String, Object> node = new HashMap<String, Object>();
                    node.put("lb", (IExpr)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("lb"));
                    node.put("hiddenTColon", (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1));
                    node.put("hiddenTAsterisk", (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2));
                    ASTListNode<IASTNode> embeddedList = new ASTListNode<IASTNode>();
                    embeddedList.add((IASTNode)(node.get("explicitShapeSpecList")));
                    embeddedList.add((IASTNode)(node.get("hiddenTComma")));
                    embeddedList.add((IASTNode)(node.get("lb")));
                    embeddedList.add((IASTNode)(node.get("hiddenTColon")));
                    embeddedList.add((IASTNode)(node.get("hiddenTAsterisk")));
                    node.put("errorRecoveryList", embeddedList);
                    return node;

        }
        public Object handleAssumedSizeSpec526(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 3 and 4
                    Map<String, Object> node = new HashMap<String, Object>();
                    node.put("explicitShapeSpecList", (IASTListNode<ASTExplicitShapeSpecNode>)valueStack.get(valueStackOffset + 0));
                    node.put("hiddenTComma", (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1));
                    node.put("hiddenTAsterisk", (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2));
                    ASTListNode<IASTNode> embeddedList = new ASTListNode<IASTNode>();
                    embeddedList.add((IASTNode)(node.get("explicitShapeSpecList")));
                    embeddedList.add((IASTNode)(node.get("hiddenTComma")));
                    embeddedList.add((IASTNode)(node.get("lb")));
                    embeddedList.add((IASTNode)(node.get("hiddenTColon")));
                    embeddedList.add((IASTNode)(node.get("hiddenTAsterisk")));
                    node.put("errorRecoveryList", embeddedList);
                    return node;

        }
        public Object handleAssumedSizeSpec527(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 3 and 4
                    Map<String, Object> node = new HashMap<String, Object>();
                    node.put("explicitShapeSpecList", (IASTListNode<ASTExplicitShapeSpecNode>)valueStack.get(valueStackOffset + 0));
                    node.put("hiddenTComma", (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1));
                    node.put("lb", (IExpr)((Map<String, Object>)valueStack.get(valueStackOffset + 2)).get("lb"));
                    node.put("hiddenTColon", (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3));
                    node.put("hiddenTAsterisk", (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4));
                    ASTListNode<IASTNode> embeddedList = new ASTListNode<IASTNode>();
                    embeddedList.add((IASTNode)(node.get("explicitShapeSpecList")));
                    embeddedList.add((IASTNode)(node.get("hiddenTComma")));
                    embeddedList.add((IASTNode)(node.get("lb")));
                    embeddedList.add((IASTNode)(node.get("hiddenTColon")));
                    embeddedList.add((IASTNode)(node.get("hiddenTAsterisk")));
                    node.put("errorRecoveryList", embeddedList);
                    return node;

        }
        public Object handleIntentStmt528(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTIntentStmtNode node = new ASTIntentStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTIntent = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTIntent != null) node.hiddenTIntent.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.intentSpec = (ASTIntentSpecNode)valueStack.get(valueStackOffset + 3);
                    if (node.intentSpec != null) node.intentSpec.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    node.variableList = (IASTListNode<ASTIntentParListNode>)valueStack.get(valueStackOffset + 5);
                    if (node.variableList != null) node.variableList.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 6);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleIntentStmt529(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTIntentStmtNode node = new ASTIntentStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTIntent = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTIntent != null) node.hiddenTIntent.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.intentSpec = (ASTIntentSpecNode)valueStack.get(valueStackOffset + 3);
                    if (node.intentSpec != null) node.intentSpec.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    node.hiddenTColon = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 5);
                    if (node.hiddenTColon != null) node.hiddenTColon.setParent(node);
                    node.hiddenTColon2 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 6);
                    if (node.hiddenTColon2 != null) node.hiddenTColon2.setParent(node);
                    node.variableList = (IASTListNode<ASTIntentParListNode>)valueStack.get(valueStackOffset + 7);
                    if (node.variableList != null) node.variableList.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 8);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleIntentParList530(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 10
                    ASTIntentParListNode node = new ASTIntentParListNode();
                    node.variableName = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("variableName");
                    if (node.variableName != null) node.variableName.setParent(node);
                    ASTListNode<ASTIntentParListNode> list = new ASTListNode<ASTIntentParListNode>();
                    list.add(node);
                    node.setParent(list);
                    return list;

        }
        public Object handleIntentParList531(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 11
                    ASTIntentParListNode node = new ASTIntentParListNode();
                    node.hiddenTComma = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTComma != null) node.hiddenTComma.setParent(node);
                    node.variableName = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 2)).get("variableName");
                    if (node.variableName != null) node.variableName.setParent(node);
                    ASTListNode<ASTIntentParListNode> list = (ASTListNode<ASTIntentParListNode>)valueStack.get(valueStackOffset);
                    list.add(node);
                    node.setParent(list);
                    return list;

        }
        public Object handleIntentPar532(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 3 and 4
                    Map<String, Object> node = new HashMap<String, Object>();
                    node.put("variableName", (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("variableName"));
                    ASTListNode<IASTNode> embeddedList = new ASTListNode<IASTNode>();
                    embeddedList.add((IASTNode)(node.get("variableName")));
                    node.put("errorRecoveryList", embeddedList);
                    return node;

        }
        public Object handleOptionalStmt533(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTOptionalStmtNode node = new ASTOptionalStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTOptional = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTOptional != null) node.hiddenTOptional.setParent(node);
                    node.variableList = (IASTListNode<ASTOptionalParListNode>)valueStack.get(valueStackOffset + 2);
                    if (node.variableList != null) node.variableList.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleOptionalStmt534(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTOptionalStmtNode node = new ASTOptionalStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTOptional = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTOptional != null) node.hiddenTOptional.setParent(node);
                    node.hiddenTColon = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTColon != null) node.hiddenTColon.setParent(node);
                    node.hiddenTColon2 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTColon2 != null) node.hiddenTColon2.setParent(node);
                    node.variableList = (IASTListNode<ASTOptionalParListNode>)valueStack.get(valueStackOffset + 4);
                    if (node.variableList != null) node.variableList.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 5);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleOptionalParList535(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 10
                    ASTOptionalParListNode node = new ASTOptionalParListNode();
                    node.variableName = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("variableName");
                    if (node.variableName != null) node.variableName.setParent(node);
                    ASTListNode<ASTOptionalParListNode> list = new ASTListNode<ASTOptionalParListNode>();
                    list.add(node);
                    node.setParent(list);
                    return list;

        }
        public Object handleOptionalParList536(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 11
                    ASTOptionalParListNode node = new ASTOptionalParListNode();
                    node.hiddenTComma = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTComma != null) node.hiddenTComma.setParent(node);
                    node.variableName = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 2)).get("variableName");
                    if (node.variableName != null) node.variableName.setParent(node);
                    ASTListNode<ASTOptionalParListNode> list = (ASTListNode<ASTOptionalParListNode>)valueStack.get(valueStackOffset);
                    list.add(node);
                    node.setParent(list);
                    return list;

        }
        public Object handleOptionalPar537(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 3 and 4
                    Map<String, Object> node = new HashMap<String, Object>();
                    node.put("variableName", (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("variableName"));
                    ASTListNode<IASTNode> embeddedList = new ASTListNode<IASTNode>();
                    embeddedList.add((IASTNode)(node.get("variableName")));
                    node.put("errorRecoveryList", embeddedList);
                    return node;

        }
        public Object handleAccessStmt538(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTAccessStmtNode node = new ASTAccessStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.accessSpec = (ASTAccessSpecNode)valueStack.get(valueStackOffset + 1);
                    if (node.accessSpec != null) node.accessSpec.setParent(node);
                    node.hiddenTColon = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTColon != null) node.hiddenTColon.setParent(node);
                    node.hiddenTColon2 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTColon2 != null) node.hiddenTColon2.setParent(node);
                    node.accessIdList = (IASTListNode<IAccessId>)valueStack.get(valueStackOffset + 4);
                    if (node.accessIdList != null) node.accessIdList.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 5);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleAccessStmt539(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTAccessStmtNode node = new ASTAccessStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.accessSpec = (ASTAccessSpecNode)valueStack.get(valueStackOffset + 1);
                    if (node.accessSpec != null) node.accessSpec.setParent(node);
                    node.accessIdList = (IASTListNode<IAccessId>)valueStack.get(valueStackOffset + 2);
                    if (node.accessIdList != null) node.accessIdList.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleAccessStmt540(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTAccessStmtNode node = new ASTAccessStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.accessSpec = (ASTAccessSpecNode)valueStack.get(valueStackOffset + 1);
                    if (node.accessSpec != null) node.accessSpec.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleAccessIdList541(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 7 with separator
                    ASTSeparatedListNode<IAccessId> list = new ASTSeparatedListNode<IAccessId>();
                    IAccessId elt = (IAccessId)valueStack.get(valueStackOffset + 0);
                    list.add(null, elt);
                    if (elt != null) elt.setParent(list);
                    return list;

        }
        public Object handleAccessIdList542(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 8 with separator
                    ASTSeparatedListNode<IAccessId> list = (ASTSeparatedListNode<IAccessId>)valueStack.get(valueStackOffset);
                    org.eclipse.photran.internal.core.lexer.Token token = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    IAccessId elt = (IAccessId)valueStack.get(valueStackOffset + 2);
                    list.add(token, elt);
                    token.setParent(list);
                    if (elt != null) elt.setParent(list);
                    return list;

        }
        public Object handleAccessId543(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 5
                    ASTGenericNameNode result = (ASTGenericNameNode)valueStack.get(valueStackOffset + 0);
                    return result;

        }
        public Object handleAccessId544(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 5
                    ASTGenericSpecNode result = (ASTGenericSpecNode)valueStack.get(valueStackOffset + 0);
                    return result;

        }
        public Object handleSaveStmt545(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTSaveStmtNode node = new ASTSaveStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTSave = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTSave != null) node.hiddenTSave.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleSaveStmt546(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTSaveStmtNode node = new ASTSaveStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTSave = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTSave != null) node.hiddenTSave.setParent(node);
                    node.variableList = (IASTListNode<ASTSavedEntityNode>)valueStack.get(valueStackOffset + 2);
                    if (node.variableList != null) node.variableList.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleSaveStmt547(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTSaveStmtNode node = new ASTSaveStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTSave = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTSave != null) node.hiddenTSave.setParent(node);
                    node.hiddenTColon = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTColon != null) node.hiddenTColon.setParent(node);
                    node.hiddenTColon2 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTColon2 != null) node.hiddenTColon2.setParent(node);
                    node.variableList = (IASTListNode<ASTSavedEntityNode>)valueStack.get(valueStackOffset + 4);
                    if (node.variableList != null) node.variableList.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 5);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleSavedEntityList548(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 7 with separator
                    ASTSeparatedListNode<ASTSavedEntityNode> list = new ASTSeparatedListNode<ASTSavedEntityNode>();
                    ASTSavedEntityNode elt = (ASTSavedEntityNode)valueStack.get(valueStackOffset + 0);
                    list.add(null, elt);
                    if (elt != null) elt.setParent(list);
                    return list;

        }
        public Object handleSavedEntityList549(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 8 with separator
                    ASTSeparatedListNode<ASTSavedEntityNode> list = (ASTSeparatedListNode<ASTSavedEntityNode>)valueStack.get(valueStackOffset);
                    org.eclipse.photran.internal.core.lexer.Token token = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    ASTSavedEntityNode elt = (ASTSavedEntityNode)valueStack.get(valueStackOffset + 2);
                    list.add(token, elt);
                    token.setParent(list);
                    if (elt != null) elt.setParent(list);
                    return list;

        }
        public Object handleSavedEntity550(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTSavedEntityNode node = new ASTSavedEntityNode();
                    node.variableName = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("variableName");
                    if (node.variableName != null) node.variableName.setParent(node);
                    return node;

        }
        public Object handleSavedEntity551(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTSavedEntityNode node = new ASTSavedEntityNode();
                    node.hiddenTSlash = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("hiddenTSlash");
                    if (node.hiddenTSlash != null) node.hiddenTSlash.setParent(node);
                    node.commonBlockName = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("commonBlockName");
                    if (node.commonBlockName != null) node.commonBlockName.setParent(node);
                    node.hiddenTSlash2 = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("hiddenTSlash2");
                    if (node.hiddenTSlash2 != null) node.hiddenTSlash2.setParent(node);
                    return node;

        }
        public Object handleSavedCommonBlock552(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 3 and 4
                    Map<String, Object> node = new HashMap<String, Object>();
                    node.put("hiddenTSlash", (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0));
                    node.put("commonBlockName", (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("commonBlockName"));
                    node.put("hiddenTSlash2", (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2));
                    ASTListNode<IASTNode> embeddedList = new ASTListNode<IASTNode>();
                    embeddedList.add((IASTNode)(node.get("hiddenTSlash")));
                    embeddedList.add((IASTNode)(node.get("commonBlockName")));
                    embeddedList.add((IASTNode)(node.get("hiddenTSlash2")));
                    node.put("errorRecoveryList", embeddedList);
                    return node;

        }
        public Object handleDimensionStmt553(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTDimensionStmtNode node = new ASTDimensionStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTDimension = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTDimension != null) node.hiddenTDimension.setParent(node);
                    node.hiddenTColon = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTColon != null) node.hiddenTColon.setParent(node);
                    node.hiddenTColon2 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTColon2 != null) node.hiddenTColon2.setParent(node);
                    node.arrayDeclaratorList = (IASTListNode<ASTArrayDeclaratorNode>)valueStack.get(valueStackOffset + 4);
                    if (node.arrayDeclaratorList != null) node.arrayDeclaratorList.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 5);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleDimensionStmt554(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTDimensionStmtNode node = new ASTDimensionStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTDimension = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTDimension != null) node.hiddenTDimension.setParent(node);
                    node.arrayDeclaratorList = (IASTListNode<ASTArrayDeclaratorNode>)valueStack.get(valueStackOffset + 2);
                    if (node.arrayDeclaratorList != null) node.arrayDeclaratorList.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleArrayDeclaratorList555(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 7 with separator
                    ASTSeparatedListNode<ASTArrayDeclaratorNode> list = new ASTSeparatedListNode<ASTArrayDeclaratorNode>();
                    ASTArrayDeclaratorNode elt = new ASTArrayDeclaratorNode();
                    elt.variableName = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("variableName");
                    if (elt.variableName != null) elt.variableName.setParent(elt);
                    elt.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("hiddenTLparen");
                    if (elt.hiddenTLparen != null) elt.hiddenTLparen.setParent(elt);
                    elt.arraySpec = (ASTArraySpecNode)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("arraySpec");
                    if (elt.arraySpec != null) elt.arraySpec.setParent(elt);
                    elt.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("hiddenTRparen");
                    if (elt.hiddenTRparen != null) elt.hiddenTRparen.setParent(elt);
                    list.add(null, elt);
                    if (elt != null) elt.setParent(list);
                    return list;

        }
        public Object handleArrayDeclaratorList556(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 8 with separator
                    ASTSeparatedListNode<ASTArrayDeclaratorNode> list = (ASTSeparatedListNode<ASTArrayDeclaratorNode>)valueStack.get(valueStackOffset);
                    org.eclipse.photran.internal.core.lexer.Token token = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    ASTArrayDeclaratorNode elt = new ASTArrayDeclaratorNode();
                    elt.variableName = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 2)).get("variableName");
                    if (elt.variableName != null) elt.variableName.setParent(elt);
                    elt.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 2)).get("hiddenTLparen");
                    if (elt.hiddenTLparen != null) elt.hiddenTLparen.setParent(elt);
                    elt.arraySpec = (ASTArraySpecNode)((Map<String, Object>)valueStack.get(valueStackOffset + 2)).get("arraySpec");
                    if (elt.arraySpec != null) elt.arraySpec.setParent(elt);
                    elt.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 2)).get("hiddenTRparen");
                    if (elt.hiddenTRparen != null) elt.hiddenTRparen.setParent(elt);
                    list.add(token, elt);
                    token.setParent(list);
                    if (elt != null) elt.setParent(list);
                    return list;

        }
        public Object handleArrayDeclarator557(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 3 and 4
                    Map<String, Object> node = new HashMap<String, Object>();
                    node.put("variableName", (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("variableName"));
                    node.put("hiddenTLparen", (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1));
                    node.put("arraySpec", (ASTArraySpecNode)valueStack.get(valueStackOffset + 2));
                    node.put("hiddenTRparen", (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3));
                    ASTListNode<IASTNode> embeddedList = new ASTListNode<IASTNode>();
                    embeddedList.add((IASTNode)(node.get("variableName")));
                    embeddedList.add((IASTNode)(node.get("hiddenTLparen")));
                    embeddedList.add((IASTNode)(node.get("arraySpec")));
                    embeddedList.add((IASTNode)(node.get("hiddenTRparen")));
                    node.put("errorRecoveryList", embeddedList);
                    return node;

        }
        public Object handleAllocatableStmt558(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTAllocatableStmtNode node = new ASTAllocatableStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTAllocatable = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTAllocatable != null) node.hiddenTAllocatable.setParent(node);
                    node.hiddenTColon = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTColon != null) node.hiddenTColon.setParent(node);
                    node.hiddenTColon2 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTColon2 != null) node.hiddenTColon2.setParent(node);
                    node.arrayAllocationList = (IASTListNode<ASTArrayAllocationNode>)valueStack.get(valueStackOffset + 4);
                    if (node.arrayAllocationList != null) node.arrayAllocationList.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 5);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleAllocatableStmt559(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTAllocatableStmtNode node = new ASTAllocatableStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTAllocatable = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTAllocatable != null) node.hiddenTAllocatable.setParent(node);
                    node.arrayAllocationList = (IASTListNode<ASTArrayAllocationNode>)valueStack.get(valueStackOffset + 2);
                    if (node.arrayAllocationList != null) node.arrayAllocationList.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleArrayAllocationList560(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 7 with separator
                    ASTSeparatedListNode<ASTArrayAllocationNode> list = new ASTSeparatedListNode<ASTArrayAllocationNode>();
                    ASTArrayAllocationNode elt = (ASTArrayAllocationNode)valueStack.get(valueStackOffset + 0);
                    list.add(null, elt);
                    if (elt != null) elt.setParent(list);
                    return list;

        }
        public Object handleArrayAllocationList561(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 8 with separator
                    ASTSeparatedListNode<ASTArrayAllocationNode> list = (ASTSeparatedListNode<ASTArrayAllocationNode>)valueStack.get(valueStackOffset);
                    org.eclipse.photran.internal.core.lexer.Token token = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    ASTArrayAllocationNode elt = (ASTArrayAllocationNode)valueStack.get(valueStackOffset + 2);
                    list.add(token, elt);
                    token.setParent(list);
                    if (elt != null) elt.setParent(list);
                    return list;

        }
        public Object handleArrayAllocation562(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTArrayAllocationNode node = new ASTArrayAllocationNode();
                    node.arrayName = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("arrayName");
                    if (node.arrayName != null) node.arrayName.setParent(node);
                    return node;

        }
        public Object handleArrayAllocation563(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTArrayAllocationNode node = new ASTArrayAllocationNode();
                    node.arrayName = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("arrayName");
                    if (node.arrayName != null) node.arrayName.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.deferredShapeSpecList = (IASTListNode<ASTDeferredShapeSpecListNode>)valueStack.get(valueStackOffset + 2);
                    if (node.deferredShapeSpecList != null) node.deferredShapeSpecList.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    return node;

        }
        public Object handleAsynchronousStmt564(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTAsynchronousStmtNode node = new ASTAsynchronousStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTAsynchronous = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTAsynchronous != null) node.hiddenTAsynchronous.setParent(node);
                    node.hiddenTColon = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTColon != null) node.hiddenTColon.setParent(node);
                    node.hiddenTColon2 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTColon2 != null) node.hiddenTColon2.setParent(node);
                    node.objectList = (IASTListNode<org.eclipse.photran.internal.core.lexer.Token>)valueStack.get(valueStackOffset + 4);
                    if (node.objectList != null) node.objectList.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 5);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleAsynchronousStmt565(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTAsynchronousStmtNode node = new ASTAsynchronousStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTAsynchronous = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTAsynchronous != null) node.hiddenTAsynchronous.setParent(node);
                    node.objectList = (IASTListNode<org.eclipse.photran.internal.core.lexer.Token>)valueStack.get(valueStackOffset + 2);
                    if (node.objectList != null) node.objectList.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleObjectList566(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 7 with separator
                    ASTSeparatedListNode<org.eclipse.photran.internal.core.lexer.Token> list = new ASTSeparatedListNode<org.eclipse.photran.internal.core.lexer.Token>();
                    org.eclipse.photran.internal.core.lexer.Token elt = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    list.add(null, elt);
                    if (elt != null) elt.setParent(list);
                    return list;

        }
        public Object handleObjectList567(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 8 with separator
                    ASTSeparatedListNode<org.eclipse.photran.internal.core.lexer.Token> list = (ASTSeparatedListNode<org.eclipse.photran.internal.core.lexer.Token>)valueStack.get(valueStackOffset);
                    org.eclipse.photran.internal.core.lexer.Token token = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    org.eclipse.photran.internal.core.lexer.Token elt = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    list.add(token, elt);
                    token.setParent(list);
                    if (elt != null) elt.setParent(list);
                    return list;

        }
        public Object handleBindStmt568(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTBindStmtNode node = new ASTBindStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.languageBindingSpec = (ASTLanguageBindingSpecNode)valueStack.get(valueStackOffset + 1);
                    if (node.languageBindingSpec != null) node.languageBindingSpec.setParent(node);
                    node.hiddenTColon = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTColon != null) node.hiddenTColon.setParent(node);
                    node.hiddenTColon2 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTColon2 != null) node.hiddenTColon2.setParent(node);
                    node.bindEntityList = (IASTListNode<IBindEntity>)valueStack.get(valueStackOffset + 4);
                    if (node.bindEntityList != null) node.bindEntityList.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 5);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleBindStmt569(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTBindStmtNode node = new ASTBindStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.languageBindingSpec = (ASTLanguageBindingSpecNode)valueStack.get(valueStackOffset + 1);
                    if (node.languageBindingSpec != null) node.languageBindingSpec.setParent(node);
                    node.bindEntityList = (IASTListNode<IBindEntity>)valueStack.get(valueStackOffset + 2);
                    if (node.bindEntityList != null) node.bindEntityList.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleBindEntity570(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 5
                    ASTVariableNameNode result = new ASTVariableNameNode();
                    result.variableName = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("variableName");
                    if (result.variableName != null) result.variableName.setParent(result);
                    return result;

        }
        public Object handleBindEntity571(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTCommonBlockBinding node = new ASTCommonBlockBinding();
                    node.hiddenTSlash = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.hiddenTSlash != null) node.hiddenTSlash.setParent(node);
                    node.commonBlockName = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.commonBlockName != null) node.commonBlockName.setParent(node);
                    node.hiddenTSlash2 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTSlash2 != null) node.hiddenTSlash2.setParent(node);
                    return node;

        }
        public Object handleBindEntityList572(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 7 with separator
                    ASTSeparatedListNode<IBindEntity> list = new ASTSeparatedListNode<IBindEntity>();
                    IBindEntity elt = (IBindEntity)valueStack.get(valueStackOffset + 0);
                    list.add(null, elt);
                    if (elt != null) elt.setParent(list);
                    return list;

        }
        public Object handleBindEntityList573(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 8 with separator
                    ASTSeparatedListNode<IBindEntity> list = (ASTSeparatedListNode<IBindEntity>)valueStack.get(valueStackOffset);
                    org.eclipse.photran.internal.core.lexer.Token token = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    IBindEntity elt = (IBindEntity)valueStack.get(valueStackOffset + 2);
                    list.add(token, elt);
                    token.setParent(list);
                    if (elt != null) elt.setParent(list);
                    return list;

        }
        public Object handlePointerStmt574(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTPointerStmtNode node = new ASTPointerStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTPointer = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTPointer != null) node.hiddenTPointer.setParent(node);
                    node.hiddenTColon = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTColon != null) node.hiddenTColon.setParent(node);
                    node.hiddenTColon2 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTColon2 != null) node.hiddenTColon2.setParent(node);
                    node.pointerStmtObjectList = (IASTListNode<ASTPointerStmtObjectNode>)valueStack.get(valueStackOffset + 4);
                    if (node.pointerStmtObjectList != null) node.pointerStmtObjectList.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 5);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handlePointerStmt575(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTPointerStmtNode node = new ASTPointerStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTPointer = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTPointer != null) node.hiddenTPointer.setParent(node);
                    node.pointerStmtObjectList = (IASTListNode<ASTPointerStmtObjectNode>)valueStack.get(valueStackOffset + 2);
                    if (node.pointerStmtObjectList != null) node.pointerStmtObjectList.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handlePointerStmtObjectList576(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 7 with separator
                    ASTSeparatedListNode<ASTPointerStmtObjectNode> list = new ASTSeparatedListNode<ASTPointerStmtObjectNode>();
                    ASTPointerStmtObjectNode elt = (ASTPointerStmtObjectNode)valueStack.get(valueStackOffset + 0);
                    list.add(null, elt);
                    if (elt != null) elt.setParent(list);
                    return list;

        }
        public Object handlePointerStmtObjectList577(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 8 with separator
                    ASTSeparatedListNode<ASTPointerStmtObjectNode> list = (ASTSeparatedListNode<ASTPointerStmtObjectNode>)valueStack.get(valueStackOffset);
                    org.eclipse.photran.internal.core.lexer.Token token = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    ASTPointerStmtObjectNode elt = (ASTPointerStmtObjectNode)valueStack.get(valueStackOffset + 2);
                    list.add(token, elt);
                    token.setParent(list);
                    if (elt != null) elt.setParent(list);
                    return list;

        }
        public Object handlePointerStmtObject578(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTPointerStmtObjectNode node = new ASTPointerStmtObjectNode();
                    node.pointerName = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("pointerName");
                    if (node.pointerName != null) node.pointerName.setParent(node);
                    return node;

        }
        public Object handlePointerStmtObject579(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTPointerStmtObjectNode node = new ASTPointerStmtObjectNode();
                    node.pointerName = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("pointerName");
                    if (node.pointerName != null) node.pointerName.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.deferredShapeSpecList = (IASTListNode<ASTDeferredShapeSpecListNode>)valueStack.get(valueStackOffset + 2);
                    if (node.deferredShapeSpecList != null) node.deferredShapeSpecList.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    return node;

        }
        public Object handlePointerName580(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 3 and 4
                    Map<String, Object> node = new HashMap<String, Object>();
                    node.put("pointerName", (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0));
                    ASTListNode<IASTNode> embeddedList = new ASTListNode<IASTNode>();
                    embeddedList.add((IASTNode)(node.get("pointerName")));
                    node.put("errorRecoveryList", embeddedList);
                    return node;

        }
        public Object handleCrayPointerStmt581(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTCrayPointerStmtNode node = new ASTCrayPointerStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTPointer = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTPointer != null) node.hiddenTPointer.setParent(node);
                    node.crayPointerStmtObjectList = (IASTListNode<ASTCrayPointerStmtObjectNode>)valueStack.get(valueStackOffset + 2);
                    if (node.crayPointerStmtObjectList != null) node.crayPointerStmtObjectList.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleCrayPointerStmtObjectList582(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 7 with separator
                    ASTSeparatedListNode<ASTCrayPointerStmtObjectNode> list = new ASTSeparatedListNode<ASTCrayPointerStmtObjectNode>();
                    ASTCrayPointerStmtObjectNode elt = (ASTCrayPointerStmtObjectNode)valueStack.get(valueStackOffset + 0);
                    list.add(null, elt);
                    if (elt != null) elt.setParent(list);
                    return list;

        }
        public Object handleCrayPointerStmtObjectList583(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 8 with separator
                    ASTSeparatedListNode<ASTCrayPointerStmtObjectNode> list = (ASTSeparatedListNode<ASTCrayPointerStmtObjectNode>)valueStack.get(valueStackOffset);
                    org.eclipse.photran.internal.core.lexer.Token token = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    ASTCrayPointerStmtObjectNode elt = (ASTCrayPointerStmtObjectNode)valueStack.get(valueStackOffset + 2);
                    list.add(token, elt);
                    token.setParent(list);
                    if (elt != null) elt.setParent(list);
                    return list;

        }
        public Object handleCrayPointerStmtObject584(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTCrayPointerStmtObjectNode node = new ASTCrayPointerStmtObjectNode();
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.pointerName = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("pointerName");
                    if (node.pointerName != null) node.pointerName.setParent(node);
                    node.hiddenTComma = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTComma != null) node.hiddenTComma.setParent(node);
                    node.targetObject = (ASTTargetObjectNode)valueStack.get(valueStackOffset + 3);
                    if (node.targetObject != null) node.targetObject.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    return node;

        }
        public Object handleCodimensionStmt585(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTCodimensionStmtNode node = new ASTCodimensionStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTCodimension = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTCodimension != null) node.hiddenTCodimension.setParent(node);
                    node.hiddenTColon = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTColon != null) node.hiddenTColon.setParent(node);
                    node.hiddenTColon2 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTColon2 != null) node.hiddenTColon2.setParent(node);
                    node.codimensionDeclList = (IASTListNode<ASTCodimensionDeclNode>)valueStack.get(valueStackOffset + 4);
                    if (node.codimensionDeclList != null) node.codimensionDeclList.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 5);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleCodimensionStmt586(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTCodimensionStmtNode node = new ASTCodimensionStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTCodimension = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTCodimension != null) node.hiddenTCodimension.setParent(node);
                    node.codimensionDeclList = (IASTListNode<ASTCodimensionDeclNode>)valueStack.get(valueStackOffset + 2);
                    if (node.codimensionDeclList != null) node.codimensionDeclList.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleCodimensionDeclList587(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 7 with separator
                    ASTSeparatedListNode<ASTCodimensionDeclNode> list = new ASTSeparatedListNode<ASTCodimensionDeclNode>();
                    ASTCodimensionDeclNode elt = (ASTCodimensionDeclNode)valueStack.get(valueStackOffset + 0);
                    list.add(null, elt);
                    if (elt != null) elt.setParent(list);
                    return list;

        }
        public Object handleCodimensionDeclList588(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 8 with separator
                    ASTSeparatedListNode<ASTCodimensionDeclNode> list = (ASTSeparatedListNode<ASTCodimensionDeclNode>)valueStack.get(valueStackOffset);
                    org.eclipse.photran.internal.core.lexer.Token token = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    ASTCodimensionDeclNode elt = (ASTCodimensionDeclNode)valueStack.get(valueStackOffset + 2);
                    list.add(token, elt);
                    token.setParent(list);
                    if (elt != null) elt.setParent(list);
                    return list;

        }
        public Object handleCodimensionDecl589(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTCodimensionDeclNode node = new ASTCodimensionDeclNode();
                    ASTNameNode tmp0 = new ASTNameNode();
                    tmp0.name = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("name");
                    if (tmp0.name != null) tmp0.name.setParent(tmp0);
                    node.name = tmp0;
                    if (tmp0 != null) tmp0.setParent(node);
                    node.hiddenTLbracket = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTLbracket != null) node.hiddenTLbracket.setParent(node);
                    node.coarraySpec = (ASTCoarraySpecNode)valueStack.get(valueStackOffset + 2);
                    if (node.coarraySpec != null) node.coarraySpec.setParent(node);
                    node.hiddenTRbracket = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTRbracket != null) node.hiddenTRbracket.setParent(node);
                    return node;

        }
        public Object handleContiguousStmt590(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTContiguousStmtNode node = new ASTContiguousStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTContiguous = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTContiguous != null) node.hiddenTContiguous.setParent(node);
                    node.hiddenTColon = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTColon != null) node.hiddenTColon.setParent(node);
                    node.hiddenTColon2 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTColon2 != null) node.hiddenTColon2.setParent(node);
                    node.objectNameList = (IASTListNode<ASTObjectNameListNode>)valueStack.get(valueStackOffset + 4);
                    if (node.objectNameList != null) node.objectNameList.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 5);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleContiguousStmt591(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTContiguousStmtNode node = new ASTContiguousStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTContiguous = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTContiguous != null) node.hiddenTContiguous.setParent(node);
                    node.objectNameList = (IASTListNode<ASTObjectNameListNode>)valueStack.get(valueStackOffset + 2);
                    if (node.objectNameList != null) node.objectNameList.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleObjectNameList592(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 10
                    ASTObjectNameListNode node = new ASTObjectNameListNode();
                    node.name = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("name");
                    if (node.name != null) node.name.setParent(node);
                    ASTListNode<ASTObjectNameListNode> list = new ASTListNode<ASTObjectNameListNode>();
                    list.add(node);
                    node.setParent(list);
                    return list;

        }
        public Object handleObjectNameList593(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 11
                    ASTObjectNameListNode node = new ASTObjectNameListNode();
                    node.hiddenTComma = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTComma != null) node.hiddenTComma.setParent(node);
                    node.name = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 2)).get("name");
                    if (node.name != null) node.name.setParent(node);
                    ASTListNode<ASTObjectNameListNode> list = (ASTListNode<ASTObjectNameListNode>)valueStack.get(valueStackOffset);
                    list.add(node);
                    node.setParent(list);
                    return list;

        }
        public Object handleProtectedStmt594(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTProtectedStmtNode node = new ASTProtectedStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTProtected = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTProtected != null) node.hiddenTProtected.setParent(node);
                    node.hiddenTColon = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTColon != null) node.hiddenTColon.setParent(node);
                    node.hiddenTColon2 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTColon2 != null) node.hiddenTColon2.setParent(node);
                    node.entityNameList = (IASTListNode<org.eclipse.photran.internal.core.lexer.Token>)valueStack.get(valueStackOffset + 4);
                    if (node.entityNameList != null) node.entityNameList.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 5);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleProtectedStmt595(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTProtectedStmtNode node = new ASTProtectedStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTProtected = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTProtected != null) node.hiddenTProtected.setParent(node);
                    node.entityNameList = (IASTListNode<org.eclipse.photran.internal.core.lexer.Token>)valueStack.get(valueStackOffset + 2);
                    if (node.entityNameList != null) node.entityNameList.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleTargetStmt596(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTTargetStmtNode node = new ASTTargetStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTTarget = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTTarget != null) node.hiddenTTarget.setParent(node);
                    node.hiddenTColon = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTColon != null) node.hiddenTColon.setParent(node);
                    node.hiddenTColon2 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTColon2 != null) node.hiddenTColon2.setParent(node);
                    node.targetObjectList = (IASTListNode<ASTTargetObjectNode>)valueStack.get(valueStackOffset + 4);
                    if (node.targetObjectList != null) node.targetObjectList.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 5);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleTargetStmt597(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTTargetStmtNode node = new ASTTargetStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTTarget = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTTarget != null) node.hiddenTTarget.setParent(node);
                    node.targetObjectList = (IASTListNode<ASTTargetObjectNode>)valueStack.get(valueStackOffset + 2);
                    if (node.targetObjectList != null) node.targetObjectList.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleTargetObjectList598(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 7 with separator
                    ASTSeparatedListNode<ASTTargetObjectNode> list = new ASTSeparatedListNode<ASTTargetObjectNode>();
                    ASTTargetObjectNode elt = (ASTTargetObjectNode)valueStack.get(valueStackOffset + 0);
                    list.add(null, elt);
                    if (elt != null) elt.setParent(list);
                    return list;

        }
        public Object handleTargetObjectList599(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 8 with separator
                    ASTSeparatedListNode<ASTTargetObjectNode> list = (ASTSeparatedListNode<ASTTargetObjectNode>)valueStack.get(valueStackOffset);
                    org.eclipse.photran.internal.core.lexer.Token token = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    ASTTargetObjectNode elt = (ASTTargetObjectNode)valueStack.get(valueStackOffset + 2);
                    list.add(token, elt);
                    token.setParent(list);
                    if (elt != null) elt.setParent(list);
                    return list;

        }
        public Object handleTargetObject600(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTTargetObjectNode node = new ASTTargetObjectNode();
                    node.targetName = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("targetName");
                    if (node.targetName != null) node.targetName.setParent(node);
                    return node;

        }
        public Object handleTargetObject601(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTTargetObjectNode node = new ASTTargetObjectNode();
                    node.targetName = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("targetName");
                    if (node.targetName != null) node.targetName.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.arraySpec = (ASTArraySpecNode)valueStack.get(valueStackOffset + 2);
                    if (node.arraySpec != null) node.arraySpec.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    return node;

        }
        public Object handleTargetObject602(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTTargetObjectNode node = new ASTTargetObjectNode();
                    node.targetName = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("targetName");
                    if (node.targetName != null) node.targetName.setParent(node);
                    node.hiddenTLbracket = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTLbracket != null) node.hiddenTLbracket.setParent(node);
                    node.coarraySpec = (ASTCoarraySpecNode)valueStack.get(valueStackOffset + 2);
                    if (node.coarraySpec != null) node.coarraySpec.setParent(node);
                    node.hiddenTRbracket = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTRbracket != null) node.hiddenTRbracket.setParent(node);
                    return node;

        }
        public Object handleTargetObject603(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTTargetObjectNode node = new ASTTargetObjectNode();
                    node.targetName = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("targetName");
                    if (node.targetName != null) node.targetName.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.arraySpec = (ASTArraySpecNode)valueStack.get(valueStackOffset + 2);
                    if (node.arraySpec != null) node.arraySpec.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    node.hiddenTLbracket = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenTLbracket != null) node.hiddenTLbracket.setParent(node);
                    node.coarraySpec = (ASTCoarraySpecNode)valueStack.get(valueStackOffset + 5);
                    if (node.coarraySpec != null) node.coarraySpec.setParent(node);
                    node.hiddenTRbracket = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 6);
                    if (node.hiddenTRbracket != null) node.hiddenTRbracket.setParent(node);
                    return node;

        }
        public Object handleTargetName604(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 3 and 4
                    Map<String, Object> node = new HashMap<String, Object>();
                    node.put("targetName", (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0));
                    ASTListNode<IASTNode> embeddedList = new ASTListNode<IASTNode>();
                    embeddedList.add((IASTNode)(node.get("targetName")));
                    node.put("errorRecoveryList", embeddedList);
                    return node;

        }
        public Object handleValueStmt605(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTValueStmtNode node = new ASTValueStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTValue = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTValue != null) node.hiddenTValue.setParent(node);
                    node.hiddenTColon = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTColon != null) node.hiddenTColon.setParent(node);
                    node.hiddenTColon2 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTColon2 != null) node.hiddenTColon2.setParent(node);
                    node.entityNameList = (IASTListNode<org.eclipse.photran.internal.core.lexer.Token>)valueStack.get(valueStackOffset + 4);
                    if (node.entityNameList != null) node.entityNameList.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 5);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleValueStmt606(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTValueStmtNode node = new ASTValueStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTValue = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTValue != null) node.hiddenTValue.setParent(node);
                    node.entityNameList = (IASTListNode<org.eclipse.photran.internal.core.lexer.Token>)valueStack.get(valueStackOffset + 2);
                    if (node.entityNameList != null) node.entityNameList.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleVolatileStmt607(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTVolatileStmtNode node = new ASTVolatileStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTVolatile = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTVolatile != null) node.hiddenTVolatile.setParent(node);
                    node.hiddenTColon = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTColon != null) node.hiddenTColon.setParent(node);
                    node.hiddenTColon2 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTColon2 != null) node.hiddenTColon2.setParent(node);
                    node.entityNameList = (IASTListNode<org.eclipse.photran.internal.core.lexer.Token>)valueStack.get(valueStackOffset + 4);
                    if (node.entityNameList != null) node.entityNameList.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 5);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleVolatileStmt608(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTVolatileStmtNode node = new ASTVolatileStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTVolatile = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTVolatile != null) node.hiddenTVolatile.setParent(node);
                    node.entityNameList = (IASTListNode<org.eclipse.photran.internal.core.lexer.Token>)valueStack.get(valueStackOffset + 2);
                    if (node.entityNameList != null) node.entityNameList.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleParameterStmt609(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTParameterStmtNode node = new ASTParameterStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTParameter = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTParameter != null) node.hiddenTParameter.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.namedConstantDefList = (IASTListNode<ASTNamedConstantDefNode>)valueStack.get(valueStackOffset + 3);
                    if (node.namedConstantDefList != null) node.namedConstantDefList.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 5);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleNamedConstantDefList610(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 7 with separator
                    ASTSeparatedListNode<ASTNamedConstantDefNode> list = new ASTSeparatedListNode<ASTNamedConstantDefNode>();
                    ASTNamedConstantDefNode elt = (ASTNamedConstantDefNode)valueStack.get(valueStackOffset + 0);
                    list.add(null, elt);
                    if (elt != null) elt.setParent(list);
                    return list;

        }
        public Object handleNamedConstantDefList611(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 8 with separator
                    ASTSeparatedListNode<ASTNamedConstantDefNode> list = (ASTSeparatedListNode<ASTNamedConstantDefNode>)valueStack.get(valueStackOffset);
                    org.eclipse.photran.internal.core.lexer.Token token = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    ASTNamedConstantDefNode elt = (ASTNamedConstantDefNode)valueStack.get(valueStackOffset + 2);
                    list.add(token, elt);
                    token.setParent(list);
                    if (elt != null) elt.setParent(list);
                    return list;

        }
        public Object handleNamedConstantDef612(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTNamedConstantDefNode node = new ASTNamedConstantDefNode();
                    node.namedConstant = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("namedConstant");
                    if (node.namedConstant != null) node.namedConstant.setParent(node);
                    node.hiddenTEquals = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTEquals != null) node.hiddenTEquals.setParent(node);
                    node.initializationExpr = (IExpr)valueStack.get(valueStackOffset + 2);
                    if (node.initializationExpr != null) node.initializationExpr.setParent(node);
                    return node;

        }
        public Object handleDataStmt613(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTDataStmtNode node = new ASTDataStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTData = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTData != null) node.hiddenTData.setParent(node);
                    node.datalist = (IASTListNode<ASTDatalistNode>)valueStack.get(valueStackOffset + 2);
                    if (node.datalist != null) node.datalist.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleDatalist614(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 10
                    ASTDatalistNode node = new ASTDatalistNode();
                    node.dataStmtSet = (ASTDataStmtSetNode)valueStack.get(valueStackOffset + 0);
                    if (node.dataStmtSet != null) node.dataStmtSet.setParent(node);
                    ASTListNode<ASTDatalistNode> list = new ASTListNode<ASTDatalistNode>();
                    list.add(node);
                    node.setParent(list);
                    return list;

        }
        public Object handleDatalist615(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 11
                    ASTDatalistNode node = new ASTDatalistNode();
                    node.dataStmtSet = (ASTDataStmtSetNode)valueStack.get(valueStackOffset + 1);
                    if (node.dataStmtSet != null) node.dataStmtSet.setParent(node);
                    ASTListNode<ASTDatalistNode> list = (ASTListNode<ASTDatalistNode>)valueStack.get(valueStackOffset);
                    list.add(node);
                    node.setParent(list);
                    return list;

        }
        public Object handleDatalist616(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 11
                    ASTDatalistNode node = new ASTDatalistNode();
                    node.hiddenTComma = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTComma != null) node.hiddenTComma.setParent(node);
                    node.dataStmtSet = (ASTDataStmtSetNode)valueStack.get(valueStackOffset + 2);
                    if (node.dataStmtSet != null) node.dataStmtSet.setParent(node);
                    ASTListNode<ASTDatalistNode> list = (ASTListNode<ASTDatalistNode>)valueStack.get(valueStackOffset);
                    list.add(node);
                    node.setParent(list);
                    return list;

        }
        public Object handleDataStmtSet617(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTDataStmtSetNode node = new ASTDataStmtSetNode();
                    node.dataStmtObjectList = (IASTListNode<IDataStmtObject>)valueStack.get(valueStackOffset + 0);
                    if (node.dataStmtObjectList != null) node.dataStmtObjectList.setParent(node);
                    node.hiddenTSlash = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTSlash != null) node.hiddenTSlash.setParent(node);
                    node.dataStmtValueList = (IASTListNode<ASTDataStmtValueNode>)valueStack.get(valueStackOffset + 2);
                    if (node.dataStmtValueList != null) node.dataStmtValueList.setParent(node);
                    node.hiddenTSlash2 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTSlash2 != null) node.hiddenTSlash2.setParent(node);
                    return node;

        }
        public Object handleDataStmtObjectList618(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 7 with separator
                    ASTSeparatedListNode<IDataStmtObject> list = new ASTSeparatedListNode<IDataStmtObject>();
                    IDataStmtObject elt = (IDataStmtObject)valueStack.get(valueStackOffset + 0);
                    list.add(null, elt);
                    if (elt != null) elt.setParent(list);
                    return list;

        }
        public Object handleDataStmtObjectList619(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 8 with separator
                    ASTSeparatedListNode<IDataStmtObject> list = (ASTSeparatedListNode<IDataStmtObject>)valueStack.get(valueStackOffset);
                    org.eclipse.photran.internal.core.lexer.Token token = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    IDataStmtObject elt = (IDataStmtObject)valueStack.get(valueStackOffset + 2);
                    list.add(token, elt);
                    token.setParent(list);
                    if (elt != null) elt.setParent(list);
                    return list;

        }
        public Object handleDataStmtObject620(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 5
                    ASTVariableNode result = (ASTVariableNode)valueStack.get(valueStackOffset + 0);
                    return result;

        }
        public Object handleDataStmtObject621(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 5
                    ASTDataImpliedDoNode result = (ASTDataImpliedDoNode)valueStack.get(valueStackOffset + 0);
                    return result;

        }
        public Object handleDataImpliedDo622(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTDataImpliedDoNode node = new ASTDataImpliedDoNode();
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.dataIDoObjectList = (IASTListNode<IDataIDoObject>)valueStack.get(valueStackOffset + 1);
                    if (node.dataIDoObjectList != null) node.dataIDoObjectList.setParent(node);
                    node.hiddenTComma = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTComma != null) node.hiddenTComma.setParent(node);
                    node.impliedDoVariable = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 3)).get("impliedDoVariable");
                    if (node.impliedDoVariable != null) node.impliedDoVariable.setParent(node);
                    node.hiddenTEquals = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenTEquals != null) node.hiddenTEquals.setParent(node);
                    node.lb = (IExpr)valueStack.get(valueStackOffset + 5);
                    if (node.lb != null) node.lb.setParent(node);
                    node.hiddenTComma2 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 6);
                    if (node.hiddenTComma2 != null) node.hiddenTComma2.setParent(node);
                    node.ub = (IExpr)valueStack.get(valueStackOffset + 7);
                    if (node.ub != null) node.ub.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 8);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    return node;

        }
        public Object handleDataImpliedDo623(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTDataImpliedDoNode node = new ASTDataImpliedDoNode();
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.dataIDoObjectList = (IASTListNode<IDataIDoObject>)valueStack.get(valueStackOffset + 1);
                    if (node.dataIDoObjectList != null) node.dataIDoObjectList.setParent(node);
                    node.hiddenTComma = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTComma != null) node.hiddenTComma.setParent(node);
                    node.impliedDoVariable = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 3)).get("impliedDoVariable");
                    if (node.impliedDoVariable != null) node.impliedDoVariable.setParent(node);
                    node.hiddenTEquals = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenTEquals != null) node.hiddenTEquals.setParent(node);
                    node.lb = (IExpr)valueStack.get(valueStackOffset + 5);
                    if (node.lb != null) node.lb.setParent(node);
                    node.hiddenTComma2 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 6);
                    if (node.hiddenTComma2 != null) node.hiddenTComma2.setParent(node);
                    node.ub = (IExpr)valueStack.get(valueStackOffset + 7);
                    if (node.ub != null) node.ub.setParent(node);
                    node.hiddenTComma3 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 8);
                    if (node.hiddenTComma3 != null) node.hiddenTComma3.setParent(node);
                    node.step = (IExpr)valueStack.get(valueStackOffset + 9);
                    if (node.step != null) node.step.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 10);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    return node;

        }
        public Object handleDataIDoObjectList624(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 7 with separator
                    ASTSeparatedListNode<IDataIDoObject> list = new ASTSeparatedListNode<IDataIDoObject>();
                    IDataIDoObject elt = (IDataIDoObject)valueStack.get(valueStackOffset + 0);
                    list.add(null, elt);
                    if (elt != null) elt.setParent(list);
                    return list;

        }
        public Object handleDataIDoObjectList625(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 8 with separator
                    ASTSeparatedListNode<IDataIDoObject> list = (ASTSeparatedListNode<IDataIDoObject>)valueStack.get(valueStackOffset);
                    org.eclipse.photran.internal.core.lexer.Token token = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    IDataIDoObject elt = (IDataIDoObject)valueStack.get(valueStackOffset + 2);
                    list.add(token, elt);
                    token.setParent(list);
                    if (elt != null) elt.setParent(list);
                    return list;

        }
        public Object handleDataIDoObject626(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 5
                    ASTArrayElementNode result = new ASTArrayElementNode();
                    result.structureComponent = (IASTListNode<ASTStructureComponentNode>)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("structureComponent");
                    if (result.structureComponent != null) result.structureComponent.setParent(result);
                    result.variableName = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("variableName");
                    if (result.variableName != null) result.variableName.setParent(result);
                    result.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("hiddenTLparen");
                    if (result.hiddenTLparen != null) result.hiddenTLparen.setParent(result);
                    result.sectionSubscriptList = (IASTListNode<ASTSectionSubscriptNode>)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("sectionSubscriptList");
                    if (result.sectionSubscriptList != null) result.sectionSubscriptList.setParent(result);
                    result.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("hiddenTRparen");
                    if (result.hiddenTRparen != null) result.hiddenTRparen.setParent(result);
                    result.imageSelector = (ASTImageSelectorNode)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("imageSelector");
                    if (result.imageSelector != null) result.imageSelector.setParent(result);
                    return result;

        }
        public Object handleDataIDoObject627(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 5
                    ASTDataImpliedDoNode result = (ASTDataImpliedDoNode)valueStack.get(valueStackOffset + 0);
                    return result;

        }
        public Object handleDataIDoObject628(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 5
                    IASTListNode<ASTStructureComponentNode> result = (IASTListNode<ASTStructureComponentNode>)valueStack.get(valueStackOffset + 0);
                    return result;

        }
        public Object handleDataStmtValueList629(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 7 with separator
                    ASTSeparatedListNode<ASTDataStmtValueNode> list = new ASTSeparatedListNode<ASTDataStmtValueNode>();
                    ASTDataStmtValueNode elt = (ASTDataStmtValueNode)valueStack.get(valueStackOffset + 0);
                    list.add(null, elt);
                    if (elt != null) elt.setParent(list);
                    return list;

        }
        public Object handleDataStmtValueList630(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 8 with separator
                    ASTSeparatedListNode<ASTDataStmtValueNode> list = (ASTSeparatedListNode<ASTDataStmtValueNode>)valueStack.get(valueStackOffset);
                    org.eclipse.photran.internal.core.lexer.Token token = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    ASTDataStmtValueNode elt = (ASTDataStmtValueNode)valueStack.get(valueStackOffset + 2);
                    list.add(token, elt);
                    token.setParent(list);
                    if (elt != null) elt.setParent(list);
                    return list;

        }
        public Object handleDataStmtValue631(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTDataStmtValueNode node = new ASTDataStmtValueNode();
                    node.constant = (ASTConstantNode)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("constant");
                    if (node.constant != null) node.constant.setParent(node);
                    node.isNull = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("isNull");
                    if (node.isNull != null) node.isNull.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("hiddenTLparen");
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("hiddenTRparen");
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    return node;

        }
        public Object handleDataStmtValue632(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTDataStmtValueNode node = new ASTDataStmtValueNode();
                    node.hasConstIntKind = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.hasConstIntKind != null) node.hasConstIntKind.setParent(node);
                    node.hiddenTAsterisk = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTAsterisk != null) node.hiddenTAsterisk.setParent(node);
                    node.constant = (ASTConstantNode)((Map<String, Object>)valueStack.get(valueStackOffset + 2)).get("constant");
                    if (node.constant != null) node.constant.setParent(node);
                    node.isNull = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 2)).get("isNull");
                    if (node.isNull != null) node.isNull.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 2)).get("hiddenTLparen");
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 2)).get("hiddenTRparen");
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    return node;

        }
        public Object handleDataStmtValue633(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTDataStmtValueNode node = new ASTDataStmtValueNode();
                    node.namedConstKind = (ASTNamedConstantUseNode)valueStack.get(valueStackOffset + 0);
                    if (node.namedConstKind != null) node.namedConstKind.setParent(node);
                    node.hiddenTAsterisk = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTAsterisk != null) node.hiddenTAsterisk.setParent(node);
                    node.constant = (ASTConstantNode)((Map<String, Object>)valueStack.get(valueStackOffset + 2)).get("constant");
                    if (node.constant != null) node.constant.setParent(node);
                    node.isNull = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 2)).get("isNull");
                    if (node.isNull != null) node.isNull.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 2)).get("hiddenTLparen");
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 2)).get("hiddenTRparen");
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    return node;

        }
        public Object handleDataStmtConstant634(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 3 and 4
                    Map<String, Object> node = new HashMap<String, Object>();
                    node.put("constant", (ASTConstantNode)valueStack.get(valueStackOffset + 0));
                    ASTListNode<IASTNode> embeddedList = new ASTListNode<IASTNode>();
                    embeddedList.add((IASTNode)(node.get("constant")));
                    embeddedList.add((IASTNode)(node.get("isNull")));
                    embeddedList.add((IASTNode)(node.get("hiddenTLparen")));
                    embeddedList.add((IASTNode)(node.get("hiddenTRparen")));
                    node.put("errorRecoveryList", embeddedList);
                    return node;

        }
        public Object handleDataStmtConstant635(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 3 and 4
                    Map<String, Object> node = new HashMap<String, Object>();
                    node.put("isNull", (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0));
                    node.put("hiddenTLparen", (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1));
                    node.put("hiddenTRparen", (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2));
                    ASTListNode<IASTNode> embeddedList = new ASTListNode<IASTNode>();
                    embeddedList.add((IASTNode)(node.get("constant")));
                    embeddedList.add((IASTNode)(node.get("isNull")));
                    embeddedList.add((IASTNode)(node.get("hiddenTLparen")));
                    embeddedList.add((IASTNode)(node.get("hiddenTRparen")));
                    node.put("errorRecoveryList", embeddedList);
                    return node;

        }
        public Object handleImplicitStmt636(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTImplicitStmtNode node = new ASTImplicitStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.implicitToken = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.implicitToken != null) node.implicitToken.setParent(node);
                    node.implicitSpecList = (IASTListNode<ASTImplicitSpecNode>)valueStack.get(valueStackOffset + 2);
                    if (node.implicitSpecList != null) node.implicitSpecList.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleImplicitStmt637(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTImplicitStmtNode node = new ASTImplicitStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.implicitToken = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.implicitToken != null) node.implicitToken.setParent(node);
                    node.isImplicitNone = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.isImplicitNone != null) node.isImplicitNone.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleImplicitSpecList638(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 7 with separator
                    ASTSeparatedListNode<ASTImplicitSpecNode> list = new ASTSeparatedListNode<ASTImplicitSpecNode>();
                    ASTImplicitSpecNode elt = (ASTImplicitSpecNode)valueStack.get(valueStackOffset + 0);
                    list.add(null, elt);
                    if (elt != null) elt.setParent(list);
                    return list;

        }
        public Object handleImplicitSpecList639(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 8 with separator
                    ASTSeparatedListNode<ASTImplicitSpecNode> list = (ASTSeparatedListNode<ASTImplicitSpecNode>)valueStack.get(valueStackOffset);
                    org.eclipse.photran.internal.core.lexer.Token token = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    ASTImplicitSpecNode elt = (ASTImplicitSpecNode)valueStack.get(valueStackOffset + 2);
                    list.add(token, elt);
                    token.setParent(list);
                    if (elt != null) elt.setParent(list);
                    return list;

        }
        public Object handleImplicitSpec640(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTImplicitSpecNode node = new ASTImplicitSpecNode();
                    node.typeSpec = (ASTTypeSpecNode)valueStack.get(valueStackOffset + 0);
                    if (node.typeSpec != null) node.typeSpec.setParent(node);
                    node.charRanges = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.charRanges != null) node.charRanges.setParent(node);
                    return node;

        }
        public Object handleNamelistStmt641(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTNamelistStmtNode node = new ASTNamelistStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.tNamelist = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.tNamelist != null) node.tNamelist.setParent(node);
                    node.namelistGroups = (IASTListNode<ASTNamelistGroupsNode>)valueStack.get(valueStackOffset + 2);
                    if (node.namelistGroups != null) node.namelistGroups.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleNamelistGroups642(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 10
                    ASTNamelistGroupsNode node = new ASTNamelistGroupsNode();
                    node.hiddenTSlash = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.hiddenTSlash != null) node.hiddenTSlash.setParent(node);
                    node.namelistGroupName = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("namelistGroupName");
                    if (node.namelistGroupName != null) node.namelistGroupName.setParent(node);
                    node.hiddenTSlash2 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTSlash2 != null) node.hiddenTSlash2.setParent(node);
                    node.variableName = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 3)).get("variableName");
                    if (node.variableName != null) node.variableName.setParent(node);
                    ASTListNode<ASTNamelistGroupsNode> list = new ASTListNode<ASTNamelistGroupsNode>();
                    list.add(node);
                    node.setParent(list);
                    return list;

        }
        public Object handleNamelistGroups643(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 11
                    ASTNamelistGroupsNode node = new ASTNamelistGroupsNode();
                    node.hiddenTSlash = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTSlash != null) node.hiddenTSlash.setParent(node);
                    node.namelistGroupName = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 2)).get("namelistGroupName");
                    if (node.namelistGroupName != null) node.namelistGroupName.setParent(node);
                    node.hiddenTSlash2 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTSlash2 != null) node.hiddenTSlash2.setParent(node);
                    node.variableName = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 4)).get("variableName");
                    if (node.variableName != null) node.variableName.setParent(node);
                    ASTListNode<ASTNamelistGroupsNode> list = (ASTListNode<ASTNamelistGroupsNode>)valueStack.get(valueStackOffset);
                    list.add(node);
                    node.setParent(list);
                    return list;

        }
        public Object handleNamelistGroups644(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 11
                    ASTNamelistGroupsNode node = new ASTNamelistGroupsNode();
                    node.hiddenTComma = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTComma != null) node.hiddenTComma.setParent(node);
                    node.hiddenTSlash = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTSlash != null) node.hiddenTSlash.setParent(node);
                    node.namelistGroupName = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 3)).get("namelistGroupName");
                    if (node.namelistGroupName != null) node.namelistGroupName.setParent(node);
                    node.hiddenTSlash2 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenTSlash2 != null) node.hiddenTSlash2.setParent(node);
                    node.variableName = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 5)).get("variableName");
                    if (node.variableName != null) node.variableName.setParent(node);
                    ASTListNode<ASTNamelistGroupsNode> list = (ASTListNode<ASTNamelistGroupsNode>)valueStack.get(valueStackOffset);
                    list.add(node);
                    node.setParent(list);
                    return list;

        }
        public Object handleNamelistGroups645(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 11
                    ASTNamelistGroupsNode node = new ASTNamelistGroupsNode();
                    node.hiddenTComma = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTComma != null) node.hiddenTComma.setParent(node);
                    node.variableName = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 2)).get("variableName");
                    if (node.variableName != null) node.variableName.setParent(node);
                    ASTListNode<ASTNamelistGroupsNode> list = (ASTListNode<ASTNamelistGroupsNode>)valueStack.get(valueStackOffset);
                    list.add(node);
                    node.setParent(list);
                    return list;

        }
        public Object handleNamelistGroupObject646(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 3 and 4
                    Map<String, Object> node = new HashMap<String, Object>();
                    node.put("variableName", (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("variableName"));
                    ASTListNode<IASTNode> embeddedList = new ASTListNode<IASTNode>();
                    embeddedList.add((IASTNode)(node.get("variableName")));
                    node.put("errorRecoveryList", embeddedList);
                    return node;

        }
        public Object handleEquivalenceStmt647(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTEquivalenceStmtNode node = new ASTEquivalenceStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTEquivalence = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTEquivalence != null) node.hiddenTEquivalence.setParent(node);
                    node.equivalenceSetList = (IASTListNode<ASTEquivalenceSetNode>)valueStack.get(valueStackOffset + 2);
                    if (node.equivalenceSetList != null) node.equivalenceSetList.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleEquivalenceSetList648(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 7 with separator
                    ASTSeparatedListNode<ASTEquivalenceSetNode> list = new ASTSeparatedListNode<ASTEquivalenceSetNode>();
                    ASTEquivalenceSetNode elt = (ASTEquivalenceSetNode)valueStack.get(valueStackOffset + 0);
                    list.add(null, elt);
                    if (elt != null) elt.setParent(list);
                    return list;

        }
        public Object handleEquivalenceSetList649(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 8 with separator
                    ASTSeparatedListNode<ASTEquivalenceSetNode> list = (ASTSeparatedListNode<ASTEquivalenceSetNode>)valueStack.get(valueStackOffset);
                    org.eclipse.photran.internal.core.lexer.Token token = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    ASTEquivalenceSetNode elt = (ASTEquivalenceSetNode)valueStack.get(valueStackOffset + 2);
                    list.add(token, elt);
                    token.setParent(list);
                    if (elt != null) elt.setParent(list);
                    return list;

        }
        public Object handleEquivalenceSet650(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTEquivalenceSetNode node = new ASTEquivalenceSetNode();
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.variable = (ASTVariableNode)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("variable");
                    if (node.variable != null) node.variable.setParent(node);
                    node.hiddenTComma = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTComma != null) node.hiddenTComma.setParent(node);
                    node.equivalentObjects = (IASTListNode<ASTEquivalenceObjectListNode>)valueStack.get(valueStackOffset + 3);
                    if (node.equivalentObjects != null) node.equivalentObjects.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    return node;

        }
        public Object handleEquivalenceObjectList651(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 10
                    ASTEquivalenceObjectListNode node = new ASTEquivalenceObjectListNode();
                    node.variable = (ASTVariableNode)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("variable");
                    if (node.variable != null) node.variable.setParent(node);
                    ASTListNode<ASTEquivalenceObjectListNode> list = new ASTListNode<ASTEquivalenceObjectListNode>();
                    list.add(node);
                    node.setParent(list);
                    return list;

        }
        public Object handleEquivalenceObjectList652(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 11
                    ASTEquivalenceObjectListNode node = new ASTEquivalenceObjectListNode();
                    node.hiddenTComma = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTComma != null) node.hiddenTComma.setParent(node);
                    node.variable = (ASTVariableNode)((Map<String, Object>)valueStack.get(valueStackOffset + 2)).get("variable");
                    if (node.variable != null) node.variable.setParent(node);
                    ASTListNode<ASTEquivalenceObjectListNode> list = (ASTListNode<ASTEquivalenceObjectListNode>)valueStack.get(valueStackOffset);
                    list.add(node);
                    node.setParent(list);
                    return list;

        }
        public Object handleEquivalenceObject653(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 3 and 4
                    Map<String, Object> node = new HashMap<String, Object>();
                    node.put("variable", (ASTVariableNode)valueStack.get(valueStackOffset + 0));
                    ASTListNode<IASTNode> embeddedList = new ASTListNode<IASTNode>();
                    embeddedList.add((IASTNode)(node.get("variable")));
                    node.put("errorRecoveryList", embeddedList);
                    return node;

        }
        public Object handleCommonStmt654(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTCommonStmtNode node = new ASTCommonStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTCommon = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTCommon != null) node.hiddenTCommon.setParent(node);
                    node.commonBlockList = (IASTListNode<ASTCommonBlockNode>)valueStack.get(valueStackOffset + 2);
                    if (node.commonBlockList != null) node.commonBlockList.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleCommonBlockList655(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 7
                    IASTListNode<ASTCommonBlockNode> list = new ASTListNode<ASTCommonBlockNode>();
                    ASTCommonBlockNode elt = (ASTCommonBlockNode)valueStack.get(valueStackOffset + 0);
                    list.add(elt);
                    if (elt != null) elt.setParent(list);
                    return list;

        }
        public Object handleCommonBlockList656(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 8
                    IASTListNode<ASTCommonBlockNode> list = (IASTListNode<ASTCommonBlockNode>)valueStack.get(valueStackOffset);
                    ASTCommonBlockNode elt = (ASTCommonBlockNode)valueStack.get(valueStackOffset + 1);
                    list.add(elt);
                    if (elt != null) elt.setParent(list);
                    return list;

        }
        public Object handleCommonBlock657(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTCommonBlockNode node = new ASTCommonBlockNode();
                    node.commonBlockObjectList = (IASTListNode<ASTCommonBlockObjectNode>)valueStack.get(valueStackOffset + 0);
                    if (node.commonBlockObjectList != null) node.commonBlockObjectList.setParent(node);
                    return node;

        }
        public Object handleCommonBlock658(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTCommonBlockNode node = new ASTCommonBlockNode();
                    node.hiddenTSlash = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.hiddenTSlash != null) node.hiddenTSlash.setParent(node);
                    node.hiddenTSlash2 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTSlash2 != null) node.hiddenTSlash2.setParent(node);
                    node.commonBlockObjectList = (IASTListNode<ASTCommonBlockObjectNode>)valueStack.get(valueStackOffset + 2);
                    if (node.commonBlockObjectList != null) node.commonBlockObjectList.setParent(node);
                    return node;

        }
        public Object handleCommonBlock659(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTCommonBlockNode node = new ASTCommonBlockNode();
                    node.hiddenTSlash = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.hiddenTSlash != null) node.hiddenTSlash.setParent(node);
                    ASTCommonBlockNameNode tmp1 = new ASTCommonBlockNameNode();
                    tmp1.commonBlockName = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("commonBlockName");
                    if (tmp1.commonBlockName != null) tmp1.commonBlockName.setParent(tmp1);
                    node.name = tmp1;
                    if (tmp1 != null) tmp1.setParent(node);
                    node.hiddenTSlash2 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTSlash2 != null) node.hiddenTSlash2.setParent(node);
                    node.commonBlockObjectList = (IASTListNode<ASTCommonBlockObjectNode>)valueStack.get(valueStackOffset + 3);
                    if (node.commonBlockObjectList != null) node.commonBlockObjectList.setParent(node);
                    return node;

        }
        public Object handleCommonBlockObjectList660(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 7
                    IASTListNode<ASTCommonBlockObjectNode> list = new ASTListNode<ASTCommonBlockObjectNode>();
                    ASTCommonBlockObjectNode elt = (ASTCommonBlockObjectNode)valueStack.get(valueStackOffset + 0);
                    list.add(elt);
                    if (elt != null) elt.setParent(list);
                    return list;

        }
        public Object handleCommonBlockObjectList661(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 8
                    IASTListNode<ASTCommonBlockObjectNode> list = (IASTListNode<ASTCommonBlockObjectNode>)valueStack.get(valueStackOffset);
                    ASTCommonBlockObjectNode elt = (ASTCommonBlockObjectNode)valueStack.get(valueStackOffset + 1);
                    list.add(elt);
                    if (elt != null) elt.setParent(list);
                    return list;

        }
        public Object handleCommonBlockObject662(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTCommonBlockObjectNode node = new ASTCommonBlockObjectNode();
                    node.variableName = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("variableName");
                    if (node.variableName != null) node.variableName.setParent(node);
                    return node;

        }
        public Object handleCommonBlockObject663(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTCommonBlockObjectNode node = new ASTCommonBlockObjectNode();
                    node.variableName = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("variableName");
                    if (node.variableName != null) node.variableName.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("hiddenTLparen");
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.arraySpec = (ASTArraySpecNode)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("arraySpec");
                    if (node.arraySpec != null) node.arraySpec.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("hiddenTRparen");
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    return node;

        }
        public Object handleCommonBlockObject664(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTCommonBlockObjectNode node = new ASTCommonBlockObjectNode();
                    node.variableName = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("variableName");
                    if (node.variableName != null) node.variableName.setParent(node);
                    node.hiddenTComma = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTComma != null) node.hiddenTComma.setParent(node);
                    return node;

        }
        public Object handleCommonBlockObject665(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTCommonBlockObjectNode node = new ASTCommonBlockObjectNode();
                    node.variableName = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("variableName");
                    if (node.variableName != null) node.variableName.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("hiddenTLparen");
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.arraySpec = (ASTArraySpecNode)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("arraySpec");
                    if (node.arraySpec != null) node.arraySpec.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("hiddenTRparen");
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    node.hiddenTComma = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTComma != null) node.hiddenTComma.setParent(node);
                    return node;

        }
        public Object handleVariable666(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTVariableNode node = new ASTVariableNode();
                    node.dataRef = (IASTListNode<ASTDataRefNode>)valueStack.get(valueStackOffset + 0);
                    if (node.dataRef != null) node.dataRef.setParent(node);
                    return node;

        }
        public Object handleVariable667(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTVariableNode node = new ASTVariableNode();
                    node.dataRef = (IASTListNode<ASTDataRefNode>)valueStack.get(valueStackOffset + 0);
                    if (node.dataRef != null) node.dataRef.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.sectionSubscriptList = (IASTListNode<ASTSectionSubscriptNode>)valueStack.get(valueStackOffset + 2);
                    if (node.sectionSubscriptList != null) node.sectionSubscriptList.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    return node;

        }
        public Object handleVariable668(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTVariableNode node = new ASTVariableNode();
                    node.dataRef = (IASTListNode<ASTDataRefNode>)valueStack.get(valueStackOffset + 0);
                    if (node.dataRef != null) node.dataRef.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.sectionSubscriptList = (IASTListNode<ASTSectionSubscriptNode>)valueStack.get(valueStackOffset + 2);
                    if (node.sectionSubscriptList != null) node.sectionSubscriptList.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    node.substringRange = (ASTSubstringRangeNode)valueStack.get(valueStackOffset + 4);
                    if (node.substringRange != null) node.substringRange.setParent(node);
                    return node;

        }
        public Object handleVariable669(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTVariableNode node = new ASTVariableNode();
                    node.stringConst = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("stringConst");
                    if (node.stringConst != null) node.stringConst.setParent(node);
                    node.substringRange = (ASTSubstringRangeNode)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("substringRange");
                    if (node.substringRange != null) node.substringRange.setParent(node);
                    return node;

        }
        public Object handleVariable670(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTVariableNode node = new ASTVariableNode();
                    node.dataRef = (IASTListNode<ASTDataRefNode>)valueStack.get(valueStackOffset + 0);
                    if (node.dataRef != null) node.dataRef.setParent(node);
                    node.imageSelector = (ASTImageSelectorNode)valueStack.get(valueStackOffset + 1);
                    if (node.imageSelector != null) node.imageSelector.setParent(node);
                    return node;

        }
        public Object handleVariable671(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTVariableNode node = new ASTVariableNode();
                    node.dataRef = (IASTListNode<ASTDataRefNode>)valueStack.get(valueStackOffset + 0);
                    if (node.dataRef != null) node.dataRef.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.sectionSubscriptList = (IASTListNode<ASTSectionSubscriptNode>)valueStack.get(valueStackOffset + 2);
                    if (node.sectionSubscriptList != null) node.sectionSubscriptList.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    node.imageSelector = (ASTImageSelectorNode)valueStack.get(valueStackOffset + 4);
                    if (node.imageSelector != null) node.imageSelector.setParent(node);
                    return node;

        }
        public Object handleVariable672(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTVariableNode node = new ASTVariableNode();
                    node.dataRef = (IASTListNode<ASTDataRefNode>)valueStack.get(valueStackOffset + 0);
                    if (node.dataRef != null) node.dataRef.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.sectionSubscriptList = (IASTListNode<ASTSectionSubscriptNode>)valueStack.get(valueStackOffset + 2);
                    if (node.sectionSubscriptList != null) node.sectionSubscriptList.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    node.imageSelector = (ASTImageSelectorNode)valueStack.get(valueStackOffset + 4);
                    if (node.imageSelector != null) node.imageSelector.setParent(node);
                    node.substringRange = (ASTSubstringRangeNode)valueStack.get(valueStackOffset + 5);
                    if (node.substringRange != null) node.substringRange.setParent(node);
                    return node;

        }
        public Object handleSubstrConst673(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 3 and 4
                    Map<String, Object> node = new HashMap<String, Object>();
                    node.put("stringConst", (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0));
                    node.put("substringRange", (ASTSubstringRangeNode)valueStack.get(valueStackOffset + 1));
                    ASTListNode<IASTNode> embeddedList = new ASTListNode<IASTNode>();
                    embeddedList.add((IASTNode)(node.get("stringConst")));
                    embeddedList.add((IASTNode)(node.get("substringRange")));
                    node.put("errorRecoveryList", embeddedList);
                    return node;

        }
        public Object handleVariableName674(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 3 and 4
                    Map<String, Object> node = new HashMap<String, Object>();
                    node.put("variableName", (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0));
                    ASTListNode<IASTNode> embeddedList = new ASTListNode<IASTNode>();
                    embeddedList.add((IASTNode)(node.get("variableName")));
                    node.put("errorRecoveryList", embeddedList);
                    return node;

        }
        public Object handleScalarVariable675(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTScalarVariableNode node = new ASTScalarVariableNode();
                    node.variableName = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("variableName");
                    if (node.variableName != null) node.variableName.setParent(node);
                    return node;

        }
        public Object handleScalarVariable676(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTScalarVariableNode node = new ASTScalarVariableNode();
                    node.structureComponent = (IASTListNode<ASTStructureComponentNode>)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("structureComponent");
                    if (node.structureComponent != null) node.structureComponent.setParent(node);
                    node.variableName = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("variableName");
                    if (node.variableName != null) node.variableName.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("hiddenTLparen");
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.sectionSubscriptList = (IASTListNode<ASTSectionSubscriptNode>)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("sectionSubscriptList");
                    if (node.sectionSubscriptList != null) node.sectionSubscriptList.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("hiddenTRparen");
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    node.imageSelector = (ASTImageSelectorNode)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("imageSelector");
                    if (node.imageSelector != null) node.imageSelector.setParent(node);
                    return node;

        }
        public Object handleSubstringRange677(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTSubstringRangeNode node = new ASTSubstringRangeNode();
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.subscriptTriplet = (ASTSubscriptTripletNode)valueStack.get(valueStackOffset + 1);
                    if (node.subscriptTriplet != null) node.subscriptTriplet.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    return node;

        }
        public Object handleDataRef678(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 10
                    ASTDataRefNode node = new ASTDataRefNode();
                    node.name = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("name");
                    if (node.name != null) node.name.setParent(node);
                    ASTListNode<ASTDataRefNode> list = new ASTListNode<ASTDataRefNode>();
                    list.add(node);
                    node.setParent(list);
                    return list;

        }
        public Object handleDataRef679(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 11
                    ASTDataRefNode node = new ASTDataRefNode();
                    node.hasDerivedTypeComponentName = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hasDerivedTypeComponentName != null) node.hasDerivedTypeComponentName.setParent(node);
                    ASTNameNode tmp2 = new ASTNameNode();
                    tmp2.name = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 2)).get("name");
                    if (tmp2.name != null) tmp2.name.setParent(tmp2);
                    node.componentName = tmp2;
                    if (tmp2 != null) tmp2.setParent(node);
                    ASTListNode<ASTDataRefNode> list = (ASTListNode<ASTDataRefNode>)valueStack.get(valueStackOffset);
                    list.add(node);
                    node.setParent(list);
                    return list;

        }
        public Object handleDataRef680(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 11
                    ASTDataRefNode node = new ASTDataRefNode();
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.primarySectionSubscriptList = (IASTListNode<ASTSectionSubscriptNode>)valueStack.get(valueStackOffset + 2);
                    if (node.primarySectionSubscriptList != null) node.primarySectionSubscriptList.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    node.hasDerivedTypeComponentName = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hasDerivedTypeComponentName != null) node.hasDerivedTypeComponentName.setParent(node);
                    ASTNameNode tmp5 = new ASTNameNode();
                    tmp5.name = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 5)).get("name");
                    if (tmp5.name != null) tmp5.name.setParent(tmp5);
                    node.componentName = tmp5;
                    if (tmp5 != null) tmp5.setParent(node);
                    ASTListNode<ASTDataRefNode> list = (ASTListNode<ASTDataRefNode>)valueStack.get(valueStackOffset);
                    list.add(node);
                    node.setParent(list);
                    return list;

        }
        public Object handleDataRef681(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 10
                    ASTDataRefNode node = new ASTDataRefNode();
                    node.name = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("name");
                    if (node.name != null) node.name.setParent(node);
                    node.imageSelector = (ASTImageSelectorNode)valueStack.get(valueStackOffset + 1);
                    if (node.imageSelector != null) node.imageSelector.setParent(node);
                    ASTListNode<ASTDataRefNode> list = new ASTListNode<ASTDataRefNode>();
                    list.add(node);
                    node.setParent(list);
                    return list;

        }
        public Object handleDataRef682(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 11
                    ASTDataRefNode node = new ASTDataRefNode();
                    node.imageSelector = (ASTImageSelectorNode)valueStack.get(valueStackOffset + 1);
                    if (node.imageSelector != null) node.imageSelector.setParent(node);
                    node.hasDerivedTypeComponentName = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hasDerivedTypeComponentName != null) node.hasDerivedTypeComponentName.setParent(node);
                    ASTNameNode tmp3 = new ASTNameNode();
                    tmp3.name = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 3)).get("name");
                    if (tmp3.name != null) tmp3.name.setParent(tmp3);
                    node.componentName = tmp3;
                    if (tmp3 != null) tmp3.setParent(node);
                    ASTListNode<ASTDataRefNode> list = (ASTListNode<ASTDataRefNode>)valueStack.get(valueStackOffset);
                    list.add(node);
                    node.setParent(list);
                    return list;

        }
        public Object handleDataRef683(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 11
                    ASTDataRefNode node = new ASTDataRefNode();
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.primarySectionSubscriptList = (IASTListNode<ASTSectionSubscriptNode>)valueStack.get(valueStackOffset + 2);
                    if (node.primarySectionSubscriptList != null) node.primarySectionSubscriptList.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    node.imageSelector = (ASTImageSelectorNode)valueStack.get(valueStackOffset + 4);
                    if (node.imageSelector != null) node.imageSelector.setParent(node);
                    node.hasDerivedTypeComponentName = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 5);
                    if (node.hasDerivedTypeComponentName != null) node.hasDerivedTypeComponentName.setParent(node);
                    ASTNameNode tmp6 = new ASTNameNode();
                    tmp6.name = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 6)).get("name");
                    if (tmp6.name != null) tmp6.name.setParent(tmp6);
                    node.componentName = tmp6;
                    if (tmp6 != null) tmp6.setParent(node);
                    ASTListNode<ASTDataRefNode> list = (ASTListNode<ASTDataRefNode>)valueStack.get(valueStackOffset);
                    list.add(node);
                    node.setParent(list);
                    return list;

        }
        public Object handleSFDataRef684(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 10
                    ASTSFDataRefNode node = new ASTSFDataRefNode();
                    node.name = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("name");
                    if (node.name != null) node.name.setParent(node);
                    node.hasDerivedTypeComponentName = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hasDerivedTypeComponentName != null) node.hasDerivedTypeComponentName.setParent(node);
                    ASTNameNode tmp2 = new ASTNameNode();
                    tmp2.name = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 2)).get("name");
                    if (tmp2.name != null) tmp2.name.setParent(tmp2);
                    node.componentName = tmp2;
                    if (tmp2 != null) tmp2.setParent(node);
                    ASTListNode<ASTSFDataRefNode> list = new ASTListNode<ASTSFDataRefNode>();
                    list.add(node);
                    node.setParent(list);
                    return list;

        }
        public Object handleSFDataRef685(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 10
                    ASTSFDataRefNode node = new ASTSFDataRefNode();
                    node.name = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("name");
                    if (node.name != null) node.name.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.primarySectionSubscriptList = (IASTListNode<ASTSectionSubscriptNode>)valueStack.get(valueStackOffset + 2);
                    if (node.primarySectionSubscriptList != null) node.primarySectionSubscriptList.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    ASTListNode<ASTSFDataRefNode> list = new ASTListNode<ASTSFDataRefNode>();
                    list.add(node);
                    node.setParent(list);
                    return list;

        }
        public Object handleSFDataRef686(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 11
                    ASTSFDataRefNode node = new ASTSFDataRefNode();
                    node.hasDerivedTypeComponentName = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hasDerivedTypeComponentName != null) node.hasDerivedTypeComponentName.setParent(node);
                    ASTNameNode tmp2 = new ASTNameNode();
                    tmp2.name = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 2)).get("name");
                    if (tmp2.name != null) tmp2.name.setParent(tmp2);
                    node.componentName = tmp2;
                    if (tmp2 != null) tmp2.setParent(node);
                    ASTListNode<ASTSFDataRefNode> list = (ASTListNode<ASTSFDataRefNode>)valueStack.get(valueStackOffset);
                    list.add(node);
                    node.setParent(list);
                    return list;

        }
        public Object handleSFDataRef687(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 11
                    ASTSFDataRefNode node = new ASTSFDataRefNode();
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.primarySectionSubscriptList = (IASTListNode<ASTSectionSubscriptNode>)valueStack.get(valueStackOffset + 2);
                    if (node.primarySectionSubscriptList != null) node.primarySectionSubscriptList.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    node.hasDerivedTypeComponentName = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hasDerivedTypeComponentName != null) node.hasDerivedTypeComponentName.setParent(node);
                    ASTNameNode tmp5 = new ASTNameNode();
                    tmp5.name = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 5)).get("name");
                    if (tmp5.name != null) tmp5.name.setParent(tmp5);
                    node.componentName = tmp5;
                    if (tmp5 != null) tmp5.setParent(node);
                    ASTListNode<ASTSFDataRefNode> list = (ASTListNode<ASTSFDataRefNode>)valueStack.get(valueStackOffset);
                    list.add(node);
                    node.setParent(list);
                    return list;

        }
        public Object handleSFDataRef688(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 10
                    ASTSFDataRefNode node = new ASTSFDataRefNode();
                    node.name = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("name");
                    if (node.name != null) node.name.setParent(node);
                    node.imageSelector = (ASTImageSelectorNode)valueStack.get(valueStackOffset + 1);
                    if (node.imageSelector != null) node.imageSelector.setParent(node);
                    node.hasDerivedTypeComponentName = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hasDerivedTypeComponentName != null) node.hasDerivedTypeComponentName.setParent(node);
                    ASTNameNode tmp3 = new ASTNameNode();
                    tmp3.name = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 3)).get("name");
                    if (tmp3.name != null) tmp3.name.setParent(tmp3);
                    node.componentName = tmp3;
                    if (tmp3 != null) tmp3.setParent(node);
                    ASTListNode<ASTSFDataRefNode> list = new ASTListNode<ASTSFDataRefNode>();
                    list.add(node);
                    node.setParent(list);
                    return list;

        }
        public Object handleSFDataRef689(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 10
                    ASTSFDataRefNode node = new ASTSFDataRefNode();
                    node.name = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("name");
                    if (node.name != null) node.name.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.primarySectionSubscriptList = (IASTListNode<ASTSectionSubscriptNode>)valueStack.get(valueStackOffset + 2);
                    if (node.primarySectionSubscriptList != null) node.primarySectionSubscriptList.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    node.imageSelector = (ASTImageSelectorNode)valueStack.get(valueStackOffset + 4);
                    if (node.imageSelector != null) node.imageSelector.setParent(node);
                    ASTListNode<ASTSFDataRefNode> list = new ASTListNode<ASTSFDataRefNode>();
                    list.add(node);
                    node.setParent(list);
                    return list;

        }
        public Object handleSFDataRef690(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 11
                    ASTSFDataRefNode node = new ASTSFDataRefNode();
                    node.imageSelector = (ASTImageSelectorNode)valueStack.get(valueStackOffset + 1);
                    if (node.imageSelector != null) node.imageSelector.setParent(node);
                    node.hasDerivedTypeComponentName = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hasDerivedTypeComponentName != null) node.hasDerivedTypeComponentName.setParent(node);
                    ASTNameNode tmp3 = new ASTNameNode();
                    tmp3.name = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 3)).get("name");
                    if (tmp3.name != null) tmp3.name.setParent(tmp3);
                    node.componentName = tmp3;
                    if (tmp3 != null) tmp3.setParent(node);
                    ASTListNode<ASTSFDataRefNode> list = (ASTListNode<ASTSFDataRefNode>)valueStack.get(valueStackOffset);
                    list.add(node);
                    node.setParent(list);
                    return list;

        }
        public Object handleSFDataRef691(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 11
                    ASTSFDataRefNode node = new ASTSFDataRefNode();
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.primarySectionSubscriptList = (IASTListNode<ASTSectionSubscriptNode>)valueStack.get(valueStackOffset + 2);
                    if (node.primarySectionSubscriptList != null) node.primarySectionSubscriptList.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    node.imageSelector = (ASTImageSelectorNode)valueStack.get(valueStackOffset + 4);
                    if (node.imageSelector != null) node.imageSelector.setParent(node);
                    node.hasDerivedTypeComponentName = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 5);
                    if (node.hasDerivedTypeComponentName != null) node.hasDerivedTypeComponentName.setParent(node);
                    ASTNameNode tmp6 = new ASTNameNode();
                    tmp6.name = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 6)).get("name");
                    if (tmp6.name != null) tmp6.name.setParent(tmp6);
                    node.componentName = tmp6;
                    if (tmp6 != null) tmp6.setParent(node);
                    ASTListNode<ASTSFDataRefNode> list = (ASTListNode<ASTSFDataRefNode>)valueStack.get(valueStackOffset);
                    list.add(node);
                    node.setParent(list);
                    return list;

        }
        public Object handleStructureComponent692(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 10
                    ASTStructureComponentNode node = new ASTStructureComponentNode();
                    ASTVariableNameNode tmp0 = new ASTVariableNameNode();
                    tmp0.variableName = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("variableName");
                    if (tmp0.variableName != null) tmp0.variableName.setParent(tmp0);
                    node.variableName = tmp0;
                    if (tmp0 != null) tmp0.setParent(node);
                    node.fieldSelector = (ASTFieldSelectorNode)valueStack.get(valueStackOffset + 1);
                    if (node.fieldSelector != null) node.fieldSelector.setParent(node);
                    ASTListNode<ASTStructureComponentNode> list = new ASTListNode<ASTStructureComponentNode>();
                    list.add(node);
                    node.setParent(list);
                    return list;

        }
        public Object handleStructureComponent693(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 11
                    ASTStructureComponentNode node = new ASTStructureComponentNode();
                    node.fieldSelector = (ASTFieldSelectorNode)valueStack.get(valueStackOffset + 1);
                    if (node.fieldSelector != null) node.fieldSelector.setParent(node);
                    ASTListNode<ASTStructureComponentNode> list = (ASTListNode<ASTStructureComponentNode>)valueStack.get(valueStackOffset);
                    list.add(node);
                    node.setParent(list);
                    return list;

        }
        public Object handleFieldSelector694(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTFieldSelectorNode node = new ASTFieldSelectorNode();
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.sectionSubscriptList = (IASTListNode<ASTSectionSubscriptNode>)valueStack.get(valueStackOffset + 1);
                    if (node.sectionSubscriptList != null) node.sectionSubscriptList.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    node.hasDerivedTypeComponentRef = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hasDerivedTypeComponentRef != null) node.hasDerivedTypeComponentRef.setParent(node);
                    node.name = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 4)).get("name");
                    if (node.name != null) node.name.setParent(node);
                    return node;

        }
        public Object handleFieldSelector695(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTFieldSelectorNode node = new ASTFieldSelectorNode();
                    node.hasDerivedTypeComponentRef = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.hasDerivedTypeComponentRef != null) node.hasDerivedTypeComponentRef.setParent(node);
                    node.name = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("name");
                    if (node.name != null) node.name.setParent(node);
                    return node;

        }
        public Object handleFieldSelector696(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTFieldSelectorNode node = new ASTFieldSelectorNode();
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.sectionSubscriptList = (IASTListNode<ASTSectionSubscriptNode>)valueStack.get(valueStackOffset + 1);
                    if (node.sectionSubscriptList != null) node.sectionSubscriptList.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    node.imageSelector = (ASTImageSelectorNode)valueStack.get(valueStackOffset + 3);
                    if (node.imageSelector != null) node.imageSelector.setParent(node);
                    node.hasDerivedTypeComponentRef = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hasDerivedTypeComponentRef != null) node.hasDerivedTypeComponentRef.setParent(node);
                    node.name = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 5)).get("name");
                    if (node.name != null) node.name.setParent(node);
                    return node;

        }
        public Object handleFieldSelector697(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTFieldSelectorNode node = new ASTFieldSelectorNode();
                    node.imageSelector = (ASTImageSelectorNode)valueStack.get(valueStackOffset + 0);
                    if (node.imageSelector != null) node.imageSelector.setParent(node);
                    node.hasDerivedTypeComponentRef = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hasDerivedTypeComponentRef != null) node.hasDerivedTypeComponentRef.setParent(node);
                    node.name = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 2)).get("name");
                    if (node.name != null) node.name.setParent(node);
                    return node;

        }
        public Object handleArrayElement698(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 3 and 4
                    Map<String, Object> node = new HashMap<String, Object>();
                    node.put("variableName", (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("variableName"));
                    node.put("hiddenTLparen", (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1));
                    node.put("sectionSubscriptList", (IASTListNode<ASTSectionSubscriptNode>)valueStack.get(valueStackOffset + 2));
                    node.put("hiddenTRparen", (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3));
                    ASTListNode<IASTNode> embeddedList = new ASTListNode<IASTNode>();
                    embeddedList.add((IASTNode)(node.get("structureComponent")));
                    embeddedList.add((IASTNode)(node.get("variableName")));
                    embeddedList.add((IASTNode)(node.get("hiddenTLparen")));
                    embeddedList.add((IASTNode)(node.get("sectionSubscriptList")));
                    embeddedList.add((IASTNode)(node.get("hiddenTRparen")));
                    embeddedList.add((IASTNode)(node.get("imageSelector")));
                    node.put("errorRecoveryList", embeddedList);
                    return node;

        }
        public Object handleArrayElement699(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 3 and 4
                    Map<String, Object> node = new HashMap<String, Object>();
                    node.put("structureComponent", (IASTListNode<ASTStructureComponentNode>)valueStack.get(valueStackOffset + 0));
                    node.put("hiddenTLparen", (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1));
                    node.put("sectionSubscriptList", (IASTListNode<ASTSectionSubscriptNode>)valueStack.get(valueStackOffset + 2));
                    node.put("hiddenTRparen", (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3));
                    ASTListNode<IASTNode> embeddedList = new ASTListNode<IASTNode>();
                    embeddedList.add((IASTNode)(node.get("structureComponent")));
                    embeddedList.add((IASTNode)(node.get("variableName")));
                    embeddedList.add((IASTNode)(node.get("hiddenTLparen")));
                    embeddedList.add((IASTNode)(node.get("sectionSubscriptList")));
                    embeddedList.add((IASTNode)(node.get("hiddenTRparen")));
                    embeddedList.add((IASTNode)(node.get("imageSelector")));
                    node.put("errorRecoveryList", embeddedList);
                    return node;

        }
        public Object handleArrayElement700(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 3 and 4
                    Map<String, Object> node = new HashMap<String, Object>();
                    node.put("variableName", (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("variableName"));
                    node.put("hiddenTLparen", (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1));
                    node.put("sectionSubscriptList", (IASTListNode<ASTSectionSubscriptNode>)valueStack.get(valueStackOffset + 2));
                    node.put("hiddenTRparen", (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3));
                    node.put("imageSelector", (ASTImageSelectorNode)valueStack.get(valueStackOffset + 4));
                    ASTListNode<IASTNode> embeddedList = new ASTListNode<IASTNode>();
                    embeddedList.add((IASTNode)(node.get("structureComponent")));
                    embeddedList.add((IASTNode)(node.get("variableName")));
                    embeddedList.add((IASTNode)(node.get("hiddenTLparen")));
                    embeddedList.add((IASTNode)(node.get("sectionSubscriptList")));
                    embeddedList.add((IASTNode)(node.get("hiddenTRparen")));
                    embeddedList.add((IASTNode)(node.get("imageSelector")));
                    node.put("errorRecoveryList", embeddedList);
                    return node;

        }
        public Object handleArrayElement701(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 3 and 4
                    Map<String, Object> node = new HashMap<String, Object>();
                    node.put("structureComponent", (IASTListNode<ASTStructureComponentNode>)valueStack.get(valueStackOffset + 0));
                    node.put("hiddenTLparen", (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1));
                    node.put("sectionSubscriptList", (IASTListNode<ASTSectionSubscriptNode>)valueStack.get(valueStackOffset + 2));
                    node.put("hiddenTRparen", (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3));
                    node.put("imageSelector", (ASTImageSelectorNode)valueStack.get(valueStackOffset + 4));
                    ASTListNode<IASTNode> embeddedList = new ASTListNode<IASTNode>();
                    embeddedList.add((IASTNode)(node.get("structureComponent")));
                    embeddedList.add((IASTNode)(node.get("variableName")));
                    embeddedList.add((IASTNode)(node.get("hiddenTLparen")));
                    embeddedList.add((IASTNode)(node.get("sectionSubscriptList")));
                    embeddedList.add((IASTNode)(node.get("hiddenTRparen")));
                    embeddedList.add((IASTNode)(node.get("imageSelector")));
                    node.put("errorRecoveryList", embeddedList);
                    return node;

        }
        public Object handleSubscript702(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTSubscriptNode node = new ASTSubscriptNode();
                    node.subscriptExpr = (IExpr)valueStack.get(valueStackOffset + 0);
                    if (node.subscriptExpr != null) node.subscriptExpr.setParent(node);
                    return node;

        }
        public Object handleSectionSubscriptList703(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 7 with separator
                    ASTSeparatedListNode<ASTSectionSubscriptNode> list = new ASTSeparatedListNode<ASTSectionSubscriptNode>();
                    ASTSectionSubscriptNode elt = (ASTSectionSubscriptNode)valueStack.get(valueStackOffset + 0);
                    list.add(null, elt);
                    if (elt != null) elt.setParent(list);
                    return list;

        }
        public Object handleSectionSubscriptList704(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 8 with separator
                    ASTSeparatedListNode<ASTSectionSubscriptNode> list = (ASTSeparatedListNode<ASTSectionSubscriptNode>)valueStack.get(valueStackOffset);
                    org.eclipse.photran.internal.core.lexer.Token token = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    ASTSectionSubscriptNode elt = (ASTSectionSubscriptNode)valueStack.get(valueStackOffset + 2);
                    list.add(token, elt);
                    token.setParent(list);
                    if (elt != null) elt.setParent(list);
                    return list;

        }
        public Object handleSectionSubscript705(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTSectionSubscriptNode node = new ASTSectionSubscriptNode();
                    node.expr = (IExpr)valueStack.get(valueStackOffset + 0);
                    if (node.expr != null) node.expr.setParent(node);
                    return node;

        }
        public Object handleSectionSubscript706(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTSectionSubscriptNode node = new ASTSectionSubscriptNode();
                    node.subscriptTriplet = (ASTSubscriptTripletNode)valueStack.get(valueStackOffset + 0);
                    if (node.subscriptTriplet != null) node.subscriptTriplet.setParent(node);
                    return node;

        }
        public Object handleSubscriptTriplet707(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTSubscriptTripletNode node = new ASTSubscriptTripletNode();
                    node.hiddenTColon = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.hiddenTColon != null) node.hiddenTColon.setParent(node);
                    return node;

        }
        public Object handleSubscriptTriplet708(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTSubscriptTripletNode node = new ASTSubscriptTripletNode();
                    node.hiddenTColon = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.hiddenTColon != null) node.hiddenTColon.setParent(node);
                    node.ub = (IExpr)valueStack.get(valueStackOffset + 1);
                    if (node.ub != null) node.ub.setParent(node);
                    return node;

        }
        public Object handleSubscriptTriplet709(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTSubscriptTripletNode node = new ASTSubscriptTripletNode();
                    node.lb = (IExpr)valueStack.get(valueStackOffset + 0);
                    if (node.lb != null) node.lb.setParent(node);
                    node.hiddenTColon = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTColon != null) node.hiddenTColon.setParent(node);
                    return node;

        }
        public Object handleSubscriptTriplet710(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTSubscriptTripletNode node = new ASTSubscriptTripletNode();
                    node.lb = (IExpr)valueStack.get(valueStackOffset + 0);
                    if (node.lb != null) node.lb.setParent(node);
                    node.hiddenTColon = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTColon != null) node.hiddenTColon.setParent(node);
                    node.ub = (IExpr)valueStack.get(valueStackOffset + 2);
                    if (node.ub != null) node.ub.setParent(node);
                    return node;

        }
        public Object handleSubscriptTriplet711(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTSubscriptTripletNode node = new ASTSubscriptTripletNode();
                    node.lb = (IExpr)valueStack.get(valueStackOffset + 0);
                    if (node.lb != null) node.lb.setParent(node);
                    node.hiddenTColon = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTColon != null) node.hiddenTColon.setParent(node);
                    node.ub = (IExpr)valueStack.get(valueStackOffset + 2);
                    if (node.ub != null) node.ub.setParent(node);
                    node.hiddenTColon2 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTColon2 != null) node.hiddenTColon2.setParent(node);
                    node.step = (IExpr)valueStack.get(valueStackOffset + 4);
                    if (node.step != null) node.step.setParent(node);
                    return node;

        }
        public Object handleSubscriptTriplet712(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTSubscriptTripletNode node = new ASTSubscriptTripletNode();
                    node.lb = (IExpr)valueStack.get(valueStackOffset + 0);
                    if (node.lb != null) node.lb.setParent(node);
                    node.hiddenTColon = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTColon != null) node.hiddenTColon.setParent(node);
                    node.hiddenTColon2 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTColon2 != null) node.hiddenTColon2.setParent(node);
                    node.step = (IExpr)valueStack.get(valueStackOffset + 3);
                    if (node.step != null) node.step.setParent(node);
                    return node;

        }
        public Object handleSubscriptTriplet713(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTSubscriptTripletNode node = new ASTSubscriptTripletNode();
                    node.hiddenTColon = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.hiddenTColon != null) node.hiddenTColon.setParent(node);
                    node.ub = (IExpr)valueStack.get(valueStackOffset + 1);
                    if (node.ub != null) node.ub.setParent(node);
                    node.hiddenTColon2 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTColon2 != null) node.hiddenTColon2.setParent(node);
                    node.step = (IExpr)valueStack.get(valueStackOffset + 3);
                    if (node.step != null) node.step.setParent(node);
                    return node;

        }
        public Object handleSubscriptTriplet714(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTSubscriptTripletNode node = new ASTSubscriptTripletNode();
                    node.hiddenTColon = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.hiddenTColon != null) node.hiddenTColon.setParent(node);
                    node.hiddenTColon2 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTColon2 != null) node.hiddenTColon2.setParent(node);
                    node.step = (IExpr)valueStack.get(valueStackOffset + 2);
                    if (node.step != null) node.step.setParent(node);
                    return node;

        }
        public Object handleAllocateStmt715(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTAllocateStmtNode node = new ASTAllocateStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTAllocate = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTAllocate != null) node.hiddenTAllocate.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.allocationList = (IASTListNode<ASTAllocationNode>)valueStack.get(valueStackOffset + 3);
                    if (node.allocationList != null) node.allocationList.setParent(node);
                    node.hiddenTComma = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenTComma != null) node.hiddenTComma.setParent(node);
                    node.hiddenTStateq = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 5);
                    if (node.hiddenTStateq != null) node.hiddenTStateq.setParent(node);
                    node.statusVariable = (ASTVariableNode)valueStack.get(valueStackOffset + 6);
                    if (node.statusVariable != null) node.statusVariable.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 7);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 8);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleAllocateStmt716(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTAllocateStmtNode node = new ASTAllocateStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTAllocate = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTAllocate != null) node.hiddenTAllocate.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.allocationList = (IASTListNode<ASTAllocationNode>)valueStack.get(valueStackOffset + 3);
                    if (node.allocationList != null) node.allocationList.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 5);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleAllocationList717(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 7 with separator
                    ASTSeparatedListNode<ASTAllocationNode> list = new ASTSeparatedListNode<ASTAllocationNode>();
                    ASTAllocationNode elt = (ASTAllocationNode)valueStack.get(valueStackOffset + 0);
                    list.add(null, elt);
                    if (elt != null) elt.setParent(list);
                    return list;

        }
        public Object handleAllocationList718(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 8 with separator
                    ASTSeparatedListNode<ASTAllocationNode> list = (ASTSeparatedListNode<ASTAllocationNode>)valueStack.get(valueStackOffset);
                    org.eclipse.photran.internal.core.lexer.Token token = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    ASTAllocationNode elt = (ASTAllocationNode)valueStack.get(valueStackOffset + 2);
                    list.add(token, elt);
                    token.setParent(list);
                    if (elt != null) elt.setParent(list);
                    return list;

        }
        public Object handleAllocation719(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTAllocationNode node = new ASTAllocationNode();
                    node.allocateObject = (IASTListNode<ASTAllocateObjectNode>)valueStack.get(valueStackOffset + 0);
                    if (node.allocateObject != null) node.allocateObject.setParent(node);
                    return node;

        }
        public Object handleAllocation720(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTAllocationNode node = new ASTAllocationNode();
                    node.allocateObject = (IASTListNode<ASTAllocateObjectNode>)valueStack.get(valueStackOffset + 0);
                    if (node.allocateObject != null) node.allocateObject.setParent(node);
                    node.hasAllocatedShape = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("hasAllocatedShape");
                    if (node.hasAllocatedShape != null) node.hasAllocatedShape.setParent(node);
                    node.sectionSubscriptList = (IASTListNode<ASTSectionSubscriptNode>)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("sectionSubscriptList");
                    if (node.sectionSubscriptList != null) node.sectionSubscriptList.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("hiddenTRparen");
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    node.hiddenTLbracket = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("hiddenTLbracket");
                    if (node.hiddenTLbracket != null) node.hiddenTLbracket.setParent(node);
                    node.allocateCoarraySpec = (ASTAllocateCoarraySpecNode)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("allocateCoarraySpec");
                    if (node.allocateCoarraySpec != null) node.allocateCoarraySpec.setParent(node);
                    node.hiddenTRbracket = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("hiddenTRbracket");
                    if (node.hiddenTRbracket != null) node.hiddenTRbracket.setParent(node);
                    return node;

        }
        public Object handleAllocatedShape721(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 3 and 4
                    Map<String, Object> node = new HashMap<String, Object>();
                    node.put("hasAllocatedShape", (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0));
                    node.put("sectionSubscriptList", (IASTListNode<ASTSectionSubscriptNode>)valueStack.get(valueStackOffset + 1));
                    node.put("hiddenTRparen", (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2));
                    ASTListNode<IASTNode> embeddedList = new ASTListNode<IASTNode>();
                    embeddedList.add((IASTNode)(node.get("hasAllocatedShape")));
                    embeddedList.add((IASTNode)(node.get("sectionSubscriptList")));
                    embeddedList.add((IASTNode)(node.get("hiddenTRparen")));
                    embeddedList.add((IASTNode)(node.get("hiddenTLbracket")));
                    embeddedList.add((IASTNode)(node.get("allocateCoarraySpec")));
                    embeddedList.add((IASTNode)(node.get("hiddenTRbracket")));
                    node.put("errorRecoveryList", embeddedList);
                    return node;

        }
        public Object handleAllocatedShape722(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 3 and 4
                    Map<String, Object> node = new HashMap<String, Object>();
                    node.put("hasAllocatedShape", (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0));
                    node.put("sectionSubscriptList", (IASTListNode<ASTSectionSubscriptNode>)valueStack.get(valueStackOffset + 1));
                    node.put("hiddenTRparen", (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2));
                    node.put("hiddenTLbracket", (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3));
                    node.put("allocateCoarraySpec", (ASTAllocateCoarraySpecNode)valueStack.get(valueStackOffset + 4));
                    node.put("hiddenTRbracket", (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 5));
                    ASTListNode<IASTNode> embeddedList = new ASTListNode<IASTNode>();
                    embeddedList.add((IASTNode)(node.get("hasAllocatedShape")));
                    embeddedList.add((IASTNode)(node.get("sectionSubscriptList")));
                    embeddedList.add((IASTNode)(node.get("hiddenTRparen")));
                    embeddedList.add((IASTNode)(node.get("hiddenTLbracket")));
                    embeddedList.add((IASTNode)(node.get("allocateCoarraySpec")));
                    embeddedList.add((IASTNode)(node.get("hiddenTRbracket")));
                    node.put("errorRecoveryList", embeddedList);
                    return node;

        }
        public Object handleAllocatedShape723(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 3 and 4
                    Map<String, Object> node = new HashMap<String, Object>();
                    node.put("hiddenTLbracket", (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0));
                    node.put("allocateCoarraySpec", (ASTAllocateCoarraySpecNode)valueStack.get(valueStackOffset + 1));
                    node.put("hiddenTRbracket", (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2));
                    ASTListNode<IASTNode> embeddedList = new ASTListNode<IASTNode>();
                    embeddedList.add((IASTNode)(node.get("hasAllocatedShape")));
                    embeddedList.add((IASTNode)(node.get("sectionSubscriptList")));
                    embeddedList.add((IASTNode)(node.get("hiddenTRparen")));
                    embeddedList.add((IASTNode)(node.get("hiddenTLbracket")));
                    embeddedList.add((IASTNode)(node.get("allocateCoarraySpec")));
                    embeddedList.add((IASTNode)(node.get("hiddenTRbracket")));
                    node.put("errorRecoveryList", embeddedList);
                    return node;

        }
        public Object handleAllocateObjectList724(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 7 with separator
                    ASTSeparatedListNode<IASTListNode<ASTAllocateObjectNode>> list = new ASTSeparatedListNode<IASTListNode<ASTAllocateObjectNode>>();
                    IASTListNode<ASTAllocateObjectNode> elt = (IASTListNode<ASTAllocateObjectNode>)valueStack.get(valueStackOffset + 0);
                    list.add(null, elt);
                    if (elt != null) elt.setParent(list);
                    return list;

        }
        public Object handleAllocateObjectList725(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 8 with separator
                    ASTSeparatedListNode<IASTListNode<ASTAllocateObjectNode>> list = (ASTSeparatedListNode<IASTListNode<ASTAllocateObjectNode>>)valueStack.get(valueStackOffset);
                    org.eclipse.photran.internal.core.lexer.Token token = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    IASTListNode<ASTAllocateObjectNode> elt = (IASTListNode<ASTAllocateObjectNode>)valueStack.get(valueStackOffset + 2);
                    list.add(token, elt);
                    token.setParent(list);
                    if (elt != null) elt.setParent(list);
                    return list;

        }
        public Object handleAllocateObject726(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 10
                    ASTAllocateObjectNode node = new ASTAllocateObjectNode();
                    ASTVariableNameNode tmp0 = new ASTVariableNameNode();
                    tmp0.variableName = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("variableName");
                    if (tmp0.variableName != null) tmp0.variableName.setParent(tmp0);
                    node.variableName = tmp0;
                    if (tmp0 != null) tmp0.setParent(node);
                    ASTListNode<ASTAllocateObjectNode> list = new ASTListNode<ASTAllocateObjectNode>();
                    list.add(node);
                    node.setParent(list);
                    return list;

        }
        public Object handleAllocateObject727(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 11
                    ASTAllocateObjectNode node = new ASTAllocateObjectNode();
                    node.fieldSelector = (ASTFieldSelectorNode)valueStack.get(valueStackOffset + 1);
                    if (node.fieldSelector != null) node.fieldSelector.setParent(node);
                    ASTListNode<ASTAllocateObjectNode> list = (ASTListNode<ASTAllocateObjectNode>)valueStack.get(valueStackOffset);
                    list.add(node);
                    node.setParent(list);
                    return list;

        }
        public Object handleAllocateCoarraySpec728(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTAllocateCoarraySpecNode node = new ASTAllocateCoarraySpecNode();
                    node.sectionSubscriptList = (IASTListNode<ASTSectionSubscriptNode>)valueStack.get(valueStackOffset + 0);
                    if (node.sectionSubscriptList != null) node.sectionSubscriptList.setParent(node);
                    node.hiddenTComma = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTComma != null) node.hiddenTComma.setParent(node);
                    node.lb = (IExpr)valueStack.get(valueStackOffset + 2);
                    if (node.lb != null) node.lb.setParent(node);
                    node.hiddenTColon = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTColon != null) node.hiddenTColon.setParent(node);
                    node.isAsterisk = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.isAsterisk != null) node.isAsterisk.setParent(node);
                    return node;

        }
        public Object handleAllocateCoarraySpec729(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTAllocateCoarraySpecNode node = new ASTAllocateCoarraySpecNode();
                    node.sectionSubscriptList = (IASTListNode<ASTSectionSubscriptNode>)valueStack.get(valueStackOffset + 0);
                    if (node.sectionSubscriptList != null) node.sectionSubscriptList.setParent(node);
                    node.hiddenTComma = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTComma != null) node.hiddenTComma.setParent(node);
                    node.isAsterisk = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.isAsterisk != null) node.isAsterisk.setParent(node);
                    return node;

        }
        public Object handleAllocateCoarraySpec730(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTAllocateCoarraySpecNode node = new ASTAllocateCoarraySpecNode();
                    node.lb = (IExpr)valueStack.get(valueStackOffset + 0);
                    if (node.lb != null) node.lb.setParent(node);
                    node.hiddenTColon = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTColon != null) node.hiddenTColon.setParent(node);
                    node.isAsterisk = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.isAsterisk != null) node.isAsterisk.setParent(node);
                    return node;

        }
        public Object handleAllocateCoarraySpec731(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTAllocateCoarraySpecNode node = new ASTAllocateCoarraySpecNode();
                    node.isAsterisk = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.isAsterisk != null) node.isAsterisk.setParent(node);
                    return node;

        }
        public Object handleImageSelector732(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTImageSelectorNode node = new ASTImageSelectorNode();
                    node.hiddenTLbracket = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.hiddenTLbracket != null) node.hiddenTLbracket.setParent(node);
                    node.sectionSubscriptList = (IASTListNode<ASTSectionSubscriptNode>)valueStack.get(valueStackOffset + 1);
                    if (node.sectionSubscriptList != null) node.sectionSubscriptList.setParent(node);
                    node.hiddenTRbracket = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTRbracket != null) node.hiddenTRbracket.setParent(node);
                    return node;

        }
        public Object handleNullifyStmt733(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTNullifyStmtNode node = new ASTNullifyStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTNullify = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTNullify != null) node.hiddenTNullify.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.pointerObjectList = (IASTListNode<ASTPointerObjectNode>)valueStack.get(valueStackOffset + 3);
                    if (node.pointerObjectList != null) node.pointerObjectList.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 5);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handlePointerObjectList734(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 7 with separator
                    ASTSeparatedListNode<ASTPointerObjectNode> list = new ASTSeparatedListNode<ASTPointerObjectNode>();
                    ASTPointerObjectNode elt = (ASTPointerObjectNode)valueStack.get(valueStackOffset + 0);
                    list.add(null, elt);
                    if (elt != null) elt.setParent(list);
                    return list;

        }
        public Object handlePointerObjectList735(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 8 with separator
                    ASTSeparatedListNode<ASTPointerObjectNode> list = (ASTSeparatedListNode<ASTPointerObjectNode>)valueStack.get(valueStackOffset);
                    org.eclipse.photran.internal.core.lexer.Token token = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    ASTPointerObjectNode elt = (ASTPointerObjectNode)valueStack.get(valueStackOffset + 2);
                    list.add(token, elt);
                    token.setParent(list);
                    if (elt != null) elt.setParent(list);
                    return list;

        }
        public Object handlePointerObject736(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTPointerObjectNode node = new ASTPointerObjectNode();
                    ASTNameNode tmp0 = new ASTNameNode();
                    tmp0.name = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("name");
                    if (tmp0.name != null) tmp0.name.setParent(tmp0);
                    node.name = tmp0;
                    if (tmp0 != null) tmp0.setParent(node);
                    return node;

        }
        public Object handlePointerObject737(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTPointerObjectNode node = new ASTPointerObjectNode();
                    node.pointerField = (IASTListNode<ASTPointerFieldNode>)valueStack.get(valueStackOffset + 0);
                    if (node.pointerField != null) node.pointerField.setParent(node);
                    return node;

        }
        public Object handlePointerField738(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 10
                    ASTPointerFieldNode node = new ASTPointerFieldNode();
                    ASTNameNode tmp0 = new ASTNameNode();
                    tmp0.name = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("name");
                    if (tmp0.name != null) tmp0.name.setParent(tmp0);
                    node.name = tmp0;
                    if (tmp0 != null) tmp0.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.SFExprList = (IASTListNode<ASTSFExprListNode>)valueStack.get(valueStackOffset + 2);
                    if (node.SFExprList != null) node.SFExprList.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    node.hasDerivedTypeComponentRef = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hasDerivedTypeComponentRef != null) node.hasDerivedTypeComponentRef.setParent(node);
                    ASTNameNode tmp5 = new ASTNameNode();
                    tmp5.name = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 5)).get("name");
                    if (tmp5.name != null) tmp5.name.setParent(tmp5);
                    node.componentName = tmp5;
                    if (tmp5 != null) tmp5.setParent(node);
                    ASTListNode<ASTPointerFieldNode> list = new ASTListNode<ASTPointerFieldNode>();
                    list.add(node);
                    node.setParent(list);
                    return list;

        }
        public Object handlePointerField739(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 10
                    ASTPointerFieldNode node = new ASTPointerFieldNode();
                    ASTNameNode tmp0 = new ASTNameNode();
                    tmp0.name = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("name");
                    if (tmp0.name != null) tmp0.name.setParent(tmp0);
                    node.name = tmp0;
                    if (tmp0 != null) tmp0.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.SFDummyArgNameList = (IASTListNode<ASTSFDummyArgNameListNode>)valueStack.get(valueStackOffset + 2);
                    if (node.SFDummyArgNameList != null) node.SFDummyArgNameList.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    node.hasDerivedTypeComponentRef = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hasDerivedTypeComponentRef != null) node.hasDerivedTypeComponentRef.setParent(node);
                    ASTNameNode tmp5 = new ASTNameNode();
                    tmp5.name = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 5)).get("name");
                    if (tmp5.name != null) tmp5.name.setParent(tmp5);
                    node.componentName = tmp5;
                    if (tmp5 != null) tmp5.setParent(node);
                    ASTListNode<ASTPointerFieldNode> list = new ASTListNode<ASTPointerFieldNode>();
                    list.add(node);
                    node.setParent(list);
                    return list;

        }
        public Object handlePointerField740(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 10
                    ASTPointerFieldNode node = new ASTPointerFieldNode();
                    ASTNameNode tmp0 = new ASTNameNode();
                    tmp0.name = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("name");
                    if (tmp0.name != null) tmp0.name.setParent(tmp0);
                    node.name = tmp0;
                    if (tmp0 != null) tmp0.setParent(node);
                    node.hasDerivedTypeComponentRef = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hasDerivedTypeComponentRef != null) node.hasDerivedTypeComponentRef.setParent(node);
                    ASTNameNode tmp2 = new ASTNameNode();
                    tmp2.name = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 2)).get("name");
                    if (tmp2.name != null) tmp2.name.setParent(tmp2);
                    node.componentName = tmp2;
                    if (tmp2 != null) tmp2.setParent(node);
                    ASTListNode<ASTPointerFieldNode> list = new ASTListNode<ASTPointerFieldNode>();
                    list.add(node);
                    node.setParent(list);
                    return list;

        }
        public Object handlePointerField741(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 11
                    ASTPointerFieldNode node = new ASTPointerFieldNode();
                    node.fieldSelector = (ASTFieldSelectorNode)valueStack.get(valueStackOffset + 1);
                    if (node.fieldSelector != null) node.fieldSelector.setParent(node);
                    ASTListNode<ASTPointerFieldNode> list = (ASTListNode<ASTPointerFieldNode>)valueStack.get(valueStackOffset);
                    list.add(node);
                    node.setParent(list);
                    return list;

        }
        public Object handlePointerField742(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 10
                    ASTPointerFieldNode node = new ASTPointerFieldNode();
                    ASTNameNode tmp0 = new ASTNameNode();
                    tmp0.name = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("name");
                    if (tmp0.name != null) tmp0.name.setParent(tmp0);
                    node.name = tmp0;
                    if (tmp0 != null) tmp0.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.SFExprList = (IASTListNode<ASTSFExprListNode>)valueStack.get(valueStackOffset + 2);
                    if (node.SFExprList != null) node.SFExprList.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    node.imageSelector = (ASTImageSelectorNode)valueStack.get(valueStackOffset + 4);
                    if (node.imageSelector != null) node.imageSelector.setParent(node);
                    node.hasDerivedTypeComponentRef = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 5);
                    if (node.hasDerivedTypeComponentRef != null) node.hasDerivedTypeComponentRef.setParent(node);
                    ASTNameNode tmp6 = new ASTNameNode();
                    tmp6.name = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 6)).get("name");
                    if (tmp6.name != null) tmp6.name.setParent(tmp6);
                    node.componentName = tmp6;
                    if (tmp6 != null) tmp6.setParent(node);
                    ASTListNode<ASTPointerFieldNode> list = new ASTListNode<ASTPointerFieldNode>();
                    list.add(node);
                    node.setParent(list);
                    return list;

        }
        public Object handlePointerField743(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 10
                    ASTPointerFieldNode node = new ASTPointerFieldNode();
                    ASTNameNode tmp0 = new ASTNameNode();
                    tmp0.name = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("name");
                    if (tmp0.name != null) tmp0.name.setParent(tmp0);
                    node.name = tmp0;
                    if (tmp0 != null) tmp0.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.SFDummyArgNameList = (IASTListNode<ASTSFDummyArgNameListNode>)valueStack.get(valueStackOffset + 2);
                    if (node.SFDummyArgNameList != null) node.SFDummyArgNameList.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    node.imageSelector = (ASTImageSelectorNode)valueStack.get(valueStackOffset + 4);
                    if (node.imageSelector != null) node.imageSelector.setParent(node);
                    node.hasDerivedTypeComponentRef = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 5);
                    if (node.hasDerivedTypeComponentRef != null) node.hasDerivedTypeComponentRef.setParent(node);
                    ASTNameNode tmp6 = new ASTNameNode();
                    tmp6.name = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 6)).get("name");
                    if (tmp6.name != null) tmp6.name.setParent(tmp6);
                    node.componentName = tmp6;
                    if (tmp6 != null) tmp6.setParent(node);
                    ASTListNode<ASTPointerFieldNode> list = new ASTListNode<ASTPointerFieldNode>();
                    list.add(node);
                    node.setParent(list);
                    return list;

        }
        public Object handlePointerField744(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 10
                    ASTPointerFieldNode node = new ASTPointerFieldNode();
                    ASTNameNode tmp0 = new ASTNameNode();
                    tmp0.name = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("name");
                    if (tmp0.name != null) tmp0.name.setParent(tmp0);
                    node.name = tmp0;
                    if (tmp0 != null) tmp0.setParent(node);
                    node.imageSelector = (ASTImageSelectorNode)valueStack.get(valueStackOffset + 1);
                    if (node.imageSelector != null) node.imageSelector.setParent(node);
                    node.hasDerivedTypeComponentRef = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hasDerivedTypeComponentRef != null) node.hasDerivedTypeComponentRef.setParent(node);
                    ASTNameNode tmp3 = new ASTNameNode();
                    tmp3.name = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 3)).get("name");
                    if (tmp3.name != null) tmp3.name.setParent(tmp3);
                    node.componentName = tmp3;
                    if (tmp3 != null) tmp3.setParent(node);
                    ASTListNode<ASTPointerFieldNode> list = new ASTListNode<ASTPointerFieldNode>();
                    list.add(node);
                    node.setParent(list);
                    return list;

        }
        public Object handleDeallocateStmt745(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTDeallocateStmtNode node = new ASTDeallocateStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTDeallocate = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTDeallocate != null) node.hiddenTDeallocate.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.allocateObjectList = (IASTListNode<IASTListNode<ASTAllocateObjectNode>>)valueStack.get(valueStackOffset + 3);
                    if (node.allocateObjectList != null) node.allocateObjectList.setParent(node);
                    node.hiddenTComma = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenTComma != null) node.hiddenTComma.setParent(node);
                    node.hiddenTStateq = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 5);
                    if (node.hiddenTStateq != null) node.hiddenTStateq.setParent(node);
                    node.statusVariable = (ASTVariableNode)valueStack.get(valueStackOffset + 6);
                    if (node.statusVariable != null) node.statusVariable.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 7);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 8);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleDeallocateStmt746(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTDeallocateStmtNode node = new ASTDeallocateStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTDeallocate = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTDeallocate != null) node.hiddenTDeallocate.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.allocateObjectList = (IASTListNode<IASTListNode<ASTAllocateObjectNode>>)valueStack.get(valueStackOffset + 3);
                    if (node.allocateObjectList != null) node.allocateObjectList.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 5);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handlePrimary747(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 5
                    ASTLogicalConstNode result = (ASTLogicalConstNode)valueStack.get(valueStackOffset + 0);
                    return result;

        }
        public Object handlePrimary748(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTStringConstNode node = new ASTStringConstNode();
                    node.stringConst = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.stringConst != null) node.stringConst.setParent(node);
                    return node;

        }
        public Object handlePrimary749(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 5
                    IUnsignedArithmeticConst result = (IUnsignedArithmeticConst)valueStack.get(valueStackOffset + 0);
                    return result;

        }
        public Object handlePrimary750(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 5
                    ASTArrayConstructorNode result = (ASTArrayConstructorNode)valueStack.get(valueStackOffset + 0);
                    return result;

        }
        public Object handlePrimary751(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTVarOrFnRefNode node = new ASTVarOrFnRefNode();
                    ASTNameNode tmp0 = new ASTNameNode();
                    tmp0.name = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("name");
                    if (tmp0.name != null) tmp0.name.setParent(tmp0);
                    node.name = tmp0;
                    if (tmp0 != null) tmp0.setParent(node);
                    return node;

        }
        public Object handlePrimary752(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTVarOrFnRefNode node = new ASTVarOrFnRefNode();
                    ASTNameNode tmp0 = new ASTNameNode();
                    tmp0.name = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("name");
                    if (tmp0.name != null) tmp0.name.setParent(tmp0);
                    node.name = tmp0;
                    if (tmp0 != null) tmp0.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.primarySectionSubscriptList = (IASTListNode<ASTSectionSubscriptNode>)valueStack.get(valueStackOffset + 2);
                    if (node.primarySectionSubscriptList != null) node.primarySectionSubscriptList.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    return node;

        }
        public Object handlePrimary753(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTVarOrFnRefNode node = new ASTVarOrFnRefNode();
                    ASTNameNode tmp0 = new ASTNameNode();
                    tmp0.name = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("name");
                    if (tmp0.name != null) tmp0.name.setParent(tmp0);
                    node.name = tmp0;
                    if (tmp0 != null) tmp0.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.primarySectionSubscriptList = (IASTListNode<ASTSectionSubscriptNode>)valueStack.get(valueStackOffset + 2);
                    if (node.primarySectionSubscriptList != null) node.primarySectionSubscriptList.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    node.substringRange2 = (ASTSubstringRangeNode)valueStack.get(valueStackOffset + 4);
                    if (node.substringRange2 != null) node.substringRange2.setParent(node);
                    return node;

        }
        public Object handlePrimary754(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTVarOrFnRefNode node = new ASTVarOrFnRefNode();
                    ASTNameNode tmp0 = new ASTNameNode();
                    tmp0.name = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("name");
                    if (tmp0.name != null) tmp0.name.setParent(tmp0);
                    node.name = tmp0;
                    if (tmp0 != null) tmp0.setParent(node);
                    node.hiddenTPercent = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTPercent != null) node.hiddenTPercent.setParent(node);
                    node.derivedTypeComponentRef = (IASTListNode<ASTDataRefNode>)valueStack.get(valueStackOffset + 2);
                    if (node.derivedTypeComponentRef != null) node.derivedTypeComponentRef.setParent(node);
                    return node;

        }
        public Object handlePrimary755(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTVarOrFnRefNode node = new ASTVarOrFnRefNode();
                    ASTNameNode tmp0 = new ASTNameNode();
                    tmp0.name = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("name");
                    if (tmp0.name != null) tmp0.name.setParent(tmp0);
                    node.name = tmp0;
                    if (tmp0 != null) tmp0.setParent(node);
                    node.hiddenTPercent = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTPercent != null) node.hiddenTPercent.setParent(node);
                    node.derivedTypeComponentRef = (IASTListNode<ASTDataRefNode>)valueStack.get(valueStackOffset + 2);
                    if (node.derivedTypeComponentRef != null) node.derivedTypeComponentRef.setParent(node);
                    node.hiddenLparen2 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenLparen2 != null) node.hiddenLparen2.setParent(node);
                    node.hiddenRparen2 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenRparen2 != null) node.hiddenRparen2.setParent(node);
                    return node;

        }
        public Object handlePrimary756(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTVarOrFnRefNode node = new ASTVarOrFnRefNode();
                    ASTNameNode tmp0 = new ASTNameNode();
                    tmp0.name = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("name");
                    if (tmp0.name != null) tmp0.name.setParent(tmp0);
                    node.name = tmp0;
                    if (tmp0 != null) tmp0.setParent(node);
                    node.hiddenTPercent = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTPercent != null) node.hiddenTPercent.setParent(node);
                    node.derivedTypeComponentRef = (IASTListNode<ASTDataRefNode>)valueStack.get(valueStackOffset + 2);
                    if (node.derivedTypeComponentRef != null) node.derivedTypeComponentRef.setParent(node);
                    node.hiddenLparen2 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenLparen2 != null) node.hiddenLparen2.setParent(node);
                    node.componentSectionSubscriptList = (IASTListNode<ASTSectionSubscriptNode>)valueStack.get(valueStackOffset + 4);
                    if (node.componentSectionSubscriptList != null) node.componentSectionSubscriptList.setParent(node);
                    node.hiddenRparen2 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 5);
                    if (node.hiddenRparen2 != null) node.hiddenRparen2.setParent(node);
                    return node;

        }
        public Object handlePrimary757(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTVarOrFnRefNode node = new ASTVarOrFnRefNode();
                    ASTNameNode tmp0 = new ASTNameNode();
                    tmp0.name = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("name");
                    if (tmp0.name != null) tmp0.name.setParent(tmp0);
                    node.name = tmp0;
                    if (tmp0 != null) tmp0.setParent(node);
                    node.hiddenTPercent = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTPercent != null) node.hiddenTPercent.setParent(node);
                    node.derivedTypeComponentRef = (IASTListNode<ASTDataRefNode>)valueStack.get(valueStackOffset + 2);
                    if (node.derivedTypeComponentRef != null) node.derivedTypeComponentRef.setParent(node);
                    node.hiddenLparen2 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenLparen2 != null) node.hiddenLparen2.setParent(node);
                    node.componentSectionSubscriptList = (IASTListNode<ASTSectionSubscriptNode>)valueStack.get(valueStackOffset + 4);
                    if (node.componentSectionSubscriptList != null) node.componentSectionSubscriptList.setParent(node);
                    node.hiddenRparen2 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 5);
                    if (node.hiddenRparen2 != null) node.hiddenRparen2.setParent(node);
                    node.substringRange2 = (ASTSubstringRangeNode)valueStack.get(valueStackOffset + 6);
                    if (node.substringRange2 != null) node.substringRange2.setParent(node);
                    return node;

        }
        public Object handlePrimary758(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTVarOrFnRefNode node = new ASTVarOrFnRefNode();
                    ASTNameNode tmp0 = new ASTNameNode();
                    tmp0.name = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("name");
                    if (tmp0.name != null) tmp0.name.setParent(tmp0);
                    node.name = tmp0;
                    if (tmp0 != null) tmp0.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.primarySectionSubscriptList = (IASTListNode<ASTSectionSubscriptNode>)valueStack.get(valueStackOffset + 2);
                    if (node.primarySectionSubscriptList != null) node.primarySectionSubscriptList.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    node.hiddenTPercent = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenTPercent != null) node.hiddenTPercent.setParent(node);
                    node.derivedTypeComponentRef = (IASTListNode<ASTDataRefNode>)valueStack.get(valueStackOffset + 5);
                    if (node.derivedTypeComponentRef != null) node.derivedTypeComponentRef.setParent(node);
                    return node;

        }
        public Object handlePrimary759(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTVarOrFnRefNode node = new ASTVarOrFnRefNode();
                    ASTNameNode tmp0 = new ASTNameNode();
                    tmp0.name = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("name");
                    if (tmp0.name != null) tmp0.name.setParent(tmp0);
                    node.name = tmp0;
                    if (tmp0 != null) tmp0.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.primarySectionSubscriptList = (IASTListNode<ASTSectionSubscriptNode>)valueStack.get(valueStackOffset + 2);
                    if (node.primarySectionSubscriptList != null) node.primarySectionSubscriptList.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    node.hiddenTPercent = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenTPercent != null) node.hiddenTPercent.setParent(node);
                    node.derivedTypeComponentRef = (IASTListNode<ASTDataRefNode>)valueStack.get(valueStackOffset + 5);
                    if (node.derivedTypeComponentRef != null) node.derivedTypeComponentRef.setParent(node);
                    node.hiddenLparen2 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 6);
                    if (node.hiddenLparen2 != null) node.hiddenLparen2.setParent(node);
                    node.componentSectionSubscriptList = (IASTListNode<ASTSectionSubscriptNode>)valueStack.get(valueStackOffset + 7);
                    if (node.componentSectionSubscriptList != null) node.componentSectionSubscriptList.setParent(node);
                    node.hiddenRparen2 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 8);
                    if (node.hiddenRparen2 != null) node.hiddenRparen2.setParent(node);
                    return node;

        }
        public Object handlePrimary760(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTVarOrFnRefNode node = new ASTVarOrFnRefNode();
                    ASTNameNode tmp0 = new ASTNameNode();
                    tmp0.name = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("name");
                    if (tmp0.name != null) tmp0.name.setParent(tmp0);
                    node.name = tmp0;
                    if (tmp0 != null) tmp0.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.primarySectionSubscriptList = (IASTListNode<ASTSectionSubscriptNode>)valueStack.get(valueStackOffset + 2);
                    if (node.primarySectionSubscriptList != null) node.primarySectionSubscriptList.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    node.hiddenTPercent = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenTPercent != null) node.hiddenTPercent.setParent(node);
                    node.derivedTypeComponentRef = (IASTListNode<ASTDataRefNode>)valueStack.get(valueStackOffset + 5);
                    if (node.derivedTypeComponentRef != null) node.derivedTypeComponentRef.setParent(node);
                    node.hiddenLparen2 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 6);
                    if (node.hiddenLparen2 != null) node.hiddenLparen2.setParent(node);
                    node.componentSectionSubscriptList = (IASTListNode<ASTSectionSubscriptNode>)valueStack.get(valueStackOffset + 7);
                    if (node.componentSectionSubscriptList != null) node.componentSectionSubscriptList.setParent(node);
                    node.hiddenRparen2 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 8);
                    if (node.hiddenRparen2 != null) node.hiddenRparen2.setParent(node);
                    node.substringRange2 = (ASTSubstringRangeNode)valueStack.get(valueStackOffset + 9);
                    if (node.substringRange2 != null) node.substringRange2.setParent(node);
                    return node;

        }
        public Object handlePrimary761(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTVarOrFnRefNode node = new ASTVarOrFnRefNode();
                    node.name = (ASTNameNode)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("name");
                    if (node.name != null) node.name.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("hiddenTLparen");
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.functionArgList = (IASTListNode<ASTFunctionArgListNode>)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("functionArgList");
                    if (node.functionArgList != null) node.functionArgList.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("hiddenTRparen");
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    return node;

        }
        public Object handlePrimary762(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTVarOrFnRefNode node = new ASTVarOrFnRefNode();
                    node.name = (ASTNameNode)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("name");
                    if (node.name != null) node.name.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("hiddenTLparen");
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.functionArgList = (IASTListNode<ASTFunctionArgListNode>)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("functionArgList");
                    if (node.functionArgList != null) node.functionArgList.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("hiddenTRparen");
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    node.substringRange = (ASTSubstringRangeNode)valueStack.get(valueStackOffset + 1);
                    if (node.substringRange != null) node.substringRange.setParent(node);
                    return node;

        }
        public Object handlePrimary763(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTVarOrFnRefNode node = new ASTVarOrFnRefNode();
                    node.name = (ASTNameNode)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("name");
                    if (node.name != null) node.name.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("hiddenTLparen");
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.functionArgList = (IASTListNode<ASTFunctionArgListNode>)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("functionArgList");
                    if (node.functionArgList != null) node.functionArgList.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("hiddenTRparen");
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    node.hiddenTPercent = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTPercent != null) node.hiddenTPercent.setParent(node);
                    node.derivedTypeComponentRef = (IASTListNode<ASTDataRefNode>)valueStack.get(valueStackOffset + 2);
                    if (node.derivedTypeComponentRef != null) node.derivedTypeComponentRef.setParent(node);
                    return node;

        }
        public Object handlePrimary764(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTVarOrFnRefNode node = new ASTVarOrFnRefNode();
                    node.name = (ASTNameNode)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("name");
                    if (node.name != null) node.name.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("hiddenTLparen");
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.functionArgList = (IASTListNode<ASTFunctionArgListNode>)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("functionArgList");
                    if (node.functionArgList != null) node.functionArgList.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("hiddenTRparen");
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    node.hiddenTPercent = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTPercent != null) node.hiddenTPercent.setParent(node);
                    node.derivedTypeComponentRef = (IASTListNode<ASTDataRefNode>)valueStack.get(valueStackOffset + 2);
                    if (node.derivedTypeComponentRef != null) node.derivedTypeComponentRef.setParent(node);
                    node.hiddenLparen2 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenLparen2 != null) node.hiddenLparen2.setParent(node);
                    node.componentSectionSubscriptList = (IASTListNode<ASTSectionSubscriptNode>)valueStack.get(valueStackOffset + 4);
                    if (node.componentSectionSubscriptList != null) node.componentSectionSubscriptList.setParent(node);
                    node.hiddenRparen2 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 5);
                    if (node.hiddenRparen2 != null) node.hiddenRparen2.setParent(node);
                    return node;

        }
        public Object handlePrimary765(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTVarOrFnRefNode node = new ASTVarOrFnRefNode();
                    node.name = (ASTNameNode)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("name");
                    if (node.name != null) node.name.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("hiddenTLparen");
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.functionArgList = (IASTListNode<ASTFunctionArgListNode>)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("functionArgList");
                    if (node.functionArgList != null) node.functionArgList.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("hiddenTRparen");
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    node.hiddenTPercent = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTPercent != null) node.hiddenTPercent.setParent(node);
                    node.derivedTypeComponentRef = (IASTListNode<ASTDataRefNode>)valueStack.get(valueStackOffset + 2);
                    if (node.derivedTypeComponentRef != null) node.derivedTypeComponentRef.setParent(node);
                    node.hiddenLparen2 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenLparen2 != null) node.hiddenLparen2.setParent(node);
                    node.componentSectionSubscriptList = (IASTListNode<ASTSectionSubscriptNode>)valueStack.get(valueStackOffset + 4);
                    if (node.componentSectionSubscriptList != null) node.componentSectionSubscriptList.setParent(node);
                    node.hiddenRparen2 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 5);
                    if (node.hiddenRparen2 != null) node.hiddenRparen2.setParent(node);
                    node.substringRange2 = (ASTSubstringRangeNode)valueStack.get(valueStackOffset + 6);
                    if (node.substringRange2 != null) node.substringRange2.setParent(node);
                    return node;

        }
        public Object handlePrimary766(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTNestedExprNode node = new ASTNestedExprNode();
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.expr = (IExpr)valueStack.get(valueStackOffset + 1);
                    if (node.expr != null) node.expr.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    return node;

        }
        public Object handlePrimary767(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTStringConstNode node = new ASTStringConstNode();
                    node.stringConst = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("stringConst");
                    if (node.stringConst != null) node.stringConst.setParent(node);
                    node.substringRange = (ASTSubstringRangeNode)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("substringRange");
                    if (node.substringRange != null) node.substringRange.setParent(node);
                    return node;

        }
        public Object handlePrimary768(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTVarOrFnRefNode node = new ASTVarOrFnRefNode();
                    ASTNameNode tmp0 = new ASTNameNode();
                    tmp0.name = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("name");
                    if (tmp0.name != null) tmp0.name.setParent(tmp0);
                    node.name = tmp0;
                    if (tmp0 != null) tmp0.setParent(node);
                    node.imageSelector = (ASTImageSelectorNode)valueStack.get(valueStackOffset + 1);
                    if (node.imageSelector != null) node.imageSelector.setParent(node);
                    return node;

        }
        public Object handlePrimary769(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTVarOrFnRefNode node = new ASTVarOrFnRefNode();
                    ASTNameNode tmp0 = new ASTNameNode();
                    tmp0.name = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("name");
                    if (tmp0.name != null) tmp0.name.setParent(tmp0);
                    node.name = tmp0;
                    if (tmp0 != null) tmp0.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.primarySectionSubscriptList = (IASTListNode<ASTSectionSubscriptNode>)valueStack.get(valueStackOffset + 2);
                    if (node.primarySectionSubscriptList != null) node.primarySectionSubscriptList.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    node.imageSelector = (ASTImageSelectorNode)valueStack.get(valueStackOffset + 4);
                    if (node.imageSelector != null) node.imageSelector.setParent(node);
                    return node;

        }
        public Object handlePrimary770(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTVarOrFnRefNode node = new ASTVarOrFnRefNode();
                    ASTNameNode tmp0 = new ASTNameNode();
                    tmp0.name = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("name");
                    if (tmp0.name != null) tmp0.name.setParent(tmp0);
                    node.name = tmp0;
                    if (tmp0 != null) tmp0.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.primarySectionSubscriptList = (IASTListNode<ASTSectionSubscriptNode>)valueStack.get(valueStackOffset + 2);
                    if (node.primarySectionSubscriptList != null) node.primarySectionSubscriptList.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    node.imageSelector = (ASTImageSelectorNode)valueStack.get(valueStackOffset + 4);
                    if (node.imageSelector != null) node.imageSelector.setParent(node);
                    node.substringRange2 = (ASTSubstringRangeNode)valueStack.get(valueStackOffset + 5);
                    if (node.substringRange2 != null) node.substringRange2.setParent(node);
                    return node;

        }
        public Object handlePrimary771(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTVarOrFnRefNode node = new ASTVarOrFnRefNode();
                    ASTNameNode tmp0 = new ASTNameNode();
                    tmp0.name = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("name");
                    if (tmp0.name != null) tmp0.name.setParent(tmp0);
                    node.name = tmp0;
                    if (tmp0 != null) tmp0.setParent(node);
                    node.imageSelector = (ASTImageSelectorNode)valueStack.get(valueStackOffset + 1);
                    if (node.imageSelector != null) node.imageSelector.setParent(node);
                    node.hiddenHiddenPercent2 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenHiddenPercent2 != null) node.hiddenHiddenPercent2.setParent(node);
                    node.derivedTypeComponentRef = (IASTListNode<ASTDataRefNode>)valueStack.get(valueStackOffset + 3);
                    if (node.derivedTypeComponentRef != null) node.derivedTypeComponentRef.setParent(node);
                    return node;

        }
        public Object handlePrimary772(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTVarOrFnRefNode node = new ASTVarOrFnRefNode();
                    ASTNameNode tmp0 = new ASTNameNode();
                    tmp0.name = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("name");
                    if (tmp0.name != null) tmp0.name.setParent(tmp0);
                    node.name = tmp0;
                    if (tmp0 != null) tmp0.setParent(node);
                    node.imageSelector = (ASTImageSelectorNode)valueStack.get(valueStackOffset + 1);
                    if (node.imageSelector != null) node.imageSelector.setParent(node);
                    node.hiddenHiddenPercent2 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenHiddenPercent2 != null) node.hiddenHiddenPercent2.setParent(node);
                    node.derivedTypeComponentRef = (IASTListNode<ASTDataRefNode>)valueStack.get(valueStackOffset + 3);
                    if (node.derivedTypeComponentRef != null) node.derivedTypeComponentRef.setParent(node);
                    node.hiddenLparen2 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenLparen2 != null) node.hiddenLparen2.setParent(node);
                    node.hiddenRparen2 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 5);
                    if (node.hiddenRparen2 != null) node.hiddenRparen2.setParent(node);
                    return node;

        }
        public Object handlePrimary773(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTVarOrFnRefNode node = new ASTVarOrFnRefNode();
                    ASTNameNode tmp0 = new ASTNameNode();
                    tmp0.name = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("name");
                    if (tmp0.name != null) tmp0.name.setParent(tmp0);
                    node.name = tmp0;
                    if (tmp0 != null) tmp0.setParent(node);
                    node.imageSelector = (ASTImageSelectorNode)valueStack.get(valueStackOffset + 1);
                    if (node.imageSelector != null) node.imageSelector.setParent(node);
                    node.hiddenHiddenPercent2 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenHiddenPercent2 != null) node.hiddenHiddenPercent2.setParent(node);
                    node.derivedTypeComponentRef = (IASTListNode<ASTDataRefNode>)valueStack.get(valueStackOffset + 3);
                    if (node.derivedTypeComponentRef != null) node.derivedTypeComponentRef.setParent(node);
                    node.hiddenLparen2 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenLparen2 != null) node.hiddenLparen2.setParent(node);
                    node.componentSectionSubscriptList = (IASTListNode<ASTSectionSubscriptNode>)valueStack.get(valueStackOffset + 5);
                    if (node.componentSectionSubscriptList != null) node.componentSectionSubscriptList.setParent(node);
                    node.hiddenRparen2 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 6);
                    if (node.hiddenRparen2 != null) node.hiddenRparen2.setParent(node);
                    return node;

        }
        public Object handlePrimary774(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTVarOrFnRefNode node = new ASTVarOrFnRefNode();
                    ASTNameNode tmp0 = new ASTNameNode();
                    tmp0.name = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("name");
                    if (tmp0.name != null) tmp0.name.setParent(tmp0);
                    node.name = tmp0;
                    if (tmp0 != null) tmp0.setParent(node);
                    node.imageSelector = (ASTImageSelectorNode)valueStack.get(valueStackOffset + 1);
                    if (node.imageSelector != null) node.imageSelector.setParent(node);
                    node.hiddenHiddenPercent2 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenHiddenPercent2 != null) node.hiddenHiddenPercent2.setParent(node);
                    node.derivedTypeComponentRef = (IASTListNode<ASTDataRefNode>)valueStack.get(valueStackOffset + 3);
                    if (node.derivedTypeComponentRef != null) node.derivedTypeComponentRef.setParent(node);
                    node.hiddenLparen2 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenLparen2 != null) node.hiddenLparen2.setParent(node);
                    node.componentSectionSubscriptList = (IASTListNode<ASTSectionSubscriptNode>)valueStack.get(valueStackOffset + 5);
                    if (node.componentSectionSubscriptList != null) node.componentSectionSubscriptList.setParent(node);
                    node.hiddenRparen2 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 6);
                    if (node.hiddenRparen2 != null) node.hiddenRparen2.setParent(node);
                    node.substringRange2 = (ASTSubstringRangeNode)valueStack.get(valueStackOffset + 7);
                    if (node.substringRange2 != null) node.substringRange2.setParent(node);
                    return node;

        }
        public Object handlePrimary775(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTVarOrFnRefNode node = new ASTVarOrFnRefNode();
                    ASTNameNode tmp0 = new ASTNameNode();
                    tmp0.name = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("name");
                    if (tmp0.name != null) tmp0.name.setParent(tmp0);
                    node.name = tmp0;
                    if (tmp0 != null) tmp0.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.primarySectionSubscriptList = (IASTListNode<ASTSectionSubscriptNode>)valueStack.get(valueStackOffset + 2);
                    if (node.primarySectionSubscriptList != null) node.primarySectionSubscriptList.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    node.imageSelector = (ASTImageSelectorNode)valueStack.get(valueStackOffset + 4);
                    if (node.imageSelector != null) node.imageSelector.setParent(node);
                    node.hiddenHiddenPercent2 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 5);
                    if (node.hiddenHiddenPercent2 != null) node.hiddenHiddenPercent2.setParent(node);
                    node.derivedTypeComponentRef = (IASTListNode<ASTDataRefNode>)valueStack.get(valueStackOffset + 6);
                    if (node.derivedTypeComponentRef != null) node.derivedTypeComponentRef.setParent(node);
                    return node;

        }
        public Object handlePrimary776(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTVarOrFnRefNode node = new ASTVarOrFnRefNode();
                    ASTNameNode tmp0 = new ASTNameNode();
                    tmp0.name = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("name");
                    if (tmp0.name != null) tmp0.name.setParent(tmp0);
                    node.name = tmp0;
                    if (tmp0 != null) tmp0.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.primarySectionSubscriptList = (IASTListNode<ASTSectionSubscriptNode>)valueStack.get(valueStackOffset + 2);
                    if (node.primarySectionSubscriptList != null) node.primarySectionSubscriptList.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    node.imageSelector = (ASTImageSelectorNode)valueStack.get(valueStackOffset + 4);
                    if (node.imageSelector != null) node.imageSelector.setParent(node);
                    node.hiddenHiddenPercent2 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 5);
                    if (node.hiddenHiddenPercent2 != null) node.hiddenHiddenPercent2.setParent(node);
                    node.derivedTypeComponentRef = (IASTListNode<ASTDataRefNode>)valueStack.get(valueStackOffset + 6);
                    if (node.derivedTypeComponentRef != null) node.derivedTypeComponentRef.setParent(node);
                    node.hiddenLparen2 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 7);
                    if (node.hiddenLparen2 != null) node.hiddenLparen2.setParent(node);
                    node.componentSectionSubscriptList = (IASTListNode<ASTSectionSubscriptNode>)valueStack.get(valueStackOffset + 8);
                    if (node.componentSectionSubscriptList != null) node.componentSectionSubscriptList.setParent(node);
                    node.hiddenRparen2 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 9);
                    if (node.hiddenRparen2 != null) node.hiddenRparen2.setParent(node);
                    return node;

        }
        public Object handlePrimary777(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTVarOrFnRefNode node = new ASTVarOrFnRefNode();
                    ASTNameNode tmp0 = new ASTNameNode();
                    tmp0.name = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("name");
                    if (tmp0.name != null) tmp0.name.setParent(tmp0);
                    node.name = tmp0;
                    if (tmp0 != null) tmp0.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.primarySectionSubscriptList = (IASTListNode<ASTSectionSubscriptNode>)valueStack.get(valueStackOffset + 2);
                    if (node.primarySectionSubscriptList != null) node.primarySectionSubscriptList.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    node.imageSelector = (ASTImageSelectorNode)valueStack.get(valueStackOffset + 4);
                    if (node.imageSelector != null) node.imageSelector.setParent(node);
                    node.hiddenHiddenPercent2 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 5);
                    if (node.hiddenHiddenPercent2 != null) node.hiddenHiddenPercent2.setParent(node);
                    node.derivedTypeComponentRef = (IASTListNode<ASTDataRefNode>)valueStack.get(valueStackOffset + 6);
                    if (node.derivedTypeComponentRef != null) node.derivedTypeComponentRef.setParent(node);
                    node.hiddenLparen2 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 7);
                    if (node.hiddenLparen2 != null) node.hiddenLparen2.setParent(node);
                    node.componentSectionSubscriptList = (IASTListNode<ASTSectionSubscriptNode>)valueStack.get(valueStackOffset + 8);
                    if (node.componentSectionSubscriptList != null) node.componentSectionSubscriptList.setParent(node);
                    node.hiddenRparen2 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 9);
                    if (node.hiddenRparen2 != null) node.hiddenRparen2.setParent(node);
                    node.substringRange2 = (ASTSubstringRangeNode)valueStack.get(valueStackOffset + 10);
                    if (node.substringRange2 != null) node.substringRange2.setParent(node);
                    return node;

        }
        public Object handlePrimary778(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTVarOrFnRefNode node = new ASTVarOrFnRefNode();
                    node.name = (ASTNameNode)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("name");
                    if (node.name != null) node.name.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("hiddenTLparen");
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.functionArgList = (IASTListNode<ASTFunctionArgListNode>)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("functionArgList");
                    if (node.functionArgList != null) node.functionArgList.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("hiddenTRparen");
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    node.imageSelector = (ASTImageSelectorNode)valueStack.get(valueStackOffset + 1);
                    if (node.imageSelector != null) node.imageSelector.setParent(node);
                    return node;

        }
        public Object handlePrimary779(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTVarOrFnRefNode node = new ASTVarOrFnRefNode();
                    node.name = (ASTNameNode)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("name");
                    if (node.name != null) node.name.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("hiddenTLparen");
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.functionArgList = (IASTListNode<ASTFunctionArgListNode>)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("functionArgList");
                    if (node.functionArgList != null) node.functionArgList.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("hiddenTRparen");
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    node.substringRange = (ASTSubstringRangeNode)valueStack.get(valueStackOffset + 1);
                    if (node.substringRange != null) node.substringRange.setParent(node);
                    node.imageSelector = (ASTImageSelectorNode)valueStack.get(valueStackOffset + 2);
                    if (node.imageSelector != null) node.imageSelector.setParent(node);
                    return node;

        }
        public Object handlePrimary780(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTVarOrFnRefNode node = new ASTVarOrFnRefNode();
                    node.name = (ASTNameNode)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("name");
                    if (node.name != null) node.name.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("hiddenTLparen");
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.functionArgList = (IASTListNode<ASTFunctionArgListNode>)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("functionArgList");
                    if (node.functionArgList != null) node.functionArgList.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("hiddenTRparen");
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    node.imageSelector = (ASTImageSelectorNode)valueStack.get(valueStackOffset + 1);
                    if (node.imageSelector != null) node.imageSelector.setParent(node);
                    node.hiddenHiddenPercent2 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenHiddenPercent2 != null) node.hiddenHiddenPercent2.setParent(node);
                    node.derivedTypeComponentRef = (IASTListNode<ASTDataRefNode>)valueStack.get(valueStackOffset + 3);
                    if (node.derivedTypeComponentRef != null) node.derivedTypeComponentRef.setParent(node);
                    return node;

        }
        public Object handlePrimary781(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTVarOrFnRefNode node = new ASTVarOrFnRefNode();
                    node.name = (ASTNameNode)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("name");
                    if (node.name != null) node.name.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("hiddenTLparen");
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.functionArgList = (IASTListNode<ASTFunctionArgListNode>)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("functionArgList");
                    if (node.functionArgList != null) node.functionArgList.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("hiddenTRparen");
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    node.imageSelector = (ASTImageSelectorNode)valueStack.get(valueStackOffset + 1);
                    if (node.imageSelector != null) node.imageSelector.setParent(node);
                    node.hiddenHiddenPercent2 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenHiddenPercent2 != null) node.hiddenHiddenPercent2.setParent(node);
                    node.derivedTypeComponentRef = (IASTListNode<ASTDataRefNode>)valueStack.get(valueStackOffset + 3);
                    if (node.derivedTypeComponentRef != null) node.derivedTypeComponentRef.setParent(node);
                    node.hiddenLparen2 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenLparen2 != null) node.hiddenLparen2.setParent(node);
                    node.componentSectionSubscriptList = (IASTListNode<ASTSectionSubscriptNode>)valueStack.get(valueStackOffset + 5);
                    if (node.componentSectionSubscriptList != null) node.componentSectionSubscriptList.setParent(node);
                    node.hiddenRparen2 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 6);
                    if (node.hiddenRparen2 != null) node.hiddenRparen2.setParent(node);
                    return node;

        }
        public Object handlePrimary782(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTVarOrFnRefNode node = new ASTVarOrFnRefNode();
                    node.name = (ASTNameNode)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("name");
                    if (node.name != null) node.name.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("hiddenTLparen");
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.functionArgList = (IASTListNode<ASTFunctionArgListNode>)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("functionArgList");
                    if (node.functionArgList != null) node.functionArgList.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("hiddenTRparen");
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    node.imageSelector = (ASTImageSelectorNode)valueStack.get(valueStackOffset + 1);
                    if (node.imageSelector != null) node.imageSelector.setParent(node);
                    node.hiddenHiddenPercent2 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenHiddenPercent2 != null) node.hiddenHiddenPercent2.setParent(node);
                    node.derivedTypeComponentRef = (IASTListNode<ASTDataRefNode>)valueStack.get(valueStackOffset + 3);
                    if (node.derivedTypeComponentRef != null) node.derivedTypeComponentRef.setParent(node);
                    node.hiddenLparen2 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenLparen2 != null) node.hiddenLparen2.setParent(node);
                    node.componentSectionSubscriptList = (IASTListNode<ASTSectionSubscriptNode>)valueStack.get(valueStackOffset + 5);
                    if (node.componentSectionSubscriptList != null) node.componentSectionSubscriptList.setParent(node);
                    node.hiddenRparen2 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 6);
                    if (node.hiddenRparen2 != null) node.hiddenRparen2.setParent(node);
                    node.substringRange2 = (ASTSubstringRangeNode)valueStack.get(valueStackOffset + 7);
                    if (node.substringRange2 != null) node.substringRange2.setParent(node);
                    return node;

        }
        public Object handleCPrimary783(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTCPrimaryNode node = new ASTCPrimaryNode();
                    node.name = (ASTNameNode)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("name");
                    if (node.name != null) node.name.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("hiddenTLparen");
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.functionArgList = (IASTListNode<ASTFunctionArgListNode>)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("functionArgList");
                    if (node.functionArgList != null) node.functionArgList.setParent(node);
                    node.stringConst = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("stringConst");
                    if (node.stringConst != null) node.stringConst.setParent(node);
                    node.primarySectionSubscriptList = (IASTListNode<ASTSectionSubscriptNode>)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("primarySectionSubscriptList");
                    if (node.primarySectionSubscriptList != null) node.primarySectionSubscriptList.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("hiddenTRparen");
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    node.imageSelector = (ASTImageSelectorNode)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("imageSelector");
                    if (node.imageSelector != null) node.imageSelector.setParent(node);
                    node.hiddenTPercent = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("hiddenTPercent");
                    if (node.hiddenTPercent != null) node.hiddenTPercent.setParent(node);
                    node.derivedTypeComponentRef = (IASTListNode<ASTDataRefNode>)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("derivedTypeComponentRef");
                    if (node.derivedTypeComponentRef != null) node.derivedTypeComponentRef.setParent(node);
                    node.hiddenLparen2 = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("hiddenLparen2");
                    if (node.hiddenLparen2 != null) node.hiddenLparen2.setParent(node);
                    node.componentSectionSubscriptList = (IASTListNode<ASTSectionSubscriptNode>)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("componentSectionSubscriptList");
                    if (node.componentSectionSubscriptList != null) node.componentSectionSubscriptList.setParent(node);
                    node.hiddenRparen2 = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("hiddenRparen2");
                    if (node.hiddenRparen2 != null) node.hiddenRparen2.setParent(node);
                    return node;

        }
        public Object handleCPrimary784(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTCPrimaryNode node = new ASTCPrimaryNode();
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.nestedExpression = (ASTCExprNode)valueStack.get(valueStackOffset + 1);
                    if (node.nestedExpression != null) node.nestedExpression.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    return node;

        }
        public Object handleCOperand785(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 3 and 4
                    Map<String, Object> node = new HashMap<String, Object>();
                    node.put("stringConst", (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0));
                    ASTListNode<IASTNode> embeddedList = new ASTListNode<IASTNode>();
                    embeddedList.add((IASTNode)(node.get("name")));
                    embeddedList.add((IASTNode)(node.get("hiddenTLparen")));
                    embeddedList.add((IASTNode)(node.get("functionArgList")));
                    embeddedList.add((IASTNode)(node.get("stringConst")));
                    embeddedList.add((IASTNode)(node.get("primarySectionSubscriptList")));
                    embeddedList.add((IASTNode)(node.get("hiddenTRparen")));
                    embeddedList.add((IASTNode)(node.get("imageSelector")));
                    embeddedList.add((IASTNode)(node.get("hiddenTPercent")));
                    embeddedList.add((IASTNode)(node.get("derivedTypeComponentRef")));
                    embeddedList.add((IASTNode)(node.get("hiddenLparen2")));
                    embeddedList.add((IASTNode)(node.get("componentSectionSubscriptList")));
                    embeddedList.add((IASTNode)(node.get("hiddenRparen2")));
                    node.put("errorRecoveryList", embeddedList);
                    return node;

        }
        public Object handleCOperand786(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 3 and 4
                    Map<String, Object> node = new HashMap<String, Object>();
                    ASTNameNode tmp0 = new ASTNameNode();
                    tmp0.name = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("name");
                    if (tmp0.name != null) tmp0.name.setParent(tmp0);
                    node.put("name", tmp0);
                    ASTListNode<IASTNode> embeddedList = new ASTListNode<IASTNode>();
                    embeddedList.add((IASTNode)(node.get("name")));
                    embeddedList.add((IASTNode)(node.get("hiddenTLparen")));
                    embeddedList.add((IASTNode)(node.get("functionArgList")));
                    embeddedList.add((IASTNode)(node.get("stringConst")));
                    embeddedList.add((IASTNode)(node.get("primarySectionSubscriptList")));
                    embeddedList.add((IASTNode)(node.get("hiddenTRparen")));
                    embeddedList.add((IASTNode)(node.get("imageSelector")));
                    embeddedList.add((IASTNode)(node.get("hiddenTPercent")));
                    embeddedList.add((IASTNode)(node.get("derivedTypeComponentRef")));
                    embeddedList.add((IASTNode)(node.get("hiddenLparen2")));
                    embeddedList.add((IASTNode)(node.get("componentSectionSubscriptList")));
                    embeddedList.add((IASTNode)(node.get("hiddenRparen2")));
                    node.put("errorRecoveryList", embeddedList);
                    return node;

        }
        public Object handleCOperand787(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 3 and 4
                    Map<String, Object> node = new HashMap<String, Object>();
                    ASTNameNode tmp0 = new ASTNameNode();
                    tmp0.name = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("name");
                    if (tmp0.name != null) tmp0.name.setParent(tmp0);
                    node.put("name", tmp0);
                    node.put("hiddenTLparen", (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1));
                    node.put("primarySectionSubscriptList", (IASTListNode<ASTSectionSubscriptNode>)valueStack.get(valueStackOffset + 2));
                    node.put("hiddenTRparen", (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3));
                    ASTListNode<IASTNode> embeddedList = new ASTListNode<IASTNode>();
                    embeddedList.add((IASTNode)(node.get("name")));
                    embeddedList.add((IASTNode)(node.get("hiddenTLparen")));
                    embeddedList.add((IASTNode)(node.get("functionArgList")));
                    embeddedList.add((IASTNode)(node.get("stringConst")));
                    embeddedList.add((IASTNode)(node.get("primarySectionSubscriptList")));
                    embeddedList.add((IASTNode)(node.get("hiddenTRparen")));
                    embeddedList.add((IASTNode)(node.get("imageSelector")));
                    embeddedList.add((IASTNode)(node.get("hiddenTPercent")));
                    embeddedList.add((IASTNode)(node.get("derivedTypeComponentRef")));
                    embeddedList.add((IASTNode)(node.get("hiddenLparen2")));
                    embeddedList.add((IASTNode)(node.get("componentSectionSubscriptList")));
                    embeddedList.add((IASTNode)(node.get("hiddenRparen2")));
                    node.put("errorRecoveryList", embeddedList);
                    return node;

        }
        public Object handleCOperand788(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 3 and 4
                    Map<String, Object> node = new HashMap<String, Object>();
                    ASTNameNode tmp0 = new ASTNameNode();
                    tmp0.name = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("name");
                    if (tmp0.name != null) tmp0.name.setParent(tmp0);
                    node.put("name", tmp0);
                    node.put("hiddenTPercent", (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1));
                    node.put("derivedTypeComponentRef", (IASTListNode<ASTDataRefNode>)valueStack.get(valueStackOffset + 2));
                    ASTListNode<IASTNode> embeddedList = new ASTListNode<IASTNode>();
                    embeddedList.add((IASTNode)(node.get("name")));
                    embeddedList.add((IASTNode)(node.get("hiddenTLparen")));
                    embeddedList.add((IASTNode)(node.get("functionArgList")));
                    embeddedList.add((IASTNode)(node.get("stringConst")));
                    embeddedList.add((IASTNode)(node.get("primarySectionSubscriptList")));
                    embeddedList.add((IASTNode)(node.get("hiddenTRparen")));
                    embeddedList.add((IASTNode)(node.get("imageSelector")));
                    embeddedList.add((IASTNode)(node.get("hiddenTPercent")));
                    embeddedList.add((IASTNode)(node.get("derivedTypeComponentRef")));
                    embeddedList.add((IASTNode)(node.get("hiddenLparen2")));
                    embeddedList.add((IASTNode)(node.get("componentSectionSubscriptList")));
                    embeddedList.add((IASTNode)(node.get("hiddenRparen2")));
                    node.put("errorRecoveryList", embeddedList);
                    return node;

        }
        public Object handleCOperand789(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 3 and 4
                    Map<String, Object> node = new HashMap<String, Object>();
                    ASTNameNode tmp0 = new ASTNameNode();
                    tmp0.name = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("name");
                    if (tmp0.name != null) tmp0.name.setParent(tmp0);
                    node.put("name", tmp0);
                    node.put("hiddenTPercent", (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1));
                    node.put("derivedTypeComponentRef", (IASTListNode<ASTDataRefNode>)valueStack.get(valueStackOffset + 2));
                    node.put("hiddenLparen2", (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3));
                    node.put("componentSectionSubscriptList", (IASTListNode<ASTSectionSubscriptNode>)valueStack.get(valueStackOffset + 4));
                    node.put("hiddenRparen2", (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 5));
                    ASTListNode<IASTNode> embeddedList = new ASTListNode<IASTNode>();
                    embeddedList.add((IASTNode)(node.get("name")));
                    embeddedList.add((IASTNode)(node.get("hiddenTLparen")));
                    embeddedList.add((IASTNode)(node.get("functionArgList")));
                    embeddedList.add((IASTNode)(node.get("stringConst")));
                    embeddedList.add((IASTNode)(node.get("primarySectionSubscriptList")));
                    embeddedList.add((IASTNode)(node.get("hiddenTRparen")));
                    embeddedList.add((IASTNode)(node.get("imageSelector")));
                    embeddedList.add((IASTNode)(node.get("hiddenTPercent")));
                    embeddedList.add((IASTNode)(node.get("derivedTypeComponentRef")));
                    embeddedList.add((IASTNode)(node.get("hiddenLparen2")));
                    embeddedList.add((IASTNode)(node.get("componentSectionSubscriptList")));
                    embeddedList.add((IASTNode)(node.get("hiddenRparen2")));
                    node.put("errorRecoveryList", embeddedList);
                    return node;

        }
        public Object handleCOperand790(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 3 and 4
                    Map<String, Object> node = new HashMap<String, Object>();
                    ASTNameNode tmp0 = new ASTNameNode();
                    tmp0.name = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("name");
                    if (tmp0.name != null) tmp0.name.setParent(tmp0);
                    node.put("name", tmp0);
                    node.put("hiddenTLparen", (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1));
                    node.put("primarySectionSubscriptList", (IASTListNode<ASTSectionSubscriptNode>)valueStack.get(valueStackOffset + 2));
                    node.put("hiddenTRparen", (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3));
                    node.put("hiddenTPercent", (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4));
                    node.put("derivedTypeComponentRef", (IASTListNode<ASTDataRefNode>)valueStack.get(valueStackOffset + 5));
                    ASTListNode<IASTNode> embeddedList = new ASTListNode<IASTNode>();
                    embeddedList.add((IASTNode)(node.get("name")));
                    embeddedList.add((IASTNode)(node.get("hiddenTLparen")));
                    embeddedList.add((IASTNode)(node.get("functionArgList")));
                    embeddedList.add((IASTNode)(node.get("stringConst")));
                    embeddedList.add((IASTNode)(node.get("primarySectionSubscriptList")));
                    embeddedList.add((IASTNode)(node.get("hiddenTRparen")));
                    embeddedList.add((IASTNode)(node.get("imageSelector")));
                    embeddedList.add((IASTNode)(node.get("hiddenTPercent")));
                    embeddedList.add((IASTNode)(node.get("derivedTypeComponentRef")));
                    embeddedList.add((IASTNode)(node.get("hiddenLparen2")));
                    embeddedList.add((IASTNode)(node.get("componentSectionSubscriptList")));
                    embeddedList.add((IASTNode)(node.get("hiddenRparen2")));
                    node.put("errorRecoveryList", embeddedList);
                    return node;

        }
        public Object handleCOperand791(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 3 and 4
                    Map<String, Object> node = new HashMap<String, Object>();
                    ASTNameNode tmp0 = new ASTNameNode();
                    tmp0.name = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("name");
                    if (tmp0.name != null) tmp0.name.setParent(tmp0);
                    node.put("name", tmp0);
                    node.put("hiddenTLparen", (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1));
                    node.put("primarySectionSubscriptList", (IASTListNode<ASTSectionSubscriptNode>)valueStack.get(valueStackOffset + 2));
                    node.put("hiddenTRparen", (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3));
                    node.put("hiddenTPercent", (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4));
                    node.put("derivedTypeComponentRef", (IASTListNode<ASTDataRefNode>)valueStack.get(valueStackOffset + 5));
                    node.put("hiddenLparen2", (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 6));
                    node.put("componentSectionSubscriptList", (IASTListNode<ASTSectionSubscriptNode>)valueStack.get(valueStackOffset + 7));
                    node.put("hiddenRparen2", (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 8));
                    ASTListNode<IASTNode> embeddedList = new ASTListNode<IASTNode>();
                    embeddedList.add((IASTNode)(node.get("name")));
                    embeddedList.add((IASTNode)(node.get("hiddenTLparen")));
                    embeddedList.add((IASTNode)(node.get("functionArgList")));
                    embeddedList.add((IASTNode)(node.get("stringConst")));
                    embeddedList.add((IASTNode)(node.get("primarySectionSubscriptList")));
                    embeddedList.add((IASTNode)(node.get("hiddenTRparen")));
                    embeddedList.add((IASTNode)(node.get("imageSelector")));
                    embeddedList.add((IASTNode)(node.get("hiddenTPercent")));
                    embeddedList.add((IASTNode)(node.get("derivedTypeComponentRef")));
                    embeddedList.add((IASTNode)(node.get("hiddenLparen2")));
                    embeddedList.add((IASTNode)(node.get("componentSectionSubscriptList")));
                    embeddedList.add((IASTNode)(node.get("hiddenRparen2")));
                    node.put("errorRecoveryList", embeddedList);
                    return node;

        }
        public Object handleCOperand792(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 3 and 4
                    Map<String, Object> node = new HashMap<String, Object>();
                    node.put("name", (ASTNameNode)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("name"));
                    node.put("hiddenTLparen", (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("hiddenTLparen"));
                    node.put("functionArgList", (IASTListNode<ASTFunctionArgListNode>)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("functionArgList"));
                    node.put("hiddenTRparen", (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("hiddenTRparen"));
                    ASTListNode<IASTNode> embeddedList = new ASTListNode<IASTNode>();
                    embeddedList.add((IASTNode)(node.get("name")));
                    embeddedList.add((IASTNode)(node.get("hiddenTLparen")));
                    embeddedList.add((IASTNode)(node.get("functionArgList")));
                    embeddedList.add((IASTNode)(node.get("stringConst")));
                    embeddedList.add((IASTNode)(node.get("primarySectionSubscriptList")));
                    embeddedList.add((IASTNode)(node.get("hiddenTRparen")));
                    embeddedList.add((IASTNode)(node.get("imageSelector")));
                    embeddedList.add((IASTNode)(node.get("hiddenTPercent")));
                    embeddedList.add((IASTNode)(node.get("derivedTypeComponentRef")));
                    embeddedList.add((IASTNode)(node.get("hiddenLparen2")));
                    embeddedList.add((IASTNode)(node.get("componentSectionSubscriptList")));
                    embeddedList.add((IASTNode)(node.get("hiddenRparen2")));
                    node.put("errorRecoveryList", embeddedList);
                    return node;

        }
        public Object handleCOperand793(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 3 and 4
                    Map<String, Object> node = new HashMap<String, Object>();
                    ASTNameNode tmp0 = new ASTNameNode();
                    tmp0.name = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("name");
                    if (tmp0.name != null) tmp0.name.setParent(tmp0);
                    node.put("name", tmp0);
                    node.put("imageSelector", (ASTImageSelectorNode)valueStack.get(valueStackOffset + 1));
                    ASTListNode<IASTNode> embeddedList = new ASTListNode<IASTNode>();
                    embeddedList.add((IASTNode)(node.get("name")));
                    embeddedList.add((IASTNode)(node.get("hiddenTLparen")));
                    embeddedList.add((IASTNode)(node.get("functionArgList")));
                    embeddedList.add((IASTNode)(node.get("stringConst")));
                    embeddedList.add((IASTNode)(node.get("primarySectionSubscriptList")));
                    embeddedList.add((IASTNode)(node.get("hiddenTRparen")));
                    embeddedList.add((IASTNode)(node.get("imageSelector")));
                    embeddedList.add((IASTNode)(node.get("hiddenTPercent")));
                    embeddedList.add((IASTNode)(node.get("derivedTypeComponentRef")));
                    embeddedList.add((IASTNode)(node.get("hiddenLparen2")));
                    embeddedList.add((IASTNode)(node.get("componentSectionSubscriptList")));
                    embeddedList.add((IASTNode)(node.get("hiddenRparen2")));
                    node.put("errorRecoveryList", embeddedList);
                    return node;

        }
        public Object handleCOperand794(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 3 and 4
                    Map<String, Object> node = new HashMap<String, Object>();
                    ASTNameNode tmp0 = new ASTNameNode();
                    tmp0.name = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("name");
                    if (tmp0.name != null) tmp0.name.setParent(tmp0);
                    node.put("name", tmp0);
                    node.put("hiddenTLparen", (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1));
                    node.put("primarySectionSubscriptList", (IASTListNode<ASTSectionSubscriptNode>)valueStack.get(valueStackOffset + 2));
                    node.put("hiddenTRparen", (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3));
                    node.put("imageSelector", (ASTImageSelectorNode)valueStack.get(valueStackOffset + 4));
                    ASTListNode<IASTNode> embeddedList = new ASTListNode<IASTNode>();
                    embeddedList.add((IASTNode)(node.get("name")));
                    embeddedList.add((IASTNode)(node.get("hiddenTLparen")));
                    embeddedList.add((IASTNode)(node.get("functionArgList")));
                    embeddedList.add((IASTNode)(node.get("stringConst")));
                    embeddedList.add((IASTNode)(node.get("primarySectionSubscriptList")));
                    embeddedList.add((IASTNode)(node.get("hiddenTRparen")));
                    embeddedList.add((IASTNode)(node.get("imageSelector")));
                    embeddedList.add((IASTNode)(node.get("hiddenTPercent")));
                    embeddedList.add((IASTNode)(node.get("derivedTypeComponentRef")));
                    embeddedList.add((IASTNode)(node.get("hiddenLparen2")));
                    embeddedList.add((IASTNode)(node.get("componentSectionSubscriptList")));
                    embeddedList.add((IASTNode)(node.get("hiddenRparen2")));
                    node.put("errorRecoveryList", embeddedList);
                    return node;

        }
        public Object handleCOperand795(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 3 and 4
                    Map<String, Object> node = new HashMap<String, Object>();
                    ASTNameNode tmp0 = new ASTNameNode();
                    tmp0.name = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("name");
                    if (tmp0.name != null) tmp0.name.setParent(tmp0);
                    node.put("name", tmp0);
                    node.put("imageSelector", (ASTImageSelectorNode)valueStack.get(valueStackOffset + 1));
                    node.put("hiddenTPercent", (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2));
                    node.put("derivedTypeComponentRef", (IASTListNode<ASTDataRefNode>)valueStack.get(valueStackOffset + 3));
                    ASTListNode<IASTNode> embeddedList = new ASTListNode<IASTNode>();
                    embeddedList.add((IASTNode)(node.get("name")));
                    embeddedList.add((IASTNode)(node.get("hiddenTLparen")));
                    embeddedList.add((IASTNode)(node.get("functionArgList")));
                    embeddedList.add((IASTNode)(node.get("stringConst")));
                    embeddedList.add((IASTNode)(node.get("primarySectionSubscriptList")));
                    embeddedList.add((IASTNode)(node.get("hiddenTRparen")));
                    embeddedList.add((IASTNode)(node.get("imageSelector")));
                    embeddedList.add((IASTNode)(node.get("hiddenTPercent")));
                    embeddedList.add((IASTNode)(node.get("derivedTypeComponentRef")));
                    embeddedList.add((IASTNode)(node.get("hiddenLparen2")));
                    embeddedList.add((IASTNode)(node.get("componentSectionSubscriptList")));
                    embeddedList.add((IASTNode)(node.get("hiddenRparen2")));
                    node.put("errorRecoveryList", embeddedList);
                    return node;

        }
        public Object handleCOperand796(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 3 and 4
                    Map<String, Object> node = new HashMap<String, Object>();
                    ASTNameNode tmp0 = new ASTNameNode();
                    tmp0.name = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("name");
                    if (tmp0.name != null) tmp0.name.setParent(tmp0);
                    node.put("name", tmp0);
                    node.put("imageSelector", (ASTImageSelectorNode)valueStack.get(valueStackOffset + 1));
                    node.put("hiddenTPercent", (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2));
                    node.put("derivedTypeComponentRef", (IASTListNode<ASTDataRefNode>)valueStack.get(valueStackOffset + 3));
                    node.put("hiddenLparen2", (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4));
                    node.put("componentSectionSubscriptList", (IASTListNode<ASTSectionSubscriptNode>)valueStack.get(valueStackOffset + 5));
                    node.put("hiddenRparen2", (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 6));
                    ASTListNode<IASTNode> embeddedList = new ASTListNode<IASTNode>();
                    embeddedList.add((IASTNode)(node.get("name")));
                    embeddedList.add((IASTNode)(node.get("hiddenTLparen")));
                    embeddedList.add((IASTNode)(node.get("functionArgList")));
                    embeddedList.add((IASTNode)(node.get("stringConst")));
                    embeddedList.add((IASTNode)(node.get("primarySectionSubscriptList")));
                    embeddedList.add((IASTNode)(node.get("hiddenTRparen")));
                    embeddedList.add((IASTNode)(node.get("imageSelector")));
                    embeddedList.add((IASTNode)(node.get("hiddenTPercent")));
                    embeddedList.add((IASTNode)(node.get("derivedTypeComponentRef")));
                    embeddedList.add((IASTNode)(node.get("hiddenLparen2")));
                    embeddedList.add((IASTNode)(node.get("componentSectionSubscriptList")));
                    embeddedList.add((IASTNode)(node.get("hiddenRparen2")));
                    node.put("errorRecoveryList", embeddedList);
                    return node;

        }
        public Object handleCOperand797(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 3 and 4
                    Map<String, Object> node = new HashMap<String, Object>();
                    ASTNameNode tmp0 = new ASTNameNode();
                    tmp0.name = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("name");
                    if (tmp0.name != null) tmp0.name.setParent(tmp0);
                    node.put("name", tmp0);
                    node.put("hiddenTLparen", (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1));
                    node.put("primarySectionSubscriptList", (IASTListNode<ASTSectionSubscriptNode>)valueStack.get(valueStackOffset + 2));
                    node.put("hiddenTRparen", (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3));
                    node.put("imageSelector", (ASTImageSelectorNode)valueStack.get(valueStackOffset + 4));
                    node.put("hiddenTPercent", (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 5));
                    node.put("derivedTypeComponentRef", (IASTListNode<ASTDataRefNode>)valueStack.get(valueStackOffset + 6));
                    ASTListNode<IASTNode> embeddedList = new ASTListNode<IASTNode>();
                    embeddedList.add((IASTNode)(node.get("name")));
                    embeddedList.add((IASTNode)(node.get("hiddenTLparen")));
                    embeddedList.add((IASTNode)(node.get("functionArgList")));
                    embeddedList.add((IASTNode)(node.get("stringConst")));
                    embeddedList.add((IASTNode)(node.get("primarySectionSubscriptList")));
                    embeddedList.add((IASTNode)(node.get("hiddenTRparen")));
                    embeddedList.add((IASTNode)(node.get("imageSelector")));
                    embeddedList.add((IASTNode)(node.get("hiddenTPercent")));
                    embeddedList.add((IASTNode)(node.get("derivedTypeComponentRef")));
                    embeddedList.add((IASTNode)(node.get("hiddenLparen2")));
                    embeddedList.add((IASTNode)(node.get("componentSectionSubscriptList")));
                    embeddedList.add((IASTNode)(node.get("hiddenRparen2")));
                    node.put("errorRecoveryList", embeddedList);
                    return node;

        }
        public Object handleCOperand798(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 3 and 4
                    Map<String, Object> node = new HashMap<String, Object>();
                    ASTNameNode tmp0 = new ASTNameNode();
                    tmp0.name = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("name");
                    if (tmp0.name != null) tmp0.name.setParent(tmp0);
                    node.put("name", tmp0);
                    node.put("hiddenTLparen", (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1));
                    node.put("primarySectionSubscriptList", (IASTListNode<ASTSectionSubscriptNode>)valueStack.get(valueStackOffset + 2));
                    node.put("hiddenTRparen", (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3));
                    node.put("imageSelector", (ASTImageSelectorNode)valueStack.get(valueStackOffset + 4));
                    node.put("hiddenTPercent", (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 5));
                    node.put("derivedTypeComponentRef", (IASTListNode<ASTDataRefNode>)valueStack.get(valueStackOffset + 6));
                    node.put("hiddenLparen2", (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 7));
                    node.put("componentSectionSubscriptList", (IASTListNode<ASTSectionSubscriptNode>)valueStack.get(valueStackOffset + 8));
                    node.put("hiddenRparen2", (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 9));
                    ASTListNode<IASTNode> embeddedList = new ASTListNode<IASTNode>();
                    embeddedList.add((IASTNode)(node.get("name")));
                    embeddedList.add((IASTNode)(node.get("hiddenTLparen")));
                    embeddedList.add((IASTNode)(node.get("functionArgList")));
                    embeddedList.add((IASTNode)(node.get("stringConst")));
                    embeddedList.add((IASTNode)(node.get("primarySectionSubscriptList")));
                    embeddedList.add((IASTNode)(node.get("hiddenTRparen")));
                    embeddedList.add((IASTNode)(node.get("imageSelector")));
                    embeddedList.add((IASTNode)(node.get("hiddenTPercent")));
                    embeddedList.add((IASTNode)(node.get("derivedTypeComponentRef")));
                    embeddedList.add((IASTNode)(node.get("hiddenLparen2")));
                    embeddedList.add((IASTNode)(node.get("componentSectionSubscriptList")));
                    embeddedList.add((IASTNode)(node.get("hiddenRparen2")));
                    node.put("errorRecoveryList", embeddedList);
                    return node;

        }
        public Object handleUFPrimary799(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTUFPrimaryNode node = new ASTUFPrimaryNode();
                    node.intConst = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.intConst != null) node.intConst.setParent(node);
                    return node;

        }
        public Object handleUFPrimary800(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTUFPrimaryNode node = new ASTUFPrimaryNode();
                    node.stringConst = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.stringConst != null) node.stringConst.setParent(node);
                    return node;

        }
        public Object handleUFPrimary801(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTUFPrimaryNode node = new ASTUFPrimaryNode();
                    node.name = (ASTNameNode)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("name");
                    if (node.name != null) node.name.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("hiddenTLparen");
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.functionArgList = (IASTListNode<ASTFunctionArgListNode>)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("functionArgList");
                    if (node.functionArgList != null) node.functionArgList.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("hiddenTRparen");
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    return node;

        }
        public Object handleUFPrimary802(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTUFPrimaryNode node = new ASTUFPrimaryNode();
                    ASTNameNode tmp0 = new ASTNameNode();
                    tmp0.name = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("name");
                    if (tmp0.name != null) tmp0.name.setParent(tmp0);
                    node.name = tmp0;
                    if (tmp0 != null) tmp0.setParent(node);
                    return node;

        }
        public Object handleUFPrimary803(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTUFPrimaryNode node = new ASTUFPrimaryNode();
                    ASTNameNode tmp0 = new ASTNameNode();
                    tmp0.name = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("name");
                    if (tmp0.name != null) tmp0.name.setParent(tmp0);
                    node.name = tmp0;
                    if (tmp0 != null) tmp0.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.primarySectionSubscriptList = (IASTListNode<ASTSectionSubscriptNode>)valueStack.get(valueStackOffset + 2);
                    if (node.primarySectionSubscriptList != null) node.primarySectionSubscriptList.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    return node;

        }
        public Object handleUFPrimary804(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTUFPrimaryNode node = new ASTUFPrimaryNode();
                    ASTNameNode tmp0 = new ASTNameNode();
                    tmp0.name = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("name");
                    if (tmp0.name != null) tmp0.name.setParent(tmp0);
                    node.name = tmp0;
                    if (tmp0 != null) tmp0.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.primarySectionSubscriptList = (IASTListNode<ASTSectionSubscriptNode>)valueStack.get(valueStackOffset + 2);
                    if (node.primarySectionSubscriptList != null) node.primarySectionSubscriptList.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    node.substringRange = (ASTSubstringRangeNode)valueStack.get(valueStackOffset + 4);
                    if (node.substringRange != null) node.substringRange.setParent(node);
                    return node;

        }
        public Object handleUFPrimary805(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTUFPrimaryNode node = new ASTUFPrimaryNode();
                    ASTNameNode tmp0 = new ASTNameNode();
                    tmp0.name = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("name");
                    if (tmp0.name != null) tmp0.name.setParent(tmp0);
                    node.name = tmp0;
                    if (tmp0 != null) tmp0.setParent(node);
                    node.hiddenTPercent = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTPercent != null) node.hiddenTPercent.setParent(node);
                    node.derivedTypeComponentRef = (IASTListNode<ASTDataRefNode>)valueStack.get(valueStackOffset + 2);
                    if (node.derivedTypeComponentRef != null) node.derivedTypeComponentRef.setParent(node);
                    return node;

        }
        public Object handleUFPrimary806(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTUFPrimaryNode node = new ASTUFPrimaryNode();
                    ASTNameNode tmp0 = new ASTNameNode();
                    tmp0.name = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("name");
                    if (tmp0.name != null) tmp0.name.setParent(tmp0);
                    node.name = tmp0;
                    if (tmp0 != null) tmp0.setParent(node);
                    node.hiddenTPercent = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTPercent != null) node.hiddenTPercent.setParent(node);
                    node.derivedTypeComponentRef = (IASTListNode<ASTDataRefNode>)valueStack.get(valueStackOffset + 2);
                    if (node.derivedTypeComponentRef != null) node.derivedTypeComponentRef.setParent(node);
                    node.hiddenLparen2 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenLparen2 != null) node.hiddenLparen2.setParent(node);
                    node.componentSectionSubscriptList = (IASTListNode<ASTSectionSubscriptNode>)valueStack.get(valueStackOffset + 4);
                    if (node.componentSectionSubscriptList != null) node.componentSectionSubscriptList.setParent(node);
                    node.hiddenRparen2 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 5);
                    if (node.hiddenRparen2 != null) node.hiddenRparen2.setParent(node);
                    return node;

        }
        public Object handleUFPrimary807(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTUFPrimaryNode node = new ASTUFPrimaryNode();
                    ASTNameNode tmp0 = new ASTNameNode();
                    tmp0.name = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("name");
                    if (tmp0.name != null) tmp0.name.setParent(tmp0);
                    node.name = tmp0;
                    if (tmp0 != null) tmp0.setParent(node);
                    node.hiddenTPercent = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTPercent != null) node.hiddenTPercent.setParent(node);
                    node.derivedTypeComponentRef = (IASTListNode<ASTDataRefNode>)valueStack.get(valueStackOffset + 2);
                    if (node.derivedTypeComponentRef != null) node.derivedTypeComponentRef.setParent(node);
                    node.hiddenLparen2 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenLparen2 != null) node.hiddenLparen2.setParent(node);
                    node.componentSectionSubscriptList = (IASTListNode<ASTSectionSubscriptNode>)valueStack.get(valueStackOffset + 4);
                    if (node.componentSectionSubscriptList != null) node.componentSectionSubscriptList.setParent(node);
                    node.hiddenRparen2 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 5);
                    if (node.hiddenRparen2 != null) node.hiddenRparen2.setParent(node);
                    node.substringRange = (ASTSubstringRangeNode)valueStack.get(valueStackOffset + 6);
                    if (node.substringRange != null) node.substringRange.setParent(node);
                    return node;

        }
        public Object handleUFPrimary808(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTUFPrimaryNode node = new ASTUFPrimaryNode();
                    ASTNameNode tmp0 = new ASTNameNode();
                    tmp0.name = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("name");
                    if (tmp0.name != null) tmp0.name.setParent(tmp0);
                    node.name = tmp0;
                    if (tmp0 != null) tmp0.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.primarySectionSubscriptList = (IASTListNode<ASTSectionSubscriptNode>)valueStack.get(valueStackOffset + 2);
                    if (node.primarySectionSubscriptList != null) node.primarySectionSubscriptList.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    node.hiddenTPercent = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenTPercent != null) node.hiddenTPercent.setParent(node);
                    node.derivedTypeComponentRef = (IASTListNode<ASTDataRefNode>)valueStack.get(valueStackOffset + 5);
                    if (node.derivedTypeComponentRef != null) node.derivedTypeComponentRef.setParent(node);
                    return node;

        }
        public Object handleUFPrimary809(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTUFPrimaryNode node = new ASTUFPrimaryNode();
                    ASTNameNode tmp0 = new ASTNameNode();
                    tmp0.name = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("name");
                    if (tmp0.name != null) tmp0.name.setParent(tmp0);
                    node.name = tmp0;
                    if (tmp0 != null) tmp0.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.primarySectionSubscriptList = (IASTListNode<ASTSectionSubscriptNode>)valueStack.get(valueStackOffset + 2);
                    if (node.primarySectionSubscriptList != null) node.primarySectionSubscriptList.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    node.hiddenTPercent = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenTPercent != null) node.hiddenTPercent.setParent(node);
                    node.derivedTypeComponentRef = (IASTListNode<ASTDataRefNode>)valueStack.get(valueStackOffset + 5);
                    if (node.derivedTypeComponentRef != null) node.derivedTypeComponentRef.setParent(node);
                    node.hiddenLparen2 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 6);
                    if (node.hiddenLparen2 != null) node.hiddenLparen2.setParent(node);
                    node.componentSectionSubscriptList = (IASTListNode<ASTSectionSubscriptNode>)valueStack.get(valueStackOffset + 7);
                    if (node.componentSectionSubscriptList != null) node.componentSectionSubscriptList.setParent(node);
                    node.hiddenRparen2 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 8);
                    if (node.hiddenRparen2 != null) node.hiddenRparen2.setParent(node);
                    return node;

        }
        public Object handleUFPrimary810(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTUFPrimaryNode node = new ASTUFPrimaryNode();
                    ASTNameNode tmp0 = new ASTNameNode();
                    tmp0.name = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("name");
                    if (tmp0.name != null) tmp0.name.setParent(tmp0);
                    node.name = tmp0;
                    if (tmp0 != null) tmp0.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.primarySectionSubscriptList = (IASTListNode<ASTSectionSubscriptNode>)valueStack.get(valueStackOffset + 2);
                    if (node.primarySectionSubscriptList != null) node.primarySectionSubscriptList.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    node.hiddenTPercent = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenTPercent != null) node.hiddenTPercent.setParent(node);
                    node.derivedTypeComponentRef = (IASTListNode<ASTDataRefNode>)valueStack.get(valueStackOffset + 5);
                    if (node.derivedTypeComponentRef != null) node.derivedTypeComponentRef.setParent(node);
                    node.hiddenLparen2 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 6);
                    if (node.hiddenLparen2 != null) node.hiddenLparen2.setParent(node);
                    node.componentSectionSubscriptList = (IASTListNode<ASTSectionSubscriptNode>)valueStack.get(valueStackOffset + 7);
                    if (node.componentSectionSubscriptList != null) node.componentSectionSubscriptList.setParent(node);
                    node.hiddenRparen2 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 8);
                    if (node.hiddenRparen2 != null) node.hiddenRparen2.setParent(node);
                    node.substringRange = (ASTSubstringRangeNode)valueStack.get(valueStackOffset + 9);
                    if (node.substringRange != null) node.substringRange.setParent(node);
                    return node;

        }
        public Object handleUFPrimary811(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTUFPrimaryNode node = new ASTUFPrimaryNode();
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.nestedExpression = (ASTUFExprNode)valueStack.get(valueStackOffset + 1);
                    if (node.nestedExpression != null) node.nestedExpression.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    return node;

        }
        public Object handleUFPrimary812(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTUFPrimaryNode node = new ASTUFPrimaryNode();
                    ASTNameNode tmp0 = new ASTNameNode();
                    tmp0.name = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("name");
                    if (tmp0.name != null) tmp0.name.setParent(tmp0);
                    node.name = tmp0;
                    if (tmp0 != null) tmp0.setParent(node);
                    node.imageSelector = (ASTImageSelectorNode)valueStack.get(valueStackOffset + 1);
                    if (node.imageSelector != null) node.imageSelector.setParent(node);
                    return node;

        }
        public Object handleUFPrimary813(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTUFPrimaryNode node = new ASTUFPrimaryNode();
                    ASTNameNode tmp0 = new ASTNameNode();
                    tmp0.name = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("name");
                    if (tmp0.name != null) tmp0.name.setParent(tmp0);
                    node.name = tmp0;
                    if (tmp0 != null) tmp0.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.primarySectionSubscriptList = (IASTListNode<ASTSectionSubscriptNode>)valueStack.get(valueStackOffset + 2);
                    if (node.primarySectionSubscriptList != null) node.primarySectionSubscriptList.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    node.imageSelector = (ASTImageSelectorNode)valueStack.get(valueStackOffset + 4);
                    if (node.imageSelector != null) node.imageSelector.setParent(node);
                    return node;

        }
        public Object handleUFPrimary814(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTUFPrimaryNode node = new ASTUFPrimaryNode();
                    ASTNameNode tmp0 = new ASTNameNode();
                    tmp0.name = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("name");
                    if (tmp0.name != null) tmp0.name.setParent(tmp0);
                    node.name = tmp0;
                    if (tmp0 != null) tmp0.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.primarySectionSubscriptList = (IASTListNode<ASTSectionSubscriptNode>)valueStack.get(valueStackOffset + 2);
                    if (node.primarySectionSubscriptList != null) node.primarySectionSubscriptList.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    node.imageSelector = (ASTImageSelectorNode)valueStack.get(valueStackOffset + 4);
                    if (node.imageSelector != null) node.imageSelector.setParent(node);
                    node.substringRange = (ASTSubstringRangeNode)valueStack.get(valueStackOffset + 5);
                    if (node.substringRange != null) node.substringRange.setParent(node);
                    return node;

        }
        public Object handleUFPrimary815(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTUFPrimaryNode node = new ASTUFPrimaryNode();
                    ASTNameNode tmp0 = new ASTNameNode();
                    tmp0.name = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("name");
                    if (tmp0.name != null) tmp0.name.setParent(tmp0);
                    node.name = tmp0;
                    if (tmp0 != null) tmp0.setParent(node);
                    node.imageSelector = (ASTImageSelectorNode)valueStack.get(valueStackOffset + 1);
                    if (node.imageSelector != null) node.imageSelector.setParent(node);
                    node.hiddenTPercent = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTPercent != null) node.hiddenTPercent.setParent(node);
                    node.derivedTypeComponentRef = (IASTListNode<ASTDataRefNode>)valueStack.get(valueStackOffset + 3);
                    if (node.derivedTypeComponentRef != null) node.derivedTypeComponentRef.setParent(node);
                    return node;

        }
        public Object handleUFPrimary816(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTUFPrimaryNode node = new ASTUFPrimaryNode();
                    ASTNameNode tmp0 = new ASTNameNode();
                    tmp0.name = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("name");
                    if (tmp0.name != null) tmp0.name.setParent(tmp0);
                    node.name = tmp0;
                    if (tmp0 != null) tmp0.setParent(node);
                    node.imageSelector = (ASTImageSelectorNode)valueStack.get(valueStackOffset + 1);
                    if (node.imageSelector != null) node.imageSelector.setParent(node);
                    node.hiddenTPercent = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTPercent != null) node.hiddenTPercent.setParent(node);
                    node.derivedTypeComponentRef = (IASTListNode<ASTDataRefNode>)valueStack.get(valueStackOffset + 3);
                    if (node.derivedTypeComponentRef != null) node.derivedTypeComponentRef.setParent(node);
                    node.hiddenLparen2 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenLparen2 != null) node.hiddenLparen2.setParent(node);
                    node.componentSectionSubscriptList = (IASTListNode<ASTSectionSubscriptNode>)valueStack.get(valueStackOffset + 5);
                    if (node.componentSectionSubscriptList != null) node.componentSectionSubscriptList.setParent(node);
                    node.hiddenRparen2 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 6);
                    if (node.hiddenRparen2 != null) node.hiddenRparen2.setParent(node);
                    return node;

        }
        public Object handleUFPrimary817(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTUFPrimaryNode node = new ASTUFPrimaryNode();
                    ASTNameNode tmp0 = new ASTNameNode();
                    tmp0.name = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("name");
                    if (tmp0.name != null) tmp0.name.setParent(tmp0);
                    node.name = tmp0;
                    if (tmp0 != null) tmp0.setParent(node);
                    node.imageSelector = (ASTImageSelectorNode)valueStack.get(valueStackOffset + 1);
                    if (node.imageSelector != null) node.imageSelector.setParent(node);
                    node.hiddenTPercent = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTPercent != null) node.hiddenTPercent.setParent(node);
                    node.derivedTypeComponentRef = (IASTListNode<ASTDataRefNode>)valueStack.get(valueStackOffset + 3);
                    if (node.derivedTypeComponentRef != null) node.derivedTypeComponentRef.setParent(node);
                    node.hiddenLparen2 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenLparen2 != null) node.hiddenLparen2.setParent(node);
                    node.componentSectionSubscriptList = (IASTListNode<ASTSectionSubscriptNode>)valueStack.get(valueStackOffset + 5);
                    if (node.componentSectionSubscriptList != null) node.componentSectionSubscriptList.setParent(node);
                    node.hiddenRparen2 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 6);
                    if (node.hiddenRparen2 != null) node.hiddenRparen2.setParent(node);
                    node.substringRange = (ASTSubstringRangeNode)valueStack.get(valueStackOffset + 7);
                    if (node.substringRange != null) node.substringRange.setParent(node);
                    return node;

        }
        public Object handleUFPrimary818(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTUFPrimaryNode node = new ASTUFPrimaryNode();
                    ASTNameNode tmp0 = new ASTNameNode();
                    tmp0.name = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("name");
                    if (tmp0.name != null) tmp0.name.setParent(tmp0);
                    node.name = tmp0;
                    if (tmp0 != null) tmp0.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.primarySectionSubscriptList = (IASTListNode<ASTSectionSubscriptNode>)valueStack.get(valueStackOffset + 2);
                    if (node.primarySectionSubscriptList != null) node.primarySectionSubscriptList.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    node.imageSelector = (ASTImageSelectorNode)valueStack.get(valueStackOffset + 4);
                    if (node.imageSelector != null) node.imageSelector.setParent(node);
                    node.hiddenTPercent = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 5);
                    if (node.hiddenTPercent != null) node.hiddenTPercent.setParent(node);
                    node.derivedTypeComponentRef = (IASTListNode<ASTDataRefNode>)valueStack.get(valueStackOffset + 6);
                    if (node.derivedTypeComponentRef != null) node.derivedTypeComponentRef.setParent(node);
                    return node;

        }
        public Object handleUFPrimary819(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTUFPrimaryNode node = new ASTUFPrimaryNode();
                    ASTNameNode tmp0 = new ASTNameNode();
                    tmp0.name = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("name");
                    if (tmp0.name != null) tmp0.name.setParent(tmp0);
                    node.name = tmp0;
                    if (tmp0 != null) tmp0.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.primarySectionSubscriptList = (IASTListNode<ASTSectionSubscriptNode>)valueStack.get(valueStackOffset + 2);
                    if (node.primarySectionSubscriptList != null) node.primarySectionSubscriptList.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    node.imageSelector = (ASTImageSelectorNode)valueStack.get(valueStackOffset + 4);
                    if (node.imageSelector != null) node.imageSelector.setParent(node);
                    node.hiddenTPercent = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 5);
                    if (node.hiddenTPercent != null) node.hiddenTPercent.setParent(node);
                    node.derivedTypeComponentRef = (IASTListNode<ASTDataRefNode>)valueStack.get(valueStackOffset + 6);
                    if (node.derivedTypeComponentRef != null) node.derivedTypeComponentRef.setParent(node);
                    node.hiddenLparen2 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 7);
                    if (node.hiddenLparen2 != null) node.hiddenLparen2.setParent(node);
                    node.componentSectionSubscriptList = (IASTListNode<ASTSectionSubscriptNode>)valueStack.get(valueStackOffset + 8);
                    if (node.componentSectionSubscriptList != null) node.componentSectionSubscriptList.setParent(node);
                    node.hiddenRparen2 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 9);
                    if (node.hiddenRparen2 != null) node.hiddenRparen2.setParent(node);
                    return node;

        }
        public Object handleUFPrimary820(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTUFPrimaryNode node = new ASTUFPrimaryNode();
                    ASTNameNode tmp0 = new ASTNameNode();
                    tmp0.name = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("name");
                    if (tmp0.name != null) tmp0.name.setParent(tmp0);
                    node.name = tmp0;
                    if (tmp0 != null) tmp0.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.primarySectionSubscriptList = (IASTListNode<ASTSectionSubscriptNode>)valueStack.get(valueStackOffset + 2);
                    if (node.primarySectionSubscriptList != null) node.primarySectionSubscriptList.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    node.imageSelector = (ASTImageSelectorNode)valueStack.get(valueStackOffset + 4);
                    if (node.imageSelector != null) node.imageSelector.setParent(node);
                    node.hiddenTPercent = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 5);
                    if (node.hiddenTPercent != null) node.hiddenTPercent.setParent(node);
                    node.derivedTypeComponentRef = (IASTListNode<ASTDataRefNode>)valueStack.get(valueStackOffset + 6);
                    if (node.derivedTypeComponentRef != null) node.derivedTypeComponentRef.setParent(node);
                    node.hiddenLparen2 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 7);
                    if (node.hiddenLparen2 != null) node.hiddenLparen2.setParent(node);
                    node.componentSectionSubscriptList = (IASTListNode<ASTSectionSubscriptNode>)valueStack.get(valueStackOffset + 8);
                    if (node.componentSectionSubscriptList != null) node.componentSectionSubscriptList.setParent(node);
                    node.hiddenRparen2 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 9);
                    if (node.hiddenRparen2 != null) node.hiddenRparen2.setParent(node);
                    node.substringRange = (ASTSubstringRangeNode)valueStack.get(valueStackOffset + 10);
                    if (node.substringRange != null) node.substringRange.setParent(node);
                    return node;

        }
        public Object handleLevel1Expr821(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 5
                    IExpr result = (IExpr)valueStack.get(valueStackOffset + 0);
                    return result;

        }
        public Object handleLevel1Expr822(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTUnaryExprNode node = new ASTUnaryExprNode();
                    node.operator = (ASTOperatorNode)valueStack.get(valueStackOffset + 0);
                    if (node.operator != null) node.operator.setParent(node);
                    node.operand = (IExpr)valueStack.get(valueStackOffset + 1);
                    if (node.operand != null) node.operand.setParent(node);
                    return node;

        }
        public Object handleMultOperand823(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 5
                    IExpr result = (IExpr)valueStack.get(valueStackOffset + 0);
                    return result;

        }
        public Object handleMultOperand824(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTBinaryExprNode node = new ASTBinaryExprNode();
                    node.lhsExpr = (IExpr)valueStack.get(valueStackOffset + 0);
                    if (node.lhsExpr != null) node.lhsExpr.setParent(node);
                    node.operator = (ASTOperatorNode)valueStack.get(valueStackOffset + 1);
                    if (node.operator != null) node.operator.setParent(node);
                    node.rhsExpr = (IExpr)valueStack.get(valueStackOffset + 2);
                    if (node.rhsExpr != null) node.rhsExpr.setParent(node);
                    return node;

        }
        public Object handleUFFactor825(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTUFFactorNode node = new ASTUFFactorNode();
                    node.UFPrimary = (ASTUFPrimaryNode)valueStack.get(valueStackOffset + 0);
                    if (node.UFPrimary != null) node.UFPrimary.setParent(node);
                    return node;

        }
        public Object handleUFFactor826(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTUFFactorNode node = new ASTUFFactorNode();
                    node.lhsPrimary = (ASTUFPrimaryNode)valueStack.get(valueStackOffset + 0);
                    if (node.lhsPrimary != null) node.lhsPrimary.setParent(node);
                    node.powerOp = (ASTOperatorNode)valueStack.get(valueStackOffset + 1);
                    if (node.powerOp != null) node.powerOp.setParent(node);
                    node.rhsExpr = (ASTUFFactorNode)valueStack.get(valueStackOffset + 2);
                    if (node.rhsExpr != null) node.rhsExpr.setParent(node);
                    return node;

        }
        public Object handleAddOperand827(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 5
                    IExpr result = (IExpr)valueStack.get(valueStackOffset + 0);
                    return result;

        }
        public Object handleAddOperand828(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTBinaryExprNode node = new ASTBinaryExprNode();
                    node.lhsExpr = (IExpr)valueStack.get(valueStackOffset + 0);
                    if (node.lhsExpr != null) node.lhsExpr.setParent(node);
                    node.operator = (ASTOperatorNode)valueStack.get(valueStackOffset + 1);
                    if (node.operator != null) node.operator.setParent(node);
                    node.rhsExpr = (IExpr)valueStack.get(valueStackOffset + 2);
                    if (node.rhsExpr != null) node.rhsExpr.setParent(node);
                    return node;

        }
        public Object handleUFTerm829(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTUFTermNode node = new ASTUFTermNode();
                    node.UFFactor = (ASTUFFactorNode)valueStack.get(valueStackOffset + 0);
                    if (node.UFFactor != null) node.UFFactor.setParent(node);
                    return node;

        }
        public Object handleUFTerm830(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTUFTermNode node = new ASTUFTermNode();
                    node.lhsExpr = (ASTUFTermNode)valueStack.get(valueStackOffset + 0);
                    if (node.lhsExpr != null) node.lhsExpr.setParent(node);
                    node.multOp = (ASTOperatorNode)valueStack.get(valueStackOffset + 1);
                    if (node.multOp != null) node.multOp.setParent(node);
                    node.rhsExpr = (ASTUFFactorNode)valueStack.get(valueStackOffset + 2);
                    if (node.rhsExpr != null) node.rhsExpr.setParent(node);
                    return node;

        }
        public Object handleUFTerm831(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTUFTermNode node = new ASTUFTermNode();
                    node.lhsExpr = (ASTUFTermNode)valueStack.get(valueStackOffset + 0);
                    if (node.lhsExpr != null) node.lhsExpr.setParent(node);
                    ASTOperatorNode tmp1 = new ASTOperatorNode();
                    tmp1.hasMinusOp = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("hasMinusOp");
                    if (tmp1.hasMinusOp != null) tmp1.hasMinusOp.setParent(tmp1);
                    tmp1.hasSlashEqOp = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("hasSlashEqOp");
                    if (tmp1.hasSlashEqOp != null) tmp1.hasSlashEqOp.setParent(tmp1);
                    tmp1.hasAndOp = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("hasAndOp");
                    if (tmp1.hasAndOp != null) tmp1.hasAndOp.setParent(tmp1);
                    tmp1.definedUnaryOp = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("definedUnaryOp");
                    if (tmp1.definedUnaryOp != null) tmp1.definedUnaryOp.setParent(tmp1);
                    tmp1.hasEqOp = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("hasEqOp");
                    if (tmp1.hasEqOp != null) tmp1.hasEqOp.setParent(tmp1);
                    tmp1.hasPlusOp = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("hasPlusOp");
                    if (tmp1.hasPlusOp != null) tmp1.hasPlusOp.setParent(tmp1);
                    tmp1.hasDivideOp = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("hasDivideOp");
                    if (tmp1.hasDivideOp != null) tmp1.hasDivideOp.setParent(tmp1);
                    tmp1.hasNeqvOp = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("hasNeqvOp");
                    if (tmp1.hasNeqvOp != null) tmp1.hasNeqvOp.setParent(tmp1);
                    tmp1.hasEqEqOp = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("hasEqEqOp");
                    if (tmp1.hasEqEqOp != null) tmp1.hasEqEqOp.setParent(tmp1);
                    tmp1.hasGeOp = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("hasGeOp");
                    if (tmp1.hasGeOp != null) tmp1.hasGeOp.setParent(tmp1);
                    tmp1.hasNotOp = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("hasNotOp");
                    if (tmp1.hasNotOp != null) tmp1.hasNotOp.setParent(tmp1);
                    tmp1.hasEqvOp = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("hasEqvOp");
                    if (tmp1.hasEqvOp != null) tmp1.hasEqvOp.setParent(tmp1);
                    tmp1.hasConcatOp = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("hasConcatOp");
                    if (tmp1.hasConcatOp != null) tmp1.hasConcatOp.setParent(tmp1);
                    tmp1.hasPowerOp = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("hasPowerOp");
                    if (tmp1.hasPowerOp != null) tmp1.hasPowerOp.setParent(tmp1);
                    tmp1.hasGtOp = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("hasGtOp");
                    if (tmp1.hasGtOp != null) tmp1.hasGtOp.setParent(tmp1);
                    tmp1.hasLtOp = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("hasLtOp");
                    if (tmp1.hasLtOp != null) tmp1.hasLtOp.setParent(tmp1);
                    tmp1.hasNeOp = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("hasNeOp");
                    if (tmp1.hasNeOp != null) tmp1.hasNeOp.setParent(tmp1);
                    tmp1.hasOrOp = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("hasOrOp");
                    if (tmp1.hasOrOp != null) tmp1.hasOrOp.setParent(tmp1);
                    tmp1.customDefinedOp = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("customDefinedOp");
                    if (tmp1.customDefinedOp != null) tmp1.customDefinedOp.setParent(tmp1);
                    tmp1.hasTimesOp = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("hasTimesOp");
                    if (tmp1.hasTimesOp != null) tmp1.hasTimesOp.setParent(tmp1);
                    tmp1.definedBinaryOp = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("definedBinaryOp");
                    if (tmp1.definedBinaryOp != null) tmp1.definedBinaryOp.setParent(tmp1);
                    tmp1.hasLeOp = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("hasLeOp");
                    if (tmp1.hasLeOp != null) tmp1.hasLeOp.setParent(tmp1);
                    node.concatOp = tmp1;
                    if (tmp1 != null) tmp1.setParent(node);
                    node.rhsPrimary = (ASTUFPrimaryNode)valueStack.get(valueStackOffset + 2);
                    if (node.rhsPrimary != null) node.rhsPrimary.setParent(node);
                    return node;

        }
        public Object handleLevel2Expr832(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 5
                    IExpr result = (IExpr)valueStack.get(valueStackOffset + 0);
                    return result;

        }
        public Object handleLevel2Expr833(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTUnaryExprNode node = new ASTUnaryExprNode();
                    node.sign = (ASTSignNode)valueStack.get(valueStackOffset + 0);
                    if (node.sign != null) node.sign.setParent(node);
                    node.operand = (IExpr)valueStack.get(valueStackOffset + 1);
                    if (node.operand != null) node.operand.setParent(node);
                    return node;

        }
        public Object handleLevel2Expr834(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTBinaryExprNode node = new ASTBinaryExprNode();
                    node.lhsExpr = (IExpr)valueStack.get(valueStackOffset + 0);
                    if (node.lhsExpr != null) node.lhsExpr.setParent(node);
                    node.operator = (ASTOperatorNode)valueStack.get(valueStackOffset + 1);
                    if (node.operator != null) node.operator.setParent(node);
                    node.rhsExpr = (IExpr)valueStack.get(valueStackOffset + 2);
                    if (node.rhsExpr != null) node.rhsExpr.setParent(node);
                    return node;

        }
        public Object handleUFExpr835(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTUFExprNode node = new ASTUFExprNode();
                    node.UFTerm = (ASTUFTermNode)valueStack.get(valueStackOffset + 0);
                    if (node.UFTerm != null) node.UFTerm.setParent(node);
                    return node;

        }
        public Object handleUFExpr836(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTUFExprNode node = new ASTUFExprNode();
                    node.rhs2 = (ASTSignNode)valueStack.get(valueStackOffset + 0);
                    if (node.rhs2 != null) node.rhs2.setParent(node);
                    node.rhsExpr = (ASTUFTermNode)valueStack.get(valueStackOffset + 1);
                    if (node.rhsExpr != null) node.rhsExpr.setParent(node);
                    return node;

        }
        public Object handleUFExpr837(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTUFExprNode node = new ASTUFExprNode();
                    node.lhsExpr = (ASTUFExprNode)valueStack.get(valueStackOffset + 0);
                    if (node.lhsExpr != null) node.lhsExpr.setParent(node);
                    node.addOp = (ASTOperatorNode)valueStack.get(valueStackOffset + 1);
                    if (node.addOp != null) node.addOp.setParent(node);
                    node.rhsExpr = (ASTUFTermNode)valueStack.get(valueStackOffset + 2);
                    if (node.rhsExpr != null) node.rhsExpr.setParent(node);
                    return node;

        }
        public Object handleLevel3Expr838(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 5
                    IExpr result = (IExpr)valueStack.get(valueStackOffset + 0);
                    return result;

        }
        public Object handleLevel3Expr839(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTBinaryExprNode node = new ASTBinaryExprNode();
                    node.lhsExpr = (IExpr)valueStack.get(valueStackOffset + 0);
                    if (node.lhsExpr != null) node.lhsExpr.setParent(node);
                    ASTOperatorNode tmp1 = new ASTOperatorNode();
                    tmp1.hasMinusOp = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("hasMinusOp");
                    if (tmp1.hasMinusOp != null) tmp1.hasMinusOp.setParent(tmp1);
                    tmp1.hasSlashEqOp = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("hasSlashEqOp");
                    if (tmp1.hasSlashEqOp != null) tmp1.hasSlashEqOp.setParent(tmp1);
                    tmp1.hasAndOp = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("hasAndOp");
                    if (tmp1.hasAndOp != null) tmp1.hasAndOp.setParent(tmp1);
                    tmp1.definedUnaryOp = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("definedUnaryOp");
                    if (tmp1.definedUnaryOp != null) tmp1.definedUnaryOp.setParent(tmp1);
                    tmp1.hasEqOp = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("hasEqOp");
                    if (tmp1.hasEqOp != null) tmp1.hasEqOp.setParent(tmp1);
                    tmp1.hasPlusOp = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("hasPlusOp");
                    if (tmp1.hasPlusOp != null) tmp1.hasPlusOp.setParent(tmp1);
                    tmp1.hasDivideOp = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("hasDivideOp");
                    if (tmp1.hasDivideOp != null) tmp1.hasDivideOp.setParent(tmp1);
                    tmp1.hasNeqvOp = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("hasNeqvOp");
                    if (tmp1.hasNeqvOp != null) tmp1.hasNeqvOp.setParent(tmp1);
                    tmp1.hasEqEqOp = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("hasEqEqOp");
                    if (tmp1.hasEqEqOp != null) tmp1.hasEqEqOp.setParent(tmp1);
                    tmp1.hasGeOp = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("hasGeOp");
                    if (tmp1.hasGeOp != null) tmp1.hasGeOp.setParent(tmp1);
                    tmp1.hasNotOp = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("hasNotOp");
                    if (tmp1.hasNotOp != null) tmp1.hasNotOp.setParent(tmp1);
                    tmp1.hasEqvOp = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("hasEqvOp");
                    if (tmp1.hasEqvOp != null) tmp1.hasEqvOp.setParent(tmp1);
                    tmp1.hasConcatOp = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("hasConcatOp");
                    if (tmp1.hasConcatOp != null) tmp1.hasConcatOp.setParent(tmp1);
                    tmp1.hasPowerOp = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("hasPowerOp");
                    if (tmp1.hasPowerOp != null) tmp1.hasPowerOp.setParent(tmp1);
                    tmp1.hasGtOp = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("hasGtOp");
                    if (tmp1.hasGtOp != null) tmp1.hasGtOp.setParent(tmp1);
                    tmp1.hasLtOp = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("hasLtOp");
                    if (tmp1.hasLtOp != null) tmp1.hasLtOp.setParent(tmp1);
                    tmp1.hasNeOp = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("hasNeOp");
                    if (tmp1.hasNeOp != null) tmp1.hasNeOp.setParent(tmp1);
                    tmp1.hasOrOp = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("hasOrOp");
                    if (tmp1.hasOrOp != null) tmp1.hasOrOp.setParent(tmp1);
                    tmp1.customDefinedOp = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("customDefinedOp");
                    if (tmp1.customDefinedOp != null) tmp1.customDefinedOp.setParent(tmp1);
                    tmp1.hasTimesOp = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("hasTimesOp");
                    if (tmp1.hasTimesOp != null) tmp1.hasTimesOp.setParent(tmp1);
                    tmp1.definedBinaryOp = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("definedBinaryOp");
                    if (tmp1.definedBinaryOp != null) tmp1.definedBinaryOp.setParent(tmp1);
                    tmp1.hasLeOp = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("hasLeOp");
                    if (tmp1.hasLeOp != null) tmp1.hasLeOp.setParent(tmp1);
                    node.operator = tmp1;
                    if (tmp1 != null) tmp1.setParent(node);
                    node.rhsExpr = (IExpr)valueStack.get(valueStackOffset + 2);
                    if (node.rhsExpr != null) node.rhsExpr.setParent(node);
                    return node;

        }
        public Object handleCExpr840(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTCExprNode node = new ASTCExprNode();
                    node.rhsPrimary = (ASTCPrimaryNode)valueStack.get(valueStackOffset + 0);
                    if (node.rhsPrimary != null) node.rhsPrimary.setParent(node);
                    return node;

        }
        public Object handleCExpr841(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTCExprNode node = new ASTCExprNode();
                    node.lhsExpr = (ASTCExprNode)valueStack.get(valueStackOffset + 0);
                    if (node.lhsExpr != null) node.lhsExpr.setParent(node);
                    ASTOperatorNode tmp1 = new ASTOperatorNode();
                    tmp1.hasMinusOp = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("hasMinusOp");
                    if (tmp1.hasMinusOp != null) tmp1.hasMinusOp.setParent(tmp1);
                    tmp1.hasSlashEqOp = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("hasSlashEqOp");
                    if (tmp1.hasSlashEqOp != null) tmp1.hasSlashEqOp.setParent(tmp1);
                    tmp1.hasAndOp = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("hasAndOp");
                    if (tmp1.hasAndOp != null) tmp1.hasAndOp.setParent(tmp1);
                    tmp1.definedUnaryOp = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("definedUnaryOp");
                    if (tmp1.definedUnaryOp != null) tmp1.definedUnaryOp.setParent(tmp1);
                    tmp1.hasEqOp = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("hasEqOp");
                    if (tmp1.hasEqOp != null) tmp1.hasEqOp.setParent(tmp1);
                    tmp1.hasPlusOp = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("hasPlusOp");
                    if (tmp1.hasPlusOp != null) tmp1.hasPlusOp.setParent(tmp1);
                    tmp1.hasDivideOp = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("hasDivideOp");
                    if (tmp1.hasDivideOp != null) tmp1.hasDivideOp.setParent(tmp1);
                    tmp1.hasNeqvOp = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("hasNeqvOp");
                    if (tmp1.hasNeqvOp != null) tmp1.hasNeqvOp.setParent(tmp1);
                    tmp1.hasEqEqOp = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("hasEqEqOp");
                    if (tmp1.hasEqEqOp != null) tmp1.hasEqEqOp.setParent(tmp1);
                    tmp1.hasGeOp = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("hasGeOp");
                    if (tmp1.hasGeOp != null) tmp1.hasGeOp.setParent(tmp1);
                    tmp1.hasNotOp = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("hasNotOp");
                    if (tmp1.hasNotOp != null) tmp1.hasNotOp.setParent(tmp1);
                    tmp1.hasEqvOp = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("hasEqvOp");
                    if (tmp1.hasEqvOp != null) tmp1.hasEqvOp.setParent(tmp1);
                    tmp1.hasConcatOp = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("hasConcatOp");
                    if (tmp1.hasConcatOp != null) tmp1.hasConcatOp.setParent(tmp1);
                    tmp1.hasPowerOp = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("hasPowerOp");
                    if (tmp1.hasPowerOp != null) tmp1.hasPowerOp.setParent(tmp1);
                    tmp1.hasGtOp = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("hasGtOp");
                    if (tmp1.hasGtOp != null) tmp1.hasGtOp.setParent(tmp1);
                    tmp1.hasLtOp = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("hasLtOp");
                    if (tmp1.hasLtOp != null) tmp1.hasLtOp.setParent(tmp1);
                    tmp1.hasNeOp = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("hasNeOp");
                    if (tmp1.hasNeOp != null) tmp1.hasNeOp.setParent(tmp1);
                    tmp1.hasOrOp = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("hasOrOp");
                    if (tmp1.hasOrOp != null) tmp1.hasOrOp.setParent(tmp1);
                    tmp1.customDefinedOp = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("customDefinedOp");
                    if (tmp1.customDefinedOp != null) tmp1.customDefinedOp.setParent(tmp1);
                    tmp1.hasTimesOp = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("hasTimesOp");
                    if (tmp1.hasTimesOp != null) tmp1.hasTimesOp.setParent(tmp1);
                    tmp1.definedBinaryOp = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("definedBinaryOp");
                    if (tmp1.definedBinaryOp != null) tmp1.definedBinaryOp.setParent(tmp1);
                    tmp1.hasLeOp = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("hasLeOp");
                    if (tmp1.hasLeOp != null) tmp1.hasLeOp.setParent(tmp1);
                    node.concatOp = tmp1;
                    if (tmp1 != null) tmp1.setParent(node);
                    node.rhsPrimary = (ASTCPrimaryNode)valueStack.get(valueStackOffset + 2);
                    if (node.rhsPrimary != null) node.rhsPrimary.setParent(node);
                    return node;

        }
        public Object handleLevel4Expr842(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 5
                    IExpr result = (IExpr)valueStack.get(valueStackOffset + 0);
                    return result;

        }
        public Object handleLevel4Expr843(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTBinaryExprNode node = new ASTBinaryExprNode();
                    node.lhsExpr = (IExpr)valueStack.get(valueStackOffset + 0);
                    if (node.lhsExpr != null) node.lhsExpr.setParent(node);
                    node.operator = (ASTOperatorNode)valueStack.get(valueStackOffset + 1);
                    if (node.operator != null) node.operator.setParent(node);
                    node.rhsExpr = (IExpr)valueStack.get(valueStackOffset + 2);
                    if (node.rhsExpr != null) node.rhsExpr.setParent(node);
                    return node;

        }
        public Object handleAndOperand844(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 5
                    IExpr result = (IExpr)valueStack.get(valueStackOffset + 0);
                    return result;

        }
        public Object handleAndOperand845(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTUnaryExprNode node = new ASTUnaryExprNode();
                    node.operator = (ASTOperatorNode)valueStack.get(valueStackOffset + 0);
                    if (node.operator != null) node.operator.setParent(node);
                    node.operand = (IExpr)valueStack.get(valueStackOffset + 1);
                    if (node.operand != null) node.operand.setParent(node);
                    return node;

        }
        public Object handleOrOperand846(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 5
                    IExpr result = (IExpr)valueStack.get(valueStackOffset + 0);
                    return result;

        }
        public Object handleOrOperand847(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTBinaryExprNode node = new ASTBinaryExprNode();
                    node.lhsExpr = (IExpr)valueStack.get(valueStackOffset + 0);
                    if (node.lhsExpr != null) node.lhsExpr.setParent(node);
                    node.operator = (ASTOperatorNode)valueStack.get(valueStackOffset + 1);
                    if (node.operator != null) node.operator.setParent(node);
                    node.rhsExpr = (IExpr)valueStack.get(valueStackOffset + 2);
                    if (node.rhsExpr != null) node.rhsExpr.setParent(node);
                    return node;

        }
        public Object handleEquivOperand848(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 5
                    IExpr result = (IExpr)valueStack.get(valueStackOffset + 0);
                    return result;

        }
        public Object handleEquivOperand849(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTBinaryExprNode node = new ASTBinaryExprNode();
                    node.lhsExpr = (IExpr)valueStack.get(valueStackOffset + 0);
                    if (node.lhsExpr != null) node.lhsExpr.setParent(node);
                    node.operator = (ASTOperatorNode)valueStack.get(valueStackOffset + 1);
                    if (node.operator != null) node.operator.setParent(node);
                    node.rhsExpr = (IExpr)valueStack.get(valueStackOffset + 2);
                    if (node.rhsExpr != null) node.rhsExpr.setParent(node);
                    return node;

        }
        public Object handleLevel5Expr850(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 5
                    IExpr result = (IExpr)valueStack.get(valueStackOffset + 0);
                    return result;

        }
        public Object handleLevel5Expr851(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTBinaryExprNode node = new ASTBinaryExprNode();
                    node.lhsExpr = (IExpr)valueStack.get(valueStackOffset + 0);
                    if (node.lhsExpr != null) node.lhsExpr.setParent(node);
                    node.operator = (ASTOperatorNode)valueStack.get(valueStackOffset + 1);
                    if (node.operator != null) node.operator.setParent(node);
                    node.rhsExpr = (IExpr)valueStack.get(valueStackOffset + 2);
                    if (node.rhsExpr != null) node.rhsExpr.setParent(node);
                    return node;

        }
        public Object handleExpr852(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 5
                    IExpr result = (IExpr)valueStack.get(valueStackOffset + 0);
                    return result;

        }
        public Object handleExpr853(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTBinaryExprNode node = new ASTBinaryExprNode();
                    node.lhsExpr = (IExpr)valueStack.get(valueStackOffset + 0);
                    if (node.lhsExpr != null) node.lhsExpr.setParent(node);
                    node.operator = (ASTOperatorNode)valueStack.get(valueStackOffset + 1);
                    if (node.operator != null) node.operator.setParent(node);
                    node.rhsExpr = (IExpr)valueStack.get(valueStackOffset + 2);
                    if (node.rhsExpr != null) node.rhsExpr.setParent(node);
                    return node;

        }
        public Object handleSFExprList854(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 10
                    ASTSFExprListNode node = new ASTSFExprListNode();
                    node.lb = (ASTSFExprNode)valueStack.get(valueStackOffset + 0);
                    if (node.lb != null) node.lb.setParent(node);
                    node.hiddenTColon = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTColon != null) node.hiddenTColon.setParent(node);
                    node.ub = (IExpr)valueStack.get(valueStackOffset + 2);
                    if (node.ub != null) node.ub.setParent(node);
                    node.hiddenTColon2 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTColon2 != null) node.hiddenTColon2.setParent(node);
                    node.step = (IExpr)valueStack.get(valueStackOffset + 4);
                    if (node.step != null) node.step.setParent(node);
                    ASTListNode<ASTSFExprListNode> list = new ASTListNode<ASTSFExprListNode>();
                    list.add(node);
                    node.setParent(list);
                    return list;

        }
        public Object handleSFExprList855(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 10
                    ASTSFExprListNode node = new ASTSFExprListNode();
                    node.lb = (ASTSFExprNode)valueStack.get(valueStackOffset + 0);
                    if (node.lb != null) node.lb.setParent(node);
                    node.hiddenTColon = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTColon != null) node.hiddenTColon.setParent(node);
                    node.hiddenTColon2 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTColon2 != null) node.hiddenTColon2.setParent(node);
                    node.step = (IExpr)valueStack.get(valueStackOffset + 3);
                    if (node.step != null) node.step.setParent(node);
                    ASTListNode<ASTSFExprListNode> list = new ASTListNode<ASTSFExprListNode>();
                    list.add(node);
                    node.setParent(list);
                    return list;

        }
        public Object handleSFExprList856(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 10
                    ASTSFExprListNode node = new ASTSFExprListNode();
                    node.hiddenTColon = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.hiddenTColon != null) node.hiddenTColon.setParent(node);
                    node.ub = (IExpr)valueStack.get(valueStackOffset + 1);
                    if (node.ub != null) node.ub.setParent(node);
                    node.hiddenTColon2 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTColon2 != null) node.hiddenTColon2.setParent(node);
                    node.step = (IExpr)valueStack.get(valueStackOffset + 3);
                    if (node.step != null) node.step.setParent(node);
                    ASTListNode<ASTSFExprListNode> list = new ASTListNode<ASTSFExprListNode>();
                    list.add(node);
                    node.setParent(list);
                    return list;

        }
        public Object handleSFExprList857(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 10
                    ASTSFExprListNode node = new ASTSFExprListNode();
                    node.hiddenTColon = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.hiddenTColon != null) node.hiddenTColon.setParent(node);
                    node.hiddenTColon2 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTColon2 != null) node.hiddenTColon2.setParent(node);
                    node.step = (IExpr)valueStack.get(valueStackOffset + 2);
                    if (node.step != null) node.step.setParent(node);
                    ASTListNode<ASTSFExprListNode> list = new ASTListNode<ASTSFExprListNode>();
                    list.add(node);
                    node.setParent(list);
                    return list;

        }
        public Object handleSFExprList858(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 10
                    ASTSFExprListNode node = new ASTSFExprListNode();
                    node.hiddenTColon = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.hiddenTColon != null) node.hiddenTColon.setParent(node);
                    ASTListNode<ASTSFExprListNode> list = new ASTListNode<ASTSFExprListNode>();
                    list.add(node);
                    node.setParent(list);
                    return list;

        }
        public Object handleSFExprList859(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 10
                    ASTSFExprListNode node = new ASTSFExprListNode();
                    node.hiddenTColon = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.hiddenTColon != null) node.hiddenTColon.setParent(node);
                    node.ub = (IExpr)valueStack.get(valueStackOffset + 1);
                    if (node.ub != null) node.ub.setParent(node);
                    ASTListNode<ASTSFExprListNode> list = new ASTListNode<ASTSFExprListNode>();
                    list.add(node);
                    node.setParent(list);
                    return list;

        }
        public Object handleSFExprList860(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 10
                    ASTSFExprListNode node = new ASTSFExprListNode();
                    node.lb = (ASTSFExprNode)valueStack.get(valueStackOffset + 0);
                    if (node.lb != null) node.lb.setParent(node);
                    ASTListNode<ASTSFExprListNode> list = new ASTListNode<ASTSFExprListNode>();
                    list.add(node);
                    node.setParent(list);
                    return list;

        }
        public Object handleSFExprList861(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 10
                    ASTSFExprListNode node = new ASTSFExprListNode();
                    node.lb = (ASTSFExprNode)valueStack.get(valueStackOffset + 0);
                    if (node.lb != null) node.lb.setParent(node);
                    node.hiddenTColon = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTColon != null) node.hiddenTColon.setParent(node);
                    ASTListNode<ASTSFExprListNode> list = new ASTListNode<ASTSFExprListNode>();
                    list.add(node);
                    node.setParent(list);
                    return list;

        }
        public Object handleSFExprList862(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 10
                    ASTSFExprListNode node = new ASTSFExprListNode();
                    node.lb = (ASTSFExprNode)valueStack.get(valueStackOffset + 0);
                    if (node.lb != null) node.lb.setParent(node);
                    node.hiddenTColon = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTColon != null) node.hiddenTColon.setParent(node);
                    node.ub = (IExpr)valueStack.get(valueStackOffset + 2);
                    if (node.ub != null) node.ub.setParent(node);
                    ASTListNode<ASTSFExprListNode> list = new ASTListNode<ASTSFExprListNode>();
                    list.add(node);
                    node.setParent(list);
                    return list;

        }
        public Object handleSFExprList863(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 11
                    ASTSFExprListNode node = new ASTSFExprListNode();
                    node.hiddenTComma = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTComma != null) node.hiddenTComma.setParent(node);
                    node.sectionSubscript = (ASTSectionSubscriptNode)valueStack.get(valueStackOffset + 2);
                    if (node.sectionSubscript != null) node.sectionSubscript.setParent(node);
                    ASTListNode<ASTSFExprListNode> list = (ASTListNode<ASTSFExprListNode>)valueStack.get(valueStackOffset);
                    list.add(node);
                    node.setParent(list);
                    return list;

        }
        public Object handleSFExprList864(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 10
                    ASTSFExprListNode node = new ASTSFExprListNode();
                    node.SFDummyArgNameList = (IASTListNode<ASTSFDummyArgNameListNode>)valueStack.get(valueStackOffset + 0);
                    if (node.SFDummyArgNameList != null) node.SFDummyArgNameList.setParent(node);
                    node.hiddenTComma = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTComma != null) node.hiddenTComma.setParent(node);
                    node.hiddenTColon = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTColon != null) node.hiddenTColon.setParent(node);
                    ASTListNode<ASTSFExprListNode> list = new ASTListNode<ASTSFExprListNode>();
                    list.add(node);
                    node.setParent(list);
                    return list;

        }
        public Object handleSFExprList865(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 10
                    ASTSFExprListNode node = new ASTSFExprListNode();
                    node.SFDummyArgNameList = (IASTListNode<ASTSFDummyArgNameListNode>)valueStack.get(valueStackOffset + 0);
                    if (node.SFDummyArgNameList != null) node.SFDummyArgNameList.setParent(node);
                    node.hiddenTComma = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTComma != null) node.hiddenTComma.setParent(node);
                    node.hiddenTColon = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTColon != null) node.hiddenTColon.setParent(node);
                    node.ub = (IExpr)valueStack.get(valueStackOffset + 3);
                    if (node.ub != null) node.ub.setParent(node);
                    ASTListNode<ASTSFExprListNode> list = new ASTListNode<ASTSFExprListNode>();
                    list.add(node);
                    node.setParent(list);
                    return list;

        }
        public Object handleSFExprList866(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 10
                    ASTSFExprListNode node = new ASTSFExprListNode();
                    node.SFDummyArgNameList = (IASTListNode<ASTSFDummyArgNameListNode>)valueStack.get(valueStackOffset + 0);
                    if (node.SFDummyArgNameList != null) node.SFDummyArgNameList.setParent(node);
                    node.hiddenTComma = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTComma != null) node.hiddenTComma.setParent(node);
                    node.lb = (ASTSFExprNode)valueStack.get(valueStackOffset + 2);
                    if (node.lb != null) node.lb.setParent(node);
                    ASTListNode<ASTSFExprListNode> list = new ASTListNode<ASTSFExprListNode>();
                    list.add(node);
                    node.setParent(list);
                    return list;

        }
        public Object handleSFExprList867(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 10
                    ASTSFExprListNode node = new ASTSFExprListNode();
                    node.SFDummyArgNameList = (IASTListNode<ASTSFDummyArgNameListNode>)valueStack.get(valueStackOffset + 0);
                    if (node.SFDummyArgNameList != null) node.SFDummyArgNameList.setParent(node);
                    node.hiddenTComma = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTComma != null) node.hiddenTComma.setParent(node);
                    node.lb = (ASTSFExprNode)valueStack.get(valueStackOffset + 2);
                    if (node.lb != null) node.lb.setParent(node);
                    node.hiddenTColon = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTColon != null) node.hiddenTColon.setParent(node);
                    ASTListNode<ASTSFExprListNode> list = new ASTListNode<ASTSFExprListNode>();
                    list.add(node);
                    node.setParent(list);
                    return list;

        }
        public Object handleSFExprList868(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 10
                    ASTSFExprListNode node = new ASTSFExprListNode();
                    node.SFDummyArgNameList = (IASTListNode<ASTSFDummyArgNameListNode>)valueStack.get(valueStackOffset + 0);
                    if (node.SFDummyArgNameList != null) node.SFDummyArgNameList.setParent(node);
                    node.hiddenTComma = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTComma != null) node.hiddenTComma.setParent(node);
                    node.lb = (ASTSFExprNode)valueStack.get(valueStackOffset + 2);
                    if (node.lb != null) node.lb.setParent(node);
                    node.hiddenTColon = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTColon != null) node.hiddenTColon.setParent(node);
                    node.ub = (IExpr)valueStack.get(valueStackOffset + 4);
                    if (node.ub != null) node.ub.setParent(node);
                    ASTListNode<ASTSFExprListNode> list = new ASTListNode<ASTSFExprListNode>();
                    list.add(node);
                    node.setParent(list);
                    return list;

        }
        public Object handleAssignmentStmt869(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTAssignmentStmtNode node = new ASTAssignmentStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    ASTNameNode tmp1 = new ASTNameNode();
                    tmp1.name = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("name");
                    if (tmp1.name != null) tmp1.name.setParent(tmp1);
                    node.lhsVariable = tmp1;
                    if (tmp1 != null) tmp1.setParent(node);
                    node.hiddenTEquals = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTEquals != null) node.hiddenTEquals.setParent(node);
                    node.rhs = (IExpr)valueStack.get(valueStackOffset + 3);
                    if (node.rhs != null) node.rhs.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleAssignmentStmt870(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTAssignmentStmtNode node = new ASTAssignmentStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    ASTNameNode tmp1 = new ASTNameNode();
                    tmp1.name = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("name");
                    if (tmp1.name != null) tmp1.name.setParent(tmp1);
                    node.lhsVariable = tmp1;
                    if (tmp1 != null) tmp1.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.lhsExprList = (IASTListNode<ASTSFExprListNode>)valueStack.get(valueStackOffset + 3);
                    if (node.lhsExprList != null) node.lhsExprList.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    node.hiddenTEquals = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 5);
                    if (node.hiddenTEquals != null) node.hiddenTEquals.setParent(node);
                    node.rhs = (IExpr)valueStack.get(valueStackOffset + 6);
                    if (node.rhs != null) node.rhs.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 7);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleAssignmentStmt871(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTAssignmentStmtNode node = new ASTAssignmentStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    ASTNameNode tmp1 = new ASTNameNode();
                    tmp1.name = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("name");
                    if (tmp1.name != null) tmp1.name.setParent(tmp1);
                    node.lhsVariable = tmp1;
                    if (tmp1 != null) tmp1.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.lhsExprList = (IASTListNode<ASTSFExprListNode>)valueStack.get(valueStackOffset + 3);
                    if (node.lhsExprList != null) node.lhsExprList.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    node.substringRange = (ASTSubstringRangeNode)valueStack.get(valueStackOffset + 5);
                    if (node.substringRange != null) node.substringRange.setParent(node);
                    node.hiddenTEquals = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 6);
                    if (node.hiddenTEquals != null) node.hiddenTEquals.setParent(node);
                    node.rhs = (IExpr)valueStack.get(valueStackOffset + 7);
                    if (node.rhs != null) node.rhs.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 8);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleAssignmentStmt872(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTAssignmentStmtNode node = new ASTAssignmentStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    ASTNameNode tmp1 = new ASTNameNode();
                    tmp1.name = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("name");
                    if (tmp1.name != null) tmp1.name.setParent(tmp1);
                    node.lhsVariable = tmp1;
                    if (tmp1 != null) tmp1.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.lhsNameList = (IASTListNode<ASTSFDummyArgNameListNode>)valueStack.get(valueStackOffset + 3);
                    if (node.lhsNameList != null) node.lhsNameList.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    node.substringRange = (ASTSubstringRangeNode)valueStack.get(valueStackOffset + 5);
                    if (node.substringRange != null) node.substringRange.setParent(node);
                    node.hiddenTEquals = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 6);
                    if (node.hiddenTEquals != null) node.hiddenTEquals.setParent(node);
                    node.rhs = (IExpr)valueStack.get(valueStackOffset + 7);
                    if (node.rhs != null) node.rhs.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 8);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleAssignmentStmt873(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTAssignmentStmtNode node = new ASTAssignmentStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    ASTNameNode tmp1 = new ASTNameNode();
                    tmp1.name = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("name");
                    if (tmp1.name != null) tmp1.name.setParent(tmp1);
                    node.lhsVariable = tmp1;
                    if (tmp1 != null) tmp1.setParent(node);
                    node.hiddenTPercent = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTPercent != null) node.hiddenTPercent.setParent(node);
                    node.derivedTypeComponentRef = (IASTListNode<ASTDataRefNode>)valueStack.get(valueStackOffset + 3);
                    if (node.derivedTypeComponentRef != null) node.derivedTypeComponentRef.setParent(node);
                    node.hiddenTEquals = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenTEquals != null) node.hiddenTEquals.setParent(node);
                    node.rhs = (IExpr)valueStack.get(valueStackOffset + 5);
                    if (node.rhs != null) node.rhs.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 6);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleAssignmentStmt874(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTAssignmentStmtNode node = new ASTAssignmentStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    ASTNameNode tmp1 = new ASTNameNode();
                    tmp1.name = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("name");
                    if (tmp1.name != null) tmp1.name.setParent(tmp1);
                    node.lhsVariable = tmp1;
                    if (tmp1 != null) tmp1.setParent(node);
                    node.hiddenTPercent = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTPercent != null) node.hiddenTPercent.setParent(node);
                    node.derivedTypeComponentRef = (IASTListNode<ASTDataRefNode>)valueStack.get(valueStackOffset + 3);
                    if (node.derivedTypeComponentRef != null) node.derivedTypeComponentRef.setParent(node);
                    node.hiddenLparen2 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenLparen2 != null) node.hiddenLparen2.setParent(node);
                    node.componentSectionSubscriptList = (IASTListNode<ASTSectionSubscriptNode>)valueStack.get(valueStackOffset + 5);
                    if (node.componentSectionSubscriptList != null) node.componentSectionSubscriptList.setParent(node);
                    node.hiddenRparen2 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 6);
                    if (node.hiddenRparen2 != null) node.hiddenRparen2.setParent(node);
                    node.hiddenTEquals = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 7);
                    if (node.hiddenTEquals != null) node.hiddenTEquals.setParent(node);
                    node.rhs = (IExpr)valueStack.get(valueStackOffset + 8);
                    if (node.rhs != null) node.rhs.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 9);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleAssignmentStmt875(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTAssignmentStmtNode node = new ASTAssignmentStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    ASTNameNode tmp1 = new ASTNameNode();
                    tmp1.name = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("name");
                    if (tmp1.name != null) tmp1.name.setParent(tmp1);
                    node.lhsVariable = tmp1;
                    if (tmp1 != null) tmp1.setParent(node);
                    node.hiddenTPercent = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTPercent != null) node.hiddenTPercent.setParent(node);
                    node.derivedTypeComponentRef = (IASTListNode<ASTDataRefNode>)valueStack.get(valueStackOffset + 3);
                    if (node.derivedTypeComponentRef != null) node.derivedTypeComponentRef.setParent(node);
                    node.hiddenLparen2 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenLparen2 != null) node.hiddenLparen2.setParent(node);
                    node.componentSectionSubscriptList = (IASTListNode<ASTSectionSubscriptNode>)valueStack.get(valueStackOffset + 5);
                    if (node.componentSectionSubscriptList != null) node.componentSectionSubscriptList.setParent(node);
                    node.hiddenRparen2 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 6);
                    if (node.hiddenRparen2 != null) node.hiddenRparen2.setParent(node);
                    node.substringRange = (ASTSubstringRangeNode)valueStack.get(valueStackOffset + 7);
                    if (node.substringRange != null) node.substringRange.setParent(node);
                    node.hiddenTEquals = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 8);
                    if (node.hiddenTEquals != null) node.hiddenTEquals.setParent(node);
                    node.rhs = (IExpr)valueStack.get(valueStackOffset + 9);
                    if (node.rhs != null) node.rhs.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 10);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleAssignmentStmt876(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTAssignmentStmtNode node = new ASTAssignmentStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    ASTNameNode tmp1 = new ASTNameNode();
                    tmp1.name = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("name");
                    if (tmp1.name != null) tmp1.name.setParent(tmp1);
                    node.lhsVariable = tmp1;
                    if (tmp1 != null) tmp1.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.lhsExprList = (IASTListNode<ASTSFExprListNode>)valueStack.get(valueStackOffset + 3);
                    if (node.lhsExprList != null) node.lhsExprList.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    node.hiddenTPercent = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 5);
                    if (node.hiddenTPercent != null) node.hiddenTPercent.setParent(node);
                    node.derivedTypeComponentRef = (IASTListNode<ASTDataRefNode>)valueStack.get(valueStackOffset + 6);
                    if (node.derivedTypeComponentRef != null) node.derivedTypeComponentRef.setParent(node);
                    node.hiddenTEquals = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 7);
                    if (node.hiddenTEquals != null) node.hiddenTEquals.setParent(node);
                    node.rhs = (IExpr)valueStack.get(valueStackOffset + 8);
                    if (node.rhs != null) node.rhs.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 9);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleAssignmentStmt877(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTAssignmentStmtNode node = new ASTAssignmentStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    ASTNameNode tmp1 = new ASTNameNode();
                    tmp1.name = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("name");
                    if (tmp1.name != null) tmp1.name.setParent(tmp1);
                    node.lhsVariable = tmp1;
                    if (tmp1 != null) tmp1.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.lhsExprList = (IASTListNode<ASTSFExprListNode>)valueStack.get(valueStackOffset + 3);
                    if (node.lhsExprList != null) node.lhsExprList.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    node.hiddenTPercent = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 5);
                    if (node.hiddenTPercent != null) node.hiddenTPercent.setParent(node);
                    node.derivedTypeComponentRef = (IASTListNode<ASTDataRefNode>)valueStack.get(valueStackOffset + 6);
                    if (node.derivedTypeComponentRef != null) node.derivedTypeComponentRef.setParent(node);
                    node.hiddenLparen2 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 7);
                    if (node.hiddenLparen2 != null) node.hiddenLparen2.setParent(node);
                    node.componentSectionSubscriptList = (IASTListNode<ASTSectionSubscriptNode>)valueStack.get(valueStackOffset + 8);
                    if (node.componentSectionSubscriptList != null) node.componentSectionSubscriptList.setParent(node);
                    node.hiddenRparen2 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 9);
                    if (node.hiddenRparen2 != null) node.hiddenRparen2.setParent(node);
                    node.hiddenTEquals = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 10);
                    if (node.hiddenTEquals != null) node.hiddenTEquals.setParent(node);
                    node.rhs = (IExpr)valueStack.get(valueStackOffset + 11);
                    if (node.rhs != null) node.rhs.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 12);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleAssignmentStmt878(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTAssignmentStmtNode node = new ASTAssignmentStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    ASTNameNode tmp1 = new ASTNameNode();
                    tmp1.name = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("name");
                    if (tmp1.name != null) tmp1.name.setParent(tmp1);
                    node.lhsVariable = tmp1;
                    if (tmp1 != null) tmp1.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.lhsExprList = (IASTListNode<ASTSFExprListNode>)valueStack.get(valueStackOffset + 3);
                    if (node.lhsExprList != null) node.lhsExprList.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    node.hiddenTPercent = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 5);
                    if (node.hiddenTPercent != null) node.hiddenTPercent.setParent(node);
                    node.derivedTypeComponentRef = (IASTListNode<ASTDataRefNode>)valueStack.get(valueStackOffset + 6);
                    if (node.derivedTypeComponentRef != null) node.derivedTypeComponentRef.setParent(node);
                    node.hiddenLparen2 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 7);
                    if (node.hiddenLparen2 != null) node.hiddenLparen2.setParent(node);
                    node.componentSectionSubscriptList = (IASTListNode<ASTSectionSubscriptNode>)valueStack.get(valueStackOffset + 8);
                    if (node.componentSectionSubscriptList != null) node.componentSectionSubscriptList.setParent(node);
                    node.hiddenRparen2 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 9);
                    if (node.hiddenRparen2 != null) node.hiddenRparen2.setParent(node);
                    node.substringRange = (ASTSubstringRangeNode)valueStack.get(valueStackOffset + 10);
                    if (node.substringRange != null) node.substringRange.setParent(node);
                    node.hiddenTEquals = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 11);
                    if (node.hiddenTEquals != null) node.hiddenTEquals.setParent(node);
                    node.rhs = (IExpr)valueStack.get(valueStackOffset + 12);
                    if (node.rhs != null) node.rhs.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 13);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleAssignmentStmt879(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTAssignmentStmtNode node = new ASTAssignmentStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    ASTNameNode tmp1 = new ASTNameNode();
                    tmp1.name = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("name");
                    if (tmp1.name != null) tmp1.name.setParent(tmp1);
                    node.lhsVariable = tmp1;
                    if (tmp1 != null) tmp1.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.lhsNameList = (IASTListNode<ASTSFDummyArgNameListNode>)valueStack.get(valueStackOffset + 3);
                    if (node.lhsNameList != null) node.lhsNameList.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    node.hiddenTPercent = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 5);
                    if (node.hiddenTPercent != null) node.hiddenTPercent.setParent(node);
                    node.derivedTypeComponentRef = (IASTListNode<ASTDataRefNode>)valueStack.get(valueStackOffset + 6);
                    if (node.derivedTypeComponentRef != null) node.derivedTypeComponentRef.setParent(node);
                    node.hiddenTEquals = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 7);
                    if (node.hiddenTEquals != null) node.hiddenTEquals.setParent(node);
                    node.rhs = (IExpr)valueStack.get(valueStackOffset + 8);
                    if (node.rhs != null) node.rhs.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 9);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleAssignmentStmt880(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTAssignmentStmtNode node = new ASTAssignmentStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    ASTNameNode tmp1 = new ASTNameNode();
                    tmp1.name = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("name");
                    if (tmp1.name != null) tmp1.name.setParent(tmp1);
                    node.lhsVariable = tmp1;
                    if (tmp1 != null) tmp1.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.lhsNameList = (IASTListNode<ASTSFDummyArgNameListNode>)valueStack.get(valueStackOffset + 3);
                    if (node.lhsNameList != null) node.lhsNameList.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    node.hiddenTPercent = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 5);
                    if (node.hiddenTPercent != null) node.hiddenTPercent.setParent(node);
                    node.derivedTypeComponentRef = (IASTListNode<ASTDataRefNode>)valueStack.get(valueStackOffset + 6);
                    if (node.derivedTypeComponentRef != null) node.derivedTypeComponentRef.setParent(node);
                    node.hiddenLparen2 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 7);
                    if (node.hiddenLparen2 != null) node.hiddenLparen2.setParent(node);
                    node.componentSectionSubscriptList = (IASTListNode<ASTSectionSubscriptNode>)valueStack.get(valueStackOffset + 8);
                    if (node.componentSectionSubscriptList != null) node.componentSectionSubscriptList.setParent(node);
                    node.hiddenRparen2 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 9);
                    if (node.hiddenRparen2 != null) node.hiddenRparen2.setParent(node);
                    node.hiddenTEquals = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 10);
                    if (node.hiddenTEquals != null) node.hiddenTEquals.setParent(node);
                    node.rhs = (IExpr)valueStack.get(valueStackOffset + 11);
                    if (node.rhs != null) node.rhs.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 12);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleAssignmentStmt881(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTAssignmentStmtNode node = new ASTAssignmentStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    ASTNameNode tmp1 = new ASTNameNode();
                    tmp1.name = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("name");
                    if (tmp1.name != null) tmp1.name.setParent(tmp1);
                    node.lhsVariable = tmp1;
                    if (tmp1 != null) tmp1.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.lhsNameList = (IASTListNode<ASTSFDummyArgNameListNode>)valueStack.get(valueStackOffset + 3);
                    if (node.lhsNameList != null) node.lhsNameList.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    node.hiddenTPercent = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 5);
                    if (node.hiddenTPercent != null) node.hiddenTPercent.setParent(node);
                    node.derivedTypeComponentRef = (IASTListNode<ASTDataRefNode>)valueStack.get(valueStackOffset + 6);
                    if (node.derivedTypeComponentRef != null) node.derivedTypeComponentRef.setParent(node);
                    node.hiddenLparen2 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 7);
                    if (node.hiddenLparen2 != null) node.hiddenLparen2.setParent(node);
                    node.componentSectionSubscriptList = (IASTListNode<ASTSectionSubscriptNode>)valueStack.get(valueStackOffset + 8);
                    if (node.componentSectionSubscriptList != null) node.componentSectionSubscriptList.setParent(node);
                    node.hiddenRparen2 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 9);
                    if (node.hiddenRparen2 != null) node.hiddenRparen2.setParent(node);
                    node.substringRange = (ASTSubstringRangeNode)valueStack.get(valueStackOffset + 10);
                    if (node.substringRange != null) node.substringRange.setParent(node);
                    node.hiddenTEquals = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 11);
                    if (node.hiddenTEquals != null) node.hiddenTEquals.setParent(node);
                    node.rhs = (IExpr)valueStack.get(valueStackOffset + 12);
                    if (node.rhs != null) node.rhs.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 13);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleAssignmentStmt882(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTAssignmentStmtNode node = new ASTAssignmentStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    ASTNameNode tmp1 = new ASTNameNode();
                    tmp1.name = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("name");
                    if (tmp1.name != null) tmp1.name.setParent(tmp1);
                    node.lhsVariable = tmp1;
                    if (tmp1 != null) tmp1.setParent(node);
                    node.imageSelector = (ASTImageSelectorNode)valueStack.get(valueStackOffset + 2);
                    if (node.imageSelector != null) node.imageSelector.setParent(node);
                    node.hiddenTEquals = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTEquals != null) node.hiddenTEquals.setParent(node);
                    node.rhs = (IExpr)valueStack.get(valueStackOffset + 4);
                    if (node.rhs != null) node.rhs.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 5);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleAssignmentStmt883(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTAssignmentStmtNode node = new ASTAssignmentStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    ASTNameNode tmp1 = new ASTNameNode();
                    tmp1.name = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("name");
                    if (tmp1.name != null) tmp1.name.setParent(tmp1);
                    node.lhsVariable = tmp1;
                    if (tmp1 != null) tmp1.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.lhsExprList = (IASTListNode<ASTSFExprListNode>)valueStack.get(valueStackOffset + 3);
                    if (node.lhsExprList != null) node.lhsExprList.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    node.imageSelector = (ASTImageSelectorNode)valueStack.get(valueStackOffset + 5);
                    if (node.imageSelector != null) node.imageSelector.setParent(node);
                    node.hiddenTEquals = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 6);
                    if (node.hiddenTEquals != null) node.hiddenTEquals.setParent(node);
                    node.rhs = (IExpr)valueStack.get(valueStackOffset + 7);
                    if (node.rhs != null) node.rhs.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 8);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleAssignmentStmt884(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTAssignmentStmtNode node = new ASTAssignmentStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    ASTNameNode tmp1 = new ASTNameNode();
                    tmp1.name = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("name");
                    if (tmp1.name != null) tmp1.name.setParent(tmp1);
                    node.lhsVariable = tmp1;
                    if (tmp1 != null) tmp1.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.lhsExprList = (IASTListNode<ASTSFExprListNode>)valueStack.get(valueStackOffset + 3);
                    if (node.lhsExprList != null) node.lhsExprList.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    node.imageSelector = (ASTImageSelectorNode)valueStack.get(valueStackOffset + 5);
                    if (node.imageSelector != null) node.imageSelector.setParent(node);
                    node.substringRange = (ASTSubstringRangeNode)valueStack.get(valueStackOffset + 6);
                    if (node.substringRange != null) node.substringRange.setParent(node);
                    node.hiddenTEquals = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 7);
                    if (node.hiddenTEquals != null) node.hiddenTEquals.setParent(node);
                    node.rhs = (IExpr)valueStack.get(valueStackOffset + 8);
                    if (node.rhs != null) node.rhs.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 9);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleAssignmentStmt885(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTAssignmentStmtNode node = new ASTAssignmentStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    ASTNameNode tmp1 = new ASTNameNode();
                    tmp1.name = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("name");
                    if (tmp1.name != null) tmp1.name.setParent(tmp1);
                    node.lhsVariable = tmp1;
                    if (tmp1 != null) tmp1.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.lhsNameList = (IASTListNode<ASTSFDummyArgNameListNode>)valueStack.get(valueStackOffset + 3);
                    if (node.lhsNameList != null) node.lhsNameList.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    node.imageSelector = (ASTImageSelectorNode)valueStack.get(valueStackOffset + 5);
                    if (node.imageSelector != null) node.imageSelector.setParent(node);
                    node.substringRange = (ASTSubstringRangeNode)valueStack.get(valueStackOffset + 6);
                    if (node.substringRange != null) node.substringRange.setParent(node);
                    node.hiddenTEquals = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 7);
                    if (node.hiddenTEquals != null) node.hiddenTEquals.setParent(node);
                    node.rhs = (IExpr)valueStack.get(valueStackOffset + 8);
                    if (node.rhs != null) node.rhs.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 9);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleAssignmentStmt886(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTAssignmentStmtNode node = new ASTAssignmentStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    ASTNameNode tmp1 = new ASTNameNode();
                    tmp1.name = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("name");
                    if (tmp1.name != null) tmp1.name.setParent(tmp1);
                    node.lhsVariable = tmp1;
                    if (tmp1 != null) tmp1.setParent(node);
                    node.imageSelector = (ASTImageSelectorNode)valueStack.get(valueStackOffset + 2);
                    if (node.imageSelector != null) node.imageSelector.setParent(node);
                    node.hiddenTPercent = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTPercent != null) node.hiddenTPercent.setParent(node);
                    node.derivedTypeComponentRef = (IASTListNode<ASTDataRefNode>)valueStack.get(valueStackOffset + 4);
                    if (node.derivedTypeComponentRef != null) node.derivedTypeComponentRef.setParent(node);
                    node.hiddenTEquals = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 5);
                    if (node.hiddenTEquals != null) node.hiddenTEquals.setParent(node);
                    node.rhs = (IExpr)valueStack.get(valueStackOffset + 6);
                    if (node.rhs != null) node.rhs.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 7);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleAssignmentStmt887(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTAssignmentStmtNode node = new ASTAssignmentStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    ASTNameNode tmp1 = new ASTNameNode();
                    tmp1.name = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("name");
                    if (tmp1.name != null) tmp1.name.setParent(tmp1);
                    node.lhsVariable = tmp1;
                    if (tmp1 != null) tmp1.setParent(node);
                    node.imageSelector = (ASTImageSelectorNode)valueStack.get(valueStackOffset + 2);
                    if (node.imageSelector != null) node.imageSelector.setParent(node);
                    node.hiddenTPercent = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTPercent != null) node.hiddenTPercent.setParent(node);
                    node.derivedTypeComponentRef = (IASTListNode<ASTDataRefNode>)valueStack.get(valueStackOffset + 4);
                    if (node.derivedTypeComponentRef != null) node.derivedTypeComponentRef.setParent(node);
                    node.hiddenLparen2 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 5);
                    if (node.hiddenLparen2 != null) node.hiddenLparen2.setParent(node);
                    node.componentSectionSubscriptList = (IASTListNode<ASTSectionSubscriptNode>)valueStack.get(valueStackOffset + 6);
                    if (node.componentSectionSubscriptList != null) node.componentSectionSubscriptList.setParent(node);
                    node.hiddenRparen2 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 7);
                    if (node.hiddenRparen2 != null) node.hiddenRparen2.setParent(node);
                    node.hiddenTEquals = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 8);
                    if (node.hiddenTEquals != null) node.hiddenTEquals.setParent(node);
                    node.rhs = (IExpr)valueStack.get(valueStackOffset + 9);
                    if (node.rhs != null) node.rhs.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 10);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleAssignmentStmt888(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTAssignmentStmtNode node = new ASTAssignmentStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    ASTNameNode tmp1 = new ASTNameNode();
                    tmp1.name = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("name");
                    if (tmp1.name != null) tmp1.name.setParent(tmp1);
                    node.lhsVariable = tmp1;
                    if (tmp1 != null) tmp1.setParent(node);
                    node.imageSelector = (ASTImageSelectorNode)valueStack.get(valueStackOffset + 2);
                    if (node.imageSelector != null) node.imageSelector.setParent(node);
                    node.hiddenTPercent = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTPercent != null) node.hiddenTPercent.setParent(node);
                    node.derivedTypeComponentRef = (IASTListNode<ASTDataRefNode>)valueStack.get(valueStackOffset + 4);
                    if (node.derivedTypeComponentRef != null) node.derivedTypeComponentRef.setParent(node);
                    node.hiddenLparen2 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 5);
                    if (node.hiddenLparen2 != null) node.hiddenLparen2.setParent(node);
                    node.componentSectionSubscriptList = (IASTListNode<ASTSectionSubscriptNode>)valueStack.get(valueStackOffset + 6);
                    if (node.componentSectionSubscriptList != null) node.componentSectionSubscriptList.setParent(node);
                    node.hiddenRparen2 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 7);
                    if (node.hiddenRparen2 != null) node.hiddenRparen2.setParent(node);
                    node.substringRange = (ASTSubstringRangeNode)valueStack.get(valueStackOffset + 8);
                    if (node.substringRange != null) node.substringRange.setParent(node);
                    node.hiddenTEquals = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 9);
                    if (node.hiddenTEquals != null) node.hiddenTEquals.setParent(node);
                    node.rhs = (IExpr)valueStack.get(valueStackOffset + 10);
                    if (node.rhs != null) node.rhs.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 11);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleAssignmentStmt889(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTAssignmentStmtNode node = new ASTAssignmentStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    ASTNameNode tmp1 = new ASTNameNode();
                    tmp1.name = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("name");
                    if (tmp1.name != null) tmp1.name.setParent(tmp1);
                    node.lhsVariable = tmp1;
                    if (tmp1 != null) tmp1.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.lhsExprList = (IASTListNode<ASTSFExprListNode>)valueStack.get(valueStackOffset + 3);
                    if (node.lhsExprList != null) node.lhsExprList.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    node.imageSelector = (ASTImageSelectorNode)valueStack.get(valueStackOffset + 5);
                    if (node.imageSelector != null) node.imageSelector.setParent(node);
                    node.hiddenTPercent = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 6);
                    if (node.hiddenTPercent != null) node.hiddenTPercent.setParent(node);
                    node.derivedTypeComponentRef = (IASTListNode<ASTDataRefNode>)valueStack.get(valueStackOffset + 7);
                    if (node.derivedTypeComponentRef != null) node.derivedTypeComponentRef.setParent(node);
                    node.hiddenTEquals = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 8);
                    if (node.hiddenTEquals != null) node.hiddenTEquals.setParent(node);
                    node.rhs = (IExpr)valueStack.get(valueStackOffset + 9);
                    if (node.rhs != null) node.rhs.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 10);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleAssignmentStmt890(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTAssignmentStmtNode node = new ASTAssignmentStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    ASTNameNode tmp1 = new ASTNameNode();
                    tmp1.name = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("name");
                    if (tmp1.name != null) tmp1.name.setParent(tmp1);
                    node.lhsVariable = tmp1;
                    if (tmp1 != null) tmp1.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.lhsExprList = (IASTListNode<ASTSFExprListNode>)valueStack.get(valueStackOffset + 3);
                    if (node.lhsExprList != null) node.lhsExprList.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    node.imageSelector = (ASTImageSelectorNode)valueStack.get(valueStackOffset + 5);
                    if (node.imageSelector != null) node.imageSelector.setParent(node);
                    node.hiddenTPercent = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 6);
                    if (node.hiddenTPercent != null) node.hiddenTPercent.setParent(node);
                    node.derivedTypeComponentRef = (IASTListNode<ASTDataRefNode>)valueStack.get(valueStackOffset + 7);
                    if (node.derivedTypeComponentRef != null) node.derivedTypeComponentRef.setParent(node);
                    node.hiddenLparen2 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 8);
                    if (node.hiddenLparen2 != null) node.hiddenLparen2.setParent(node);
                    node.componentSectionSubscriptList = (IASTListNode<ASTSectionSubscriptNode>)valueStack.get(valueStackOffset + 9);
                    if (node.componentSectionSubscriptList != null) node.componentSectionSubscriptList.setParent(node);
                    node.hiddenRparen2 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 10);
                    if (node.hiddenRparen2 != null) node.hiddenRparen2.setParent(node);
                    node.hiddenTEquals = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 11);
                    if (node.hiddenTEquals != null) node.hiddenTEquals.setParent(node);
                    node.rhs = (IExpr)valueStack.get(valueStackOffset + 12);
                    if (node.rhs != null) node.rhs.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 13);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleAssignmentStmt891(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTAssignmentStmtNode node = new ASTAssignmentStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    ASTNameNode tmp1 = new ASTNameNode();
                    tmp1.name = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("name");
                    if (tmp1.name != null) tmp1.name.setParent(tmp1);
                    node.lhsVariable = tmp1;
                    if (tmp1 != null) tmp1.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.lhsExprList = (IASTListNode<ASTSFExprListNode>)valueStack.get(valueStackOffset + 3);
                    if (node.lhsExprList != null) node.lhsExprList.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    node.imageSelector = (ASTImageSelectorNode)valueStack.get(valueStackOffset + 5);
                    if (node.imageSelector != null) node.imageSelector.setParent(node);
                    node.hiddenTPercent = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 6);
                    if (node.hiddenTPercent != null) node.hiddenTPercent.setParent(node);
                    node.derivedTypeComponentRef = (IASTListNode<ASTDataRefNode>)valueStack.get(valueStackOffset + 7);
                    if (node.derivedTypeComponentRef != null) node.derivedTypeComponentRef.setParent(node);
                    node.hiddenLparen2 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 8);
                    if (node.hiddenLparen2 != null) node.hiddenLparen2.setParent(node);
                    node.componentSectionSubscriptList = (IASTListNode<ASTSectionSubscriptNode>)valueStack.get(valueStackOffset + 9);
                    if (node.componentSectionSubscriptList != null) node.componentSectionSubscriptList.setParent(node);
                    node.hiddenRparen2 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 10);
                    if (node.hiddenRparen2 != null) node.hiddenRparen2.setParent(node);
                    node.substringRange = (ASTSubstringRangeNode)valueStack.get(valueStackOffset + 11);
                    if (node.substringRange != null) node.substringRange.setParent(node);
                    node.hiddenTEquals = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 12);
                    if (node.hiddenTEquals != null) node.hiddenTEquals.setParent(node);
                    node.rhs = (IExpr)valueStack.get(valueStackOffset + 13);
                    if (node.rhs != null) node.rhs.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 14);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleAssignmentStmt892(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTAssignmentStmtNode node = new ASTAssignmentStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    ASTNameNode tmp1 = new ASTNameNode();
                    tmp1.name = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("name");
                    if (tmp1.name != null) tmp1.name.setParent(tmp1);
                    node.lhsVariable = tmp1;
                    if (tmp1 != null) tmp1.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.lhsNameList = (IASTListNode<ASTSFDummyArgNameListNode>)valueStack.get(valueStackOffset + 3);
                    if (node.lhsNameList != null) node.lhsNameList.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    node.imageSelector = (ASTImageSelectorNode)valueStack.get(valueStackOffset + 5);
                    if (node.imageSelector != null) node.imageSelector.setParent(node);
                    node.hiddenTPercent = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 6);
                    if (node.hiddenTPercent != null) node.hiddenTPercent.setParent(node);
                    node.derivedTypeComponentRef = (IASTListNode<ASTDataRefNode>)valueStack.get(valueStackOffset + 7);
                    if (node.derivedTypeComponentRef != null) node.derivedTypeComponentRef.setParent(node);
                    node.hiddenTEquals = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 8);
                    if (node.hiddenTEquals != null) node.hiddenTEquals.setParent(node);
                    node.rhs = (IExpr)valueStack.get(valueStackOffset + 9);
                    if (node.rhs != null) node.rhs.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 10);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleAssignmentStmt893(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTAssignmentStmtNode node = new ASTAssignmentStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    ASTNameNode tmp1 = new ASTNameNode();
                    tmp1.name = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("name");
                    if (tmp1.name != null) tmp1.name.setParent(tmp1);
                    node.lhsVariable = tmp1;
                    if (tmp1 != null) tmp1.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.lhsNameList = (IASTListNode<ASTSFDummyArgNameListNode>)valueStack.get(valueStackOffset + 3);
                    if (node.lhsNameList != null) node.lhsNameList.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    node.imageSelector = (ASTImageSelectorNode)valueStack.get(valueStackOffset + 5);
                    if (node.imageSelector != null) node.imageSelector.setParent(node);
                    node.hiddenTPercent = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 6);
                    if (node.hiddenTPercent != null) node.hiddenTPercent.setParent(node);
                    node.derivedTypeComponentRef = (IASTListNode<ASTDataRefNode>)valueStack.get(valueStackOffset + 7);
                    if (node.derivedTypeComponentRef != null) node.derivedTypeComponentRef.setParent(node);
                    node.hiddenLparen2 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 8);
                    if (node.hiddenLparen2 != null) node.hiddenLparen2.setParent(node);
                    node.componentSectionSubscriptList = (IASTListNode<ASTSectionSubscriptNode>)valueStack.get(valueStackOffset + 9);
                    if (node.componentSectionSubscriptList != null) node.componentSectionSubscriptList.setParent(node);
                    node.hiddenRparen2 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 10);
                    if (node.hiddenRparen2 != null) node.hiddenRparen2.setParent(node);
                    node.hiddenTEquals = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 11);
                    if (node.hiddenTEquals != null) node.hiddenTEquals.setParent(node);
                    node.rhs = (IExpr)valueStack.get(valueStackOffset + 12);
                    if (node.rhs != null) node.rhs.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 13);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleAssignmentStmt894(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTAssignmentStmtNode node = new ASTAssignmentStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    ASTNameNode tmp1 = new ASTNameNode();
                    tmp1.name = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("name");
                    if (tmp1.name != null) tmp1.name.setParent(tmp1);
                    node.lhsVariable = tmp1;
                    if (tmp1 != null) tmp1.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.lhsNameList = (IASTListNode<ASTSFDummyArgNameListNode>)valueStack.get(valueStackOffset + 3);
                    if (node.lhsNameList != null) node.lhsNameList.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    node.imageSelector = (ASTImageSelectorNode)valueStack.get(valueStackOffset + 5);
                    if (node.imageSelector != null) node.imageSelector.setParent(node);
                    node.hiddenTPercent = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 6);
                    if (node.hiddenTPercent != null) node.hiddenTPercent.setParent(node);
                    node.derivedTypeComponentRef = (IASTListNode<ASTDataRefNode>)valueStack.get(valueStackOffset + 7);
                    if (node.derivedTypeComponentRef != null) node.derivedTypeComponentRef.setParent(node);
                    node.hiddenLparen2 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 8);
                    if (node.hiddenLparen2 != null) node.hiddenLparen2.setParent(node);
                    node.componentSectionSubscriptList = (IASTListNode<ASTSectionSubscriptNode>)valueStack.get(valueStackOffset + 9);
                    if (node.componentSectionSubscriptList != null) node.componentSectionSubscriptList.setParent(node);
                    node.hiddenRparen2 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 10);
                    if (node.hiddenRparen2 != null) node.hiddenRparen2.setParent(node);
                    node.substringRange = (ASTSubstringRangeNode)valueStack.get(valueStackOffset + 11);
                    if (node.substringRange != null) node.substringRange.setParent(node);
                    node.hiddenTEquals = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 12);
                    if (node.hiddenTEquals != null) node.hiddenTEquals.setParent(node);
                    node.rhs = (IExpr)valueStack.get(valueStackOffset + 13);
                    if (node.rhs != null) node.rhs.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 14);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleSFExpr895(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTSFExprNode node = new ASTSFExprNode();
                    node.SFTerm = (ASTSFTermNode)valueStack.get(valueStackOffset + 0);
                    if (node.SFTerm != null) node.SFTerm.setParent(node);
                    return node;

        }
        public Object handleSFExpr896(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTSFExprNode node = new ASTSFExprNode();
                    node.rhs = (ASTSignNode)valueStack.get(valueStackOffset + 0);
                    if (node.rhs != null) node.rhs.setParent(node);
                    node.rhsExpr = (IExpr)valueStack.get(valueStackOffset + 1);
                    if (node.rhsExpr != null) node.rhsExpr.setParent(node);
                    return node;

        }
        public Object handleSFExpr897(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTSFExprNode node = new ASTSFExprNode();
                    node.lhsExpr = (ASTSFExprNode)valueStack.get(valueStackOffset + 0);
                    if (node.lhsExpr != null) node.lhsExpr.setParent(node);
                    node.addOp = (ASTOperatorNode)valueStack.get(valueStackOffset + 1);
                    if (node.addOp != null) node.addOp.setParent(node);
                    node.rhsExpr = (IExpr)valueStack.get(valueStackOffset + 2);
                    if (node.rhsExpr != null) node.rhsExpr.setParent(node);
                    return node;

        }
        public Object handleSFTerm898(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTSFTermNode node = new ASTSFTermNode();
                    node.SFFactor = (ASTSFFactorNode)valueStack.get(valueStackOffset + 0);
                    if (node.SFFactor != null) node.SFFactor.setParent(node);
                    return node;

        }
        public Object handleSFTerm899(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTSFTermNode node = new ASTSFTermNode();
                    node.lhsExpr = (ASTSFTermNode)valueStack.get(valueStackOffset + 0);
                    if (node.lhsExpr != null) node.lhsExpr.setParent(node);
                    node.multOp = (ASTOperatorNode)valueStack.get(valueStackOffset + 1);
                    if (node.multOp != null) node.multOp.setParent(node);
                    node.rhsExpr = (IExpr)valueStack.get(valueStackOffset + 2);
                    if (node.rhsExpr != null) node.rhsExpr.setParent(node);
                    return node;

        }
        public Object handleSFFactor900(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTSFFactorNode node = new ASTSFFactorNode();
                    node.rhsPrimary = (ASTSFPrimaryNode)valueStack.get(valueStackOffset + 0);
                    if (node.rhsPrimary != null) node.rhsPrimary.setParent(node);
                    return node;

        }
        public Object handleSFFactor901(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTSFFactorNode node = new ASTSFFactorNode();
                    node.lhsPrimary = (ASTSFPrimaryNode)valueStack.get(valueStackOffset + 0);
                    if (node.lhsPrimary != null) node.lhsPrimary.setParent(node);
                    node.powerOp = (ASTOperatorNode)valueStack.get(valueStackOffset + 1);
                    if (node.powerOp != null) node.powerOp.setParent(node);
                    node.rhsExpr = (IExpr)valueStack.get(valueStackOffset + 2);
                    if (node.rhsExpr != null) node.rhsExpr.setParent(node);
                    return node;

        }
        public Object handleSFPrimary902(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTSFPrimaryNode node = new ASTSFPrimaryNode();
                    node.arrayConstructor = (ASTArrayConstructorNode)valueStack.get(valueStackOffset + 0);
                    if (node.arrayConstructor != null) node.arrayConstructor.setParent(node);
                    return node;

        }
        public Object handleSFPrimary903(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTSFPrimaryNode node = new ASTSFPrimaryNode();
                    node.intConst = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.intConst != null) node.intConst.setParent(node);
                    return node;

        }
        public Object handleSFPrimary904(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTSFPrimaryNode node = new ASTSFPrimaryNode();
                    node.SFVarName = (ASTSFVarNameNode)valueStack.get(valueStackOffset + 0);
                    if (node.SFVarName != null) node.SFVarName.setParent(node);
                    return node;

        }
        public Object handleSFPrimary905(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTSFPrimaryNode node = new ASTSFPrimaryNode();
                    node.SFDataRef = (IASTListNode<ASTSFDataRefNode>)valueStack.get(valueStackOffset + 0);
                    if (node.SFDataRef != null) node.SFDataRef.setParent(node);
                    return node;

        }
        public Object handleSFPrimary906(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTSFPrimaryNode node = new ASTSFPrimaryNode();
                    ASTFunctionReferenceNode tmp0 = new ASTFunctionReferenceNode();
                    tmp0.name = (ASTNameNode)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("name");
                    if (tmp0.name != null) tmp0.name.setParent(tmp0);
                    tmp0.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("hiddenTLparen");
                    if (tmp0.hiddenTLparen != null) tmp0.hiddenTLparen.setParent(tmp0);
                    tmp0.functionArgList = (IASTListNode<ASTFunctionArgListNode>)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("functionArgList");
                    if (tmp0.functionArgList != null) tmp0.functionArgList.setParent(tmp0);
                    tmp0.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("hiddenTRparen");
                    if (tmp0.hiddenTRparen != null) tmp0.hiddenTRparen.setParent(tmp0);
                    node.functionReference = tmp0;
                    if (tmp0 != null) tmp0.setParent(node);
                    return node;

        }
        public Object handleSFPrimary907(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTSFPrimaryNode node = new ASTSFPrimaryNode();
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.expr = (IExpr)valueStack.get(valueStackOffset + 1);
                    if (node.expr != null) node.expr.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    return node;

        }
        public Object handlePointerAssignmentStmt908(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTAssignmentStmtNode node = new ASTAssignmentStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    ASTNameNode tmp1 = new ASTNameNode();
                    tmp1.name = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("name");
                    if (tmp1.name != null) tmp1.name.setParent(tmp1);
                    node.lhsVariable = tmp1;
                    if (tmp1 != null) tmp1.setParent(node);
                    node.isPointerAssignment = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.isPointerAssignment != null) node.isPointerAssignment.setParent(node);
                    node.target = (ASTTargetNode)valueStack.get(valueStackOffset + 3);
                    if (node.target != null) node.target.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handlePointerAssignmentStmt909(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTAssignmentStmtNode node = new ASTAssignmentStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    ASTNameNode tmp1 = new ASTNameNode();
                    tmp1.name = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("name");
                    if (tmp1.name != null) tmp1.name.setParent(tmp1);
                    node.lhsVariable = tmp1;
                    if (tmp1 != null) tmp1.setParent(node);
                    node.hiddenTPercent = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTPercent != null) node.hiddenTPercent.setParent(node);
                    node.derivedTypeComponentRef = (IASTListNode<ASTDataRefNode>)valueStack.get(valueStackOffset + 3);
                    if (node.derivedTypeComponentRef != null) node.derivedTypeComponentRef.setParent(node);
                    node.isPointerAssignment = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.isPointerAssignment != null) node.isPointerAssignment.setParent(node);
                    node.target = (ASTTargetNode)valueStack.get(valueStackOffset + 5);
                    if (node.target != null) node.target.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 6);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handlePointerAssignmentStmt910(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTAssignmentStmtNode node = new ASTAssignmentStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    ASTNameNode tmp1 = new ASTNameNode();
                    tmp1.name = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("name");
                    if (tmp1.name != null) tmp1.name.setParent(tmp1);
                    node.lhsVariable = tmp1;
                    if (tmp1 != null) tmp1.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.lhsExprList = (IASTListNode<ASTSFExprListNode>)valueStack.get(valueStackOffset + 3);
                    if (node.lhsExprList != null) node.lhsExprList.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    node.hiddenTPercent = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 5);
                    if (node.hiddenTPercent != null) node.hiddenTPercent.setParent(node);
                    node.derivedTypeComponentRef = (IASTListNode<ASTDataRefNode>)valueStack.get(valueStackOffset + 6);
                    if (node.derivedTypeComponentRef != null) node.derivedTypeComponentRef.setParent(node);
                    node.isPointerAssignment = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 7);
                    if (node.isPointerAssignment != null) node.isPointerAssignment.setParent(node);
                    node.target = (ASTTargetNode)valueStack.get(valueStackOffset + 8);
                    if (node.target != null) node.target.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 9);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handlePointerAssignmentStmt911(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTAssignmentStmtNode node = new ASTAssignmentStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    ASTNameNode tmp1 = new ASTNameNode();
                    tmp1.name = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("name");
                    if (tmp1.name != null) tmp1.name.setParent(tmp1);
                    node.lhsVariable = tmp1;
                    if (tmp1 != null) tmp1.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.lhsNameList = (IASTListNode<ASTSFDummyArgNameListNode>)valueStack.get(valueStackOffset + 3);
                    if (node.lhsNameList != null) node.lhsNameList.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    node.hiddenTPercent = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 5);
                    if (node.hiddenTPercent != null) node.hiddenTPercent.setParent(node);
                    node.derivedTypeComponentRef = (IASTListNode<ASTDataRefNode>)valueStack.get(valueStackOffset + 6);
                    if (node.derivedTypeComponentRef != null) node.derivedTypeComponentRef.setParent(node);
                    node.isPointerAssignment = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 7);
                    if (node.isPointerAssignment != null) node.isPointerAssignment.setParent(node);
                    node.target = (ASTTargetNode)valueStack.get(valueStackOffset + 8);
                    if (node.target != null) node.target.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 9);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handlePointerAssignmentStmt912(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTAssignmentStmtNode node = new ASTAssignmentStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    ASTNameNode tmp1 = new ASTNameNode();
                    tmp1.name = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("name");
                    if (tmp1.name != null) tmp1.name.setParent(tmp1);
                    node.lhsVariable = tmp1;
                    if (tmp1 != null) tmp1.setParent(node);
                    node.imageSelector = (ASTImageSelectorNode)valueStack.get(valueStackOffset + 2);
                    if (node.imageSelector != null) node.imageSelector.setParent(node);
                    node.isPointerAssignment = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.isPointerAssignment != null) node.isPointerAssignment.setParent(node);
                    node.target = (ASTTargetNode)valueStack.get(valueStackOffset + 4);
                    if (node.target != null) node.target.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 5);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handlePointerAssignmentStmt913(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTAssignmentStmtNode node = new ASTAssignmentStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    ASTNameNode tmp1 = new ASTNameNode();
                    tmp1.name = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("name");
                    if (tmp1.name != null) tmp1.name.setParent(tmp1);
                    node.lhsVariable = tmp1;
                    if (tmp1 != null) tmp1.setParent(node);
                    node.imageSelector = (ASTImageSelectorNode)valueStack.get(valueStackOffset + 2);
                    if (node.imageSelector != null) node.imageSelector.setParent(node);
                    node.hiddenTPercent = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTPercent != null) node.hiddenTPercent.setParent(node);
                    node.derivedTypeComponentRef = (IASTListNode<ASTDataRefNode>)valueStack.get(valueStackOffset + 4);
                    if (node.derivedTypeComponentRef != null) node.derivedTypeComponentRef.setParent(node);
                    node.isPointerAssignment = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 5);
                    if (node.isPointerAssignment != null) node.isPointerAssignment.setParent(node);
                    node.target = (ASTTargetNode)valueStack.get(valueStackOffset + 6);
                    if (node.target != null) node.target.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 7);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handlePointerAssignmentStmt914(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTAssignmentStmtNode node = new ASTAssignmentStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    ASTNameNode tmp1 = new ASTNameNode();
                    tmp1.name = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("name");
                    if (tmp1.name != null) tmp1.name.setParent(tmp1);
                    node.lhsVariable = tmp1;
                    if (tmp1 != null) tmp1.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.lhsExprList = (IASTListNode<ASTSFExprListNode>)valueStack.get(valueStackOffset + 3);
                    if (node.lhsExprList != null) node.lhsExprList.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    node.imageSelector = (ASTImageSelectorNode)valueStack.get(valueStackOffset + 5);
                    if (node.imageSelector != null) node.imageSelector.setParent(node);
                    node.hiddenTPercent = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 6);
                    if (node.hiddenTPercent != null) node.hiddenTPercent.setParent(node);
                    node.derivedTypeComponentRef = (IASTListNode<ASTDataRefNode>)valueStack.get(valueStackOffset + 7);
                    if (node.derivedTypeComponentRef != null) node.derivedTypeComponentRef.setParent(node);
                    node.isPointerAssignment = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 8);
                    if (node.isPointerAssignment != null) node.isPointerAssignment.setParent(node);
                    node.target = (ASTTargetNode)valueStack.get(valueStackOffset + 9);
                    if (node.target != null) node.target.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 10);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handlePointerAssignmentStmt915(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTAssignmentStmtNode node = new ASTAssignmentStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    ASTNameNode tmp1 = new ASTNameNode();
                    tmp1.name = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("name");
                    if (tmp1.name != null) tmp1.name.setParent(tmp1);
                    node.lhsVariable = tmp1;
                    if (tmp1 != null) tmp1.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.lhsNameList = (IASTListNode<ASTSFDummyArgNameListNode>)valueStack.get(valueStackOffset + 3);
                    if (node.lhsNameList != null) node.lhsNameList.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    node.imageSelector = (ASTImageSelectorNode)valueStack.get(valueStackOffset + 5);
                    if (node.imageSelector != null) node.imageSelector.setParent(node);
                    node.hiddenTPercent = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 6);
                    if (node.hiddenTPercent != null) node.hiddenTPercent.setParent(node);
                    node.derivedTypeComponentRef = (IASTListNode<ASTDataRefNode>)valueStack.get(valueStackOffset + 7);
                    if (node.derivedTypeComponentRef != null) node.derivedTypeComponentRef.setParent(node);
                    node.isPointerAssignment = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 8);
                    if (node.isPointerAssignment != null) node.isPointerAssignment.setParent(node);
                    node.target = (ASTTargetNode)valueStack.get(valueStackOffset + 9);
                    if (node.target != null) node.target.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 10);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleTarget916(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTTargetNode node = new ASTTargetNode();
                    node.expr = (IExpr)valueStack.get(valueStackOffset + 0);
                    if (node.expr != null) node.expr.setParent(node);
                    return node;

        }
        public Object handleTarget917(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTTargetNode node = new ASTTargetNode();
                    node.isNull = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.isNull != null) node.isNull.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    return node;

        }
        public Object handleWhereStmt918(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTWhereStmtNode node = new ASTWhereStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTWhere = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTWhere != null) node.hiddenTWhere.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    ASTMaskExprNode tmp3 = new ASTMaskExprNode();
                    tmp3.maskExpr = (IExpr)((Map<String, Object>)valueStack.get(valueStackOffset + 3)).get("maskExpr");
                    if (tmp3.maskExpr != null) tmp3.maskExpr.setParent(tmp3);
                    node.maskExpr = tmp3;
                    if (tmp3 != null) tmp3.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    node.assignmentStmt = (ASTAssignmentStmtNode)valueStack.get(valueStackOffset + 5);
                    if (node.assignmentStmt != null) node.assignmentStmt.setParent(node);
                    return node;

        }
        public Object handleWhereConstruct919(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTWhereConstructNode node = new ASTWhereConstructNode();
                    node.whereConstructStmt = (ASTWhereConstructStmtNode)valueStack.get(valueStackOffset + 0);
                    if (node.whereConstructStmt != null) node.whereConstructStmt.setParent(node);
                    node.whereBodyConstructBlock = (IASTListNode<IWhereBodyConstruct>)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("whereBodyConstructBlock");
                    if (node.whereBodyConstructBlock != null) node.whereBodyConstructBlock.setParent(node);
                    node.endWhereStmt = (ASTEndWhereStmtNode)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("endWhereStmt");
                    if (node.endWhereStmt != null) node.endWhereStmt.setParent(node);
                    node.elseWhereConstruct = (ASTElseWhereConstructNode)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("elseWhereConstruct");
                    if (node.elseWhereConstruct != null) node.elseWhereConstruct.setParent(node);
                    node.maskedElseWhereConstruct = (ASTMaskedElseWhereConstructNode)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("maskedElseWhereConstruct");
                    if (node.maskedElseWhereConstruct != null) node.maskedElseWhereConstruct.setParent(node);
                    return node;

        }
        public Object handleWhereRange920(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 3 and 4
                    Map<String, Object> node = new HashMap<String, Object>();
                    node.put("endWhereStmt", (ASTEndWhereStmtNode)valueStack.get(valueStackOffset + 0));
                    ASTListNode<IASTNode> embeddedList = new ASTListNode<IASTNode>();
                    embeddedList.add((IASTNode)(node.get("whereBodyConstructBlock")));
                    embeddedList.add((IASTNode)(node.get("endWhereStmt")));
                    embeddedList.add((IASTNode)(node.get("elseWhereConstruct")));
                    embeddedList.add((IASTNode)(node.get("maskedElseWhereConstruct")));
                    node.put("errorRecoveryList", embeddedList);
                    return node;

        }
        public Object handleWhereRange921(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 3 and 4
                    Map<String, Object> node = new HashMap<String, Object>();
                    node.put("whereBodyConstructBlock", (IASTListNode<IWhereBodyConstruct>)valueStack.get(valueStackOffset + 0));
                    node.put("endWhereStmt", (ASTEndWhereStmtNode)valueStack.get(valueStackOffset + 1));
                    ASTListNode<IASTNode> embeddedList = new ASTListNode<IASTNode>();
                    embeddedList.add((IASTNode)(node.get("whereBodyConstructBlock")));
                    embeddedList.add((IASTNode)(node.get("endWhereStmt")));
                    embeddedList.add((IASTNode)(node.get("elseWhereConstruct")));
                    embeddedList.add((IASTNode)(node.get("maskedElseWhereConstruct")));
                    node.put("errorRecoveryList", embeddedList);
                    return node;

        }
        public Object handleWhereRange922(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 3 and 4
                    Map<String, Object> node = new HashMap<String, Object>();
                    node.put("maskedElseWhereConstruct", (ASTMaskedElseWhereConstructNode)valueStack.get(valueStackOffset + 0));
                    ASTListNode<IASTNode> embeddedList = new ASTListNode<IASTNode>();
                    embeddedList.add((IASTNode)(node.get("whereBodyConstructBlock")));
                    embeddedList.add((IASTNode)(node.get("endWhereStmt")));
                    embeddedList.add((IASTNode)(node.get("elseWhereConstruct")));
                    embeddedList.add((IASTNode)(node.get("maskedElseWhereConstruct")));
                    node.put("errorRecoveryList", embeddedList);
                    return node;

        }
        public Object handleWhereRange923(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 3 and 4
                    Map<String, Object> node = new HashMap<String, Object>();
                    node.put("whereBodyConstructBlock", (IASTListNode<IWhereBodyConstruct>)valueStack.get(valueStackOffset + 0));
                    node.put("maskedElseWhereConstruct", (ASTMaskedElseWhereConstructNode)valueStack.get(valueStackOffset + 1));
                    ASTListNode<IASTNode> embeddedList = new ASTListNode<IASTNode>();
                    embeddedList.add((IASTNode)(node.get("whereBodyConstructBlock")));
                    embeddedList.add((IASTNode)(node.get("endWhereStmt")));
                    embeddedList.add((IASTNode)(node.get("elseWhereConstruct")));
                    embeddedList.add((IASTNode)(node.get("maskedElseWhereConstruct")));
                    node.put("errorRecoveryList", embeddedList);
                    return node;

        }
        public Object handleWhereRange924(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 3 and 4
                    Map<String, Object> node = new HashMap<String, Object>();
                    node.put("elseWhereConstruct", (ASTElseWhereConstructNode)valueStack.get(valueStackOffset + 0));
                    ASTListNode<IASTNode> embeddedList = new ASTListNode<IASTNode>();
                    embeddedList.add((IASTNode)(node.get("whereBodyConstructBlock")));
                    embeddedList.add((IASTNode)(node.get("endWhereStmt")));
                    embeddedList.add((IASTNode)(node.get("elseWhereConstruct")));
                    embeddedList.add((IASTNode)(node.get("maskedElseWhereConstruct")));
                    node.put("errorRecoveryList", embeddedList);
                    return node;

        }
        public Object handleWhereRange925(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 3 and 4
                    Map<String, Object> node = new HashMap<String, Object>();
                    node.put("whereBodyConstructBlock", (IASTListNode<IWhereBodyConstruct>)valueStack.get(valueStackOffset + 0));
                    node.put("elseWhereConstruct", (ASTElseWhereConstructNode)valueStack.get(valueStackOffset + 1));
                    ASTListNode<IASTNode> embeddedList = new ASTListNode<IASTNode>();
                    embeddedList.add((IASTNode)(node.get("whereBodyConstructBlock")));
                    embeddedList.add((IASTNode)(node.get("endWhereStmt")));
                    embeddedList.add((IASTNode)(node.get("elseWhereConstruct")));
                    embeddedList.add((IASTNode)(node.get("maskedElseWhereConstruct")));
                    node.put("errorRecoveryList", embeddedList);
                    return node;

        }
        public Object handleMaskedElseWhereConstruct926(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTMaskedElseWhereConstructNode node = new ASTMaskedElseWhereConstructNode();
                    node.maskedElseWhereStmt = (ASTMaskedElseWhereStmtNode)valueStack.get(valueStackOffset + 0);
                    if (node.maskedElseWhereStmt != null) node.maskedElseWhereStmt.setParent(node);
                    node.whereBodyConstructBlock = (IASTListNode<IWhereBodyConstruct>)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("whereBodyConstructBlock");
                    if (node.whereBodyConstructBlock != null) node.whereBodyConstructBlock.setParent(node);
                    node.endWhereStmt = (ASTEndWhereStmtNode)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("endWhereStmt");
                    if (node.endWhereStmt != null) node.endWhereStmt.setParent(node);
                    node.elseWhereConstruct = (ASTElseWhereConstructNode)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("elseWhereConstruct");
                    if (node.elseWhereConstruct != null) node.elseWhereConstruct.setParent(node);
                    node.maskedElseWhereConstruct = (ASTMaskedElseWhereConstructNode)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("maskedElseWhereConstruct");
                    if (node.maskedElseWhereConstruct != null) node.maskedElseWhereConstruct.setParent(node);
                    return node;

        }
        public Object handleElseWhereConstruct927(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTElseWhereConstructNode node = new ASTElseWhereConstructNode();
                    node.elseWhereStmt = (ASTElseWhereStmtNode)valueStack.get(valueStackOffset + 0);
                    if (node.elseWhereStmt != null) node.elseWhereStmt.setParent(node);
                    node.whereBodyConstructBlock = (IASTListNode<IWhereBodyConstruct>)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("whereBodyConstructBlock");
                    if (node.whereBodyConstructBlock != null) node.whereBodyConstructBlock.setParent(node);
                    node.endWhereStmt = (ASTEndWhereStmtNode)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("endWhereStmt");
                    if (node.endWhereStmt != null) node.endWhereStmt.setParent(node);
                    return node;

        }
        public Object handleElseWherePart928(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 3 and 4
                    Map<String, Object> node = new HashMap<String, Object>();
                    node.put("endWhereStmt", (ASTEndWhereStmtNode)valueStack.get(valueStackOffset + 0));
                    ASTListNode<IASTNode> embeddedList = new ASTListNode<IASTNode>();
                    embeddedList.add((IASTNode)(node.get("whereBodyConstructBlock")));
                    embeddedList.add((IASTNode)(node.get("endWhereStmt")));
                    node.put("errorRecoveryList", embeddedList);
                    return node;

        }
        public Object handleElseWherePart929(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 3 and 4
                    Map<String, Object> node = new HashMap<String, Object>();
                    node.put("whereBodyConstructBlock", (IASTListNode<IWhereBodyConstruct>)valueStack.get(valueStackOffset + 0));
                    node.put("endWhereStmt", (ASTEndWhereStmtNode)valueStack.get(valueStackOffset + 1));
                    ASTListNode<IASTNode> embeddedList = new ASTListNode<IASTNode>();
                    embeddedList.add((IASTNode)(node.get("whereBodyConstructBlock")));
                    embeddedList.add((IASTNode)(node.get("endWhereStmt")));
                    node.put("errorRecoveryList", embeddedList);
                    return node;

        }
        public Object handleWhereBodyConstructBlock930(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 7
                    IASTListNode<IWhereBodyConstruct> list = new ASTListNode<IWhereBodyConstruct>();
                    IWhereBodyConstruct elt = (IWhereBodyConstruct)valueStack.get(valueStackOffset + 0);
                    list.add(elt);
                    if (elt != null) elt.setParent(list);
                    return list;

        }
        public Object handleWhereBodyConstructBlock931(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 8
                    IASTListNode<IWhereBodyConstruct> list = (IASTListNode<IWhereBodyConstruct>)valueStack.get(valueStackOffset);
                    IWhereBodyConstruct elt = (IWhereBodyConstruct)valueStack.get(valueStackOffset + 1);
                    list.add(elt);
                    if (elt != null) elt.setParent(list);
                    return list;

        }
        public Object handleWhereConstructStmt932(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTWhereConstructStmtNode node = new ASTWhereConstructStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.name = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("name");
                    if (node.name != null) node.name.setParent(node);
                    node.hiddenTColon = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTColon != null) node.hiddenTColon.setParent(node);
                    node.hiddenTWhere = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTWhere != null) node.hiddenTWhere.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    ASTMaskExprNode tmp5 = new ASTMaskExprNode();
                    tmp5.maskExpr = (IExpr)((Map<String, Object>)valueStack.get(valueStackOffset + 5)).get("maskExpr");
                    if (tmp5.maskExpr != null) tmp5.maskExpr.setParent(tmp5);
                    node.maskExpr = tmp5;
                    if (tmp5 != null) tmp5.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 6);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 7);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleWhereConstructStmt933(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTWhereConstructStmtNode node = new ASTWhereConstructStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTWhere = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTWhere != null) node.hiddenTWhere.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    ASTMaskExprNode tmp3 = new ASTMaskExprNode();
                    tmp3.maskExpr = (IExpr)((Map<String, Object>)valueStack.get(valueStackOffset + 3)).get("maskExpr");
                    if (tmp3.maskExpr != null) tmp3.maskExpr.setParent(tmp3);
                    node.maskExpr = tmp3;
                    if (tmp3 != null) tmp3.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 5);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleWhereBodyConstruct934(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 5
                    ASTAssignmentStmtNode result = (ASTAssignmentStmtNode)valueStack.get(valueStackOffset + 0);
                    return result;

        }
        public Object handleWhereBodyConstruct935(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 5
                    ASTWhereStmtNode result = (ASTWhereStmtNode)valueStack.get(valueStackOffset + 0);
                    return result;

        }
        public Object handleWhereBodyConstruct936(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 5
                    ASTWhereConstructNode result = (ASTWhereConstructNode)valueStack.get(valueStackOffset + 0);
                    return result;

        }
        public Object handleMaskExpr937(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 3 and 4
                    Map<String, Object> node = new HashMap<String, Object>();
                    node.put("maskExpr", (IExpr)valueStack.get(valueStackOffset + 0));
                    ASTListNode<IASTNode> embeddedList = new ASTListNode<IASTNode>();
                    embeddedList.add((IASTNode)(node.get("maskExpr")));
                    node.put("errorRecoveryList", embeddedList);
                    return node;

        }
        public Object handleMaskedElseWhereStmt938(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTMaskedElseWhereStmtNode node = new ASTMaskedElseWhereStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTElsewhere = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTElsewhere != null) node.hiddenTElsewhere.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.maskExpr = (IExpr)((Map<String, Object>)valueStack.get(valueStackOffset + 3)).get("maskExpr");
                    if (node.maskExpr != null) node.maskExpr.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 5);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleMaskedElseWhereStmt939(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTMaskedElseWhereStmtNode node = new ASTMaskedElseWhereStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTElsewhere = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTElsewhere != null) node.hiddenTElsewhere.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.maskExpr = (IExpr)((Map<String, Object>)valueStack.get(valueStackOffset + 3)).get("maskExpr");
                    if (node.maskExpr != null) node.maskExpr.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    node.endName = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 5)).get("endName");
                    if (node.endName != null) node.endName.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 6);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleMaskedElseWhereStmt940(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTMaskedElseWhereStmtNode node = new ASTMaskedElseWhereStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTElse = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTElse != null) node.hiddenTElse.setParent(node);
                    node.hiddenTWhere = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTWhere != null) node.hiddenTWhere.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.maskExpr = (IExpr)((Map<String, Object>)valueStack.get(valueStackOffset + 4)).get("maskExpr");
                    if (node.maskExpr != null) node.maskExpr.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 5);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 6);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleMaskedElseWhereStmt941(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTMaskedElseWhereStmtNode node = new ASTMaskedElseWhereStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTElse = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTElse != null) node.hiddenTElse.setParent(node);
                    node.hiddenTWhere = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTWhere != null) node.hiddenTWhere.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.maskExpr = (IExpr)((Map<String, Object>)valueStack.get(valueStackOffset + 4)).get("maskExpr");
                    if (node.maskExpr != null) node.maskExpr.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 5);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    node.endName = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 6)).get("endName");
                    if (node.endName != null) node.endName.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 7);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleElseWhereStmt942(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTElseWhereStmtNode node = new ASTElseWhereStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTElsewhere = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTElsewhere != null) node.hiddenTElsewhere.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleElseWhereStmt943(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTElseWhereStmtNode node = new ASTElseWhereStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTElsewhere = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTElsewhere != null) node.hiddenTElsewhere.setParent(node);
                    node.endName = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 2)).get("endName");
                    if (node.endName != null) node.endName.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleElseWhereStmt944(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTElseWhereStmtNode node = new ASTElseWhereStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTElse = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTElse != null) node.hiddenTElse.setParent(node);
                    node.hiddenTWhere = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTWhere != null) node.hiddenTWhere.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleElseWhereStmt945(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTElseWhereStmtNode node = new ASTElseWhereStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTElse = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTElse != null) node.hiddenTElse.setParent(node);
                    node.hiddenTWhere = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTWhere != null) node.hiddenTWhere.setParent(node);
                    node.endName = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 3)).get("endName");
                    if (node.endName != null) node.endName.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleEndWhereStmt946(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTEndWhereStmtNode node = new ASTEndWhereStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTEndwhere = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTEndwhere != null) node.hiddenTEndwhere.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleEndWhereStmt947(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTEndWhereStmtNode node = new ASTEndWhereStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTEndwhere = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTEndwhere != null) node.hiddenTEndwhere.setParent(node);
                    node.endName = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 2)).get("endName");
                    if (node.endName != null) node.endName.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleEndWhereStmt948(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTEndWhereStmtNode node = new ASTEndWhereStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTEnd = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTEnd != null) node.hiddenTEnd.setParent(node);
                    node.hiddenTWhere = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTWhere != null) node.hiddenTWhere.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleEndWhereStmt949(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTEndWhereStmtNode node = new ASTEndWhereStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTEnd = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTEnd != null) node.hiddenTEnd.setParent(node);
                    node.hiddenTWhere = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTWhere != null) node.hiddenTWhere.setParent(node);
                    node.endName = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 3)).get("endName");
                    if (node.endName != null) node.endName.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleForallConstruct950(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTForallConstructNode node = new ASTForallConstructNode();
                    node.forallConstructStmt = (ASTForallConstructStmtNode)valueStack.get(valueStackOffset + 0);
                    if (node.forallConstructStmt != null) node.forallConstructStmt.setParent(node);
                    node.endForallStmt = (ASTEndForallStmtNode)valueStack.get(valueStackOffset + 1);
                    if (node.endForallStmt != null) node.endForallStmt.setParent(node);
                    return node;

        }
        public Object handleForallConstruct951(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTForallConstructNode node = new ASTForallConstructNode();
                    node.forallConstructStmt = (ASTForallConstructStmtNode)valueStack.get(valueStackOffset + 0);
                    if (node.forallConstructStmt != null) node.forallConstructStmt.setParent(node);
                    node.forallBody = (IASTListNode<IForallBodyConstruct>)valueStack.get(valueStackOffset + 1);
                    if (node.forallBody != null) node.forallBody.setParent(node);
                    node.endForallStmt = (ASTEndForallStmtNode)valueStack.get(valueStackOffset + 2);
                    if (node.endForallStmt != null) node.endForallStmt.setParent(node);
                    return node;

        }
        public Object handleForallBody952(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 7
                    IASTListNode<IForallBodyConstruct> list = new ASTListNode<IForallBodyConstruct>();
                    IForallBodyConstruct elt = (IForallBodyConstruct)valueStack.get(valueStackOffset + 0);
                    list.add(elt);
                    if (elt != null) elt.setParent(list);
                    return list;

        }
        public Object handleForallBody953(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 8
                    IASTListNode<IForallBodyConstruct> list = (IASTListNode<IForallBodyConstruct>)valueStack.get(valueStackOffset);
                    IForallBodyConstruct elt = (IForallBodyConstruct)valueStack.get(valueStackOffset + 1);
                    list.add(elt);
                    if (elt != null) elt.setParent(list);
                    return list;

        }
        public Object handleForallConstructStmt954(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTForallConstructStmtNode node = new ASTForallConstructStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTForall = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTForall != null) node.hiddenTForall.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 2)).get("hiddenTLparen");
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.forallTripletSpecList = (IASTListNode<ASTForallTripletSpecListNode>)((Map<String, Object>)valueStack.get(valueStackOffset + 2)).get("forallTripletSpecList");
                    if (node.forallTripletSpecList != null) node.forallTripletSpecList.setParent(node);
                    node.hiddenTComma = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 2)).get("hiddenTComma");
                    if (node.hiddenTComma != null) node.hiddenTComma.setParent(node);
                    node.scalarMaskExpr = (ASTScalarMaskExprNode)((Map<String, Object>)valueStack.get(valueStackOffset + 2)).get("scalarMaskExpr");
                    if (node.scalarMaskExpr != null) node.scalarMaskExpr.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 2)).get("hiddenTRparen");
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleForallConstructStmt955(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTForallConstructStmtNode node = new ASTForallConstructStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.name = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("name");
                    if (node.name != null) node.name.setParent(node);
                    node.hiddenTColon = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTColon != null) node.hiddenTColon.setParent(node);
                    node.hiddenTForall = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTForall != null) node.hiddenTForall.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 4)).get("hiddenTLparen");
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.forallTripletSpecList = (IASTListNode<ASTForallTripletSpecListNode>)((Map<String, Object>)valueStack.get(valueStackOffset + 4)).get("forallTripletSpecList");
                    if (node.forallTripletSpecList != null) node.forallTripletSpecList.setParent(node);
                    node.hiddenTComma = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 4)).get("hiddenTComma");
                    if (node.hiddenTComma != null) node.hiddenTComma.setParent(node);
                    node.scalarMaskExpr = (ASTScalarMaskExprNode)((Map<String, Object>)valueStack.get(valueStackOffset + 4)).get("scalarMaskExpr");
                    if (node.scalarMaskExpr != null) node.scalarMaskExpr.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 4)).get("hiddenTRparen");
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 5);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleForallHeader956(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 3 and 4
                    Map<String, Object> node = new HashMap<String, Object>();
                    node.put("hiddenTLparen", (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0));
                    node.put("forallTripletSpecList", (IASTListNode<ASTForallTripletSpecListNode>)valueStack.get(valueStackOffset + 1));
                    node.put("hiddenTRparen", (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2));
                    ASTListNode<IASTNode> embeddedList = new ASTListNode<IASTNode>();
                    embeddedList.add((IASTNode)(node.get("hiddenTLparen")));
                    embeddedList.add((IASTNode)(node.get("forallTripletSpecList")));
                    embeddedList.add((IASTNode)(node.get("hiddenTComma")));
                    embeddedList.add((IASTNode)(node.get("scalarMaskExpr")));
                    embeddedList.add((IASTNode)(node.get("hiddenTRparen")));
                    node.put("errorRecoveryList", embeddedList);
                    return node;

        }
        public Object handleForallHeader957(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 3 and 4
                    Map<String, Object> node = new HashMap<String, Object>();
                    node.put("hiddenTLparen", (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0));
                    node.put("forallTripletSpecList", (IASTListNode<ASTForallTripletSpecListNode>)valueStack.get(valueStackOffset + 1));
                    node.put("hiddenTComma", (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2));
                    node.put("scalarMaskExpr", (ASTScalarMaskExprNode)valueStack.get(valueStackOffset + 3));
                    node.put("hiddenTRparen", (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4));
                    ASTListNode<IASTNode> embeddedList = new ASTListNode<IASTNode>();
                    embeddedList.add((IASTNode)(node.get("hiddenTLparen")));
                    embeddedList.add((IASTNode)(node.get("forallTripletSpecList")));
                    embeddedList.add((IASTNode)(node.get("hiddenTComma")));
                    embeddedList.add((IASTNode)(node.get("scalarMaskExpr")));
                    embeddedList.add((IASTNode)(node.get("hiddenTRparen")));
                    node.put("errorRecoveryList", embeddedList);
                    return node;

        }
        public Object handleScalarMaskExpr958(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTScalarMaskExprNode node = new ASTScalarMaskExprNode();
                    node.maskExpr = (IExpr)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("maskExpr");
                    if (node.maskExpr != null) node.maskExpr.setParent(node);
                    return node;

        }
        public Object handleForallTripletSpecList959(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 10
                    ASTForallTripletSpecListNode node = new ASTForallTripletSpecListNode();
                    ASTNameNode tmp0 = new ASTNameNode();
                    tmp0.name = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("name");
                    if (tmp0.name != null) tmp0.name.setParent(tmp0);
                    node.name = tmp0;
                    if (tmp0 != null) tmp0.setParent(node);
                    node.hiddenTEquals = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTEquals != null) node.hiddenTEquals.setParent(node);
                    node.lb = (ASTSubscriptNode)valueStack.get(valueStackOffset + 2);
                    if (node.lb != null) node.lb.setParent(node);
                    node.hiddenTColon = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTColon != null) node.hiddenTColon.setParent(node);
                    node.ub = (ASTSubscriptNode)valueStack.get(valueStackOffset + 4);
                    if (node.ub != null) node.ub.setParent(node);
                    ASTListNode<ASTForallTripletSpecListNode> list = new ASTListNode<ASTForallTripletSpecListNode>();
                    list.add(node);
                    node.setParent(list);
                    return list;

        }
        public Object handleForallTripletSpecList960(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 10
                    ASTForallTripletSpecListNode node = new ASTForallTripletSpecListNode();
                    ASTNameNode tmp0 = new ASTNameNode();
                    tmp0.name = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("name");
                    if (tmp0.name != null) tmp0.name.setParent(tmp0);
                    node.name = tmp0;
                    if (tmp0 != null) tmp0.setParent(node);
                    node.hiddenTEquals = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTEquals != null) node.hiddenTEquals.setParent(node);
                    node.lb = (ASTSubscriptNode)valueStack.get(valueStackOffset + 2);
                    if (node.lb != null) node.lb.setParent(node);
                    node.hiddenTColon = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTColon != null) node.hiddenTColon.setParent(node);
                    node.ub = (ASTSubscriptNode)valueStack.get(valueStackOffset + 4);
                    if (node.ub != null) node.ub.setParent(node);
                    node.hiddenTColon2 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 5);
                    if (node.hiddenTColon2 != null) node.hiddenTColon2.setParent(node);
                    node.stepExpr = (IExpr)valueStack.get(valueStackOffset + 6);
                    if (node.stepExpr != null) node.stepExpr.setParent(node);
                    ASTListNode<ASTForallTripletSpecListNode> list = new ASTListNode<ASTForallTripletSpecListNode>();
                    list.add(node);
                    node.setParent(list);
                    return list;

        }
        public Object handleForallTripletSpecList961(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 11
                    ASTForallTripletSpecListNode node = new ASTForallTripletSpecListNode();
                    node.hiddenTComma = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTComma != null) node.hiddenTComma.setParent(node);
                    ASTNameNode tmp2 = new ASTNameNode();
                    tmp2.name = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 2)).get("name");
                    if (tmp2.name != null) tmp2.name.setParent(tmp2);
                    node.name = tmp2;
                    if (tmp2 != null) tmp2.setParent(node);
                    node.hiddenTEquals = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTEquals != null) node.hiddenTEquals.setParent(node);
                    node.lb = (ASTSubscriptNode)valueStack.get(valueStackOffset + 4);
                    if (node.lb != null) node.lb.setParent(node);
                    node.hiddenTColon = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 5);
                    if (node.hiddenTColon != null) node.hiddenTColon.setParent(node);
                    node.ub = (ASTSubscriptNode)valueStack.get(valueStackOffset + 6);
                    if (node.ub != null) node.ub.setParent(node);
                    ASTListNode<ASTForallTripletSpecListNode> list = (ASTListNode<ASTForallTripletSpecListNode>)valueStack.get(valueStackOffset);
                    list.add(node);
                    node.setParent(list);
                    return list;

        }
        public Object handleForallTripletSpecList962(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 11
                    ASTForallTripletSpecListNode node = new ASTForallTripletSpecListNode();
                    node.hiddenTComma = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTComma != null) node.hiddenTComma.setParent(node);
                    ASTNameNode tmp2 = new ASTNameNode();
                    tmp2.name = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 2)).get("name");
                    if (tmp2.name != null) tmp2.name.setParent(tmp2);
                    node.name = tmp2;
                    if (tmp2 != null) tmp2.setParent(node);
                    node.hiddenTEquals = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTEquals != null) node.hiddenTEquals.setParent(node);
                    node.lb = (ASTSubscriptNode)valueStack.get(valueStackOffset + 4);
                    if (node.lb != null) node.lb.setParent(node);
                    node.hiddenTColon = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 5);
                    if (node.hiddenTColon != null) node.hiddenTColon.setParent(node);
                    node.ub = (ASTSubscriptNode)valueStack.get(valueStackOffset + 6);
                    if (node.ub != null) node.ub.setParent(node);
                    node.hiddenTColon2 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 7);
                    if (node.hiddenTColon2 != null) node.hiddenTColon2.setParent(node);
                    node.stepExpr = (IExpr)valueStack.get(valueStackOffset + 8);
                    if (node.stepExpr != null) node.stepExpr.setParent(node);
                    ASTListNode<ASTForallTripletSpecListNode> list = (ASTListNode<ASTForallTripletSpecListNode>)valueStack.get(valueStackOffset);
                    list.add(node);
                    node.setParent(list);
                    return list;

        }
        public Object handleForallBodyConstruct963(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 5
                    ASTAssignmentStmtNode result = (ASTAssignmentStmtNode)valueStack.get(valueStackOffset + 0);
                    return result;

        }
        public Object handleForallBodyConstruct964(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 5
                    ASTAssignmentStmtNode result = (ASTAssignmentStmtNode)valueStack.get(valueStackOffset + 0);
                    return result;

        }
        public Object handleForallBodyConstruct965(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 5
                    ASTWhereStmtNode result = (ASTWhereStmtNode)valueStack.get(valueStackOffset + 0);
                    return result;

        }
        public Object handleForallBodyConstruct966(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 5
                    ASTWhereConstructNode result = (ASTWhereConstructNode)valueStack.get(valueStackOffset + 0);
                    return result;

        }
        public Object handleForallBodyConstruct967(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 5
                    ASTForallConstructNode result = (ASTForallConstructNode)valueStack.get(valueStackOffset + 0);
                    return result;

        }
        public Object handleForallBodyConstruct968(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 5
                    ASTForallStmtNode result = (ASTForallStmtNode)valueStack.get(valueStackOffset + 0);
                    return result;

        }
        public Object handleEndForallStmt969(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTEndForallStmtNode node = new ASTEndForallStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTEnd = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTEnd != null) node.hiddenTEnd.setParent(node);
                    node.hiddenTForall = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTForall != null) node.hiddenTForall.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleEndForallStmt970(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTEndForallStmtNode node = new ASTEndForallStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTEnd = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTEnd != null) node.hiddenTEnd.setParent(node);
                    node.hiddenTForall = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTForall != null) node.hiddenTForall.setParent(node);
                    node.endName = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 3)).get("endName");
                    if (node.endName != null) node.endName.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleEndForallStmt971(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTEndForallStmtNode node = new ASTEndForallStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTEndforall = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTEndforall != null) node.hiddenTEndforall.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleEndForallStmt972(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTEndForallStmtNode node = new ASTEndForallStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTEndforall = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTEndforall != null) node.hiddenTEndforall.setParent(node);
                    node.endName = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 2)).get("endName");
                    if (node.endName != null) node.endName.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleForallStmt973(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTForallStmtNode node = new ASTForallStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTForall = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTForall != null) node.hiddenTForall.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 2)).get("hiddenTLparen");
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.forallTripletSpecList = (IASTListNode<ASTForallTripletSpecListNode>)((Map<String, Object>)valueStack.get(valueStackOffset + 2)).get("forallTripletSpecList");
                    if (node.forallTripletSpecList != null) node.forallTripletSpecList.setParent(node);
                    node.hiddenTComma = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 2)).get("hiddenTComma");
                    if (node.hiddenTComma != null) node.hiddenTComma.setParent(node);
                    node.scalarMaskExpr = (ASTScalarMaskExprNode)((Map<String, Object>)valueStack.get(valueStackOffset + 2)).get("scalarMaskExpr");
                    if (node.scalarMaskExpr != null) node.scalarMaskExpr.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 2)).get("hiddenTRparen");
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    node.assignment = (ASTAssignmentStmtNode)valueStack.get(valueStackOffset + 3);
                    if (node.assignment != null) node.assignment.setParent(node);
                    return node;

        }
        public Object handleForallStmt974(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTForallStmtNode node = new ASTForallStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTForall = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTForall != null) node.hiddenTForall.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 2)).get("hiddenTLparen");
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.forallTripletSpecList = (IASTListNode<ASTForallTripletSpecListNode>)((Map<String, Object>)valueStack.get(valueStackOffset + 2)).get("forallTripletSpecList");
                    if (node.forallTripletSpecList != null) node.forallTripletSpecList.setParent(node);
                    node.hiddenTComma = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 2)).get("hiddenTComma");
                    if (node.hiddenTComma != null) node.hiddenTComma.setParent(node);
                    node.scalarMaskExpr = (ASTScalarMaskExprNode)((Map<String, Object>)valueStack.get(valueStackOffset + 2)).get("scalarMaskExpr");
                    if (node.scalarMaskExpr != null) node.scalarMaskExpr.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 2)).get("hiddenTRparen");
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    node.assignment = (ASTAssignmentStmtNode)valueStack.get(valueStackOffset + 3);
                    if (node.assignment != null) node.assignment.setParent(node);
                    return node;

        }
        public Object handleIfConstruct975(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTIfConstructNode node = new ASTIfConstructNode();
                    node.ifThenStmt = (ASTIfThenStmtNode)valueStack.get(valueStackOffset + 0);
                    if (node.ifThenStmt != null) node.ifThenStmt.setParent(node);
                    node.conditionalBody = (IASTListNode<IExecutionPartConstruct>)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("conditionalBody");
                    if (node.conditionalBody != null) node.conditionalBody.setParent(node);
                    node.elseConstruct = (ASTElseConstructNode)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("elseConstruct");
                    if (node.elseConstruct != null) node.elseConstruct.setParent(node);
                    node.elseIfConstruct = (ASTElseIfConstructNode)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("elseIfConstruct");
                    if (node.elseIfConstruct != null) node.elseIfConstruct.setParent(node);
                    node.endIfStmt = (ASTEndIfStmtNode)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("endIfStmt");
                    if (node.endIfStmt != null) node.endIfStmt.setParent(node);
                    return node;

        }
        public Object handleThenPart976(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 3 and 4
                    Map<String, Object> node = new HashMap<String, Object>();
                    node.put("endIfStmt", (ASTEndIfStmtNode)valueStack.get(valueStackOffset + 0));
                    ASTListNode<IASTNode> embeddedList = new ASTListNode<IASTNode>();
                    embeddedList.add((IASTNode)(node.get("conditionalBody")));
                    embeddedList.add((IASTNode)(node.get("elseConstruct")));
                    embeddedList.add((IASTNode)(node.get("elseIfConstruct")));
                    embeddedList.add((IASTNode)(node.get("endIfStmt")));
                    node.put("errorRecoveryList", embeddedList);
                    return node;

        }
        public Object handleThenPart977(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 3 and 4
                    Map<String, Object> node = new HashMap<String, Object>();
                    node.put("conditionalBody", (IASTListNode<IExecutionPartConstruct>)valueStack.get(valueStackOffset + 0));
                    node.put("endIfStmt", (ASTEndIfStmtNode)valueStack.get(valueStackOffset + 1));
                    ASTListNode<IASTNode> embeddedList = new ASTListNode<IASTNode>();
                    embeddedList.add((IASTNode)(node.get("conditionalBody")));
                    embeddedList.add((IASTNode)(node.get("elseConstruct")));
                    embeddedList.add((IASTNode)(node.get("elseIfConstruct")));
                    embeddedList.add((IASTNode)(node.get("endIfStmt")));
                    node.put("errorRecoveryList", embeddedList);
                    return node;

        }
        public Object handleThenPart978(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 3 and 4
                    Map<String, Object> node = new HashMap<String, Object>();
                    node.put("elseIfConstruct", (ASTElseIfConstructNode)valueStack.get(valueStackOffset + 0));
                    ASTListNode<IASTNode> embeddedList = new ASTListNode<IASTNode>();
                    embeddedList.add((IASTNode)(node.get("conditionalBody")));
                    embeddedList.add((IASTNode)(node.get("elseConstruct")));
                    embeddedList.add((IASTNode)(node.get("elseIfConstruct")));
                    embeddedList.add((IASTNode)(node.get("endIfStmt")));
                    node.put("errorRecoveryList", embeddedList);
                    return node;

        }
        public Object handleThenPart979(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 3 and 4
                    Map<String, Object> node = new HashMap<String, Object>();
                    node.put("conditionalBody", (IASTListNode<IExecutionPartConstruct>)valueStack.get(valueStackOffset + 0));
                    node.put("elseIfConstruct", (ASTElseIfConstructNode)valueStack.get(valueStackOffset + 1));
                    ASTListNode<IASTNode> embeddedList = new ASTListNode<IASTNode>();
                    embeddedList.add((IASTNode)(node.get("conditionalBody")));
                    embeddedList.add((IASTNode)(node.get("elseConstruct")));
                    embeddedList.add((IASTNode)(node.get("elseIfConstruct")));
                    embeddedList.add((IASTNode)(node.get("endIfStmt")));
                    node.put("errorRecoveryList", embeddedList);
                    return node;

        }
        public Object handleThenPart980(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 3 and 4
                    Map<String, Object> node = new HashMap<String, Object>();
                    node.put("elseConstruct", (ASTElseConstructNode)valueStack.get(valueStackOffset + 0));
                    ASTListNode<IASTNode> embeddedList = new ASTListNode<IASTNode>();
                    embeddedList.add((IASTNode)(node.get("conditionalBody")));
                    embeddedList.add((IASTNode)(node.get("elseConstruct")));
                    embeddedList.add((IASTNode)(node.get("elseIfConstruct")));
                    embeddedList.add((IASTNode)(node.get("endIfStmt")));
                    node.put("errorRecoveryList", embeddedList);
                    return node;

        }
        public Object handleThenPart981(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 3 and 4
                    Map<String, Object> node = new HashMap<String, Object>();
                    node.put("conditionalBody", (IASTListNode<IExecutionPartConstruct>)valueStack.get(valueStackOffset + 0));
                    node.put("elseConstruct", (ASTElseConstructNode)valueStack.get(valueStackOffset + 1));
                    ASTListNode<IASTNode> embeddedList = new ASTListNode<IASTNode>();
                    embeddedList.add((IASTNode)(node.get("conditionalBody")));
                    embeddedList.add((IASTNode)(node.get("elseConstruct")));
                    embeddedList.add((IASTNode)(node.get("elseIfConstruct")));
                    embeddedList.add((IASTNode)(node.get("endIfStmt")));
                    node.put("errorRecoveryList", embeddedList);
                    return node;

        }
        public Object handleElseIfConstruct982(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTElseIfConstructNode node = new ASTElseIfConstructNode();
                    node.elseIfStmt = (ASTElseIfStmtNode)valueStack.get(valueStackOffset + 0);
                    if (node.elseIfStmt != null) node.elseIfStmt.setParent(node);
                    node.conditionalBody = (IASTListNode<IExecutionPartConstruct>)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("conditionalBody");
                    if (node.conditionalBody != null) node.conditionalBody.setParent(node);
                    node.elseConstruct = (ASTElseConstructNode)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("elseConstruct");
                    if (node.elseConstruct != null) node.elseConstruct.setParent(node);
                    node.elseIfConstruct = (ASTElseIfConstructNode)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("elseIfConstruct");
                    if (node.elseIfConstruct != null) node.elseIfConstruct.setParent(node);
                    node.endIfStmt = (ASTEndIfStmtNode)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("endIfStmt");
                    if (node.endIfStmt != null) node.endIfStmt.setParent(node);
                    return node;

        }
        public Object handleElseConstruct983(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTElseConstructNode node = new ASTElseConstructNode();
                    node.elseStmt = (ASTElseStmtNode)valueStack.get(valueStackOffset + 0);
                    if (node.elseStmt != null) node.elseStmt.setParent(node);
                    node.conditionalBody = (IASTListNode<IExecutionPartConstruct>)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("conditionalBody");
                    if (node.conditionalBody != null) node.conditionalBody.setParent(node);
                    node.endIfStmt = (ASTEndIfStmtNode)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("endIfStmt");
                    if (node.endIfStmt != null) node.endIfStmt.setParent(node);
                    return node;

        }
        public Object handleElsePart984(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 3 and 4
                    Map<String, Object> node = new HashMap<String, Object>();
                    node.put("endIfStmt", (ASTEndIfStmtNode)valueStack.get(valueStackOffset + 0));
                    ASTListNode<IASTNode> embeddedList = new ASTListNode<IASTNode>();
                    embeddedList.add((IASTNode)(node.get("conditionalBody")));
                    embeddedList.add((IASTNode)(node.get("endIfStmt")));
                    node.put("errorRecoveryList", embeddedList);
                    return node;

        }
        public Object handleElsePart985(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 3 and 4
                    Map<String, Object> node = new HashMap<String, Object>();
                    node.put("conditionalBody", (IASTListNode<IExecutionPartConstruct>)valueStack.get(valueStackOffset + 0));
                    node.put("endIfStmt", (ASTEndIfStmtNode)valueStack.get(valueStackOffset + 1));
                    ASTListNode<IASTNode> embeddedList = new ASTListNode<IASTNode>();
                    embeddedList.add((IASTNode)(node.get("conditionalBody")));
                    embeddedList.add((IASTNode)(node.get("endIfStmt")));
                    node.put("errorRecoveryList", embeddedList);
                    return node;

        }
        public Object handleConditionalBody986(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 7
                    IASTListNode<IExecutionPartConstruct> list = new ASTListNode<IExecutionPartConstruct>();
                    IExecutionPartConstruct elt = (IExecutionPartConstruct)valueStack.get(valueStackOffset + 0);
                    list.add(elt);
                    if (elt != null) elt.setParent(list);
                    return list;

        }
        public Object handleConditionalBody987(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 8
                    IASTListNode<IExecutionPartConstruct> list = (IASTListNode<IExecutionPartConstruct>)valueStack.get(valueStackOffset);
                    IExecutionPartConstruct elt = (IExecutionPartConstruct)valueStack.get(valueStackOffset + 1);
                    list.add(elt);
                    if (elt != null) elt.setParent(list);
                    return list;

        }
        public Object handleIfThenStmt988(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTIfThenStmtNode node = new ASTIfThenStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTIf = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTIf != null) node.hiddenTIf.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.guardingExpression = (IExpr)valueStack.get(valueStackOffset + 3);
                    if (node.guardingExpression != null) node.guardingExpression.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    node.hiddenTThen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 5);
                    if (node.hiddenTThen != null) node.hiddenTThen.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 6);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleIfThenStmt989(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTIfThenStmtNode node = new ASTIfThenStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.name = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("name");
                    if (node.name != null) node.name.setParent(node);
                    node.hiddenTColon = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTColon != null) node.hiddenTColon.setParent(node);
                    node.hiddenTIf = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTIf != null) node.hiddenTIf.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.guardingExpression = (IExpr)valueStack.get(valueStackOffset + 5);
                    if (node.guardingExpression != null) node.guardingExpression.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 6);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    node.hiddenTThen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 7);
                    if (node.hiddenTThen != null) node.hiddenTThen.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 8);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleIfThenStmt990(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTIfThenStmtNode node = new ASTIfThenStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTIf = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTIf != null) node.hiddenTIf.setParent(node);
                    node.ifThenError = (ASTIfThenErrorNode)valueStack.get(valueStackOffset + 2);
                    if (node.ifThenError != null) node.ifThenError.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleIfThenStmt991(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTIfThenStmtNode node = new ASTIfThenStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.name = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("name");
                    if (node.name != null) node.name.setParent(node);
                    node.hiddenTColon = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTColon != null) node.hiddenTColon.setParent(node);
                    node.hiddenTIf = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTIf != null) node.hiddenTIf.setParent(node);
                    node.ifThenError = (ASTIfThenErrorNode)valueStack.get(valueStackOffset + 4);
                    if (node.ifThenError != null) node.ifThenError.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 5);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleElseIfStmt992(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTElseIfStmtNode node = new ASTElseIfStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTElseif = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTElseif != null) node.hiddenTElseif.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.guardingExpression = (IExpr)valueStack.get(valueStackOffset + 3);
                    if (node.guardingExpression != null) node.guardingExpression.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    node.hiddenTThen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 5);
                    if (node.hiddenTThen != null) node.hiddenTThen.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 6);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleElseIfStmt993(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTElseIfStmtNode node = new ASTElseIfStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTElseif = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTElseif != null) node.hiddenTElseif.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.guardingExpression = (IExpr)valueStack.get(valueStackOffset + 3);
                    if (node.guardingExpression != null) node.guardingExpression.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    node.hiddenTThen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 5);
                    if (node.hiddenTThen != null) node.hiddenTThen.setParent(node);
                    node.endName = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 6)).get("endName");
                    if (node.endName != null) node.endName.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 7);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleElseIfStmt994(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTElseIfStmtNode node = new ASTElseIfStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTElse = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTElse != null) node.hiddenTElse.setParent(node);
                    node.hiddenTIf = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTIf != null) node.hiddenTIf.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.guardingExpression = (IExpr)valueStack.get(valueStackOffset + 4);
                    if (node.guardingExpression != null) node.guardingExpression.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 5);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    node.hiddenTThen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 6);
                    if (node.hiddenTThen != null) node.hiddenTThen.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 7);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleElseIfStmt995(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTElseIfStmtNode node = new ASTElseIfStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTElse = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTElse != null) node.hiddenTElse.setParent(node);
                    node.hiddenTIf = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTIf != null) node.hiddenTIf.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.guardingExpression = (IExpr)valueStack.get(valueStackOffset + 4);
                    if (node.guardingExpression != null) node.guardingExpression.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 5);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    node.hiddenTThen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 6);
                    if (node.hiddenTThen != null) node.hiddenTThen.setParent(node);
                    node.endName = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 7)).get("endName");
                    if (node.endName != null) node.endName.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 8);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleElseStmt996(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTElseStmtNode node = new ASTElseStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTElse = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTElse != null) node.hiddenTElse.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleElseStmt997(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTElseStmtNode node = new ASTElseStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTElse = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTElse != null) node.hiddenTElse.setParent(node);
                    node.endName = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 2)).get("endName");
                    if (node.endName != null) node.endName.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleEndIfStmt998(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTEndIfStmtNode node = new ASTEndIfStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTEndif = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTEndif != null) node.hiddenTEndif.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleEndIfStmt999(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTEndIfStmtNode node = new ASTEndIfStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTEndif = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTEndif != null) node.hiddenTEndif.setParent(node);
                    node.endName = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 2)).get("endName");
                    if (node.endName != null) node.endName.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleEndIfStmt1000(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTEndIfStmtNode node = new ASTEndIfStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTEnd = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTEnd != null) node.hiddenTEnd.setParent(node);
                    node.hiddenTIf = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTIf != null) node.hiddenTIf.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleEndIfStmt1001(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTEndIfStmtNode node = new ASTEndIfStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTEnd = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTEnd != null) node.hiddenTEnd.setParent(node);
                    node.hiddenTIf = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTIf != null) node.hiddenTIf.setParent(node);
                    node.endName = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 3)).get("endName");
                    if (node.endName != null) node.endName.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleIfStmt1002(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTIfStmtNode node = new ASTIfStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.tIf = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.tIf != null) node.tIf.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.guardingExpression = (IExpr)valueStack.get(valueStackOffset + 3);
                    if (node.guardingExpression != null) node.guardingExpression.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    node.actionStmt = (IActionStmt)valueStack.get(valueStackOffset + 5);
                    if (node.actionStmt != null) node.actionStmt.setParent(node);
                    return node;

        }
        public Object handleBlockConstruct1003(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTBlockConstructNode node = new ASTBlockConstructNode();
                    node.blockStmt = (ASTBlockStmtNode)valueStack.get(valueStackOffset + 0);
                    if (node.blockStmt != null) node.blockStmt.setParent(node);
                    node.endBlockStmt = (ASTEndBlockStmtNode)valueStack.get(valueStackOffset + 1);
                    if (node.endBlockStmt != null) node.endBlockStmt.setParent(node);
                    return node;

        }
        public Object handleBlockConstruct1004(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTBlockConstructNode node = new ASTBlockConstructNode();
                    node.blockStmt = (ASTBlockStmtNode)valueStack.get(valueStackOffset + 0);
                    if (node.blockStmt != null) node.blockStmt.setParent(node);
                    node.body = (IASTListNode<IBodyConstruct>)valueStack.get(valueStackOffset + 1);
                    if (node.body != null) node.body.setParent(node);
                    node.endBlockStmt = (ASTEndBlockStmtNode)valueStack.get(valueStackOffset + 2);
                    if (node.endBlockStmt != null) node.endBlockStmt.setParent(node);
                    return node;

        }
        public Object handleBlockStmt1005(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTBlockStmtNode node = new ASTBlockStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTBlock = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTBlock != null) node.hiddenTBlock.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleBlockStmt1006(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTBlockStmtNode node = new ASTBlockStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.name = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("name");
                    if (node.name != null) node.name.setParent(node);
                    node.hiddenTColon = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTColon != null) node.hiddenTColon.setParent(node);
                    node.hiddenTBlock = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTBlock != null) node.hiddenTBlock.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleEndBlockStmt1007(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTEndBlockStmtNode node = new ASTEndBlockStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTEndblock = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTEndblock != null) node.hiddenTEndblock.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleEndBlockStmt1008(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTEndBlockStmtNode node = new ASTEndBlockStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTEndblock = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTEndblock != null) node.hiddenTEndblock.setParent(node);
                    node.endName = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 2)).get("endName");
                    if (node.endName != null) node.endName.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleEndBlockStmt1009(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTEndBlockStmtNode node = new ASTEndBlockStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTEnd = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTEnd != null) node.hiddenTEnd.setParent(node);
                    node.hiddenTBlock = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTBlock != null) node.hiddenTBlock.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleEndBlockStmt1010(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTEndBlockStmtNode node = new ASTEndBlockStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTEnd = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTEnd != null) node.hiddenTEnd.setParent(node);
                    node.hiddenTBlock = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTBlock != null) node.hiddenTBlock.setParent(node);
                    node.endName = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 3)).get("endName");
                    if (node.endName != null) node.endName.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleCriticalConstruct1011(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTCriticalConstructNode node = new ASTCriticalConstructNode();
                    node.criticalStmt = (ASTCriticalStmtNode)valueStack.get(valueStackOffset + 0);
                    if (node.criticalStmt != null) node.criticalStmt.setParent(node);
                    node.endCriticalStmt = (ASTEndCriticalStmtNode)valueStack.get(valueStackOffset + 1);
                    if (node.endCriticalStmt != null) node.endCriticalStmt.setParent(node);
                    return node;

        }
        public Object handleCriticalConstruct1012(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTCriticalConstructNode node = new ASTCriticalConstructNode();
                    node.criticalStmt = (ASTCriticalStmtNode)valueStack.get(valueStackOffset + 0);
                    if (node.criticalStmt != null) node.criticalStmt.setParent(node);
                    node.body = (IASTListNode<IBodyConstruct>)valueStack.get(valueStackOffset + 1);
                    if (node.body != null) node.body.setParent(node);
                    node.endCriticalStmt = (ASTEndCriticalStmtNode)valueStack.get(valueStackOffset + 2);
                    if (node.endCriticalStmt != null) node.endCriticalStmt.setParent(node);
                    return node;

        }
        public Object handleCriticalStmt1013(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTCriticalStmtNode node = new ASTCriticalStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTCritical = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTCritical != null) node.hiddenTCritical.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleCriticalStmt1014(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTCriticalStmtNode node = new ASTCriticalStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.name = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("name");
                    if (node.name != null) node.name.setParent(node);
                    node.hiddenTColon = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTColon != null) node.hiddenTColon.setParent(node);
                    node.hiddenTCritical = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTCritical != null) node.hiddenTCritical.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleEndCriticalStmt1015(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTEndCriticalStmtNode node = new ASTEndCriticalStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTEndcritical = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTEndcritical != null) node.hiddenTEndcritical.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleEndCriticalStmt1016(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTEndCriticalStmtNode node = new ASTEndCriticalStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTEndcritical = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTEndcritical != null) node.hiddenTEndcritical.setParent(node);
                    node.endName = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 2)).get("endName");
                    if (node.endName != null) node.endName.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleEndCriticalStmt1017(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTEndCriticalStmtNode node = new ASTEndCriticalStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTEnd = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTEnd != null) node.hiddenTEnd.setParent(node);
                    node.hiddenTCritical = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTCritical != null) node.hiddenTCritical.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleEndCriticalStmt1018(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTEndCriticalStmtNode node = new ASTEndCriticalStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTEnd = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTEnd != null) node.hiddenTEnd.setParent(node);
                    node.hiddenTCritical = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTCritical != null) node.hiddenTCritical.setParent(node);
                    node.endName = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 3)).get("endName");
                    if (node.endName != null) node.endName.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleCaseConstruct1019(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTCaseConstructNode node = new ASTCaseConstructNode();
                    node.selectCaseStmt = (ASTSelectCaseStmtNode)valueStack.get(valueStackOffset + 0);
                    if (node.selectCaseStmt != null) node.selectCaseStmt.setParent(node);
                    node.selectCaseBody = (IASTListNode<ICaseBodyConstruct>)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("selectCaseBody");
                    if (node.selectCaseBody != null) node.selectCaseBody.setParent(node);
                    node.endSelectStmt = (ASTEndSelectStmtNode)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("endSelectStmt");
                    if (node.endSelectStmt != null) node.endSelectStmt.setParent(node);
                    return node;

        }
        public Object handleSelectCaseRange1020(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 3 and 4
                    Map<String, Object> node = new HashMap<String, Object>();
                    node.put("selectCaseBody", (IASTListNode<ICaseBodyConstruct>)valueStack.get(valueStackOffset + 0));
                    node.put("endSelectStmt", (ASTEndSelectStmtNode)valueStack.get(valueStackOffset + 1));
                    ASTListNode<IASTNode> embeddedList = new ASTListNode<IASTNode>();
                    embeddedList.add((IASTNode)(node.get("selectCaseBody")));
                    embeddedList.add((IASTNode)(node.get("endSelectStmt")));
                    node.put("errorRecoveryList", embeddedList);
                    return node;

        }
        public Object handleSelectCaseRange1021(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 3 and 4
                    Map<String, Object> node = new HashMap<String, Object>();
                    node.put("endSelectStmt", (ASTEndSelectStmtNode)valueStack.get(valueStackOffset + 0));
                    ASTListNode<IASTNode> embeddedList = new ASTListNode<IASTNode>();
                    embeddedList.add((IASTNode)(node.get("selectCaseBody")));
                    embeddedList.add((IASTNode)(node.get("endSelectStmt")));
                    node.put("errorRecoveryList", embeddedList);
                    return node;

        }
        public Object handleSelectCaseBody1022(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 7
                    IASTListNode<ICaseBodyConstruct> list = new ASTListNode<ICaseBodyConstruct>();
                    ICaseBodyConstruct elt = (ICaseBodyConstruct)valueStack.get(valueStackOffset + 0);
                    list.add(elt);
                    if (elt != null) elt.setParent(list);
                    return list;

        }
        public Object handleSelectCaseBody1023(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 8
                    IASTListNode<ICaseBodyConstruct> list = (IASTListNode<ICaseBodyConstruct>)valueStack.get(valueStackOffset);
                    ICaseBodyConstruct elt = (ICaseBodyConstruct)valueStack.get(valueStackOffset + 1);
                    list.add(elt);
                    if (elt != null) elt.setParent(list);
                    return list;

        }
        public Object handleCaseBodyConstruct1024(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 5
                    ASTCaseStmtNode result = (ASTCaseStmtNode)valueStack.get(valueStackOffset + 0);
                    return result;

        }
        public Object handleCaseBodyConstruct1025(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 5
                    IExecutionPartConstruct result = (IExecutionPartConstruct)valueStack.get(valueStackOffset + 0);
                    return result;

        }
        public Object handleSelectCaseStmt1026(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTSelectCaseStmtNode node = new ASTSelectCaseStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.name = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("name");
                    if (node.name != null) node.name.setParent(node);
                    node.hiddenTColon = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTColon != null) node.hiddenTColon.setParent(node);
                    node.hiddenTSelectcase = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTSelectcase != null) node.hiddenTSelectcase.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.selectionExpression = (IExpr)valueStack.get(valueStackOffset + 5);
                    if (node.selectionExpression != null) node.selectionExpression.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 6);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 7);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleSelectCaseStmt1027(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTSelectCaseStmtNode node = new ASTSelectCaseStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTSelectcase = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTSelectcase != null) node.hiddenTSelectcase.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.selectionExpression = (IExpr)valueStack.get(valueStackOffset + 3);
                    if (node.selectionExpression != null) node.selectionExpression.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 5);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleSelectCaseStmt1028(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTSelectCaseStmtNode node = new ASTSelectCaseStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.name = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("name");
                    if (node.name != null) node.name.setParent(node);
                    node.hiddenTColon = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTColon != null) node.hiddenTColon.setParent(node);
                    node.hiddenTSelect = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTSelect != null) node.hiddenTSelect.setParent(node);
                    node.hiddenTCase = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenTCase != null) node.hiddenTCase.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 5);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.selectionExpression = (IExpr)valueStack.get(valueStackOffset + 6);
                    if (node.selectionExpression != null) node.selectionExpression.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 7);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 8);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleSelectCaseStmt1029(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTSelectCaseStmtNode node = new ASTSelectCaseStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTSelect = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTSelect != null) node.hiddenTSelect.setParent(node);
                    node.hiddenTCase = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTCase != null) node.hiddenTCase.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.selectionExpression = (IExpr)valueStack.get(valueStackOffset + 4);
                    if (node.selectionExpression != null) node.selectionExpression.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 5);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 6);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleCaseStmt1030(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTCaseStmtNode node = new ASTCaseStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTCase = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTCase != null) node.hiddenTCase.setParent(node);
                    node.hasDefaultSelector = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 2)).get("hasDefaultSelector");
                    if (node.hasDefaultSelector != null) node.hasDefaultSelector.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 2)).get("hiddenTLparen");
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.caseValueRangeListSelector = (IASTListNode<ASTCaseValueRangeNode>)((Map<String, Object>)valueStack.get(valueStackOffset + 2)).get("caseValueRangeListSelector");
                    if (node.caseValueRangeListSelector != null) node.caseValueRangeListSelector.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 2)).get("hiddenTRparen");
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleCaseStmt1031(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTCaseStmtNode node = new ASTCaseStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTCase = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTCase != null) node.hiddenTCase.setParent(node);
                    node.hasDefaultSelector = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 2)).get("hasDefaultSelector");
                    if (node.hasDefaultSelector != null) node.hasDefaultSelector.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 2)).get("hiddenTLparen");
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.caseValueRangeListSelector = (IASTListNode<ASTCaseValueRangeNode>)((Map<String, Object>)valueStack.get(valueStackOffset + 2)).get("caseValueRangeListSelector");
                    if (node.caseValueRangeListSelector != null) node.caseValueRangeListSelector.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 2)).get("hiddenTRparen");
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    ASTNameNode tmp3 = new ASTNameNode();
                    tmp3.name = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 3)).get("name");
                    if (tmp3.name != null) tmp3.name.setParent(tmp3);
                    node.name = tmp3;
                    if (tmp3 != null) tmp3.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleEndSelectStmt1032(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTEndSelectStmtNode node = new ASTEndSelectStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTEndselect = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTEndselect != null) node.hiddenTEndselect.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleEndSelectStmt1033(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTEndSelectStmtNode node = new ASTEndSelectStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTEndselect = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTEndselect != null) node.hiddenTEndselect.setParent(node);
                    node.endName = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 2)).get("endName");
                    if (node.endName != null) node.endName.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleEndSelectStmt1034(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTEndSelectStmtNode node = new ASTEndSelectStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTEndbeforeselect = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTEndbeforeselect != null) node.hiddenTEndbeforeselect.setParent(node);
                    node.hiddenTSelect = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTSelect != null) node.hiddenTSelect.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleEndSelectStmt1035(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTEndSelectStmtNode node = new ASTEndSelectStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTEndbeforeselect = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTEndbeforeselect != null) node.hiddenTEndbeforeselect.setParent(node);
                    node.hiddenTSelect = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTSelect != null) node.hiddenTSelect.setParent(node);
                    node.endName = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 3)).get("endName");
                    if (node.endName != null) node.endName.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleCaseSelector1036(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 3 and 4
                    Map<String, Object> node = new HashMap<String, Object>();
                    node.put("hiddenTLparen", (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0));
                    node.put("caseValueRangeListSelector", (IASTListNode<ASTCaseValueRangeNode>)valueStack.get(valueStackOffset + 1));
                    node.put("hiddenTRparen", (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2));
                    ASTListNode<IASTNode> embeddedList = new ASTListNode<IASTNode>();
                    embeddedList.add((IASTNode)(node.get("hasDefaultSelector")));
                    embeddedList.add((IASTNode)(node.get("hiddenTLparen")));
                    embeddedList.add((IASTNode)(node.get("caseValueRangeListSelector")));
                    embeddedList.add((IASTNode)(node.get("hiddenTRparen")));
                    node.put("errorRecoveryList", embeddedList);
                    return node;

        }
        public Object handleCaseSelector1037(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 3 and 4
                    Map<String, Object> node = new HashMap<String, Object>();
                    node.put("hasDefaultSelector", (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0));
                    ASTListNode<IASTNode> embeddedList = new ASTListNode<IASTNode>();
                    embeddedList.add((IASTNode)(node.get("hasDefaultSelector")));
                    embeddedList.add((IASTNode)(node.get("hiddenTLparen")));
                    embeddedList.add((IASTNode)(node.get("caseValueRangeListSelector")));
                    embeddedList.add((IASTNode)(node.get("hiddenTRparen")));
                    node.put("errorRecoveryList", embeddedList);
                    return node;

        }
        public Object handleCaseValueRangeList1038(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 7 with separator
                    ASTSeparatedListNode<ASTCaseValueRangeNode> list = new ASTSeparatedListNode<ASTCaseValueRangeNode>();
                    ASTCaseValueRangeNode elt = (ASTCaseValueRangeNode)valueStack.get(valueStackOffset + 0);
                    list.add(null, elt);
                    if (elt != null) elt.setParent(list);
                    return list;

        }
        public Object handleCaseValueRangeList1039(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 8 with separator
                    ASTSeparatedListNode<ASTCaseValueRangeNode> list = (ASTSeparatedListNode<ASTCaseValueRangeNode>)valueStack.get(valueStackOffset);
                    org.eclipse.photran.internal.core.lexer.Token token = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    ASTCaseValueRangeNode elt = (ASTCaseValueRangeNode)valueStack.get(valueStackOffset + 2);
                    list.add(token, elt);
                    token.setParent(list);
                    if (elt != null) elt.setParent(list);
                    return list;

        }
        public Object handleCaseValueRange1040(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTCaseValueRangeNode node = new ASTCaseValueRangeNode();
                    node.lb = (IExpr)valueStack.get(valueStackOffset + 0);
                    if (node.lb != null) node.lb.setParent(node);
                    return node;

        }
        public Object handleCaseValueRange1041(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTCaseValueRangeNode node = new ASTCaseValueRangeNode();
                    node.lb = (IExpr)valueStack.get(valueStackOffset + 0);
                    if (node.lb != null) node.lb.setParent(node);
                    node.hiddenTColon = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTColon != null) node.hiddenTColon.setParent(node);
                    return node;

        }
        public Object handleCaseValueRange1042(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTCaseValueRangeNode node = new ASTCaseValueRangeNode();
                    node.hiddenTColon = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.hiddenTColon != null) node.hiddenTColon.setParent(node);
                    node.ub = (IExpr)valueStack.get(valueStackOffset + 1);
                    if (node.ub != null) node.ub.setParent(node);
                    return node;

        }
        public Object handleCaseValueRange1043(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTCaseValueRangeNode node = new ASTCaseValueRangeNode();
                    node.lb = (IExpr)valueStack.get(valueStackOffset + 0);
                    if (node.lb != null) node.lb.setParent(node);
                    node.hiddenTColon = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTColon != null) node.hiddenTColon.setParent(node);
                    node.ub = (IExpr)valueStack.get(valueStackOffset + 2);
                    if (node.ub != null) node.ub.setParent(node);
                    return node;

        }
        public Object handleAssociateConstruct1044(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTAssociateConstructNode node = new ASTAssociateConstructNode();
                    node.associateStmt = (ASTAssociateStmtNode)valueStack.get(valueStackOffset + 0);
                    if (node.associateStmt != null) node.associateStmt.setParent(node);
                    node.associateBody = (IASTListNode<IExecutionPartConstruct>)valueStack.get(valueStackOffset + 1);
                    if (node.associateBody != null) node.associateBody.setParent(node);
                    node.endAssociateStmt = (ASTEndAssociateStmtNode)valueStack.get(valueStackOffset + 2);
                    if (node.endAssociateStmt != null) node.endAssociateStmt.setParent(node);
                    return node;

        }
        public Object handleAssociateConstruct1045(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTAssociateConstructNode node = new ASTAssociateConstructNode();
                    node.associateStmt = (ASTAssociateStmtNode)valueStack.get(valueStackOffset + 0);
                    if (node.associateStmt != null) node.associateStmt.setParent(node);
                    node.endAssociateStmt = (ASTEndAssociateStmtNode)valueStack.get(valueStackOffset + 1);
                    if (node.endAssociateStmt != null) node.endAssociateStmt.setParent(node);
                    return node;

        }
        public Object handleAssociateStmt1046(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTAssociateStmtNode node = new ASTAssociateStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.name = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("name");
                    if (node.name != null) node.name.setParent(node);
                    node.hiddenTColon = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTColon != null) node.hiddenTColon.setParent(node);
                    node.hiddenTAssociate = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTAssociate != null) node.hiddenTAssociate.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.associationList = (IASTListNode<ASTAssociationNode>)valueStack.get(valueStackOffset + 5);
                    if (node.associationList != null) node.associationList.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 6);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 7);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleAssociateStmt1047(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTAssociateStmtNode node = new ASTAssociateStmtNode();
                    node.hiddenTAssociate = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.hiddenTAssociate != null) node.hiddenTAssociate.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.associationList = (IASTListNode<ASTAssociationNode>)valueStack.get(valueStackOffset + 2);
                    if (node.associationList != null) node.associationList.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleAssociationList1048(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 7 with separator
                    ASTSeparatedListNode<ASTAssociationNode> list = new ASTSeparatedListNode<ASTAssociationNode>();
                    ASTAssociationNode elt = (ASTAssociationNode)valueStack.get(valueStackOffset + 0);
                    list.add(null, elt);
                    if (elt != null) elt.setParent(list);
                    return list;

        }
        public Object handleAssociationList1049(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 8 with separator
                    ASTSeparatedListNode<ASTAssociationNode> list = (ASTSeparatedListNode<ASTAssociationNode>)valueStack.get(valueStackOffset);
                    org.eclipse.photran.internal.core.lexer.Token token = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    ASTAssociationNode elt = (ASTAssociationNode)valueStack.get(valueStackOffset + 2);
                    list.add(token, elt);
                    token.setParent(list);
                    if (elt != null) elt.setParent(list);
                    return list;

        }
        public Object handleAssociation1050(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTAssociationNode node = new ASTAssociationNode();
                    node.associateName = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.associateName != null) node.associateName.setParent(node);
                    node.hiddenTEqgreaterthan = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTEqgreaterthan != null) node.hiddenTEqgreaterthan.setParent(node);
                    node.selector = (ISelector)valueStack.get(valueStackOffset + 2);
                    if (node.selector != null) node.selector.setParent(node);
                    return node;

        }
        public Object handleSelector1051(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 5
                    IExpr result = (IExpr)valueStack.get(valueStackOffset + 0);
                    return result;

        }
        public Object handleAssociateBody1052(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 7
                    IASTListNode<IExecutionPartConstruct> list = new ASTListNode<IExecutionPartConstruct>();
                    IExecutionPartConstruct elt = (IExecutionPartConstruct)valueStack.get(valueStackOffset + 0);
                    list.add(elt);
                    if (elt != null) elt.setParent(list);
                    return list;

        }
        public Object handleAssociateBody1053(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 8
                    IASTListNode<IExecutionPartConstruct> list = (IASTListNode<IExecutionPartConstruct>)valueStack.get(valueStackOffset);
                    IExecutionPartConstruct elt = (IExecutionPartConstruct)valueStack.get(valueStackOffset + 1);
                    list.add(elt);
                    if (elt != null) elt.setParent(list);
                    return list;

        }
        public Object handleEndAssociateStmt1054(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTEndAssociateStmtNode node = new ASTEndAssociateStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTEnd = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTEnd != null) node.hiddenTEnd.setParent(node);
                    node.hiddenTAssociate = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTAssociate != null) node.hiddenTAssociate.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleEndAssociateStmt1055(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTEndAssociateStmtNode node = new ASTEndAssociateStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTEnd = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTEnd != null) node.hiddenTEnd.setParent(node);
                    node.hiddenTAssociate = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTAssociate != null) node.hiddenTAssociate.setParent(node);
                    node.associateConstructName = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.associateConstructName != null) node.associateConstructName.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleSelectTypeConstruct1056(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTSelectTypeConstructNode node = new ASTSelectTypeConstructNode();
                    node.selectTypeStmt = (ASTSelectTypeStmtNode)valueStack.get(valueStackOffset + 0);
                    if (node.selectTypeStmt != null) node.selectTypeStmt.setParent(node);
                    node.selectTypeBody = (IASTListNode<ASTSelectTypeBodyNode>)valueStack.get(valueStackOffset + 1);
                    if (node.selectTypeBody != null) node.selectTypeBody.setParent(node);
                    node.endSelectTypeStmt = (ASTEndSelectTypeStmtNode)valueStack.get(valueStackOffset + 2);
                    if (node.endSelectTypeStmt != null) node.endSelectTypeStmt.setParent(node);
                    return node;

        }
        public Object handleSelectTypeConstruct1057(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTSelectTypeConstructNode node = new ASTSelectTypeConstructNode();
                    node.selectTypeStmt = (ASTSelectTypeStmtNode)valueStack.get(valueStackOffset + 0);
                    if (node.selectTypeStmt != null) node.selectTypeStmt.setParent(node);
                    node.endSelectTypeStmt = (ASTEndSelectTypeStmtNode)valueStack.get(valueStackOffset + 1);
                    if (node.endSelectTypeStmt != null) node.endSelectTypeStmt.setParent(node);
                    return node;

        }
        public Object handleSelectTypeBody1058(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 10
                    ASTSelectTypeBodyNode node = new ASTSelectTypeBodyNode();
                    node.typeGuardStmt = (ASTTypeGuardStmtNode)valueStack.get(valueStackOffset + 0);
                    if (node.typeGuardStmt != null) node.typeGuardStmt.setParent(node);
                    node.typeGuardBlock = (IASTListNode<IExecutionPartConstruct>)valueStack.get(valueStackOffset + 1);
                    if (node.typeGuardBlock != null) node.typeGuardBlock.setParent(node);
                    ASTListNode<ASTSelectTypeBodyNode> list = new ASTListNode<ASTSelectTypeBodyNode>();
                    list.add(node);
                    node.setParent(list);
                    return list;

        }
        public Object handleSelectTypeBody1059(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 11
                    ASTSelectTypeBodyNode node = new ASTSelectTypeBodyNode();
                    node.typeGuardStmt = (ASTTypeGuardStmtNode)valueStack.get(valueStackOffset + 1);
                    if (node.typeGuardStmt != null) node.typeGuardStmt.setParent(node);
                    node.typeGuardBlock = (IASTListNode<IExecutionPartConstruct>)valueStack.get(valueStackOffset + 2);
                    if (node.typeGuardBlock != null) node.typeGuardBlock.setParent(node);
                    ASTListNode<ASTSelectTypeBodyNode> list = (ASTListNode<ASTSelectTypeBodyNode>)valueStack.get(valueStackOffset);
                    list.add(node);
                    node.setParent(list);
                    return list;

        }
        public Object handleTypeGuardBlock1060(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 6
                    return new ASTListNode<IExecutionPartConstruct>();

        }
        public Object handleTypeGuardBlock1061(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 8
                    IASTListNode<IExecutionPartConstruct> list = (IASTListNode<IExecutionPartConstruct>)valueStack.get(valueStackOffset);
                    IExecutionPartConstruct elt = (IExecutionPartConstruct)valueStack.get(valueStackOffset + 1);
                    list.add(elt);
                    if (elt != null) elt.setParent(list);
                    return list;

        }
        public Object handleSelectTypeStmt1062(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTSelectTypeStmtNode node = new ASTSelectTypeStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.name = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("name");
                    if (node.name != null) node.name.setParent(node);
                    node.hiddenTColon = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTColon != null) node.hiddenTColon.setParent(node);
                    node.hiddenTSelect = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTSelect != null) node.hiddenTSelect.setParent(node);
                    node.hiddenTType = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenTType != null) node.hiddenTType.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 5);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.associateName = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 6);
                    if (node.associateName != null) node.associateName.setParent(node);
                    node.hiddenTEqgreaterthan = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 7);
                    if (node.hiddenTEqgreaterthan != null) node.hiddenTEqgreaterthan.setParent(node);
                    node.selector = (ISelector)valueStack.get(valueStackOffset + 8);
                    if (node.selector != null) node.selector.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 9);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 10);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleSelectTypeStmt1063(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTSelectTypeStmtNode node = new ASTSelectTypeStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.name = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("name");
                    if (node.name != null) node.name.setParent(node);
                    node.hiddenTColon = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTColon != null) node.hiddenTColon.setParent(node);
                    node.hiddenTSelect = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTSelect != null) node.hiddenTSelect.setParent(node);
                    node.hiddenTType = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenTType != null) node.hiddenTType.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 5);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.selector = (ISelector)valueStack.get(valueStackOffset + 6);
                    if (node.selector != null) node.selector.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 7);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 8);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleSelectTypeStmt1064(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTSelectTypeStmtNode node = new ASTSelectTypeStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTSelect = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTSelect != null) node.hiddenTSelect.setParent(node);
                    node.hiddenTType = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTType != null) node.hiddenTType.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.associateName = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.associateName != null) node.associateName.setParent(node);
                    node.hiddenTEqgreaterthan = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 5);
                    if (node.hiddenTEqgreaterthan != null) node.hiddenTEqgreaterthan.setParent(node);
                    node.selector = (ISelector)valueStack.get(valueStackOffset + 6);
                    if (node.selector != null) node.selector.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 7);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 8);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleSelectTypeStmt1065(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTSelectTypeStmtNode node = new ASTSelectTypeStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTSelect = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTSelect != null) node.hiddenTSelect.setParent(node);
                    node.hiddenTType = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTType != null) node.hiddenTType.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.selector = (ISelector)valueStack.get(valueStackOffset + 4);
                    if (node.selector != null) node.selector.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 5);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 6);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleTypeGuardStmt1066(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTTypeGuardStmtNode node = new ASTTypeGuardStmtNode();
                    node.isType = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.isType != null) node.isType.setParent(node);
                    node.hiddenTIs = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTIs != null) node.hiddenTIs.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.typeSpecNoPrefix = (ASTTypeSpecNode)valueStack.get(valueStackOffset + 3);
                    if (node.typeSpecNoPrefix != null) node.typeSpecNoPrefix.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 5);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleTypeGuardStmt1067(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTTypeGuardStmtNode node = new ASTTypeGuardStmtNode();
                    node.isType = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.isType != null) node.isType.setParent(node);
                    node.hiddenTIs = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTIs != null) node.hiddenTIs.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.typeSpecNoPrefix = (ASTTypeSpecNode)valueStack.get(valueStackOffset + 3);
                    if (node.typeSpecNoPrefix != null) node.typeSpecNoPrefix.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    node.selectConstructName = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 5);
                    if (node.selectConstructName != null) node.selectConstructName.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 6);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleTypeGuardStmt1068(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTTypeGuardStmtNode node = new ASTTypeGuardStmtNode();
                    node.isClass = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.isClass != null) node.isClass.setParent(node);
                    node.hiddenTIs = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTIs != null) node.hiddenTIs.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.typeSpecNoPrefix = (ASTTypeSpecNode)valueStack.get(valueStackOffset + 3);
                    if (node.typeSpecNoPrefix != null) node.typeSpecNoPrefix.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 5);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleTypeGuardStmt1069(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTTypeGuardStmtNode node = new ASTTypeGuardStmtNode();
                    node.isClass = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.isClass != null) node.isClass.setParent(node);
                    node.hiddenTIs = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTIs != null) node.hiddenTIs.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.typeSpecNoPrefix = (ASTTypeSpecNode)valueStack.get(valueStackOffset + 3);
                    if (node.typeSpecNoPrefix != null) node.typeSpecNoPrefix.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    node.selectConstructName = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 5);
                    if (node.selectConstructName != null) node.selectConstructName.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 6);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleTypeGuardStmt1070(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTTypeGuardStmtNode node = new ASTTypeGuardStmtNode();
                    node.isDefault = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.isDefault != null) node.isDefault.setParent(node);
                    node.hiddenTDefault = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTDefault != null) node.hiddenTDefault.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleTypeGuardStmt1071(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTTypeGuardStmtNode node = new ASTTypeGuardStmtNode();
                    node.isDefault = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.isDefault != null) node.isDefault.setParent(node);
                    node.hiddenTDefault = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTDefault != null) node.hiddenTDefault.setParent(node);
                    node.selectConstructName = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.selectConstructName != null) node.selectConstructName.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleEndSelectTypeStmt1072(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTEndSelectTypeStmtNode node = new ASTEndSelectTypeStmtNode();
                    node.hiddenTEndselect = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.hiddenTEndselect != null) node.hiddenTEndselect.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleEndSelectTypeStmt1073(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTEndSelectTypeStmtNode node = new ASTEndSelectTypeStmtNode();
                    node.hiddenTEndselect = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.hiddenTEndselect != null) node.hiddenTEndselect.setParent(node);
                    node.selectConstructName = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.selectConstructName != null) node.selectConstructName.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleEndSelectTypeStmt1074(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTEndSelectTypeStmtNode node = new ASTEndSelectTypeStmtNode();
                    node.hiddenTEndbeforeselect = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.hiddenTEndbeforeselect != null) node.hiddenTEndbeforeselect.setParent(node);
                    node.hiddenTSelect = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTSelect != null) node.hiddenTSelect.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleEndSelectTypeStmt1075(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTEndSelectTypeStmtNode node = new ASTEndSelectTypeStmtNode();
                    node.hiddenTEndbeforeselect = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.hiddenTEndbeforeselect != null) node.hiddenTEndbeforeselect.setParent(node);
                    node.hiddenTSelect = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTSelect != null) node.hiddenTSelect.setParent(node);
                    node.selectConstructName = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.selectConstructName != null) node.selectConstructName.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleDoConstruct1076(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTDoConstructNode node = new ASTDoConstructNode();
                    node.labelDoStmt = (ASTLabelDoStmtNode)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("labelDoStmt");
                    if (node.labelDoStmt != null) node.labelDoStmt.setParent(node);
                    return node;

        }
        public Object handleBlockDoConstruct1077(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 3 and 4
                    Map<String, Object> node = new HashMap<String, Object>();
                    node.put("labelDoStmt", (ASTLabelDoStmtNode)valueStack.get(valueStackOffset + 0));
                    ASTListNode<IASTNode> embeddedList = new ASTListNode<IASTNode>();
                    embeddedList.add((IASTNode)(node.get("labelDoStmt")));
                    node.put("errorRecoveryList", embeddedList);
                    return node;

        }
        public Object handleLabelDoStmt1078(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTLabelDoStmtNode node = new ASTLabelDoStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTDo = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTDo != null) node.hiddenTDo.setParent(node);
                    ASTLblRefNode tmp2 = new ASTLblRefNode();
                    tmp2.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 2)).get("label");
                    if (tmp2.label != null) tmp2.label.setParent(tmp2);
                    node.lblRef = tmp2;
                    if (tmp2 != null) tmp2.setParent(node);
                    node.hiddenTComma = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 3)).get("hiddenTComma");
                    if (node.hiddenTComma != null) node.hiddenTComma.setParent(node);
                    node.loopControl = (ASTLoopControlNode)((Map<String, Object>)valueStack.get(valueStackOffset + 3)).get("loopControl");
                    if (node.loopControl != null) node.loopControl.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleLabelDoStmt1079(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTLabelDoStmtNode node = new ASTLabelDoStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTDo = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTDo != null) node.hiddenTDo.setParent(node);
                    ASTLblRefNode tmp2 = new ASTLblRefNode();
                    tmp2.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 2)).get("label");
                    if (tmp2.label != null) tmp2.label.setParent(tmp2);
                    node.lblRef = tmp2;
                    if (tmp2 != null) tmp2.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleLabelDoStmt1080(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTLabelDoStmtNode node = new ASTLabelDoStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTDo = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTDo != null) node.hiddenTDo.setParent(node);
                    node.hiddenTComma = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 2)).get("hiddenTComma");
                    if (node.hiddenTComma != null) node.hiddenTComma.setParent(node);
                    node.loopControl = (ASTLoopControlNode)((Map<String, Object>)valueStack.get(valueStackOffset + 2)).get("loopControl");
                    if (node.loopControl != null) node.loopControl.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleLabelDoStmt1081(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTLabelDoStmtNode node = new ASTLabelDoStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTDo = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTDo != null) node.hiddenTDo.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleLabelDoStmt1082(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTLabelDoStmtNode node = new ASTLabelDoStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.name = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("name");
                    if (node.name != null) node.name.setParent(node);
                    node.hiddenTColon = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTColon != null) node.hiddenTColon.setParent(node);
                    node.hiddenTDo = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTDo != null) node.hiddenTDo.setParent(node);
                    ASTLblRefNode tmp4 = new ASTLblRefNode();
                    tmp4.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 4)).get("label");
                    if (tmp4.label != null) tmp4.label.setParent(tmp4);
                    node.lblRef = tmp4;
                    if (tmp4 != null) tmp4.setParent(node);
                    node.hiddenTComma = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 5)).get("hiddenTComma");
                    if (node.hiddenTComma != null) node.hiddenTComma.setParent(node);
                    node.loopControl = (ASTLoopControlNode)((Map<String, Object>)valueStack.get(valueStackOffset + 5)).get("loopControl");
                    if (node.loopControl != null) node.loopControl.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 6);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleLabelDoStmt1083(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTLabelDoStmtNode node = new ASTLabelDoStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.name = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("name");
                    if (node.name != null) node.name.setParent(node);
                    node.hiddenTColon = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTColon != null) node.hiddenTColon.setParent(node);
                    node.hiddenTDo = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTDo != null) node.hiddenTDo.setParent(node);
                    ASTLblRefNode tmp4 = new ASTLblRefNode();
                    tmp4.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 4)).get("label");
                    if (tmp4.label != null) tmp4.label.setParent(tmp4);
                    node.lblRef = tmp4;
                    if (tmp4 != null) tmp4.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 5);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleLabelDoStmt1084(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTLabelDoStmtNode node = new ASTLabelDoStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.name = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("name");
                    if (node.name != null) node.name.setParent(node);
                    node.hiddenTColon = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTColon != null) node.hiddenTColon.setParent(node);
                    node.hiddenTDo = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTDo != null) node.hiddenTDo.setParent(node);
                    node.hiddenTComma = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 4)).get("hiddenTComma");
                    if (node.hiddenTComma != null) node.hiddenTComma.setParent(node);
                    node.loopControl = (ASTLoopControlNode)((Map<String, Object>)valueStack.get(valueStackOffset + 4)).get("loopControl");
                    if (node.loopControl != null) node.loopControl.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 5);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleLabelDoStmt1085(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTLabelDoStmtNode node = new ASTLabelDoStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.name = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("name");
                    if (node.name != null) node.name.setParent(node);
                    node.hiddenTColon = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTColon != null) node.hiddenTColon.setParent(node);
                    node.hiddenTDo = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTDo != null) node.hiddenTDo.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleCommaLoopControl1086(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 3 and 4
                    Map<String, Object> node = new HashMap<String, Object>();
                    node.put("hiddenTComma", (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0));
                    node.put("loopControl", (ASTLoopControlNode)valueStack.get(valueStackOffset + 1));
                    ASTListNode<IASTNode> embeddedList = new ASTListNode<IASTNode>();
                    embeddedList.add((IASTNode)(node.get("hiddenTComma")));
                    embeddedList.add((IASTNode)(node.get("loopControl")));
                    node.put("errorRecoveryList", embeddedList);
                    return node;

        }
        public Object handleCommaLoopControl1087(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 3 and 4
                    Map<String, Object> node = new HashMap<String, Object>();
                    node.put("loopControl", (ASTLoopControlNode)valueStack.get(valueStackOffset + 0));
                    ASTListNode<IASTNode> embeddedList = new ASTListNode<IASTNode>();
                    embeddedList.add((IASTNode)(node.get("hiddenTComma")));
                    embeddedList.add((IASTNode)(node.get("loopControl")));
                    node.put("errorRecoveryList", embeddedList);
                    return node;

        }
        public Object handleLoopControl1088(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTLoopControlNode node = new ASTLoopControlNode();
                    node.variableName = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("variableName");
                    if (node.variableName != null) node.variableName.setParent(node);
                    node.hiddenTEquals = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTEquals != null) node.hiddenTEquals.setParent(node);
                    node.lb = (IExpr)valueStack.get(valueStackOffset + 2);
                    if (node.lb != null) node.lb.setParent(node);
                    node.hiddenTComma = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTComma != null) node.hiddenTComma.setParent(node);
                    node.ub = (IExpr)valueStack.get(valueStackOffset + 4);
                    if (node.ub != null) node.ub.setParent(node);
                    return node;

        }
        public Object handleLoopControl1089(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTLoopControlNode node = new ASTLoopControlNode();
                    node.variableName = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("variableName");
                    if (node.variableName != null) node.variableName.setParent(node);
                    node.hiddenTEquals = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTEquals != null) node.hiddenTEquals.setParent(node);
                    node.lb = (IExpr)valueStack.get(valueStackOffset + 2);
                    if (node.lb != null) node.lb.setParent(node);
                    node.hiddenTComma = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTComma != null) node.hiddenTComma.setParent(node);
                    node.ub = (IExpr)valueStack.get(valueStackOffset + 4);
                    if (node.ub != null) node.ub.setParent(node);
                    node.hiddenTComma2 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 5);
                    if (node.hiddenTComma2 != null) node.hiddenTComma2.setParent(node);
                    node.step = (IExpr)valueStack.get(valueStackOffset + 6);
                    if (node.step != null) node.step.setParent(node);
                    return node;

        }
        public Object handleLoopControl1090(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTLoopControlNode node = new ASTLoopControlNode();
                    node.hiddenTWhile = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.hiddenTWhile != null) node.hiddenTWhile.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.whileExpr = (IExpr)valueStack.get(valueStackOffset + 2);
                    if (node.whileExpr != null) node.whileExpr.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    return node;

        }
        public Object handleEndDoStmt1091(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTEndDoStmtNode node = new ASTEndDoStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTEnddo = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTEnddo != null) node.hiddenTEnddo.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleEndDoStmt1092(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTEndDoStmtNode node = new ASTEndDoStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTEnddo = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTEnddo != null) node.hiddenTEnddo.setParent(node);
                    node.endName = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 2)).get("endName");
                    if (node.endName != null) node.endName.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleEndDoStmt1093(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTEndDoStmtNode node = new ASTEndDoStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTEnd = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTEnd != null) node.hiddenTEnd.setParent(node);
                    node.hiddenTDo = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTDo != null) node.hiddenTDo.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleEndDoStmt1094(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTEndDoStmtNode node = new ASTEndDoStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTEnd = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTEnd != null) node.hiddenTEnd.setParent(node);
                    node.hiddenTDo = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTDo != null) node.hiddenTDo.setParent(node);
                    node.endName = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 3)).get("endName");
                    if (node.endName != null) node.endName.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleCycleStmt1095(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTCycleStmtNode node = new ASTCycleStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTCycle = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTCycle != null) node.hiddenTCycle.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleCycleStmt1096(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTCycleStmtNode node = new ASTCycleStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTCycle = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTCycle != null) node.hiddenTCycle.setParent(node);
                    node.name = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 2)).get("name");
                    if (node.name != null) node.name.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleExitStmt1097(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTExitStmtNode node = new ASTExitStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTExit = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTExit != null) node.hiddenTExit.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleExitStmt1098(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTExitStmtNode node = new ASTExitStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTExit = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTExit != null) node.hiddenTExit.setParent(node);
                    node.name = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 2)).get("name");
                    if (node.name != null) node.name.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleGotoStmt1099(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTGotoStmtNode node = new ASTGotoStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTGoto = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("hiddenTGoto");
                    if (node.hiddenTGoto != null) node.hiddenTGoto.setParent(node);
                    node.hiddenTGo = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("hiddenTGo");
                    if (node.hiddenTGo != null) node.hiddenTGo.setParent(node);
                    node.hiddenTTo = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("hiddenTTo");
                    if (node.hiddenTTo != null) node.hiddenTTo.setParent(node);
                    ASTLblRefNode tmp2 = new ASTLblRefNode();
                    tmp2.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 2)).get("label");
                    if (tmp2.label != null) tmp2.label.setParent(tmp2);
                    node.gotoLblRef = tmp2;
                    if (tmp2 != null) tmp2.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleGoToKw1100(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 3 and 4
                    Map<String, Object> node = new HashMap<String, Object>();
                    node.put("hiddenTGoto", (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0));
                    ASTListNode<IASTNode> embeddedList = new ASTListNode<IASTNode>();
                    embeddedList.add((IASTNode)(node.get("hiddenTGoto")));
                    embeddedList.add((IASTNode)(node.get("hiddenTGo")));
                    embeddedList.add((IASTNode)(node.get("hiddenTTo")));
                    node.put("errorRecoveryList", embeddedList);
                    return node;

        }
        public Object handleGoToKw1101(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 3 and 4
                    Map<String, Object> node = new HashMap<String, Object>();
                    node.put("hiddenTGo", (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0));
                    node.put("hiddenTTo", (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1));
                    ASTListNode<IASTNode> embeddedList = new ASTListNode<IASTNode>();
                    embeddedList.add((IASTNode)(node.get("hiddenTGoto")));
                    embeddedList.add((IASTNode)(node.get("hiddenTGo")));
                    embeddedList.add((IASTNode)(node.get("hiddenTTo")));
                    node.put("errorRecoveryList", embeddedList);
                    return node;

        }
        public Object handleComputedGotoStmt1102(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTComputedGotoStmtNode node = new ASTComputedGotoStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTGoto = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("hiddenTGoto");
                    if (node.hiddenTGoto != null) node.hiddenTGoto.setParent(node);
                    node.hiddenTGo = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("hiddenTGo");
                    if (node.hiddenTGo != null) node.hiddenTGo.setParent(node);
                    node.hiddenTTo = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("hiddenTTo");
                    if (node.hiddenTTo != null) node.hiddenTTo.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.lblRefList = (IASTListNode<ASTLblRefListNode>)valueStack.get(valueStackOffset + 3);
                    if (node.lblRefList != null) node.lblRefList.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    node.expr = (IExpr)valueStack.get(valueStackOffset + 5);
                    if (node.expr != null) node.expr.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 6);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleComputedGotoStmt1103(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTComputedGotoStmtNode node = new ASTComputedGotoStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTGoto = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("hiddenTGoto");
                    if (node.hiddenTGoto != null) node.hiddenTGoto.setParent(node);
                    node.hiddenTGo = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("hiddenTGo");
                    if (node.hiddenTGo != null) node.hiddenTGo.setParent(node);
                    node.hiddenTTo = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("hiddenTTo");
                    if (node.hiddenTTo != null) node.hiddenTTo.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.lblRefList = (IASTListNode<ASTLblRefListNode>)valueStack.get(valueStackOffset + 3);
                    if (node.lblRefList != null) node.lblRefList.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    node.hiddenTComma = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 5)).get("hiddenTComma");
                    if (node.hiddenTComma != null) node.hiddenTComma.setParent(node);
                    node.expr = (IExpr)((Map<String, Object>)valueStack.get(valueStackOffset + 5)).get("expr");
                    if (node.expr != null) node.expr.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 6);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleCommaExp1104(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 3 and 4
                    Map<String, Object> node = new HashMap<String, Object>();
                    node.put("hiddenTComma", (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0));
                    node.put("expr", (IExpr)valueStack.get(valueStackOffset + 1));
                    ASTListNode<IASTNode> embeddedList = new ASTListNode<IASTNode>();
                    embeddedList.add((IASTNode)(node.get("hiddenTComma")));
                    embeddedList.add((IASTNode)(node.get("expr")));
                    node.put("errorRecoveryList", embeddedList);
                    return node;

        }
        public Object handleLblRefList1105(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 10
                    ASTLblRefListNode node = new ASTLblRefListNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    ASTListNode<ASTLblRefListNode> list = new ASTListNode<ASTLblRefListNode>();
                    list.add(node);
                    node.setParent(list);
                    return list;

        }
        public Object handleLblRefList1106(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 11
                    ASTLblRefListNode node = new ASTLblRefListNode();
                    node.hiddenTComma = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTComma != null) node.hiddenTComma.setParent(node);
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 2)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    ASTListNode<ASTLblRefListNode> list = (ASTListNode<ASTLblRefListNode>)valueStack.get(valueStackOffset);
                    list.add(node);
                    node.setParent(list);
                    return list;

        }
        public Object handleLblRef1107(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 3 and 4
                    Map<String, Object> node = new HashMap<String, Object>();
                    node.put("label", (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label"));
                    ASTListNode<IASTNode> embeddedList = new ASTListNode<IASTNode>();
                    embeddedList.add((IASTNode)(node.get("label")));
                    node.put("errorRecoveryList", embeddedList);
                    return node;

        }
        public Object handleArithmeticIfStmt1108(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTArithmeticIfStmtNode node = new ASTArithmeticIfStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTIf = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTIf != null) node.hiddenTIf.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.expr = (IExpr)valueStack.get(valueStackOffset + 3);
                    if (node.expr != null) node.expr.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    ASTLblRefNode tmp5 = new ASTLblRefNode();
                    tmp5.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 5)).get("label");
                    if (tmp5.label != null) tmp5.label.setParent(tmp5);
                    node.first = tmp5;
                    if (tmp5 != null) tmp5.setParent(node);
                    node.hiddenTComma = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 6);
                    if (node.hiddenTComma != null) node.hiddenTComma.setParent(node);
                    ASTLblRefNode tmp7 = new ASTLblRefNode();
                    tmp7.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 7)).get("label");
                    if (tmp7.label != null) tmp7.label.setParent(tmp7);
                    node.second = tmp7;
                    if (tmp7 != null) tmp7.setParent(node);
                    node.hiddenTComma2 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 8);
                    if (node.hiddenTComma2 != null) node.hiddenTComma2.setParent(node);
                    ASTLblRefNode tmp9 = new ASTLblRefNode();
                    tmp9.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 9)).get("label");
                    if (tmp9.label != null) tmp9.label.setParent(tmp9);
                    node.third = tmp9;
                    if (tmp9 != null) tmp9.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 10);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleContinueStmt1109(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTContinueStmtNode node = new ASTContinueStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTContinue = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTContinue != null) node.hiddenTContinue.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleStopStmt1110(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTStopStmtNode node = new ASTStopStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTStop = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTStop != null) node.hiddenTStop.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleStopStmt1111(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTStopStmtNode node = new ASTStopStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTStop = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTStop != null) node.hiddenTStop.setParent(node);
                    node.intConst = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.intConst != null) node.intConst.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleStopStmt1112(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTStopStmtNode node = new ASTStopStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTStop = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTStop != null) node.hiddenTStop.setParent(node);
                    node.stringConst = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.stringConst != null) node.stringConst.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleStopStmt1113(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTStopStmtNode node = new ASTStopStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTStop = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTStop != null) node.hiddenTStop.setParent(node);
                    node.paramVar = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.paramVar != null) node.paramVar.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleAllStopStmt1114(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTAllStopStmtNode node = new ASTAllStopStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTAll = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTAll != null) node.hiddenTAll.setParent(node);
                    node.hiddenTStop = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTStop != null) node.hiddenTStop.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleAllStopStmt1115(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTAllStopStmtNode node = new ASTAllStopStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTAll = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTAll != null) node.hiddenTAll.setParent(node);
                    node.hiddenTStop = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTStop != null) node.hiddenTStop.setParent(node);
                    node.intConst = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.intConst != null) node.intConst.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleAllStopStmt1116(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTAllStopStmtNode node = new ASTAllStopStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTAll = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTAll != null) node.hiddenTAll.setParent(node);
                    node.hiddenTStop = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTStop != null) node.hiddenTStop.setParent(node);
                    node.stringConst = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.stringConst != null) node.stringConst.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleAllStopStmt1117(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTAllStopStmtNode node = new ASTAllStopStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTAll = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTAll != null) node.hiddenTAll.setParent(node);
                    node.hiddenTStop = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTStop != null) node.hiddenTStop.setParent(node);
                    node.paramVar = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.paramVar != null) node.paramVar.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleAllStopStmt1118(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTAllStopStmtNode node = new ASTAllStopStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTAllstop = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTAllstop != null) node.hiddenTAllstop.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleAllStopStmt1119(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTAllStopStmtNode node = new ASTAllStopStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTAllstop = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTAllstop != null) node.hiddenTAllstop.setParent(node);
                    node.intConst = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.intConst != null) node.intConst.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleAllStopStmt1120(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTAllStopStmtNode node = new ASTAllStopStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTAllstop = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTAllstop != null) node.hiddenTAllstop.setParent(node);
                    node.stringConst = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.stringConst != null) node.stringConst.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleAllStopStmt1121(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTAllStopStmtNode node = new ASTAllStopStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTAllstop = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTAllstop != null) node.hiddenTAllstop.setParent(node);
                    node.paramVar = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.paramVar != null) node.paramVar.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleSyncAllStmt1122(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTSyncAllStmtNode node = new ASTSyncAllStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTSync = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTSync != null) node.hiddenTSync.setParent(node);
                    node.hiddenTAll = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTAll != null) node.hiddenTAll.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.syncStatList = (IASTListNode<ASTSyncStatNode>)valueStack.get(valueStackOffset + 4);
                    if (node.syncStatList != null) node.syncStatList.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 5);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 6);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleSyncAllStmt1123(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTSyncAllStmtNode node = new ASTSyncAllStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTSync = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTSync != null) node.hiddenTSync.setParent(node);
                    node.hiddenTAll = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTAll != null) node.hiddenTAll.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleSyncAllStmt1124(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTSyncAllStmtNode node = new ASTSyncAllStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTSyncall = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTSyncall != null) node.hiddenTSyncall.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.syncStatList = (IASTListNode<ASTSyncStatNode>)valueStack.get(valueStackOffset + 3);
                    if (node.syncStatList != null) node.syncStatList.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 5);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleSyncAllStmt1125(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTSyncAllStmtNode node = new ASTSyncAllStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTSyncall = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTSyncall != null) node.hiddenTSyncall.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleSyncStatList1126(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 7 with separator
                    ASTSeparatedListNode<ASTSyncStatNode> list = new ASTSeparatedListNode<ASTSyncStatNode>();
                    ASTSyncStatNode elt = (ASTSyncStatNode)valueStack.get(valueStackOffset + 0);
                    list.add(null, elt);
                    if (elt != null) elt.setParent(list);
                    return list;

        }
        public Object handleSyncStatList1127(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 8 with separator
                    ASTSeparatedListNode<ASTSyncStatNode> list = (ASTSeparatedListNode<ASTSyncStatNode>)valueStack.get(valueStackOffset);
                    org.eclipse.photran.internal.core.lexer.Token token = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    ASTSyncStatNode elt = (ASTSyncStatNode)valueStack.get(valueStackOffset + 2);
                    list.add(token, elt);
                    token.setParent(list);
                    if (elt != null) elt.setParent(list);
                    return list;

        }
        public Object handleSyncStat1128(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTSyncStatNode node = new ASTSyncStatNode();
                    ASTNameNode tmp0 = new ASTNameNode();
                    tmp0.name = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("name");
                    if (tmp0.name != null) tmp0.name.setParent(tmp0);
                    node.name = tmp0;
                    if (tmp0 != null) tmp0.setParent(node);
                    node.hiddenTEquals = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTEquals != null) node.hiddenTEquals.setParent(node);
                    node.expr = (IExpr)valueStack.get(valueStackOffset + 2);
                    if (node.expr != null) node.expr.setParent(node);
                    return node;

        }
        public Object handleSyncImagesStmt1129(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTSyncImagesStmtNode node = new ASTSyncImagesStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTSync = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTSync != null) node.hiddenTSync.setParent(node);
                    node.hiddenTImages = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTImages != null) node.hiddenTImages.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.imageSet = (ASTImageSetNode)valueStack.get(valueStackOffset + 4);
                    if (node.imageSet != null) node.imageSet.setParent(node);
                    node.hiddenTComma = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 5);
                    if (node.hiddenTComma != null) node.hiddenTComma.setParent(node);
                    node.syncStatList = (IASTListNode<ASTSyncStatNode>)valueStack.get(valueStackOffset + 6);
                    if (node.syncStatList != null) node.syncStatList.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 7);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 8);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleSyncImagesStmt1130(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTSyncImagesStmtNode node = new ASTSyncImagesStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTSync = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTSync != null) node.hiddenTSync.setParent(node);
                    node.hiddenTImages = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTImages != null) node.hiddenTImages.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.imageSet = (ASTImageSetNode)valueStack.get(valueStackOffset + 4);
                    if (node.imageSet != null) node.imageSet.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 5);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 6);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleSyncImagesStmt1131(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTSyncImagesStmtNode node = new ASTSyncImagesStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTSyncimages = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTSyncimages != null) node.hiddenTSyncimages.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.imageSet = (ASTImageSetNode)valueStack.get(valueStackOffset + 3);
                    if (node.imageSet != null) node.imageSet.setParent(node);
                    node.hiddenTComma = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenTComma != null) node.hiddenTComma.setParent(node);
                    node.syncStatList = (IASTListNode<ASTSyncStatNode>)valueStack.get(valueStackOffset + 5);
                    if (node.syncStatList != null) node.syncStatList.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 6);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 7);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleSyncImagesStmt1132(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTSyncImagesStmtNode node = new ASTSyncImagesStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTSyncimages = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTSyncimages != null) node.hiddenTSyncimages.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.imageSet = (ASTImageSetNode)valueStack.get(valueStackOffset + 3);
                    if (node.imageSet != null) node.imageSet.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 5);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleImageSet1133(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTImageSetNode node = new ASTImageSetNode();
                    node.isExpr = (IExpr)valueStack.get(valueStackOffset + 0);
                    if (node.isExpr != null) node.isExpr.setParent(node);
                    return node;

        }
        public Object handleImageSet1134(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTImageSetNode node = new ASTImageSetNode();
                    node.isStar = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.isStar != null) node.isStar.setParent(node);
                    return node;

        }
        public Object handleSyncMemoryStmt1135(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTSyncMemoryStmtNode node = new ASTSyncMemoryStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTSync = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTSync != null) node.hiddenTSync.setParent(node);
                    node.hiddenTMemory = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTMemory != null) node.hiddenTMemory.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.syncStatList = (IASTListNode<ASTSyncStatNode>)valueStack.get(valueStackOffset + 4);
                    if (node.syncStatList != null) node.syncStatList.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 5);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 6);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleSyncMemoryStmt1136(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTSyncMemoryStmtNode node = new ASTSyncMemoryStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTSync = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTSync != null) node.hiddenTSync.setParent(node);
                    node.hiddenTMemory = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTMemory != null) node.hiddenTMemory.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleSyncMemoryStmt1137(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTSyncMemoryStmtNode node = new ASTSyncMemoryStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTSyncmemory = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTSyncmemory != null) node.hiddenTSyncmemory.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.syncStatList = (IASTListNode<ASTSyncStatNode>)valueStack.get(valueStackOffset + 3);
                    if (node.syncStatList != null) node.syncStatList.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 5);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleSyncMemoryStmt1138(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTSyncMemoryStmtNode node = new ASTSyncMemoryStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTSyncmemory = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTSyncmemory != null) node.hiddenTSyncmemory.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleLockStmt1139(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTLockStmtNode node = new ASTLockStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTLock = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTLock != null) node.hiddenTLock.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    ASTNameNode tmp3 = new ASTNameNode();
                    tmp3.name = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 3)).get("name");
                    if (tmp3.name != null) tmp3.name.setParent(tmp3);
                    node.lockVariable = tmp3;
                    if (tmp3 != null) tmp3.setParent(node);
                    node.hiddenTComma = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenTComma != null) node.hiddenTComma.setParent(node);
                    node.syncStatList = (IASTListNode<ASTSyncStatNode>)valueStack.get(valueStackOffset + 5);
                    if (node.syncStatList != null) node.syncStatList.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 6);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 7);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleLockStmt1140(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTLockStmtNode node = new ASTLockStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTLock = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTLock != null) node.hiddenTLock.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    ASTNameNode tmp3 = new ASTNameNode();
                    tmp3.name = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 3)).get("name");
                    if (tmp3.name != null) tmp3.name.setParent(tmp3);
                    node.lockVariable = tmp3;
                    if (tmp3 != null) tmp3.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 5);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleUnlockStmt1141(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTUnlockStmtNode node = new ASTUnlockStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTUnlock = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTUnlock != null) node.hiddenTUnlock.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    ASTNameNode tmp3 = new ASTNameNode();
                    tmp3.name = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 3)).get("name");
                    if (tmp3.name != null) tmp3.name.setParent(tmp3);
                    node.lockVariable = tmp3;
                    if (tmp3 != null) tmp3.setParent(node);
                    node.hiddenTComma = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenTComma != null) node.hiddenTComma.setParent(node);
                    node.syncStatList = (IASTListNode<ASTSyncStatNode>)valueStack.get(valueStackOffset + 5);
                    if (node.syncStatList != null) node.syncStatList.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 6);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 7);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleUnlockStmt1142(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTUnlockStmtNode node = new ASTUnlockStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTUnlock = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTUnlock != null) node.hiddenTUnlock.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    ASTNameNode tmp3 = new ASTNameNode();
                    tmp3.name = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 3)).get("name");
                    if (tmp3.name != null) tmp3.name.setParent(tmp3);
                    node.lockVariable = tmp3;
                    if (tmp3 != null) tmp3.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 5);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleUnitIdentifier1143(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTUnitIdentifierNode node = new ASTUnitIdentifierNode();
                    node.expression = (ASTUFExprNode)valueStack.get(valueStackOffset + 0);
                    if (node.expression != null) node.expression.setParent(node);
                    return node;

        }
        public Object handleUnitIdentifier1144(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTUnitIdentifierNode node = new ASTUnitIdentifierNode();
                    node.hasAsterisk = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.hasAsterisk != null) node.hasAsterisk.setParent(node);
                    return node;

        }
        public Object handleOpenStmt1145(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTOpenStmtNode node = new ASTOpenStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTOpen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTOpen != null) node.hiddenTOpen.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.connectSpecList = (IASTListNode<ASTConnectSpecNode>)valueStack.get(valueStackOffset + 3);
                    if (node.connectSpecList != null) node.connectSpecList.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 5);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleConnectSpecList1146(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 7 with separator
                    ASTSeparatedListNode<ASTConnectSpecNode> list = new ASTSeparatedListNode<ASTConnectSpecNode>();
                    ASTConnectSpecNode elt = (ASTConnectSpecNode)valueStack.get(valueStackOffset + 0);
                    list.add(null, elt);
                    if (elt != null) elt.setParent(list);
                    return list;

        }
        public Object handleConnectSpecList1147(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 8 with separator
                    ASTSeparatedListNode<ASTConnectSpecNode> list = (ASTSeparatedListNode<ASTConnectSpecNode>)valueStack.get(valueStackOffset);
                    org.eclipse.photran.internal.core.lexer.Token token = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    ASTConnectSpecNode elt = (ASTConnectSpecNode)valueStack.get(valueStackOffset + 2);
                    list.add(token, elt);
                    token.setParent(list);
                    if (elt != null) elt.setParent(list);
                    return list;

        }
        public Object handleConnectSpec1148(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTConnectSpecNode node = new ASTConnectSpecNode();
                    node.filename = (ASTUnitIdentifierNode)valueStack.get(valueStackOffset + 0);
                    if (node.filename != null) node.filename.setParent(node);
                    return node;

        }
        public Object handleConnectSpec1149(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTConnectSpecNode node = new ASTConnectSpecNode();
                    node.hiddenTUniteq = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.hiddenTUniteq != null) node.hiddenTUniteq.setParent(node);
                    node.unitIdentifier = (ASTUnitIdentifierNode)valueStack.get(valueStackOffset + 1);
                    if (node.unitIdentifier != null) node.unitIdentifier.setParent(node);
                    return node;

        }
        public Object handleConnectSpec1150(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTConnectSpecNode node = new ASTConnectSpecNode();
                    node.hiddenTErreq = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.hiddenTErreq != null) node.hiddenTErreq.setParent(node);
                    ASTLblRefNode tmp1 = new ASTLblRefNode();
                    tmp1.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("label");
                    if (tmp1.label != null) tmp1.label.setParent(tmp1);
                    node.errLbl = tmp1;
                    if (tmp1 != null) tmp1.setParent(node);
                    return node;

        }
        public Object handleConnectSpec1151(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTConnectSpecNode node = new ASTConnectSpecNode();
                    node.hiddenTFileeq = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.hiddenTFileeq != null) node.hiddenTFileeq.setParent(node);
                    node.fileExpr = (ASTCExprNode)valueStack.get(valueStackOffset + 1);
                    if (node.fileExpr != null) node.fileExpr.setParent(node);
                    return node;

        }
        public Object handleConnectSpec1152(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTConnectSpecNode node = new ASTConnectSpecNode();
                    node.hiddenTStatuseq = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.hiddenTStatuseq != null) node.hiddenTStatuseq.setParent(node);
                    node.statusExpr = (ASTCExprNode)valueStack.get(valueStackOffset + 1);
                    if (node.statusExpr != null) node.statusExpr.setParent(node);
                    return node;

        }
        public Object handleConnectSpec1153(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTConnectSpecNode node = new ASTConnectSpecNode();
                    node.hiddenTAccesseq = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.hiddenTAccesseq != null) node.hiddenTAccesseq.setParent(node);
                    node.accessExpr = (ASTCExprNode)valueStack.get(valueStackOffset + 1);
                    if (node.accessExpr != null) node.accessExpr.setParent(node);
                    return node;

        }
        public Object handleConnectSpec1154(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTConnectSpecNode node = new ASTConnectSpecNode();
                    node.hiddenTFormeq = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.hiddenTFormeq != null) node.hiddenTFormeq.setParent(node);
                    node.formExpr = (ASTCExprNode)valueStack.get(valueStackOffset + 1);
                    if (node.formExpr != null) node.formExpr.setParent(node);
                    return node;

        }
        public Object handleConnectSpec1155(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTConnectSpecNode node = new ASTConnectSpecNode();
                    node.hiddenTRecleq = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.hiddenTRecleq != null) node.hiddenTRecleq.setParent(node);
                    node.reclExpr = (IExpr)valueStack.get(valueStackOffset + 1);
                    if (node.reclExpr != null) node.reclExpr.setParent(node);
                    return node;

        }
        public Object handleConnectSpec1156(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTConnectSpecNode node = new ASTConnectSpecNode();
                    node.hiddenTBlankeq = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.hiddenTBlankeq != null) node.hiddenTBlankeq.setParent(node);
                    node.blankExpr = (ASTCExprNode)valueStack.get(valueStackOffset + 1);
                    if (node.blankExpr != null) node.blankExpr.setParent(node);
                    return node;

        }
        public Object handleConnectSpec1157(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTConnectSpecNode node = new ASTConnectSpecNode();
                    node.hiddenTIostateq = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.hiddenTIostateq != null) node.hiddenTIostateq.setParent(node);
                    node.ioStatVar = (ASTScalarVariableNode)valueStack.get(valueStackOffset + 1);
                    if (node.ioStatVar != null) node.ioStatVar.setParent(node);
                    return node;

        }
        public Object handleConnectSpec1158(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTConnectSpecNode node = new ASTConnectSpecNode();
                    node.hiddenTPositioneq = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.hiddenTPositioneq != null) node.hiddenTPositioneq.setParent(node);
                    node.positionExpr = (ASTCExprNode)valueStack.get(valueStackOffset + 1);
                    if (node.positionExpr != null) node.positionExpr.setParent(node);
                    return node;

        }
        public Object handleConnectSpec1159(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTConnectSpecNode node = new ASTConnectSpecNode();
                    node.hiddenTActioneq = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.hiddenTActioneq != null) node.hiddenTActioneq.setParent(node);
                    node.actionExpr = (ASTCExprNode)valueStack.get(valueStackOffset + 1);
                    if (node.actionExpr != null) node.actionExpr.setParent(node);
                    return node;

        }
        public Object handleConnectSpec1160(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTConnectSpecNode node = new ASTConnectSpecNode();
                    node.hiddenTDelimeq = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.hiddenTDelimeq != null) node.hiddenTDelimeq.setParent(node);
                    node.delimExpr = (ASTCExprNode)valueStack.get(valueStackOffset + 1);
                    if (node.delimExpr != null) node.delimExpr.setParent(node);
                    return node;

        }
        public Object handleConnectSpec1161(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTConnectSpecNode node = new ASTConnectSpecNode();
                    node.hiddenTPadeq = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.hiddenTPadeq != null) node.hiddenTPadeq.setParent(node);
                    node.padExpr = (ASTCExprNode)valueStack.get(valueStackOffset + 1);
                    if (node.padExpr != null) node.padExpr.setParent(node);
                    return node;

        }
        public Object handleConnectSpec1162(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTConnectSpecNode node = new ASTConnectSpecNode();
                    node.hiddenTAsynchronouseq = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.hiddenTAsynchronouseq != null) node.hiddenTAsynchronouseq.setParent(node);
                    node.asyncExpr = (ASTCExprNode)valueStack.get(valueStackOffset + 1);
                    if (node.asyncExpr != null) node.asyncExpr.setParent(node);
                    return node;

        }
        public Object handleConnectSpec1163(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTConnectSpecNode node = new ASTConnectSpecNode();
                    node.hiddenTDecimaleq = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.hiddenTDecimaleq != null) node.hiddenTDecimaleq.setParent(node);
                    node.decimalExpr = (ASTCExprNode)valueStack.get(valueStackOffset + 1);
                    if (node.decimalExpr != null) node.decimalExpr.setParent(node);
                    return node;

        }
        public Object handleConnectSpec1164(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTConnectSpecNode node = new ASTConnectSpecNode();
                    node.hiddenTEncodingeq = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.hiddenTEncodingeq != null) node.hiddenTEncodingeq.setParent(node);
                    node.encodingExpr = (ASTCExprNode)valueStack.get(valueStackOffset + 1);
                    if (node.encodingExpr != null) node.encodingExpr.setParent(node);
                    return node;

        }
        public Object handleConnectSpec1165(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTConnectSpecNode node = new ASTConnectSpecNode();
                    node.hiddenTIomsgeq = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.hiddenTIomsgeq != null) node.hiddenTIomsgeq.setParent(node);
                    node.iomsgExpr = (ASTScalarVariableNode)valueStack.get(valueStackOffset + 1);
                    if (node.iomsgExpr != null) node.iomsgExpr.setParent(node);
                    return node;

        }
        public Object handleConnectSpec1166(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTConnectSpecNode node = new ASTConnectSpecNode();
                    node.hiddenTRoundeq = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.hiddenTRoundeq != null) node.hiddenTRoundeq.setParent(node);
                    node.roundExpr = (ASTCExprNode)valueStack.get(valueStackOffset + 1);
                    if (node.roundExpr != null) node.roundExpr.setParent(node);
                    return node;

        }
        public Object handleConnectSpec1167(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTConnectSpecNode node = new ASTConnectSpecNode();
                    node.hiddenTSigneq = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.hiddenTSigneq != null) node.hiddenTSigneq.setParent(node);
                    node.signExpr = (ASTCExprNode)valueStack.get(valueStackOffset + 1);
                    if (node.signExpr != null) node.signExpr.setParent(node);
                    return node;

        }
        public Object handleConnectSpec1168(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTConnectSpecNode node = new ASTConnectSpecNode();
                    node.hiddenTConverteq = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.hiddenTConverteq != null) node.hiddenTConverteq.setParent(node);
                    node.convertExpr = (ASTCExprNode)valueStack.get(valueStackOffset + 1);
                    if (node.convertExpr != null) node.convertExpr.setParent(node);
                    return node;

        }
        public Object handleCloseStmt1169(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTCloseStmtNode node = new ASTCloseStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTClose = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTClose != null) node.hiddenTClose.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.closeSpecList = (IASTListNode<ASTCloseSpecListNode>)valueStack.get(valueStackOffset + 3);
                    if (node.closeSpecList != null) node.closeSpecList.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 5);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleCloseSpecList1170(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 10
                    ASTCloseSpecListNode node = new ASTCloseSpecListNode();
                    node.unitIdentifier = (ASTUnitIdentifierNode)valueStack.get(valueStackOffset + 0);
                    if (node.unitIdentifier != null) node.unitIdentifier.setParent(node);
                    ASTListNode<ASTCloseSpecListNode> list = new ASTListNode<ASTCloseSpecListNode>();
                    list.add(node);
                    node.setParent(list);
                    return list;

        }
        public Object handleCloseSpecList1171(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 10
                    ASTCloseSpecListNode node = new ASTCloseSpecListNode();
                    node.closeSpec = (ASTCloseSpecNode)valueStack.get(valueStackOffset + 0);
                    if (node.closeSpec != null) node.closeSpec.setParent(node);
                    ASTListNode<ASTCloseSpecListNode> list = new ASTListNode<ASTCloseSpecListNode>();
                    list.add(node);
                    node.setParent(list);
                    return list;

        }
        public Object handleCloseSpecList1172(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 11
                    ASTCloseSpecListNode node = new ASTCloseSpecListNode();
                    node.hiddenTComma = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTComma != null) node.hiddenTComma.setParent(node);
                    node.closeSpec = (ASTCloseSpecNode)valueStack.get(valueStackOffset + 2);
                    if (node.closeSpec != null) node.closeSpec.setParent(node);
                    ASTListNode<ASTCloseSpecListNode> list = (ASTListNode<ASTCloseSpecListNode>)valueStack.get(valueStackOffset);
                    list.add(node);
                    node.setParent(list);
                    return list;

        }
        public Object handleCloseSpec1173(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTCloseSpecNode node = new ASTCloseSpecNode();
                    node.hiddenTUniteq = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.hiddenTUniteq != null) node.hiddenTUniteq.setParent(node);
                    node.unitIdentifier = (ASTUnitIdentifierNode)valueStack.get(valueStackOffset + 1);
                    if (node.unitIdentifier != null) node.unitIdentifier.setParent(node);
                    return node;

        }
        public Object handleCloseSpec1174(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTCloseSpecNode node = new ASTCloseSpecNode();
                    node.hiddenTErreq = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.hiddenTErreq != null) node.hiddenTErreq.setParent(node);
                    ASTLblRefNode tmp1 = new ASTLblRefNode();
                    tmp1.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("label");
                    if (tmp1.label != null) tmp1.label.setParent(tmp1);
                    node.errLbl = tmp1;
                    if (tmp1 != null) tmp1.setParent(node);
                    return node;

        }
        public Object handleCloseSpec1175(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTCloseSpecNode node = new ASTCloseSpecNode();
                    node.hiddenTStatuseq = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.hiddenTStatuseq != null) node.hiddenTStatuseq.setParent(node);
                    node.statusExpr = (ASTCExprNode)valueStack.get(valueStackOffset + 1);
                    if (node.statusExpr != null) node.statusExpr.setParent(node);
                    return node;

        }
        public Object handleCloseSpec1176(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTCloseSpecNode node = new ASTCloseSpecNode();
                    node.hiddenTIostateq = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.hiddenTIostateq != null) node.hiddenTIostateq.setParent(node);
                    node.ioStatVar = (ASTScalarVariableNode)valueStack.get(valueStackOffset + 1);
                    if (node.ioStatVar != null) node.ioStatVar.setParent(node);
                    return node;

        }
        public Object handleCloseSpec1177(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTCloseSpecNode node = new ASTCloseSpecNode();
                    node.hiddenTIomsgeq = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.hiddenTIomsgeq != null) node.hiddenTIomsgeq.setParent(node);
                    node.ioMsgVar = (ASTScalarVariableNode)valueStack.get(valueStackOffset + 1);
                    if (node.ioMsgVar != null) node.ioMsgVar.setParent(node);
                    return node;

        }
        public Object handleReadStmt1178(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTReadStmtNode node = new ASTReadStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTRead = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTRead != null) node.hiddenTRead.setParent(node);
                    node.rdCtlSpec = (ASTRdCtlSpecNode)valueStack.get(valueStackOffset + 2);
                    if (node.rdCtlSpec != null) node.rdCtlSpec.setParent(node);
                    node.hiddenTComma = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTComma != null) node.hiddenTComma.setParent(node);
                    node.inputItemList = (IASTListNode<IInputItem>)valueStack.get(valueStackOffset + 4);
                    if (node.inputItemList != null) node.inputItemList.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 5);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleReadStmt1179(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTReadStmtNode node = new ASTReadStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTRead = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTRead != null) node.hiddenTRead.setParent(node);
                    node.rdCtlSpec = (ASTRdCtlSpecNode)valueStack.get(valueStackOffset + 2);
                    if (node.rdCtlSpec != null) node.rdCtlSpec.setParent(node);
                    node.inputItemList = (IASTListNode<IInputItem>)valueStack.get(valueStackOffset + 3);
                    if (node.inputItemList != null) node.inputItemList.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleReadStmt1180(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTReadStmtNode node = new ASTReadStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTRead = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTRead != null) node.hiddenTRead.setParent(node);
                    node.rdCtlSpec = (ASTRdCtlSpecNode)valueStack.get(valueStackOffset + 2);
                    if (node.rdCtlSpec != null) node.rdCtlSpec.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleReadStmt1181(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTReadStmtNode node = new ASTReadStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTRead = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTRead != null) node.hiddenTRead.setParent(node);
                    node.rdFmtId = (ASTRdFmtIdNode)valueStack.get(valueStackOffset + 2);
                    if (node.rdFmtId != null) node.rdFmtId.setParent(node);
                    node.hiddenTComma = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTComma != null) node.hiddenTComma.setParent(node);
                    node.inputItemList = (IASTListNode<IInputItem>)valueStack.get(valueStackOffset + 4);
                    if (node.inputItemList != null) node.inputItemList.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 5);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleReadStmt1182(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTReadStmtNode node = new ASTReadStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTRead = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTRead != null) node.hiddenTRead.setParent(node);
                    node.rdFmtId = (ASTRdFmtIdNode)valueStack.get(valueStackOffset + 2);
                    if (node.rdFmtId != null) node.rdFmtId.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleRdCtlSpec1183(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTRdCtlSpecNode node = new ASTRdCtlSpecNode();
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("hiddenTLparen");
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.readUnitExpr = (ASTUFExprNode)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("readUnitExpr");
                    if (node.readUnitExpr != null) node.readUnitExpr.setParent(node);
                    node.readUnitIsAsterisk = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("readUnitIsAsterisk");
                    if (node.readUnitIsAsterisk != null) node.readUnitIsAsterisk.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("hiddenTRparen");
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    return node;

        }
        public Object handleRdCtlSpec1184(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTRdCtlSpecNode node = new ASTRdCtlSpecNode();
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.rdIoCtlSpecList = (IASTListNode<ASTRdIoCtlSpecListNode>)valueStack.get(valueStackOffset + 1);
                    if (node.rdIoCtlSpecList != null) node.rdIoCtlSpecList.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    return node;

        }
        public Object handleRdUnitId1185(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 3 and 4
                    Map<String, Object> node = new HashMap<String, Object>();
                    node.put("hiddenTLparen", (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0));
                    node.put("readUnitExpr", (ASTUFExprNode)valueStack.get(valueStackOffset + 1));
                    node.put("hiddenTRparen", (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2));
                    ASTListNode<IASTNode> embeddedList = new ASTListNode<IASTNode>();
                    embeddedList.add((IASTNode)(node.get("hiddenTLparen")));
                    embeddedList.add((IASTNode)(node.get("readUnitExpr")));
                    embeddedList.add((IASTNode)(node.get("readUnitIsAsterisk")));
                    embeddedList.add((IASTNode)(node.get("hiddenTRparen")));
                    node.put("errorRecoveryList", embeddedList);
                    return node;

        }
        public Object handleRdUnitId1186(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 3 and 4
                    Map<String, Object> node = new HashMap<String, Object>();
                    node.put("hiddenTLparen", (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0));
                    node.put("readUnitIsAsterisk", (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1));
                    node.put("hiddenTRparen", (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2));
                    ASTListNode<IASTNode> embeddedList = new ASTListNode<IASTNode>();
                    embeddedList.add((IASTNode)(node.get("hiddenTLparen")));
                    embeddedList.add((IASTNode)(node.get("readUnitExpr")));
                    embeddedList.add((IASTNode)(node.get("readUnitIsAsterisk")));
                    embeddedList.add((IASTNode)(node.get("hiddenTRparen")));
                    node.put("errorRecoveryList", embeddedList);
                    return node;

        }
        public Object handleRdIoCtlSpecList1187(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 10
                    ASTRdIoCtlSpecListNode node = new ASTRdIoCtlSpecListNode();
                    node.unitIdentifier = (ASTUnitIdentifierNode)valueStack.get(valueStackOffset + 0);
                    if (node.unitIdentifier != null) node.unitIdentifier.setParent(node);
                    node.hiddenTComma = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTComma != null) node.hiddenTComma.setParent(node);
                    node.ioControlSpec = (ASTIoControlSpecNode)valueStack.get(valueStackOffset + 2);
                    if (node.ioControlSpec != null) node.ioControlSpec.setParent(node);
                    ASTListNode<ASTRdIoCtlSpecListNode> list = new ASTListNode<ASTRdIoCtlSpecListNode>();
                    list.add(node);
                    node.setParent(list);
                    return list;

        }
        public Object handleRdIoCtlSpecList1188(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 10
                    ASTRdIoCtlSpecListNode node = new ASTRdIoCtlSpecListNode();
                    node.unitIdentifier = (ASTUnitIdentifierNode)valueStack.get(valueStackOffset + 0);
                    if (node.unitIdentifier != null) node.unitIdentifier.setParent(node);
                    node.hiddenTComma = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTComma != null) node.hiddenTComma.setParent(node);
                    node.formatIdentifier = (ASTFormatIdentifierNode)valueStack.get(valueStackOffset + 2);
                    if (node.formatIdentifier != null) node.formatIdentifier.setParent(node);
                    ASTListNode<ASTRdIoCtlSpecListNode> list = new ASTListNode<ASTRdIoCtlSpecListNode>();
                    list.add(node);
                    node.setParent(list);
                    return list;

        }
        public Object handleRdIoCtlSpecList1189(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 10
                    ASTRdIoCtlSpecListNode node = new ASTRdIoCtlSpecListNode();
                    node.ioControlSpec = (ASTIoControlSpecNode)valueStack.get(valueStackOffset + 0);
                    if (node.ioControlSpec != null) node.ioControlSpec.setParent(node);
                    ASTListNode<ASTRdIoCtlSpecListNode> list = new ASTListNode<ASTRdIoCtlSpecListNode>();
                    list.add(node);
                    node.setParent(list);
                    return list;

        }
        public Object handleRdIoCtlSpecList1190(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 11
                    ASTRdIoCtlSpecListNode node = new ASTRdIoCtlSpecListNode();
                    node.hiddenTComma = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTComma != null) node.hiddenTComma.setParent(node);
                    node.ioControlSpec = (ASTIoControlSpecNode)valueStack.get(valueStackOffset + 2);
                    if (node.ioControlSpec != null) node.ioControlSpec.setParent(node);
                    ASTListNode<ASTRdIoCtlSpecListNode> list = (ASTListNode<ASTRdIoCtlSpecListNode>)valueStack.get(valueStackOffset);
                    list.add(node);
                    node.setParent(list);
                    return list;

        }
        public Object handleRdFmtId1191(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTRdFmtIdNode node = new ASTRdFmtIdNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    return node;

        }
        public Object handleRdFmtId1192(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTRdFmtIdNode node = new ASTRdFmtIdNode();
                    node.formatIsAsterisk = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.formatIsAsterisk != null) node.formatIsAsterisk.setParent(node);
                    return node;

        }
        public Object handleRdFmtId1193(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTRdFmtIdNode node = new ASTRdFmtIdNode();
                    ASTCOperandNode tmp0 = new ASTCOperandNode();
                    tmp0.name = (ASTNameNode)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("name");
                    if (tmp0.name != null) tmp0.name.setParent(tmp0);
                    tmp0.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("hiddenTLparen");
                    if (tmp0.hiddenTLparen != null) tmp0.hiddenTLparen.setParent(tmp0);
                    tmp0.functionArgList = (IASTListNode<ASTFunctionArgListNode>)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("functionArgList");
                    if (tmp0.functionArgList != null) tmp0.functionArgList.setParent(tmp0);
                    tmp0.stringConst = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("stringConst");
                    if (tmp0.stringConst != null) tmp0.stringConst.setParent(tmp0);
                    tmp0.primarySectionSubscriptList = (IASTListNode<ASTSectionSubscriptNode>)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("primarySectionSubscriptList");
                    if (tmp0.primarySectionSubscriptList != null) tmp0.primarySectionSubscriptList.setParent(tmp0);
                    tmp0.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("hiddenTRparen");
                    if (tmp0.hiddenTRparen != null) tmp0.hiddenTRparen.setParent(tmp0);
                    tmp0.imageSelector = (ASTImageSelectorNode)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("imageSelector");
                    if (tmp0.imageSelector != null) tmp0.imageSelector.setParent(tmp0);
                    tmp0.hiddenTPercent = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("hiddenTPercent");
                    if (tmp0.hiddenTPercent != null) tmp0.hiddenTPercent.setParent(tmp0);
                    tmp0.derivedTypeComponentRef = (IASTListNode<ASTDataRefNode>)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("derivedTypeComponentRef");
                    if (tmp0.derivedTypeComponentRef != null) tmp0.derivedTypeComponentRef.setParent(tmp0);
                    tmp0.hiddenLparen2 = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("hiddenLparen2");
                    if (tmp0.hiddenLparen2 != null) tmp0.hiddenLparen2.setParent(tmp0);
                    tmp0.componentSectionSubscriptList = (IASTListNode<ASTSectionSubscriptNode>)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("componentSectionSubscriptList");
                    if (tmp0.componentSectionSubscriptList != null) tmp0.componentSectionSubscriptList.setParent(tmp0);
                    tmp0.hiddenRparen2 = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("hiddenRparen2");
                    if (tmp0.hiddenRparen2 != null) tmp0.hiddenRparen2.setParent(tmp0);
                    node.primary1 = tmp0;
                    if (tmp0 != null) tmp0.setParent(node);
                    return node;

        }
        public Object handleRdFmtId1194(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTRdFmtIdNode node = new ASTRdFmtIdNode();
                    ASTCOperandNode tmp0 = new ASTCOperandNode();
                    tmp0.name = (ASTNameNode)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("name");
                    if (tmp0.name != null) tmp0.name.setParent(tmp0);
                    tmp0.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("hiddenTLparen");
                    if (tmp0.hiddenTLparen != null) tmp0.hiddenTLparen.setParent(tmp0);
                    tmp0.functionArgList = (IASTListNode<ASTFunctionArgListNode>)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("functionArgList");
                    if (tmp0.functionArgList != null) tmp0.functionArgList.setParent(tmp0);
                    tmp0.stringConst = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("stringConst");
                    if (tmp0.stringConst != null) tmp0.stringConst.setParent(tmp0);
                    tmp0.primarySectionSubscriptList = (IASTListNode<ASTSectionSubscriptNode>)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("primarySectionSubscriptList");
                    if (tmp0.primarySectionSubscriptList != null) tmp0.primarySectionSubscriptList.setParent(tmp0);
                    tmp0.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("hiddenTRparen");
                    if (tmp0.hiddenTRparen != null) tmp0.hiddenTRparen.setParent(tmp0);
                    tmp0.imageSelector = (ASTImageSelectorNode)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("imageSelector");
                    if (tmp0.imageSelector != null) tmp0.imageSelector.setParent(tmp0);
                    tmp0.hiddenTPercent = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("hiddenTPercent");
                    if (tmp0.hiddenTPercent != null) tmp0.hiddenTPercent.setParent(tmp0);
                    tmp0.derivedTypeComponentRef = (IASTListNode<ASTDataRefNode>)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("derivedTypeComponentRef");
                    if (tmp0.derivedTypeComponentRef != null) tmp0.derivedTypeComponentRef.setParent(tmp0);
                    tmp0.hiddenLparen2 = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("hiddenLparen2");
                    if (tmp0.hiddenLparen2 != null) tmp0.hiddenLparen2.setParent(tmp0);
                    tmp0.componentSectionSubscriptList = (IASTListNode<ASTSectionSubscriptNode>)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("componentSectionSubscriptList");
                    if (tmp0.componentSectionSubscriptList != null) tmp0.componentSectionSubscriptList.setParent(tmp0);
                    tmp0.hiddenRparen2 = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("hiddenRparen2");
                    if (tmp0.hiddenRparen2 != null) tmp0.hiddenRparen2.setParent(tmp0);
                    node.primary1 = tmp0;
                    if (tmp0 != null) tmp0.setParent(node);
                    node.hasMinusOp = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("hasMinusOp");
                    if (node.hasMinusOp != null) node.hasMinusOp.setParent(node);
                    node.hasSlashEqOp = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("hasSlashEqOp");
                    if (node.hasSlashEqOp != null) node.hasSlashEqOp.setParent(node);
                    node.hasAndOp = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("hasAndOp");
                    if (node.hasAndOp != null) node.hasAndOp.setParent(node);
                    node.definedUnaryOp = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("definedUnaryOp");
                    if (node.definedUnaryOp != null) node.definedUnaryOp.setParent(node);
                    node.hasEqOp = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("hasEqOp");
                    if (node.hasEqOp != null) node.hasEqOp.setParent(node);
                    node.hasPlusOp = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("hasPlusOp");
                    if (node.hasPlusOp != null) node.hasPlusOp.setParent(node);
                    node.hasDivideOp = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("hasDivideOp");
                    if (node.hasDivideOp != null) node.hasDivideOp.setParent(node);
                    node.hasNeqvOp = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("hasNeqvOp");
                    if (node.hasNeqvOp != null) node.hasNeqvOp.setParent(node);
                    node.hasEqEqOp = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("hasEqEqOp");
                    if (node.hasEqEqOp != null) node.hasEqEqOp.setParent(node);
                    node.hasGeOp = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("hasGeOp");
                    if (node.hasGeOp != null) node.hasGeOp.setParent(node);
                    node.hasNotOp = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("hasNotOp");
                    if (node.hasNotOp != null) node.hasNotOp.setParent(node);
                    node.hasEqvOp = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("hasEqvOp");
                    if (node.hasEqvOp != null) node.hasEqvOp.setParent(node);
                    node.hasConcatOp = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("hasConcatOp");
                    if (node.hasConcatOp != null) node.hasConcatOp.setParent(node);
                    node.hasPowerOp = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("hasPowerOp");
                    if (node.hasPowerOp != null) node.hasPowerOp.setParent(node);
                    node.hasGtOp = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("hasGtOp");
                    if (node.hasGtOp != null) node.hasGtOp.setParent(node);
                    node.hasLtOp = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("hasLtOp");
                    if (node.hasLtOp != null) node.hasLtOp.setParent(node);
                    node.hasNeOp = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("hasNeOp");
                    if (node.hasNeOp != null) node.hasNeOp.setParent(node);
                    node.hasOrOp = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("hasOrOp");
                    if (node.hasOrOp != null) node.hasOrOp.setParent(node);
                    node.customDefinedOp = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("customDefinedOp");
                    if (node.customDefinedOp != null) node.customDefinedOp.setParent(node);
                    node.hasTimesOp = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("hasTimesOp");
                    if (node.hasTimesOp != null) node.hasTimesOp.setParent(node);
                    node.definedBinaryOp = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("definedBinaryOp");
                    if (node.definedBinaryOp != null) node.definedBinaryOp.setParent(node);
                    node.hasLeOp = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("hasLeOp");
                    if (node.hasLeOp != null) node.hasLeOp.setParent(node);
                    node.primary2 = (ASTCPrimaryNode)valueStack.get(valueStackOffset + 2);
                    if (node.primary2 != null) node.primary2.setParent(node);
                    return node;

        }
        public Object handleRdFmtId1195(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTRdFmtIdNode node = new ASTRdFmtIdNode();
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("hiddenTLparen");
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.formatIdExpr = (ASTUFExprNode)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("formatIdExpr");
                    if (node.formatIdExpr != null) node.formatIdExpr.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("hiddenTRparen");
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    node.hasMinusOp = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("hasMinusOp");
                    if (node.hasMinusOp != null) node.hasMinusOp.setParent(node);
                    node.hasSlashEqOp = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("hasSlashEqOp");
                    if (node.hasSlashEqOp != null) node.hasSlashEqOp.setParent(node);
                    node.hasAndOp = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("hasAndOp");
                    if (node.hasAndOp != null) node.hasAndOp.setParent(node);
                    node.definedUnaryOp = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("definedUnaryOp");
                    if (node.definedUnaryOp != null) node.definedUnaryOp.setParent(node);
                    node.hasEqOp = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("hasEqOp");
                    if (node.hasEqOp != null) node.hasEqOp.setParent(node);
                    node.hasPlusOp = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("hasPlusOp");
                    if (node.hasPlusOp != null) node.hasPlusOp.setParent(node);
                    node.hasDivideOp = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("hasDivideOp");
                    if (node.hasDivideOp != null) node.hasDivideOp.setParent(node);
                    node.hasNeqvOp = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("hasNeqvOp");
                    if (node.hasNeqvOp != null) node.hasNeqvOp.setParent(node);
                    node.hasEqEqOp = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("hasEqEqOp");
                    if (node.hasEqEqOp != null) node.hasEqEqOp.setParent(node);
                    node.hasGeOp = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("hasGeOp");
                    if (node.hasGeOp != null) node.hasGeOp.setParent(node);
                    node.hasNotOp = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("hasNotOp");
                    if (node.hasNotOp != null) node.hasNotOp.setParent(node);
                    node.hasEqvOp = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("hasEqvOp");
                    if (node.hasEqvOp != null) node.hasEqvOp.setParent(node);
                    node.hasConcatOp = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("hasConcatOp");
                    if (node.hasConcatOp != null) node.hasConcatOp.setParent(node);
                    node.hasPowerOp = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("hasPowerOp");
                    if (node.hasPowerOp != null) node.hasPowerOp.setParent(node);
                    node.hasGtOp = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("hasGtOp");
                    if (node.hasGtOp != null) node.hasGtOp.setParent(node);
                    node.hasLtOp = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("hasLtOp");
                    if (node.hasLtOp != null) node.hasLtOp.setParent(node);
                    node.hasNeOp = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("hasNeOp");
                    if (node.hasNeOp != null) node.hasNeOp.setParent(node);
                    node.hasOrOp = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("hasOrOp");
                    if (node.hasOrOp != null) node.hasOrOp.setParent(node);
                    node.customDefinedOp = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("customDefinedOp");
                    if (node.customDefinedOp != null) node.customDefinedOp.setParent(node);
                    node.hasTimesOp = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("hasTimesOp");
                    if (node.hasTimesOp != null) node.hasTimesOp.setParent(node);
                    node.definedBinaryOp = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("definedBinaryOp");
                    if (node.definedBinaryOp != null) node.definedBinaryOp.setParent(node);
                    node.hasLeOp = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("hasLeOp");
                    if (node.hasLeOp != null) node.hasLeOp.setParent(node);
                    node.primary2 = (ASTCPrimaryNode)valueStack.get(valueStackOffset + 2);
                    if (node.primary2 != null) node.primary2.setParent(node);
                    return node;

        }
        public Object handleRdFmtIdExpr1196(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 3 and 4
                    Map<String, Object> node = new HashMap<String, Object>();
                    node.put("hiddenTLparen", (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0));
                    node.put("formatIdExpr", (ASTUFExprNode)valueStack.get(valueStackOffset + 1));
                    node.put("hiddenTRparen", (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2));
                    ASTListNode<IASTNode> embeddedList = new ASTListNode<IASTNode>();
                    embeddedList.add((IASTNode)(node.get("hiddenTLparen")));
                    embeddedList.add((IASTNode)(node.get("formatIdExpr")));
                    embeddedList.add((IASTNode)(node.get("hiddenTRparen")));
                    node.put("errorRecoveryList", embeddedList);
                    return node;

        }
        public Object handleWriteStmt1197(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTWriteStmtNode node = new ASTWriteStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTWrite = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTWrite != null) node.hiddenTWrite.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.ioControlSpecList = (IASTListNode<ASTIoControlSpecListNode>)valueStack.get(valueStackOffset + 3);
                    if (node.ioControlSpecList != null) node.ioControlSpecList.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    node.hiddenTComma = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 5);
                    if (node.hiddenTComma != null) node.hiddenTComma.setParent(node);
                    node.outputItemList = (ASTOutputItemListNode)valueStack.get(valueStackOffset + 6);
                    if (node.outputItemList != null) node.outputItemList.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 7);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleWriteStmt1198(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTWriteStmtNode node = new ASTWriteStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTWrite = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTWrite != null) node.hiddenTWrite.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.ioControlSpecList = (IASTListNode<ASTIoControlSpecListNode>)valueStack.get(valueStackOffset + 3);
                    if (node.ioControlSpecList != null) node.ioControlSpecList.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    node.outputItemList = (ASTOutputItemListNode)valueStack.get(valueStackOffset + 5);
                    if (node.outputItemList != null) node.outputItemList.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 6);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleWriteStmt1199(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTWriteStmtNode node = new ASTWriteStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTWrite = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTWrite != null) node.hiddenTWrite.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.ioControlSpecList = (IASTListNode<ASTIoControlSpecListNode>)valueStack.get(valueStackOffset + 3);
                    if (node.ioControlSpecList != null) node.ioControlSpecList.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 5);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handlePrintStmt1200(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTPrintStmtNode node = new ASTPrintStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTPrint = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTPrint != null) node.hiddenTPrint.setParent(node);
                    node.formatIdentifier = (ASTFormatIdentifierNode)valueStack.get(valueStackOffset + 2);
                    if (node.formatIdentifier != null) node.formatIdentifier.setParent(node);
                    node.hiddenTComma = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTComma != null) node.hiddenTComma.setParent(node);
                    node.outputItemList = (ASTOutputItemListNode)valueStack.get(valueStackOffset + 4);
                    if (node.outputItemList != null) node.outputItemList.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 5);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handlePrintStmt1201(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTPrintStmtNode node = new ASTPrintStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTPrint = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTPrint != null) node.hiddenTPrint.setParent(node);
                    node.formatIdentifier = (ASTFormatIdentifierNode)valueStack.get(valueStackOffset + 2);
                    if (node.formatIdentifier != null) node.formatIdentifier.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleIoControlSpecList1202(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 10
                    ASTIoControlSpecListNode node = new ASTIoControlSpecListNode();
                    node.unitIdentifier = (ASTUnitIdentifierNode)valueStack.get(valueStackOffset + 0);
                    if (node.unitIdentifier != null) node.unitIdentifier.setParent(node);
                    ASTListNode<ASTIoControlSpecListNode> list = new ASTListNode<ASTIoControlSpecListNode>();
                    list.add(node);
                    node.setParent(list);
                    return list;

        }
        public Object handleIoControlSpecList1203(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 10
                    ASTIoControlSpecListNode node = new ASTIoControlSpecListNode();
                    node.unitIdentifier = (ASTUnitIdentifierNode)valueStack.get(valueStackOffset + 0);
                    if (node.unitIdentifier != null) node.unitIdentifier.setParent(node);
                    node.hiddenTComma = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTComma != null) node.hiddenTComma.setParent(node);
                    node.formatIdentifier = (ASTFormatIdentifierNode)valueStack.get(valueStackOffset + 2);
                    if (node.formatIdentifier != null) node.formatIdentifier.setParent(node);
                    ASTListNode<ASTIoControlSpecListNode> list = new ASTListNode<ASTIoControlSpecListNode>();
                    list.add(node);
                    node.setParent(list);
                    return list;

        }
        public Object handleIoControlSpecList1204(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 10
                    ASTIoControlSpecListNode node = new ASTIoControlSpecListNode();
                    node.unitIdentifier = (ASTUnitIdentifierNode)valueStack.get(valueStackOffset + 0);
                    if (node.unitIdentifier != null) node.unitIdentifier.setParent(node);
                    node.hiddenTComma = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTComma != null) node.hiddenTComma.setParent(node);
                    node.ioControlSpec = (ASTIoControlSpecNode)valueStack.get(valueStackOffset + 2);
                    if (node.ioControlSpec != null) node.ioControlSpec.setParent(node);
                    ASTListNode<ASTIoControlSpecListNode> list = new ASTListNode<ASTIoControlSpecListNode>();
                    list.add(node);
                    node.setParent(list);
                    return list;

        }
        public Object handleIoControlSpecList1205(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 10
                    ASTIoControlSpecListNode node = new ASTIoControlSpecListNode();
                    node.ioControlSpec = (ASTIoControlSpecNode)valueStack.get(valueStackOffset + 0);
                    if (node.ioControlSpec != null) node.ioControlSpec.setParent(node);
                    ASTListNode<ASTIoControlSpecListNode> list = new ASTListNode<ASTIoControlSpecListNode>();
                    list.add(node);
                    node.setParent(list);
                    return list;

        }
        public Object handleIoControlSpecList1206(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 11
                    ASTIoControlSpecListNode node = new ASTIoControlSpecListNode();
                    node.hiddenTComma = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTComma != null) node.hiddenTComma.setParent(node);
                    node.ioControlSpec = (ASTIoControlSpecNode)valueStack.get(valueStackOffset + 2);
                    if (node.ioControlSpec != null) node.ioControlSpec.setParent(node);
                    ASTListNode<ASTIoControlSpecListNode> list = (ASTListNode<ASTIoControlSpecListNode>)valueStack.get(valueStackOffset);
                    list.add(node);
                    node.setParent(list);
                    return list;

        }
        public Object handleIoControlSpec1207(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTIoControlSpecNode node = new ASTIoControlSpecNode();
                    node.hiddenTFmteq = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.hiddenTFmteq != null) node.hiddenTFmteq.setParent(node);
                    node.formatIdentifier = (ASTFormatIdentifierNode)valueStack.get(valueStackOffset + 1);
                    if (node.formatIdentifier != null) node.formatIdentifier.setParent(node);
                    return node;

        }
        public Object handleIoControlSpec1208(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTIoControlSpecNode node = new ASTIoControlSpecNode();
                    node.hiddenTUniteq = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.hiddenTUniteq != null) node.hiddenTUniteq.setParent(node);
                    node.unitIdentifier = (ASTUnitIdentifierNode)valueStack.get(valueStackOffset + 1);
                    if (node.unitIdentifier != null) node.unitIdentifier.setParent(node);
                    return node;

        }
        public Object handleIoControlSpec1209(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTIoControlSpecNode node = new ASTIoControlSpecNode();
                    node.hiddenTReceq = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.hiddenTReceq != null) node.hiddenTReceq.setParent(node);
                    node.recExpr = (IExpr)valueStack.get(valueStackOffset + 1);
                    if (node.recExpr != null) node.recExpr.setParent(node);
                    return node;

        }
        public Object handleIoControlSpec1210(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTIoControlSpecNode node = new ASTIoControlSpecNode();
                    node.hiddenTEndeq = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.hiddenTEndeq != null) node.hiddenTEndeq.setParent(node);
                    ASTLblRefNode tmp1 = new ASTLblRefNode();
                    tmp1.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("label");
                    if (tmp1.label != null) tmp1.label.setParent(tmp1);
                    node.endExpr = tmp1;
                    if (tmp1 != null) tmp1.setParent(node);
                    return node;

        }
        public Object handleIoControlSpec1211(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTIoControlSpecNode node = new ASTIoControlSpecNode();
                    node.hiddenTErreq = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.hiddenTErreq != null) node.hiddenTErreq.setParent(node);
                    ASTLblRefNode tmp1 = new ASTLblRefNode();
                    tmp1.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("label");
                    if (tmp1.label != null) tmp1.label.setParent(tmp1);
                    node.errLbl = tmp1;
                    if (tmp1 != null) tmp1.setParent(node);
                    return node;

        }
        public Object handleIoControlSpec1212(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTIoControlSpecNode node = new ASTIoControlSpecNode();
                    node.hiddenTIostateq = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.hiddenTIostateq != null) node.hiddenTIostateq.setParent(node);
                    node.ioStatVar = (ASTScalarVariableNode)valueStack.get(valueStackOffset + 1);
                    if (node.ioStatVar != null) node.ioStatVar.setParent(node);
                    return node;

        }
        public Object handleIoControlSpec1213(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTIoControlSpecNode node = new ASTIoControlSpecNode();
                    node.hiddenTNmleq = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.hiddenTNmleq != null) node.hiddenTNmleq.setParent(node);
                    ASTNamelistGroupNameNode tmp1 = new ASTNamelistGroupNameNode();
                    tmp1.namelistGroupName = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("namelistGroupName");
                    if (tmp1.namelistGroupName != null) tmp1.namelistGroupName.setParent(tmp1);
                    node.namelistGroupName = tmp1;
                    if (tmp1 != null) tmp1.setParent(node);
                    return node;

        }
        public Object handleIoControlSpec1214(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTIoControlSpecNode node = new ASTIoControlSpecNode();
                    node.hiddenTAdvanceeq = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.hiddenTAdvanceeq != null) node.hiddenTAdvanceeq.setParent(node);
                    node.advanceExpr = (ASTCExprNode)valueStack.get(valueStackOffset + 1);
                    if (node.advanceExpr != null) node.advanceExpr.setParent(node);
                    return node;

        }
        public Object handleIoControlSpec1215(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTIoControlSpecNode node = new ASTIoControlSpecNode();
                    node.hiddenTSizeeq = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.hiddenTSizeeq != null) node.hiddenTSizeeq.setParent(node);
                    node.sizeVar = (ASTVariableNode)valueStack.get(valueStackOffset + 1);
                    if (node.sizeVar != null) node.sizeVar.setParent(node);
                    return node;

        }
        public Object handleIoControlSpec1216(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTIoControlSpecNode node = new ASTIoControlSpecNode();
                    node.hiddenTEoreq = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.hiddenTEoreq != null) node.hiddenTEoreq.setParent(node);
                    ASTLblRefNode tmp1 = new ASTLblRefNode();
                    tmp1.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("label");
                    if (tmp1.label != null) tmp1.label.setParent(tmp1);
                    node.eorLbl = tmp1;
                    if (tmp1 != null) tmp1.setParent(node);
                    return node;

        }
        public Object handleIoControlSpec1217(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTIoControlSpecNode node = new ASTIoControlSpecNode();
                    node.hiddenTAsynchronouseq = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.hiddenTAsynchronouseq != null) node.hiddenTAsynchronouseq.setParent(node);
                    node.asyncExpr = (ASTCExprNode)valueStack.get(valueStackOffset + 1);
                    if (node.asyncExpr != null) node.asyncExpr.setParent(node);
                    return node;

        }
        public Object handleIoControlSpec1218(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTIoControlSpecNode node = new ASTIoControlSpecNode();
                    node.hiddenTDecimaleq = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.hiddenTDecimaleq != null) node.hiddenTDecimaleq.setParent(node);
                    node.decimalExpr = (ASTCExprNode)valueStack.get(valueStackOffset + 1);
                    if (node.decimalExpr != null) node.decimalExpr.setParent(node);
                    return node;

        }
        public Object handleIoControlSpec1219(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTIoControlSpecNode node = new ASTIoControlSpecNode();
                    node.hiddenTIdeq = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.hiddenTIdeq != null) node.hiddenTIdeq.setParent(node);
                    node.idVar = (ASTScalarVariableNode)valueStack.get(valueStackOffset + 1);
                    if (node.idVar != null) node.idVar.setParent(node);
                    return node;

        }
        public Object handleIoControlSpec1220(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTIoControlSpecNode node = new ASTIoControlSpecNode();
                    node.hiddenTIomsgeq = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.hiddenTIomsgeq != null) node.hiddenTIomsgeq.setParent(node);
                    node.iomsgExpr = (ASTScalarVariableNode)valueStack.get(valueStackOffset + 1);
                    if (node.iomsgExpr != null) node.iomsgExpr.setParent(node);
                    return node;

        }
        public Object handleIoControlSpec1221(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTIoControlSpecNode node = new ASTIoControlSpecNode();
                    node.hiddenTPoseq = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.hiddenTPoseq != null) node.hiddenTPoseq.setParent(node);
                    node.posExpr = (ASTCExprNode)valueStack.get(valueStackOffset + 1);
                    if (node.posExpr != null) node.posExpr.setParent(node);
                    return node;

        }
        public Object handleIoControlSpec1222(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTIoControlSpecNode node = new ASTIoControlSpecNode();
                    node.hiddenTRoundeq = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.hiddenTRoundeq != null) node.hiddenTRoundeq.setParent(node);
                    node.roundExpr = (ASTCExprNode)valueStack.get(valueStackOffset + 1);
                    if (node.roundExpr != null) node.roundExpr.setParent(node);
                    return node;

        }
        public Object handleIoControlSpec1223(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTIoControlSpecNode node = new ASTIoControlSpecNode();
                    node.hiddenTSigneq = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.hiddenTSigneq != null) node.hiddenTSigneq.setParent(node);
                    node.signExpr = (ASTCExprNode)valueStack.get(valueStackOffset + 1);
                    if (node.signExpr != null) node.signExpr.setParent(node);
                    return node;

        }
        public Object handleFormatIdentifier1224(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTFormatIdentifierNode node = new ASTFormatIdentifierNode();
                    ASTLblRefNode tmp0 = new ASTLblRefNode();
                    tmp0.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (tmp0.label != null) tmp0.label.setParent(tmp0);
                    node.formatLbl = tmp0;
                    if (tmp0 != null) tmp0.setParent(node);
                    return node;

        }
        public Object handleFormatIdentifier1225(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTFormatIdentifierNode node = new ASTFormatIdentifierNode();
                    node.formatExpr = (ASTCExprNode)valueStack.get(valueStackOffset + 0);
                    if (node.formatExpr != null) node.formatExpr.setParent(node);
                    return node;

        }
        public Object handleFormatIdentifier1226(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTFormatIdentifierNode node = new ASTFormatIdentifierNode();
                    node.formatIsAsterisk = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.formatIsAsterisk != null) node.formatIsAsterisk.setParent(node);
                    return node;

        }
        public Object handleInputItemList1227(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 7 with separator
                    ASTSeparatedListNode<IInputItem> list = new ASTSeparatedListNode<IInputItem>();
                    IInputItem elt = (IInputItem)valueStack.get(valueStackOffset + 0);
                    list.add(null, elt);
                    if (elt != null) elt.setParent(list);
                    return list;

        }
        public Object handleInputItemList1228(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 8 with separator
                    ASTSeparatedListNode<IInputItem> list = (ASTSeparatedListNode<IInputItem>)valueStack.get(valueStackOffset);
                    org.eclipse.photran.internal.core.lexer.Token token = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    IInputItem elt = (IInputItem)valueStack.get(valueStackOffset + 2);
                    list.add(token, elt);
                    token.setParent(list);
                    if (elt != null) elt.setParent(list);
                    return list;

        }
        public Object handleInputItem1229(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 5
                    ASTVariableNode result = (ASTVariableNode)valueStack.get(valueStackOffset + 0);
                    return result;

        }
        public Object handleInputItem1230(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 5
                    ASTInputImpliedDoNode result = (ASTInputImpliedDoNode)valueStack.get(valueStackOffset + 0);
                    return result;

        }
        public Object handleOutputItemList1231(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTOutputItemListNode node = new ASTOutputItemListNode();
                    node.singleExpr = (IExpr)valueStack.get(valueStackOffset + 0);
                    if (node.singleExpr != null) node.singleExpr.setParent(node);
                    return node;

        }
        public Object handleOutputItemList1232(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTOutputItemListNode node = new ASTOutputItemListNode();
                    node.outputItemList1 = (ASTOutputItemList1Node)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("outputItemList1");
                    if (node.outputItemList1 != null) node.outputItemList1.setParent(node);
                    node.expr1 = (IExpr)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("expr1");
                    if (node.expr1 != null) node.expr1.setParent(node);
                    node.hiddenTComma = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("hiddenTComma");
                    if (node.hiddenTComma != null) node.hiddenTComma.setParent(node);
                    node.expr2 = (IExpr)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("expr2");
                    if (node.expr2 != null) node.expr2.setParent(node);
                    node.outputImpliedDo = (ASTOutputImpliedDoNode)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("outputImpliedDo");
                    if (node.outputImpliedDo != null) node.outputImpliedDo.setParent(node);
                    return node;

        }
        public Object handleOutputItemList11233(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 3 and 4
                    Map<String, Object> node = new HashMap<String, Object>();
                    node.put("expr1", (IExpr)valueStack.get(valueStackOffset + 0));
                    node.put("hiddenTComma", (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1));
                    node.put("expr2", (IExpr)valueStack.get(valueStackOffset + 2));
                    ASTListNode<IASTNode> embeddedList = new ASTListNode<IASTNode>();
                    embeddedList.add((IASTNode)(node.get("outputItemList1")));
                    embeddedList.add((IASTNode)(node.get("expr1")));
                    embeddedList.add((IASTNode)(node.get("hiddenTComma")));
                    embeddedList.add((IASTNode)(node.get("expr2")));
                    embeddedList.add((IASTNode)(node.get("outputImpliedDo")));
                    node.put("errorRecoveryList", embeddedList);
                    return node;

        }
        public Object handleOutputItemList11234(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 3 and 4
                    Map<String, Object> node = new HashMap<String, Object>();
                    node.put("expr1", (IExpr)valueStack.get(valueStackOffset + 0));
                    node.put("hiddenTComma", (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1));
                    node.put("outputImpliedDo", (ASTOutputImpliedDoNode)valueStack.get(valueStackOffset + 2));
                    ASTListNode<IASTNode> embeddedList = new ASTListNode<IASTNode>();
                    embeddedList.add((IASTNode)(node.get("outputItemList1")));
                    embeddedList.add((IASTNode)(node.get("expr1")));
                    embeddedList.add((IASTNode)(node.get("hiddenTComma")));
                    embeddedList.add((IASTNode)(node.get("expr2")));
                    embeddedList.add((IASTNode)(node.get("outputImpliedDo")));
                    node.put("errorRecoveryList", embeddedList);
                    return node;

        }
        public Object handleOutputItemList11235(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 3 and 4
                    Map<String, Object> node = new HashMap<String, Object>();
                    node.put("outputImpliedDo", (ASTOutputImpliedDoNode)valueStack.get(valueStackOffset + 0));
                    ASTListNode<IASTNode> embeddedList = new ASTListNode<IASTNode>();
                    embeddedList.add((IASTNode)(node.get("outputItemList1")));
                    embeddedList.add((IASTNode)(node.get("expr1")));
                    embeddedList.add((IASTNode)(node.get("hiddenTComma")));
                    embeddedList.add((IASTNode)(node.get("expr2")));
                    embeddedList.add((IASTNode)(node.get("outputImpliedDo")));
                    node.put("errorRecoveryList", embeddedList);
                    return node;

        }
        public Object handleOutputItemList11236(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 3 and 4
                    Map<String, Object> node = new HashMap<String, Object>();
                    ASTOutputItemList1Node tmp0 = new ASTOutputItemList1Node();
                    tmp0.outputItemList1 = (ASTOutputItemList1Node)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("outputItemList1");
                    if (tmp0.outputItemList1 != null) tmp0.outputItemList1.setParent(tmp0);
                    tmp0.expr1 = (IExpr)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("expr1");
                    if (tmp0.expr1 != null) tmp0.expr1.setParent(tmp0);
                    tmp0.hiddenTComma = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("hiddenTComma");
                    if (tmp0.hiddenTComma != null) tmp0.hiddenTComma.setParent(tmp0);
                    tmp0.expr2 = (IExpr)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("expr2");
                    if (tmp0.expr2 != null) tmp0.expr2.setParent(tmp0);
                    tmp0.outputImpliedDo = (ASTOutputImpliedDoNode)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("outputImpliedDo");
                    if (tmp0.outputImpliedDo != null) tmp0.outputImpliedDo.setParent(tmp0);
                    node.put("outputItemList1", tmp0);
                    node.put("hiddenTComma", (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1));
                    node.put("expr2", (IExpr)valueStack.get(valueStackOffset + 2));
                    ASTListNode<IASTNode> embeddedList = new ASTListNode<IASTNode>();
                    embeddedList.add((IASTNode)(node.get("outputItemList1")));
                    embeddedList.add((IASTNode)(node.get("expr1")));
                    embeddedList.add((IASTNode)(node.get("hiddenTComma")));
                    embeddedList.add((IASTNode)(node.get("expr2")));
                    embeddedList.add((IASTNode)(node.get("outputImpliedDo")));
                    node.put("errorRecoveryList", embeddedList);
                    return node;

        }
        public Object handleOutputItemList11237(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 3 and 4
                    Map<String, Object> node = new HashMap<String, Object>();
                    ASTOutputItemList1Node tmp0 = new ASTOutputItemList1Node();
                    tmp0.outputItemList1 = (ASTOutputItemList1Node)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("outputItemList1");
                    if (tmp0.outputItemList1 != null) tmp0.outputItemList1.setParent(tmp0);
                    tmp0.expr1 = (IExpr)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("expr1");
                    if (tmp0.expr1 != null) tmp0.expr1.setParent(tmp0);
                    tmp0.hiddenTComma = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("hiddenTComma");
                    if (tmp0.hiddenTComma != null) tmp0.hiddenTComma.setParent(tmp0);
                    tmp0.expr2 = (IExpr)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("expr2");
                    if (tmp0.expr2 != null) tmp0.expr2.setParent(tmp0);
                    tmp0.outputImpliedDo = (ASTOutputImpliedDoNode)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("outputImpliedDo");
                    if (tmp0.outputImpliedDo != null) tmp0.outputImpliedDo.setParent(tmp0);
                    node.put("outputItemList1", tmp0);
                    node.put("hiddenTComma", (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1));
                    node.put("outputImpliedDo", (ASTOutputImpliedDoNode)valueStack.get(valueStackOffset + 2));
                    ASTListNode<IASTNode> embeddedList = new ASTListNode<IASTNode>();
                    embeddedList.add((IASTNode)(node.get("outputItemList1")));
                    embeddedList.add((IASTNode)(node.get("expr1")));
                    embeddedList.add((IASTNode)(node.get("hiddenTComma")));
                    embeddedList.add((IASTNode)(node.get("expr2")));
                    embeddedList.add((IASTNode)(node.get("outputImpliedDo")));
                    node.put("errorRecoveryList", embeddedList);
                    return node;

        }
        public Object handleInputImpliedDo1238(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTInputImpliedDoNode node = new ASTInputImpliedDoNode();
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.inputItemList = (IASTListNode<IInputItem>)valueStack.get(valueStackOffset + 1);
                    if (node.inputItemList != null) node.inputItemList.setParent(node);
                    node.hiddenTComma = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTComma != null) node.hiddenTComma.setParent(node);
                    node.impliedDoVariable = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 3)).get("impliedDoVariable");
                    if (node.impliedDoVariable != null) node.impliedDoVariable.setParent(node);
                    node.hiddenTEquals = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenTEquals != null) node.hiddenTEquals.setParent(node);
                    node.lb = (IExpr)valueStack.get(valueStackOffset + 5);
                    if (node.lb != null) node.lb.setParent(node);
                    node.hiddenTComma2 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 6);
                    if (node.hiddenTComma2 != null) node.hiddenTComma2.setParent(node);
                    node.ub = (IExpr)valueStack.get(valueStackOffset + 7);
                    if (node.ub != null) node.ub.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 8);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    return node;

        }
        public Object handleInputImpliedDo1239(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTInputImpliedDoNode node = new ASTInputImpliedDoNode();
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.inputItemList = (IASTListNode<IInputItem>)valueStack.get(valueStackOffset + 1);
                    if (node.inputItemList != null) node.inputItemList.setParent(node);
                    node.hiddenTComma = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTComma != null) node.hiddenTComma.setParent(node);
                    node.impliedDoVariable = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 3)).get("impliedDoVariable");
                    if (node.impliedDoVariable != null) node.impliedDoVariable.setParent(node);
                    node.hiddenTEquals = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenTEquals != null) node.hiddenTEquals.setParent(node);
                    node.lb = (IExpr)valueStack.get(valueStackOffset + 5);
                    if (node.lb != null) node.lb.setParent(node);
                    node.hiddenTComma2 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 6);
                    if (node.hiddenTComma2 != null) node.hiddenTComma2.setParent(node);
                    node.ub = (IExpr)valueStack.get(valueStackOffset + 7);
                    if (node.ub != null) node.ub.setParent(node);
                    node.hiddenTComma3 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 8);
                    if (node.hiddenTComma3 != null) node.hiddenTComma3.setParent(node);
                    node.step = (IExpr)valueStack.get(valueStackOffset + 9);
                    if (node.step != null) node.step.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 10);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    return node;

        }
        public Object handleOutputImpliedDo1240(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTOutputImpliedDoNode node = new ASTOutputImpliedDoNode();
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.expr = (IExpr)valueStack.get(valueStackOffset + 1);
                    if (node.expr != null) node.expr.setParent(node);
                    node.hiddenTComma = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTComma != null) node.hiddenTComma.setParent(node);
                    node.impliedDoVariable = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 3)).get("impliedDoVariable");
                    if (node.impliedDoVariable != null) node.impliedDoVariable.setParent(node);
                    node.hiddenTEquals = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenTEquals != null) node.hiddenTEquals.setParent(node);
                    node.lb = (IExpr)valueStack.get(valueStackOffset + 5);
                    if (node.lb != null) node.lb.setParent(node);
                    node.hiddenTComma2 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 6);
                    if (node.hiddenTComma2 != null) node.hiddenTComma2.setParent(node);
                    node.ub = (IExpr)valueStack.get(valueStackOffset + 7);
                    if (node.ub != null) node.ub.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 8);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    return node;

        }
        public Object handleOutputImpliedDo1241(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTOutputImpliedDoNode node = new ASTOutputImpliedDoNode();
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.expr = (IExpr)valueStack.get(valueStackOffset + 1);
                    if (node.expr != null) node.expr.setParent(node);
                    node.hiddenTComma = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTComma != null) node.hiddenTComma.setParent(node);
                    node.impliedDoVariable = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 3)).get("impliedDoVariable");
                    if (node.impliedDoVariable != null) node.impliedDoVariable.setParent(node);
                    node.hiddenTEquals = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenTEquals != null) node.hiddenTEquals.setParent(node);
                    node.lb = (IExpr)valueStack.get(valueStackOffset + 5);
                    if (node.lb != null) node.lb.setParent(node);
                    node.hiddenTComma2 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 6);
                    if (node.hiddenTComma2 != null) node.hiddenTComma2.setParent(node);
                    node.ub = (IExpr)valueStack.get(valueStackOffset + 7);
                    if (node.ub != null) node.ub.setParent(node);
                    node.hiddenTComma3 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 8);
                    if (node.hiddenTComma3 != null) node.hiddenTComma3.setParent(node);
                    node.step = (IExpr)valueStack.get(valueStackOffset + 9);
                    if (node.step != null) node.step.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 10);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    return node;

        }
        public Object handleOutputImpliedDo1242(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTOutputImpliedDoNode node = new ASTOutputImpliedDoNode();
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    ASTOutputItemList1Node tmp1 = new ASTOutputItemList1Node();
                    tmp1.outputItemList1 = (ASTOutputItemList1Node)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("outputItemList1");
                    if (tmp1.outputItemList1 != null) tmp1.outputItemList1.setParent(tmp1);
                    tmp1.expr1 = (IExpr)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("expr1");
                    if (tmp1.expr1 != null) tmp1.expr1.setParent(tmp1);
                    tmp1.hiddenTComma = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("hiddenTComma");
                    if (tmp1.hiddenTComma != null) tmp1.hiddenTComma.setParent(tmp1);
                    tmp1.expr2 = (IExpr)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("expr2");
                    if (tmp1.expr2 != null) tmp1.expr2.setParent(tmp1);
                    tmp1.outputImpliedDo = (ASTOutputImpliedDoNode)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("outputImpliedDo");
                    if (tmp1.outputImpliedDo != null) tmp1.outputImpliedDo.setParent(tmp1);
                    node.outputItemList1 = tmp1;
                    if (tmp1 != null) tmp1.setParent(node);
                    node.hiddenTComma = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTComma != null) node.hiddenTComma.setParent(node);
                    node.impliedDoVariable = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 3)).get("impliedDoVariable");
                    if (node.impliedDoVariable != null) node.impliedDoVariable.setParent(node);
                    node.hiddenTEquals = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenTEquals != null) node.hiddenTEquals.setParent(node);
                    node.lb = (IExpr)valueStack.get(valueStackOffset + 5);
                    if (node.lb != null) node.lb.setParent(node);
                    node.hiddenTComma2 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 6);
                    if (node.hiddenTComma2 != null) node.hiddenTComma2.setParent(node);
                    node.ub = (IExpr)valueStack.get(valueStackOffset + 7);
                    if (node.ub != null) node.ub.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 8);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    return node;

        }
        public Object handleOutputImpliedDo1243(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTOutputImpliedDoNode node = new ASTOutputImpliedDoNode();
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    ASTOutputItemList1Node tmp1 = new ASTOutputItemList1Node();
                    tmp1.outputItemList1 = (ASTOutputItemList1Node)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("outputItemList1");
                    if (tmp1.outputItemList1 != null) tmp1.outputItemList1.setParent(tmp1);
                    tmp1.expr1 = (IExpr)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("expr1");
                    if (tmp1.expr1 != null) tmp1.expr1.setParent(tmp1);
                    tmp1.hiddenTComma = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("hiddenTComma");
                    if (tmp1.hiddenTComma != null) tmp1.hiddenTComma.setParent(tmp1);
                    tmp1.expr2 = (IExpr)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("expr2");
                    if (tmp1.expr2 != null) tmp1.expr2.setParent(tmp1);
                    tmp1.outputImpliedDo = (ASTOutputImpliedDoNode)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("outputImpliedDo");
                    if (tmp1.outputImpliedDo != null) tmp1.outputImpliedDo.setParent(tmp1);
                    node.outputItemList1 = tmp1;
                    if (tmp1 != null) tmp1.setParent(node);
                    node.hiddenTComma = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTComma != null) node.hiddenTComma.setParent(node);
                    node.impliedDoVariable = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 3)).get("impliedDoVariable");
                    if (node.impliedDoVariable != null) node.impliedDoVariable.setParent(node);
                    node.hiddenTEquals = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenTEquals != null) node.hiddenTEquals.setParent(node);
                    node.lb = (IExpr)valueStack.get(valueStackOffset + 5);
                    if (node.lb != null) node.lb.setParent(node);
                    node.hiddenTComma2 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 6);
                    if (node.hiddenTComma2 != null) node.hiddenTComma2.setParent(node);
                    node.ub = (IExpr)valueStack.get(valueStackOffset + 7);
                    if (node.ub != null) node.ub.setParent(node);
                    node.hiddenTComma3 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 8);
                    if (node.hiddenTComma3 != null) node.hiddenTComma3.setParent(node);
                    node.step = (IExpr)valueStack.get(valueStackOffset + 9);
                    if (node.step != null) node.step.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 10);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    return node;

        }
        public Object handleWaitStmt1244(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTWaitStmtNode node = new ASTWaitStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTWait = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTWait != null) node.hiddenTWait.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.waitSpecList = (IASTListNode<ASTWaitSpecNode>)valueStack.get(valueStackOffset + 3);
                    if (node.waitSpecList != null) node.waitSpecList.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 5);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleWaitSpecList1245(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 7 with separator
                    ASTSeparatedListNode<ASTWaitSpecNode> list = new ASTSeparatedListNode<ASTWaitSpecNode>();
                    ASTWaitSpecNode elt = (ASTWaitSpecNode)valueStack.get(valueStackOffset + 0);
                    list.add(null, elt);
                    if (elt != null) elt.setParent(list);
                    return list;

        }
        public Object handleWaitSpecList1246(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 8 with separator
                    ASTSeparatedListNode<ASTWaitSpecNode> list = (ASTSeparatedListNode<ASTWaitSpecNode>)valueStack.get(valueStackOffset);
                    org.eclipse.photran.internal.core.lexer.Token token = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    ASTWaitSpecNode elt = (ASTWaitSpecNode)valueStack.get(valueStackOffset + 2);
                    list.add(token, elt);
                    token.setParent(list);
                    if (elt != null) elt.setParent(list);
                    return list;

        }
        public Object handleWaitSpec1247(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTWaitSpecNode node = new ASTWaitSpecNode();
                    node.expr = (IExpr)valueStack.get(valueStackOffset + 0);
                    if (node.expr != null) node.expr.setParent(node);
                    return node;

        }
        public Object handleWaitSpec1248(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTWaitSpecNode node = new ASTWaitSpecNode();
                    node.keyword = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.keyword != null) node.keyword.setParent(node);
                    node.hiddenTEquals = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTEquals != null) node.hiddenTEquals.setParent(node);
                    node.expr = (IExpr)valueStack.get(valueStackOffset + 2);
                    if (node.expr != null) node.expr.setParent(node);
                    return node;

        }
        public Object handleBackspaceStmt1249(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTBackspaceStmtNode node = new ASTBackspaceStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTBackspace = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTBackspace != null) node.hiddenTBackspace.setParent(node);
                    node.unitIdentifier = (ASTUnitIdentifierNode)valueStack.get(valueStackOffset + 2);
                    if (node.unitIdentifier != null) node.unitIdentifier.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleBackspaceStmt1250(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTBackspaceStmtNode node = new ASTBackspaceStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTBackspace = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTBackspace != null) node.hiddenTBackspace.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.positionSpecList = (IASTListNode<ASTPositionSpecListNode>)valueStack.get(valueStackOffset + 3);
                    if (node.positionSpecList != null) node.positionSpecList.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 5);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleEndfileStmt1251(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTEndfileStmtNode node = new ASTEndfileStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTEndfile = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTEndfile != null) node.hiddenTEndfile.setParent(node);
                    node.unitIdentifier = (ASTUnitIdentifierNode)valueStack.get(valueStackOffset + 2);
                    if (node.unitIdentifier != null) node.unitIdentifier.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleEndfileStmt1252(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTEndfileStmtNode node = new ASTEndfileStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTEndfile = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTEndfile != null) node.hiddenTEndfile.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.positionSpecList = (IASTListNode<ASTPositionSpecListNode>)valueStack.get(valueStackOffset + 3);
                    if (node.positionSpecList != null) node.positionSpecList.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 5);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleEndfileStmt1253(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTEndfileStmtNode node = new ASTEndfileStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTEnd = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTEnd != null) node.hiddenTEnd.setParent(node);
                    node.hiddenTFile = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTFile != null) node.hiddenTFile.setParent(node);
                    node.unitIdentifier = (ASTUnitIdentifierNode)valueStack.get(valueStackOffset + 3);
                    if (node.unitIdentifier != null) node.unitIdentifier.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleEndfileStmt1254(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTEndfileStmtNode node = new ASTEndfileStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTEnd = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTEnd != null) node.hiddenTEnd.setParent(node);
                    node.hiddenTFile = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTFile != null) node.hiddenTFile.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.positionSpecList = (IASTListNode<ASTPositionSpecListNode>)valueStack.get(valueStackOffset + 4);
                    if (node.positionSpecList != null) node.positionSpecList.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 5);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 6);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleRewindStmt1255(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTRewindStmtNode node = new ASTRewindStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTRewind = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTRewind != null) node.hiddenTRewind.setParent(node);
                    node.unitIdentifier = (ASTUnitIdentifierNode)valueStack.get(valueStackOffset + 2);
                    if (node.unitIdentifier != null) node.unitIdentifier.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleRewindStmt1256(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTRewindStmtNode node = new ASTRewindStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTRewind = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTRewind != null) node.hiddenTRewind.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.positionSpecList = (IASTListNode<ASTPositionSpecListNode>)valueStack.get(valueStackOffset + 3);
                    if (node.positionSpecList != null) node.positionSpecList.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 5);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handlePositionSpecList1257(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 10
                    ASTPositionSpecListNode node = new ASTPositionSpecListNode();
                    node.unitIdentifier = (ASTUnitIdentifierNode)valueStack.get(valueStackOffset + 0);
                    if (node.unitIdentifier != null) node.unitIdentifier.setParent(node);
                    node.hiddenTComma = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTComma != null) node.hiddenTComma.setParent(node);
                    node.positionSpec = (ASTPositionSpecNode)valueStack.get(valueStackOffset + 2);
                    if (node.positionSpec != null) node.positionSpec.setParent(node);
                    ASTListNode<ASTPositionSpecListNode> list = new ASTListNode<ASTPositionSpecListNode>();
                    list.add(node);
                    node.setParent(list);
                    return list;

        }
        public Object handlePositionSpecList1258(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 10
                    ASTPositionSpecListNode node = new ASTPositionSpecListNode();
                    node.positionSpec = (ASTPositionSpecNode)valueStack.get(valueStackOffset + 0);
                    if (node.positionSpec != null) node.positionSpec.setParent(node);
                    ASTListNode<ASTPositionSpecListNode> list = new ASTListNode<ASTPositionSpecListNode>();
                    list.add(node);
                    node.setParent(list);
                    return list;

        }
        public Object handlePositionSpecList1259(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 11
                    ASTPositionSpecListNode node = new ASTPositionSpecListNode();
                    node.hiddenTComma = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTComma != null) node.hiddenTComma.setParent(node);
                    node.positionSpec = (ASTPositionSpecNode)valueStack.get(valueStackOffset + 2);
                    if (node.positionSpec != null) node.positionSpec.setParent(node);
                    ASTListNode<ASTPositionSpecListNode> list = (ASTListNode<ASTPositionSpecListNode>)valueStack.get(valueStackOffset);
                    list.add(node);
                    node.setParent(list);
                    return list;

        }
        public Object handlePositionSpec1260(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTPositionSpecNode node = new ASTPositionSpecNode();
                    node.hiddenTUniteq = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.hiddenTUniteq != null) node.hiddenTUniteq.setParent(node);
                    node.unitIdentifier = (ASTUnitIdentifierNode)valueStack.get(valueStackOffset + 1);
                    if (node.unitIdentifier != null) node.unitIdentifier.setParent(node);
                    return node;

        }
        public Object handlePositionSpec1261(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTPositionSpecNode node = new ASTPositionSpecNode();
                    node.hiddenTErreq = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.hiddenTErreq != null) node.hiddenTErreq.setParent(node);
                    ASTLblRefNode tmp1 = new ASTLblRefNode();
                    tmp1.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("label");
                    if (tmp1.label != null) tmp1.label.setParent(tmp1);
                    node.errLbl = tmp1;
                    if (tmp1 != null) tmp1.setParent(node);
                    return node;

        }
        public Object handlePositionSpec1262(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTPositionSpecNode node = new ASTPositionSpecNode();
                    node.hiddenTIostateq = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.hiddenTIostateq != null) node.hiddenTIostateq.setParent(node);
                    node.ioStatVar = (ASTScalarVariableNode)valueStack.get(valueStackOffset + 1);
                    if (node.ioStatVar != null) node.ioStatVar.setParent(node);
                    return node;

        }
        public Object handleInquireStmt1263(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTInquireStmtNode node = new ASTInquireStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTInquire = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTInquire != null) node.hiddenTInquire.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.inquireSpecList = (IASTListNode<ASTInquireSpecListNode>)valueStack.get(valueStackOffset + 3);
                    if (node.inquireSpecList != null) node.inquireSpecList.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 5);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleInquireStmt1264(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTInquireStmtNode node = new ASTInquireStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTInquire = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTInquire != null) node.hiddenTInquire.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.hiddenTIolengtheq = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTIolengtheq != null) node.hiddenTIolengtheq.setParent(node);
                    node.ioLengthVar = (ASTScalarVariableNode)valueStack.get(valueStackOffset + 4);
                    if (node.ioLengthVar != null) node.ioLengthVar.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 5);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    node.outputItemList = (ASTOutputItemListNode)valueStack.get(valueStackOffset + 6);
                    if (node.outputItemList != null) node.outputItemList.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 7);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleInquireSpecList1265(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 10
                    ASTInquireSpecListNode node = new ASTInquireSpecListNode();
                    node.unitIdentifier = (ASTUnitIdentifierNode)valueStack.get(valueStackOffset + 0);
                    if (node.unitIdentifier != null) node.unitIdentifier.setParent(node);
                    ASTListNode<ASTInquireSpecListNode> list = new ASTListNode<ASTInquireSpecListNode>();
                    list.add(node);
                    node.setParent(list);
                    return list;

        }
        public Object handleInquireSpecList1266(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 10
                    ASTInquireSpecListNode node = new ASTInquireSpecListNode();
                    node.inquireSpec = (ASTInquireSpecNode)valueStack.get(valueStackOffset + 0);
                    if (node.inquireSpec != null) node.inquireSpec.setParent(node);
                    ASTListNode<ASTInquireSpecListNode> list = new ASTListNode<ASTInquireSpecListNode>();
                    list.add(node);
                    node.setParent(list);
                    return list;

        }
        public Object handleInquireSpecList1267(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 11
                    ASTInquireSpecListNode node = new ASTInquireSpecListNode();
                    node.hiddenTComma = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTComma != null) node.hiddenTComma.setParent(node);
                    node.inquireSpec = (ASTInquireSpecNode)valueStack.get(valueStackOffset + 2);
                    if (node.inquireSpec != null) node.inquireSpec.setParent(node);
                    ASTListNode<ASTInquireSpecListNode> list = (ASTListNode<ASTInquireSpecListNode>)valueStack.get(valueStackOffset);
                    list.add(node);
                    node.setParent(list);
                    return list;

        }
        public Object handleInquireSpec1268(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTInquireSpecNode node = new ASTInquireSpecNode();
                    node.hiddenTUniteq = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.hiddenTUniteq != null) node.hiddenTUniteq.setParent(node);
                    node.unitIdentifier = (ASTUnitIdentifierNode)valueStack.get(valueStackOffset + 1);
                    if (node.unitIdentifier != null) node.unitIdentifier.setParent(node);
                    return node;

        }
        public Object handleInquireSpec1269(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTInquireSpecNode node = new ASTInquireSpecNode();
                    node.hiddenTFileeq = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.hiddenTFileeq != null) node.hiddenTFileeq.setParent(node);
                    node.fileExpr = (ASTCExprNode)valueStack.get(valueStackOffset + 1);
                    if (node.fileExpr != null) node.fileExpr.setParent(node);
                    return node;

        }
        public Object handleInquireSpec1270(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTInquireSpecNode node = new ASTInquireSpecNode();
                    node.hiddenTErreq = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.hiddenTErreq != null) node.hiddenTErreq.setParent(node);
                    ASTLblRefNode tmp1 = new ASTLblRefNode();
                    tmp1.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("label");
                    if (tmp1.label != null) tmp1.label.setParent(tmp1);
                    node.errVar = tmp1;
                    if (tmp1 != null) tmp1.setParent(node);
                    return node;

        }
        public Object handleInquireSpec1271(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTInquireSpecNode node = new ASTInquireSpecNode();
                    node.hiddenTIostateq = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.hiddenTIostateq != null) node.hiddenTIostateq.setParent(node);
                    node.ioStatVar = (ASTScalarVariableNode)valueStack.get(valueStackOffset + 1);
                    if (node.ioStatVar != null) node.ioStatVar.setParent(node);
                    return node;

        }
        public Object handleInquireSpec1272(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTInquireSpecNode node = new ASTInquireSpecNode();
                    node.hiddenTExisteq = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.hiddenTExisteq != null) node.hiddenTExisteq.setParent(node);
                    node.existVar = (ASTScalarVariableNode)valueStack.get(valueStackOffset + 1);
                    if (node.existVar != null) node.existVar.setParent(node);
                    return node;

        }
        public Object handleInquireSpec1273(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTInquireSpecNode node = new ASTInquireSpecNode();
                    node.hiddenTOpenedeq = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.hiddenTOpenedeq != null) node.hiddenTOpenedeq.setParent(node);
                    node.openedVar = (ASTScalarVariableNode)valueStack.get(valueStackOffset + 1);
                    if (node.openedVar != null) node.openedVar.setParent(node);
                    return node;

        }
        public Object handleInquireSpec1274(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTInquireSpecNode node = new ASTInquireSpecNode();
                    node.hiddenTNumbereq = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.hiddenTNumbereq != null) node.hiddenTNumbereq.setParent(node);
                    node.numberVar = (ASTScalarVariableNode)valueStack.get(valueStackOffset + 1);
                    if (node.numberVar != null) node.numberVar.setParent(node);
                    return node;

        }
        public Object handleInquireSpec1275(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTInquireSpecNode node = new ASTInquireSpecNode();
                    node.hiddenTNamedeq = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.hiddenTNamedeq != null) node.hiddenTNamedeq.setParent(node);
                    node.namedVar = (ASTScalarVariableNode)valueStack.get(valueStackOffset + 1);
                    if (node.namedVar != null) node.namedVar.setParent(node);
                    return node;

        }
        public Object handleInquireSpec1276(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTInquireSpecNode node = new ASTInquireSpecNode();
                    node.hiddenTNameeq = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.hiddenTNameeq != null) node.hiddenTNameeq.setParent(node);
                    node.nameVar = (ASTScalarVariableNode)valueStack.get(valueStackOffset + 1);
                    if (node.nameVar != null) node.nameVar.setParent(node);
                    return node;

        }
        public Object handleInquireSpec1277(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTInquireSpecNode node = new ASTInquireSpecNode();
                    node.hiddenTAccesseq = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.hiddenTAccesseq != null) node.hiddenTAccesseq.setParent(node);
                    node.accessVar = (ASTScalarVariableNode)valueStack.get(valueStackOffset + 1);
                    if (node.accessVar != null) node.accessVar.setParent(node);
                    return node;

        }
        public Object handleInquireSpec1278(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTInquireSpecNode node = new ASTInquireSpecNode();
                    node.hiddenTSequentialeq = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.hiddenTSequentialeq != null) node.hiddenTSequentialeq.setParent(node);
                    node.sequentialVar = (ASTScalarVariableNode)valueStack.get(valueStackOffset + 1);
                    if (node.sequentialVar != null) node.sequentialVar.setParent(node);
                    return node;

        }
        public Object handleInquireSpec1279(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTInquireSpecNode node = new ASTInquireSpecNode();
                    node.hiddenTDirecteq = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.hiddenTDirecteq != null) node.hiddenTDirecteq.setParent(node);
                    node.directVar = (ASTScalarVariableNode)valueStack.get(valueStackOffset + 1);
                    if (node.directVar != null) node.directVar.setParent(node);
                    return node;

        }
        public Object handleInquireSpec1280(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTInquireSpecNode node = new ASTInquireSpecNode();
                    node.hiddenTFormeq = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.hiddenTFormeq != null) node.hiddenTFormeq.setParent(node);
                    node.formVar = (ASTScalarVariableNode)valueStack.get(valueStackOffset + 1);
                    if (node.formVar != null) node.formVar.setParent(node);
                    return node;

        }
        public Object handleInquireSpec1281(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTInquireSpecNode node = new ASTInquireSpecNode();
                    node.hiddenTFormattedeq = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.hiddenTFormattedeq != null) node.hiddenTFormattedeq.setParent(node);
                    node.formattedVar = (ASTScalarVariableNode)valueStack.get(valueStackOffset + 1);
                    if (node.formattedVar != null) node.formattedVar.setParent(node);
                    return node;

        }
        public Object handleInquireSpec1282(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTInquireSpecNode node = new ASTInquireSpecNode();
                    node.hiddenTUnformattedeq = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.hiddenTUnformattedeq != null) node.hiddenTUnformattedeq.setParent(node);
                    node.unformattedVar = (ASTScalarVariableNode)valueStack.get(valueStackOffset + 1);
                    if (node.unformattedVar != null) node.unformattedVar.setParent(node);
                    return node;

        }
        public Object handleInquireSpec1283(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTInquireSpecNode node = new ASTInquireSpecNode();
                    node.hiddenTRecleq = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.hiddenTRecleq != null) node.hiddenTRecleq.setParent(node);
                    node.reclExpr = (IExpr)valueStack.get(valueStackOffset + 1);
                    if (node.reclExpr != null) node.reclExpr.setParent(node);
                    return node;

        }
        public Object handleInquireSpec1284(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTInquireSpecNode node = new ASTInquireSpecNode();
                    node.hiddenTNextreceq = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.hiddenTNextreceq != null) node.hiddenTNextreceq.setParent(node);
                    node.nextRecVar = (ASTScalarVariableNode)valueStack.get(valueStackOffset + 1);
                    if (node.nextRecVar != null) node.nextRecVar.setParent(node);
                    return node;

        }
        public Object handleInquireSpec1285(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTInquireSpecNode node = new ASTInquireSpecNode();
                    node.hiddenTBlankeq = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.hiddenTBlankeq != null) node.hiddenTBlankeq.setParent(node);
                    node.blankVar = (ASTScalarVariableNode)valueStack.get(valueStackOffset + 1);
                    if (node.blankVar != null) node.blankVar.setParent(node);
                    return node;

        }
        public Object handleInquireSpec1286(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTInquireSpecNode node = new ASTInquireSpecNode();
                    node.hiddenTPositioneq = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.hiddenTPositioneq != null) node.hiddenTPositioneq.setParent(node);
                    node.positionVar = (ASTScalarVariableNode)valueStack.get(valueStackOffset + 1);
                    if (node.positionVar != null) node.positionVar.setParent(node);
                    return node;

        }
        public Object handleInquireSpec1287(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTInquireSpecNode node = new ASTInquireSpecNode();
                    node.hiddenTActioneq = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.hiddenTActioneq != null) node.hiddenTActioneq.setParent(node);
                    node.actionVar = (ASTScalarVariableNode)valueStack.get(valueStackOffset + 1);
                    if (node.actionVar != null) node.actionVar.setParent(node);
                    return node;

        }
        public Object handleInquireSpec1288(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTInquireSpecNode node = new ASTInquireSpecNode();
                    node.hiddenTReadeq = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.hiddenTReadeq != null) node.hiddenTReadeq.setParent(node);
                    node.readVar = (ASTScalarVariableNode)valueStack.get(valueStackOffset + 1);
                    if (node.readVar != null) node.readVar.setParent(node);
                    return node;

        }
        public Object handleInquireSpec1289(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTInquireSpecNode node = new ASTInquireSpecNode();
                    node.hiddenTWriteeq = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.hiddenTWriteeq != null) node.hiddenTWriteeq.setParent(node);
                    node.writeVar = (ASTScalarVariableNode)valueStack.get(valueStackOffset + 1);
                    if (node.writeVar != null) node.writeVar.setParent(node);
                    return node;

        }
        public Object handleInquireSpec1290(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTInquireSpecNode node = new ASTInquireSpecNode();
                    node.hiddenTReadwriteeq = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.hiddenTReadwriteeq != null) node.hiddenTReadwriteeq.setParent(node);
                    node.readWriteVar = (ASTScalarVariableNode)valueStack.get(valueStackOffset + 1);
                    if (node.readWriteVar != null) node.readWriteVar.setParent(node);
                    return node;

        }
        public Object handleInquireSpec1291(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTInquireSpecNode node = new ASTInquireSpecNode();
                    node.hiddenTDelimeq = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.hiddenTDelimeq != null) node.hiddenTDelimeq.setParent(node);
                    node.delimVar = (ASTScalarVariableNode)valueStack.get(valueStackOffset + 1);
                    if (node.delimVar != null) node.delimVar.setParent(node);
                    return node;

        }
        public Object handleInquireSpec1292(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTInquireSpecNode node = new ASTInquireSpecNode();
                    node.hiddenTPadeq = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.hiddenTPadeq != null) node.hiddenTPadeq.setParent(node);
                    node.padVar = (ASTScalarVariableNode)valueStack.get(valueStackOffset + 1);
                    if (node.padVar != null) node.padVar.setParent(node);
                    return node;

        }
        public Object handleInquireSpec1293(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTInquireSpecNode node = new ASTInquireSpecNode();
                    node.hiddenTAsynchronouseq = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.hiddenTAsynchronouseq != null) node.hiddenTAsynchronouseq.setParent(node);
                    node.asyncExpr = (ASTScalarVariableNode)valueStack.get(valueStackOffset + 1);
                    if (node.asyncExpr != null) node.asyncExpr.setParent(node);
                    return node;

        }
        public Object handleInquireSpec1294(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTInquireSpecNode node = new ASTInquireSpecNode();
                    node.hiddenTDecimaleq = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.hiddenTDecimaleq != null) node.hiddenTDecimaleq.setParent(node);
                    node.decimalExpr = (ASTScalarVariableNode)valueStack.get(valueStackOffset + 1);
                    if (node.decimalExpr != null) node.decimalExpr.setParent(node);
                    return node;

        }
        public Object handleInquireSpec1295(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTInquireSpecNode node = new ASTInquireSpecNode();
                    node.hiddenTEncodingeq = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.hiddenTEncodingeq != null) node.hiddenTEncodingeq.setParent(node);
                    node.encodingExpr = (ASTScalarVariableNode)valueStack.get(valueStackOffset + 1);
                    if (node.encodingExpr != null) node.encodingExpr.setParent(node);
                    return node;

        }
        public Object handleInquireSpec1296(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTInquireSpecNode node = new ASTInquireSpecNode();
                    node.hiddenTIdeq = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.hiddenTIdeq != null) node.hiddenTIdeq.setParent(node);
                    node.idVar = (ASTScalarVariableNode)valueStack.get(valueStackOffset + 1);
                    if (node.idVar != null) node.idVar.setParent(node);
                    return node;

        }
        public Object handleInquireSpec1297(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTInquireSpecNode node = new ASTInquireSpecNode();
                    node.hiddenTIomsgeq = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.hiddenTIomsgeq != null) node.hiddenTIomsgeq.setParent(node);
                    node.iomsgExpr = (ASTScalarVariableNode)valueStack.get(valueStackOffset + 1);
                    if (node.iomsgExpr != null) node.iomsgExpr.setParent(node);
                    return node;

        }
        public Object handleInquireSpec1298(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTInquireSpecNode node = new ASTInquireSpecNode();
                    node.hiddenTPendingeq = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.hiddenTPendingeq != null) node.hiddenTPendingeq.setParent(node);
                    node.pendingVar = (ASTScalarVariableNode)valueStack.get(valueStackOffset + 1);
                    if (node.pendingVar != null) node.pendingVar.setParent(node);
                    return node;

        }
        public Object handleInquireSpec1299(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTInquireSpecNode node = new ASTInquireSpecNode();
                    node.hiddenTPoseq = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.hiddenTPoseq != null) node.hiddenTPoseq.setParent(node);
                    node.posVar = (ASTScalarVariableNode)valueStack.get(valueStackOffset + 1);
                    if (node.posVar != null) node.posVar.setParent(node);
                    return node;

        }
        public Object handleInquireSpec1300(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTInquireSpecNode node = new ASTInquireSpecNode();
                    node.hiddenTRoundeq = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.hiddenTRoundeq != null) node.hiddenTRoundeq.setParent(node);
                    node.roundExpr = (ASTScalarVariableNode)valueStack.get(valueStackOffset + 1);
                    if (node.roundExpr != null) node.roundExpr.setParent(node);
                    return node;

        }
        public Object handleInquireSpec1301(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTInquireSpecNode node = new ASTInquireSpecNode();
                    node.hiddenTSigneq = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.hiddenTSigneq != null) node.hiddenTSigneq.setParent(node);
                    node.signExpr = (ASTScalarVariableNode)valueStack.get(valueStackOffset + 1);
                    if (node.signExpr != null) node.signExpr.setParent(node);
                    return node;

        }
        public Object handleInquireSpec1302(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTInquireSpecNode node = new ASTInquireSpecNode();
                    node.hiddenTSizeeq = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.hiddenTSizeeq != null) node.hiddenTSizeeq.setParent(node);
                    node.sizeVar = (ASTScalarVariableNode)valueStack.get(valueStackOffset + 1);
                    if (node.sizeVar != null) node.sizeVar.setParent(node);
                    return node;

        }
        public Object handleInquireSpec1303(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTInquireSpecNode node = new ASTInquireSpecNode();
                    node.hiddenTStreameq = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.hiddenTStreameq != null) node.hiddenTStreameq.setParent(node);
                    node.streamVar = (ASTScalarVariableNode)valueStack.get(valueStackOffset + 1);
                    if (node.streamVar != null) node.streamVar.setParent(node);
                    return node;

        }
        public Object handleFormatStmt1304(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTFormatStmtNode node = new ASTFormatStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTFormat = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTFormat != null) node.hiddenTFormat.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleFormatStmt1305(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTFormatStmtNode node = new ASTFormatStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTFormat = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTFormat != null) node.hiddenTFormat.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.fmtSpec = (IASTListNode<ASTFmtSpecNode>)valueStack.get(valueStackOffset + 3);
                    if (node.fmtSpec != null) node.fmtSpec.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 5);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleFmtSpec1306(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 10
                    ASTFmtSpecNode node = new ASTFmtSpecNode();
                    node.formatEdit = (ASTFormatEditNode)valueStack.get(valueStackOffset + 0);
                    if (node.formatEdit != null) node.formatEdit.setParent(node);
                    ASTListNode<ASTFmtSpecNode> list = new ASTListNode<ASTFmtSpecNode>();
                    list.add(node);
                    node.setParent(list);
                    return list;

        }
        public Object handleFmtSpec1307(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 10
                    ASTFmtSpecNode node = new ASTFmtSpecNode();
                    node.colonFormatSep = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("colonFormatSep");
                    if (node.colonFormatSep != null) node.colonFormatSep.setParent(node);
                    node.slashFormatSep = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("slashFormatSep");
                    if (node.slashFormatSep != null) node.slashFormatSep.setParent(node);
                    ASTListNode<ASTFmtSpecNode> list = new ASTListNode<ASTFmtSpecNode>();
                    list.add(node);
                    node.setParent(list);
                    return list;

        }
        public Object handleFmtSpec1308(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 10
                    ASTFmtSpecNode node = new ASTFmtSpecNode();
                    node.colonFormatSep = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("colonFormatSep");
                    if (node.colonFormatSep != null) node.colonFormatSep.setParent(node);
                    node.slashFormatSep = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("slashFormatSep");
                    if (node.slashFormatSep != null) node.slashFormatSep.setParent(node);
                    node.formatEdit = (ASTFormatEditNode)valueStack.get(valueStackOffset + 1);
                    if (node.formatEdit != null) node.formatEdit.setParent(node);
                    ASTListNode<ASTFmtSpecNode> list = new ASTListNode<ASTFmtSpecNode>();
                    list.add(node);
                    node.setParent(list);
                    return list;

        }
        public Object handleFmtSpec1309(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 11
                    ASTFmtSpecNode node = new ASTFmtSpecNode();
                    node.colonFormatSep = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("colonFormatSep");
                    if (node.colonFormatSep != null) node.colonFormatSep.setParent(node);
                    node.slashFormatSep = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("slashFormatSep");
                    if (node.slashFormatSep != null) node.slashFormatSep.setParent(node);
                    ASTListNode<ASTFmtSpecNode> list = (ASTListNode<ASTFmtSpecNode>)valueStack.get(valueStackOffset);
                    list.add(node);
                    node.setParent(list);
                    return list;

        }
        public Object handleFmtSpec1310(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 11
                    ASTFmtSpecNode node = new ASTFmtSpecNode();
                    node.colonFormatSep = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("colonFormatSep");
                    if (node.colonFormatSep != null) node.colonFormatSep.setParent(node);
                    node.slashFormatSep = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("slashFormatSep");
                    if (node.slashFormatSep != null) node.slashFormatSep.setParent(node);
                    node.formatEdit = (ASTFormatEditNode)valueStack.get(valueStackOffset + 2);
                    if (node.formatEdit != null) node.formatEdit.setParent(node);
                    ASTListNode<ASTFmtSpecNode> list = (ASTListNode<ASTFmtSpecNode>)valueStack.get(valueStackOffset);
                    list.add(node);
                    node.setParent(list);
                    return list;

        }
        public Object handleFmtSpec1311(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 11
                    ASTFmtSpecNode node = new ASTFmtSpecNode();
                    node.hiddenTComma = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTComma != null) node.hiddenTComma.setParent(node);
                    node.formatEdit = (ASTFormatEditNode)valueStack.get(valueStackOffset + 2);
                    if (node.formatEdit != null) node.formatEdit.setParent(node);
                    ASTListNode<ASTFmtSpecNode> list = (ASTListNode<ASTFmtSpecNode>)valueStack.get(valueStackOffset);
                    list.add(node);
                    node.setParent(list);
                    return list;

        }
        public Object handleFmtSpec1312(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 11
                    ASTFmtSpecNode node = new ASTFmtSpecNode();
                    node.hiddenTComma = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTComma != null) node.hiddenTComma.setParent(node);
                    node.colonFormatSep = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 2)).get("colonFormatSep");
                    if (node.colonFormatSep != null) node.colonFormatSep.setParent(node);
                    node.slashFormatSep = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 2)).get("slashFormatSep");
                    if (node.slashFormatSep != null) node.slashFormatSep.setParent(node);
                    ASTListNode<ASTFmtSpecNode> list = (ASTListNode<ASTFmtSpecNode>)valueStack.get(valueStackOffset);
                    list.add(node);
                    node.setParent(list);
                    return list;

        }
        public Object handleFmtSpec1313(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 11
                    ASTFmtSpecNode node = new ASTFmtSpecNode();
                    node.hiddenTComma = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTComma != null) node.hiddenTComma.setParent(node);
                    node.colonFormatSep = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 2)).get("colonFormatSep");
                    if (node.colonFormatSep != null) node.colonFormatSep.setParent(node);
                    node.slashFormatSep = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 2)).get("slashFormatSep");
                    if (node.slashFormatSep != null) node.slashFormatSep.setParent(node);
                    node.formatEdit = (ASTFormatEditNode)valueStack.get(valueStackOffset + 3);
                    if (node.formatEdit != null) node.formatEdit.setParent(node);
                    ASTListNode<ASTFmtSpecNode> list = (ASTListNode<ASTFmtSpecNode>)valueStack.get(valueStackOffset);
                    list.add(node);
                    node.setParent(list);
                    return list;

        }
        public Object handleFormatEdit1314(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTFormatEditNode node = new ASTFormatEditNode();
                    node.editElement = (ASTEditElementNode)valueStack.get(valueStackOffset + 0);
                    if (node.editElement != null) node.editElement.setParent(node);
                    return node;

        }
        public Object handleFormatEdit1315(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTFormatEditNode node = new ASTFormatEditNode();
                    node.intConst = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.intConst != null) node.intConst.setParent(node);
                    node.editElement = (ASTEditElementNode)valueStack.get(valueStackOffset + 1);
                    if (node.editElement != null) node.editElement.setParent(node);
                    return node;

        }
        public Object handleFormatEdit1316(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTFormatEditNode node = new ASTFormatEditNode();
                    node.hexConst = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.hexConst != null) node.hexConst.setParent(node);
                    return node;

        }
        public Object handleFormatEdit1317(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTFormatEditNode node = new ASTFormatEditNode();
                    node.pConst = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.pConst != null) node.pConst.setParent(node);
                    return node;

        }
        public Object handleFormatEdit1318(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTFormatEditNode node = new ASTFormatEditNode();
                    node.pConst = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.pConst != null) node.pConst.setParent(node);
                    node.editElement = (ASTEditElementNode)valueStack.get(valueStackOffset + 1);
                    if (node.editElement != null) node.editElement.setParent(node);
                    return node;

        }
        public Object handleFormatEdit1319(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTFormatEditNode node = new ASTFormatEditNode();
                    node.pConst = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.pConst != null) node.pConst.setParent(node);
                    node.intConst = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.intConst != null) node.intConst.setParent(node);
                    node.editElement = (ASTEditElementNode)valueStack.get(valueStackOffset + 2);
                    if (node.editElement != null) node.editElement.setParent(node);
                    return node;

        }
        public Object handleEditElement1320(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTEditElementNode node = new ASTEditElementNode();
                    node.floatConst = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.floatConst != null) node.floatConst.setParent(node);
                    return node;

        }
        public Object handleEditElement1321(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTEditElementNode node = new ASTEditElementNode();
                    node.stringConst = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.stringConst != null) node.stringConst.setParent(node);
                    return node;

        }
        public Object handleEditElement1322(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTEditElementNode node = new ASTEditElementNode();
                    node.identifier = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.identifier != null) node.identifier.setParent(node);
                    return node;

        }
        public Object handleEditElement1323(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTEditElementNode node = new ASTEditElementNode();
                    node.hollerith = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.hollerith != null) node.hollerith.setParent(node);
                    return node;

        }
        public Object handleEditElement1324(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTEditElementNode node = new ASTEditElementNode();
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.fmtSpec = (IASTListNode<ASTFmtSpecNode>)valueStack.get(valueStackOffset + 1);
                    if (node.fmtSpec != null) node.fmtSpec.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    return node;

        }
        public Object handleFormatsep1325(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 3 and 4
                    Map<String, Object> node = new HashMap<String, Object>();
                    node.put("slashFormatSep", (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0));
                    ASTListNode<IASTNode> embeddedList = new ASTListNode<IASTNode>();
                    embeddedList.add((IASTNode)(node.get("colonFormatSep")));
                    embeddedList.add((IASTNode)(node.get("slashFormatSep")));
                    node.put("errorRecoveryList", embeddedList);
                    return node;

        }
        public Object handleFormatsep1326(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 3 and 4
                    Map<String, Object> node = new HashMap<String, Object>();
                    node.put("colonFormatSep", (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0));
                    ASTListNode<IASTNode> embeddedList = new ASTListNode<IASTNode>();
                    embeddedList.add((IASTNode)(node.get("colonFormatSep")));
                    embeddedList.add((IASTNode)(node.get("slashFormatSep")));
                    node.put("errorRecoveryList", embeddedList);
                    return node;

        }
        public Object handleProgramStmt1327(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTProgramStmtNode node = new ASTProgramStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.programToken = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.programToken != null) node.programToken.setParent(node);
                    node.programName = (ASTProgramNameNode)valueStack.get(valueStackOffset + 2);
                    if (node.programName != null) node.programName.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleEndProgramStmt1328(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTEndProgramStmtNode node = new ASTEndProgramStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.endToken = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.endToken != null) node.endToken.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleEndProgramStmt1329(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTEndProgramStmtNode node = new ASTEndProgramStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.endToken = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.endToken != null) node.endToken.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleEndProgramStmt1330(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTEndProgramStmtNode node = new ASTEndProgramStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.endToken = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.endToken != null) node.endToken.setParent(node);
                    node.endName = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 2)).get("endName");
                    if (node.endName != null) node.endName.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleEndProgramStmt1331(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTEndProgramStmtNode node = new ASTEndProgramStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.endToken = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.endToken != null) node.endToken.setParent(node);
                    node.hiddenTProgram = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTProgram != null) node.hiddenTProgram.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleEndProgramStmt1332(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTEndProgramStmtNode node = new ASTEndProgramStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.endToken = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.endToken != null) node.endToken.setParent(node);
                    node.hiddenTProgram = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTProgram != null) node.hiddenTProgram.setParent(node);
                    node.endName = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 3)).get("endName");
                    if (node.endName != null) node.endName.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleModuleStmt1333(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTModuleStmtNode node = new ASTModuleStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTModule = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTModule != null) node.hiddenTModule.setParent(node);
                    node.moduleName = (ASTModuleNameNode)valueStack.get(valueStackOffset + 2);
                    if (node.moduleName != null) node.moduleName.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleEndModuleStmt1334(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTEndModuleStmtNode node = new ASTEndModuleStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTEnd = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTEnd != null) node.hiddenTEnd.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleEndModuleStmt1335(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTEndModuleStmtNode node = new ASTEndModuleStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTEndmodule = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTEndmodule != null) node.hiddenTEndmodule.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleEndModuleStmt1336(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTEndModuleStmtNode node = new ASTEndModuleStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTEndmodule = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTEndmodule != null) node.hiddenTEndmodule.setParent(node);
                    node.endName = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 2)).get("endName");
                    if (node.endName != null) node.endName.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleEndModuleStmt1337(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTEndModuleStmtNode node = new ASTEndModuleStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTEnd = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTEnd != null) node.hiddenTEnd.setParent(node);
                    node.hiddenTModule = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTModule != null) node.hiddenTModule.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleEndModuleStmt1338(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTEndModuleStmtNode node = new ASTEndModuleStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTEnd = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTEnd != null) node.hiddenTEnd.setParent(node);
                    node.hiddenTModule = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTModule != null) node.hiddenTModule.setParent(node);
                    node.endName = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 3)).get("endName");
                    if (node.endName != null) node.endName.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleUseStmt1339(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTUseStmtNode node = new ASTUseStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.useToken = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.useToken != null) node.useToken.setParent(node);
                    node.hiddenHiddenTComma1 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenHiddenTComma1 != null) node.hiddenHiddenTComma1.setParent(node);
                    node.moduleNature = (ASTModuleNatureNode)valueStack.get(valueStackOffset + 3);
                    if (node.moduleNature != null) node.moduleNature.setParent(node);
                    node.hiddenHiddenTColon1 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenHiddenTColon1 != null) node.hiddenHiddenTColon1.setParent(node);
                    node.hiddenHiddenTColon2 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 5);
                    if (node.hiddenHiddenTColon2 != null) node.hiddenHiddenTColon2.setParent(node);
                    node.name = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 6)).get("name");
                    if (node.name != null) node.name.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 7);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleUseStmt1340(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTUseStmtNode node = new ASTUseStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.useToken = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.useToken != null) node.useToken.setParent(node);
                    node.hiddenHiddenTComma1 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenHiddenTComma1 != null) node.hiddenHiddenTComma1.setParent(node);
                    node.moduleNature = (ASTModuleNatureNode)valueStack.get(valueStackOffset + 3);
                    if (node.moduleNature != null) node.moduleNature.setParent(node);
                    node.hiddenHiddenTColon1 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenHiddenTColon1 != null) node.hiddenHiddenTColon1.setParent(node);
                    node.hiddenHiddenTColon2 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 5);
                    if (node.hiddenHiddenTColon2 != null) node.hiddenHiddenTColon2.setParent(node);
                    node.name = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 6)).get("name");
                    if (node.name != null) node.name.setParent(node);
                    node.hiddenTComma = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 7);
                    if (node.hiddenTComma != null) node.hiddenTComma.setParent(node);
                    node.renameList = (IASTListNode<ASTRenameNode>)valueStack.get(valueStackOffset + 8);
                    if (node.renameList != null) node.renameList.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 9);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleUseStmt1341(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTUseStmtNode node = new ASTUseStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.useToken = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.useToken != null) node.useToken.setParent(node);
                    node.hiddenHiddenTComma1 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenHiddenTComma1 != null) node.hiddenHiddenTComma1.setParent(node);
                    node.moduleNature = (ASTModuleNatureNode)valueStack.get(valueStackOffset + 3);
                    if (node.moduleNature != null) node.moduleNature.setParent(node);
                    node.hiddenHiddenTColon1 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenHiddenTColon1 != null) node.hiddenHiddenTColon1.setParent(node);
                    node.hiddenHiddenTColon2 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 5);
                    if (node.hiddenHiddenTColon2 != null) node.hiddenHiddenTColon2.setParent(node);
                    node.name = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 6)).get("name");
                    if (node.name != null) node.name.setParent(node);
                    node.hiddenTComma = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 7);
                    if (node.hiddenTComma != null) node.hiddenTComma.setParent(node);
                    node.hiddenTOnly = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 8);
                    if (node.hiddenTOnly != null) node.hiddenTOnly.setParent(node);
                    node.hiddenTColon = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 9);
                    if (node.hiddenTColon != null) node.hiddenTColon.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 10);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleUseStmt1342(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTUseStmtNode node = new ASTUseStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.useToken = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.useToken != null) node.useToken.setParent(node);
                    node.hiddenHiddenTComma1 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenHiddenTComma1 != null) node.hiddenHiddenTComma1.setParent(node);
                    node.moduleNature = (ASTModuleNatureNode)valueStack.get(valueStackOffset + 3);
                    if (node.moduleNature != null) node.moduleNature.setParent(node);
                    node.hiddenHiddenTColon1 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenHiddenTColon1 != null) node.hiddenHiddenTColon1.setParent(node);
                    node.hiddenHiddenTColon2 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 5);
                    if (node.hiddenHiddenTColon2 != null) node.hiddenHiddenTColon2.setParent(node);
                    node.name = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 6)).get("name");
                    if (node.name != null) node.name.setParent(node);
                    node.hiddenTComma = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 7);
                    if (node.hiddenTComma != null) node.hiddenTComma.setParent(node);
                    node.hiddenTOnly = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 8);
                    if (node.hiddenTOnly != null) node.hiddenTOnly.setParent(node);
                    node.hiddenTColon = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 9);
                    if (node.hiddenTColon != null) node.hiddenTColon.setParent(node);
                    node.onlyList = (IASTListNode<ASTOnlyNode>)valueStack.get(valueStackOffset + 10);
                    if (node.onlyList != null) node.onlyList.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 11);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleUseStmt1343(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTUseStmtNode node = new ASTUseStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.useToken = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.useToken != null) node.useToken.setParent(node);
                    node.hiddenHiddenTColon1 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenHiddenTColon1 != null) node.hiddenHiddenTColon1.setParent(node);
                    node.hiddenHiddenTColon2 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenHiddenTColon2 != null) node.hiddenHiddenTColon2.setParent(node);
                    node.name = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 4)).get("name");
                    if (node.name != null) node.name.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 5);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleUseStmt1344(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTUseStmtNode node = new ASTUseStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.useToken = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.useToken != null) node.useToken.setParent(node);
                    node.hiddenHiddenTColon1 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenHiddenTColon1 != null) node.hiddenHiddenTColon1.setParent(node);
                    node.hiddenHiddenTColon2 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenHiddenTColon2 != null) node.hiddenHiddenTColon2.setParent(node);
                    node.name = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 4)).get("name");
                    if (node.name != null) node.name.setParent(node);
                    node.hiddenTComma = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 5);
                    if (node.hiddenTComma != null) node.hiddenTComma.setParent(node);
                    node.renameList = (IASTListNode<ASTRenameNode>)valueStack.get(valueStackOffset + 6);
                    if (node.renameList != null) node.renameList.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 7);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleUseStmt1345(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTUseStmtNode node = new ASTUseStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.useToken = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.useToken != null) node.useToken.setParent(node);
                    node.hiddenHiddenTColon1 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenHiddenTColon1 != null) node.hiddenHiddenTColon1.setParent(node);
                    node.hiddenHiddenTColon2 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenHiddenTColon2 != null) node.hiddenHiddenTColon2.setParent(node);
                    node.name = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 4)).get("name");
                    if (node.name != null) node.name.setParent(node);
                    node.hiddenTComma = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 5);
                    if (node.hiddenTComma != null) node.hiddenTComma.setParent(node);
                    node.hiddenTOnly = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 6);
                    if (node.hiddenTOnly != null) node.hiddenTOnly.setParent(node);
                    node.hiddenTColon = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 7);
                    if (node.hiddenTColon != null) node.hiddenTColon.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 8);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleUseStmt1346(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTUseStmtNode node = new ASTUseStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.useToken = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.useToken != null) node.useToken.setParent(node);
                    node.hiddenHiddenTColon1 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenHiddenTColon1 != null) node.hiddenHiddenTColon1.setParent(node);
                    node.hiddenHiddenTColon2 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenHiddenTColon2 != null) node.hiddenHiddenTColon2.setParent(node);
                    node.name = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 4)).get("name");
                    if (node.name != null) node.name.setParent(node);
                    node.hiddenTComma = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 5);
                    if (node.hiddenTComma != null) node.hiddenTComma.setParent(node);
                    node.hiddenTOnly = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 6);
                    if (node.hiddenTOnly != null) node.hiddenTOnly.setParent(node);
                    node.hiddenTColon = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 7);
                    if (node.hiddenTColon != null) node.hiddenTColon.setParent(node);
                    node.onlyList = (IASTListNode<ASTOnlyNode>)valueStack.get(valueStackOffset + 8);
                    if (node.onlyList != null) node.onlyList.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 9);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleUseStmt1347(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTUseStmtNode node = new ASTUseStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.useToken = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.useToken != null) node.useToken.setParent(node);
                    node.name = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 2)).get("name");
                    if (node.name != null) node.name.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleUseStmt1348(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTUseStmtNode node = new ASTUseStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.useToken = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.useToken != null) node.useToken.setParent(node);
                    node.name = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 2)).get("name");
                    if (node.name != null) node.name.setParent(node);
                    node.hiddenTComma = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTComma != null) node.hiddenTComma.setParent(node);
                    node.renameList = (IASTListNode<ASTRenameNode>)valueStack.get(valueStackOffset + 4);
                    if (node.renameList != null) node.renameList.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 5);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleUseStmt1349(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTUseStmtNode node = new ASTUseStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.useToken = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.useToken != null) node.useToken.setParent(node);
                    node.name = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 2)).get("name");
                    if (node.name != null) node.name.setParent(node);
                    node.hiddenTComma = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTComma != null) node.hiddenTComma.setParent(node);
                    node.hiddenTOnly = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenTOnly != null) node.hiddenTOnly.setParent(node);
                    node.hiddenTColon = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 5);
                    if (node.hiddenTColon != null) node.hiddenTColon.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 6);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleUseStmt1350(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTUseStmtNode node = new ASTUseStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.useToken = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.useToken != null) node.useToken.setParent(node);
                    node.name = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 2)).get("name");
                    if (node.name != null) node.name.setParent(node);
                    node.hiddenTComma = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTComma != null) node.hiddenTComma.setParent(node);
                    node.hiddenTOnly = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenTOnly != null) node.hiddenTOnly.setParent(node);
                    node.hiddenTColon = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 5);
                    if (node.hiddenTColon != null) node.hiddenTColon.setParent(node);
                    node.onlyList = (IASTListNode<ASTOnlyNode>)valueStack.get(valueStackOffset + 6);
                    if (node.onlyList != null) node.onlyList.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 7);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleModuleNature1351(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTModuleNatureNode node = new ASTModuleNatureNode();
                    node.isIntrinsic = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.isIntrinsic != null) node.isIntrinsic.setParent(node);
                    return node;

        }
        public Object handleModuleNature1352(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTModuleNatureNode node = new ASTModuleNatureNode();
                    node.isNonIntrinsic = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.isNonIntrinsic != null) node.isNonIntrinsic.setParent(node);
                    return node;

        }
        public Object handleRenameList1353(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 7 with separator
                    ASTSeparatedListNode<ASTRenameNode> list = new ASTSeparatedListNode<ASTRenameNode>();
                    ASTRenameNode elt = (ASTRenameNode)valueStack.get(valueStackOffset + 0);
                    list.add(null, elt);
                    if (elt != null) elt.setParent(list);
                    return list;

        }
        public Object handleRenameList1354(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 8 with separator
                    ASTSeparatedListNode<ASTRenameNode> list = (ASTSeparatedListNode<ASTRenameNode>)valueStack.get(valueStackOffset);
                    org.eclipse.photran.internal.core.lexer.Token token = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    ASTRenameNode elt = (ASTRenameNode)valueStack.get(valueStackOffset + 2);
                    list.add(token, elt);
                    token.setParent(list);
                    if (elt != null) elt.setParent(list);
                    return list;

        }
        public Object handleOnlyList1355(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 7 with separator
                    ASTSeparatedListNode<ASTOnlyNode> list = new ASTSeparatedListNode<ASTOnlyNode>();
                    ASTOnlyNode elt = (ASTOnlyNode)valueStack.get(valueStackOffset + 0);
                    list.add(null, elt);
                    if (elt != null) elt.setParent(list);
                    return list;

        }
        public Object handleOnlyList1356(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 8 with separator
                    ASTSeparatedListNode<ASTOnlyNode> list = (ASTSeparatedListNode<ASTOnlyNode>)valueStack.get(valueStackOffset);
                    org.eclipse.photran.internal.core.lexer.Token token = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    ASTOnlyNode elt = (ASTOnlyNode)valueStack.get(valueStackOffset + 2);
                    list.add(token, elt);
                    token.setParent(list);
                    if (elt != null) elt.setParent(list);
                    return list;

        }
        public Object handleRename1357(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTRenameNode node = new ASTRenameNode();
                    node.newName = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.newName != null) node.newName.setParent(node);
                    node.hiddenTEqgreaterthan = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTEqgreaterthan != null) node.hiddenTEqgreaterthan.setParent(node);
                    node.name = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 2)).get("name");
                    if (node.name != null) node.name.setParent(node);
                    return node;

        }
        public Object handleRename1358(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTRenameNode node = new ASTRenameNode();
                    node.isOperator = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.isOperator != null) node.isOperator.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.newName = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.newName != null) node.newName.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    node.hiddenTEqgreaterthan = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenTEqgreaterthan != null) node.hiddenTEqgreaterthan.setParent(node);
                    node.hiddenTOperator = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 5);
                    if (node.hiddenTOperator != null) node.hiddenTOperator.setParent(node);
                    node.hiddenTLparen2 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 6);
                    if (node.hiddenTLparen2 != null) node.hiddenTLparen2.setParent(node);
                    node.name = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 7);
                    if (node.name != null) node.name.setParent(node);
                    node.hiddenTRparen2 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 8);
                    if (node.hiddenTRparen2 != null) node.hiddenTRparen2.setParent(node);
                    return node;

        }
        public Object handleOnly1359(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTOnlyNode node = new ASTOnlyNode();
                    node.genericSpec = (ASTGenericSpecNode)valueStack.get(valueStackOffset + 0);
                    if (node.genericSpec != null) node.genericSpec.setParent(node);
                    return node;

        }
        public Object handleOnly1360(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTOnlyNode node = new ASTOnlyNode();
                    node.name = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("name");
                    if (node.name != null) node.name.setParent(node);
                    return node;

        }
        public Object handleOnly1361(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTOnlyNode node = new ASTOnlyNode();
                    node.newName = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.newName != null) node.newName.setParent(node);
                    node.isRenamed = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.isRenamed != null) node.isRenamed.setParent(node);
                    node.name = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 2)).get("name");
                    if (node.name != null) node.name.setParent(node);
                    return node;

        }
        public Object handleOnly1362(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTOnlyNode node = new ASTOnlyNode();
                    node.isOperator = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.isOperator != null) node.isOperator.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.newOp = (IDefinedOperator)valueStack.get(valueStackOffset + 2);
                    if (node.newOp != null) node.newOp.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    node.isRenamed = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.isRenamed != null) node.isRenamed.setParent(node);
                    node.hiddenTOperator = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 5);
                    if (node.hiddenTOperator != null) node.hiddenTOperator.setParent(node);
                    node.hiddenTLparen2 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 6);
                    if (node.hiddenTLparen2 != null) node.hiddenTLparen2.setParent(node);
                    node.oldOp = (IDefinedOperator)valueStack.get(valueStackOffset + 7);
                    if (node.oldOp != null) node.oldOp.setParent(node);
                    node.hiddenTRparen2 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 8);
                    if (node.hiddenTRparen2 != null) node.hiddenTRparen2.setParent(node);
                    return node;

        }
        public Object handleBlockDataStmt1363(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTBlockDataStmtNode node = new ASTBlockDataStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.blockDataToken = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.blockDataToken != null) node.blockDataToken.setParent(node);
                    node.blockDataName = (ASTBlockDataNameNode)valueStack.get(valueStackOffset + 2);
                    if (node.blockDataName != null) node.blockDataName.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleBlockDataStmt1364(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTBlockDataStmtNode node = new ASTBlockDataStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.blockDataToken = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.blockDataToken != null) node.blockDataToken.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleBlockDataStmt1365(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTBlockDataStmtNode node = new ASTBlockDataStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.blockDataToken = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.blockDataToken != null) node.blockDataToken.setParent(node);
                    node.hiddenTData = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTData != null) node.hiddenTData.setParent(node);
                    node.blockDataName = (ASTBlockDataNameNode)valueStack.get(valueStackOffset + 3);
                    if (node.blockDataName != null) node.blockDataName.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleBlockDataStmt1366(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTBlockDataStmtNode node = new ASTBlockDataStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.blockDataToken = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.blockDataToken != null) node.blockDataToken.setParent(node);
                    node.hiddenTData = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTData != null) node.hiddenTData.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleEndBlockDataStmt1367(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTEndBlockDataStmtNode node = new ASTEndBlockDataStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTEnd = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTEnd != null) node.hiddenTEnd.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleEndBlockDataStmt1368(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTEndBlockDataStmtNode node = new ASTEndBlockDataStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTEndblockdata = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTEndblockdata != null) node.hiddenTEndblockdata.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleEndBlockDataStmt1369(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTEndBlockDataStmtNode node = new ASTEndBlockDataStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTEndblockdata = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTEndblockdata != null) node.hiddenTEndblockdata.setParent(node);
                    node.endName = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 2)).get("endName");
                    if (node.endName != null) node.endName.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleEndBlockDataStmt1370(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTEndBlockDataStmtNode node = new ASTEndBlockDataStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTEnd = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTEnd != null) node.hiddenTEnd.setParent(node);
                    node.hiddenTBlockdata = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTBlockdata != null) node.hiddenTBlockdata.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleEndBlockDataStmt1371(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTEndBlockDataStmtNode node = new ASTEndBlockDataStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTEnd = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTEnd != null) node.hiddenTEnd.setParent(node);
                    node.hiddenTBlockdata = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTBlockdata != null) node.hiddenTBlockdata.setParent(node);
                    node.endName = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 3)).get("endName");
                    if (node.endName != null) node.endName.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleEndBlockDataStmt1372(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTEndBlockDataStmtNode node = new ASTEndBlockDataStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTEndblock = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTEndblock != null) node.hiddenTEndblock.setParent(node);
                    node.hiddenTData = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTData != null) node.hiddenTData.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleEndBlockDataStmt1373(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTEndBlockDataStmtNode node = new ASTEndBlockDataStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTEndblock = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTEndblock != null) node.hiddenTEndblock.setParent(node);
                    node.hiddenTData = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTData != null) node.hiddenTData.setParent(node);
                    node.endName = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 3)).get("endName");
                    if (node.endName != null) node.endName.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleEndBlockDataStmt1374(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTEndBlockDataStmtNode node = new ASTEndBlockDataStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTEnd = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTEnd != null) node.hiddenTEnd.setParent(node);
                    node.hiddenTBlock = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTBlock != null) node.hiddenTBlock.setParent(node);
                    node.hiddenTData = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTData != null) node.hiddenTData.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleEndBlockDataStmt1375(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTEndBlockDataStmtNode node = new ASTEndBlockDataStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTEnd = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTEnd != null) node.hiddenTEnd.setParent(node);
                    node.hiddenTBlock = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTBlock != null) node.hiddenTBlock.setParent(node);
                    node.hiddenTData = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTData != null) node.hiddenTData.setParent(node);
                    node.endName = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 4)).get("endName");
                    if (node.endName != null) node.endName.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 5);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleInterfaceBlock1376(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTInterfaceBlockNode node = new ASTInterfaceBlockNode();
                    node.interfaceStmt = (ASTInterfaceStmtNode)valueStack.get(valueStackOffset + 0);
                    if (node.interfaceStmt != null) node.interfaceStmt.setParent(node);
                    node.interfaceBlockBody = (IASTListNode<IInterfaceSpecification>)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("interfaceBlockBody");
                    if (node.interfaceBlockBody != null) node.interfaceBlockBody.setParent(node);
                    node.endInterfaceStmt = (ASTEndInterfaceStmtNode)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("endInterfaceStmt");
                    if (node.endInterfaceStmt != null) node.endInterfaceStmt.setParent(node);
                    return node;

        }
        public Object handleInterfaceRange1377(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 3 and 4
                    Map<String, Object> node = new HashMap<String, Object>();
                    node.put("interfaceBlockBody", (IASTListNode<IInterfaceSpecification>)valueStack.get(valueStackOffset + 0));
                    node.put("endInterfaceStmt", (ASTEndInterfaceStmtNode)valueStack.get(valueStackOffset + 1));
                    ASTListNode<IASTNode> embeddedList = new ASTListNode<IASTNode>();
                    embeddedList.add((IASTNode)(node.get("interfaceBlockBody")));
                    embeddedList.add((IASTNode)(node.get("endInterfaceStmt")));
                    node.put("errorRecoveryList", embeddedList);
                    return node;

        }
        public Object handleInterfaceBlockBody1378(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 7
                    IASTListNode<IInterfaceSpecification> list = new ASTListNode<IInterfaceSpecification>();
                    IInterfaceSpecification elt = (IInterfaceSpecification)valueStack.get(valueStackOffset + 0);
                    list.add(elt);
                    if (elt != null) elt.setParent(list);
                    return list;

        }
        public Object handleInterfaceBlockBody1379(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 8
                    IASTListNode<IInterfaceSpecification> list = (IASTListNode<IInterfaceSpecification>)valueStack.get(valueStackOffset);
                    IInterfaceSpecification elt = (IInterfaceSpecification)valueStack.get(valueStackOffset + 1);
                    list.add(elt);
                    if (elt != null) elt.setParent(list);
                    return list;

        }
        public Object handleInterfaceSpecification1380(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 5
                    ASTInterfaceBodyNode result = (ASTInterfaceBodyNode)valueStack.get(valueStackOffset + 0);
                    return result;

        }
        public Object handleInterfaceSpecification1381(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 5
                    ASTModuleProcedureStmtNode result = (ASTModuleProcedureStmtNode)valueStack.get(valueStackOffset + 0);
                    return result;

        }
        public Object handleInterfaceStmt1382(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTInterfaceStmtNode node = new ASTInterfaceStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.interfaceToken = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.interfaceToken != null) node.interfaceToken.setParent(node);
                    node.genericName = (ASTGenericNameNode)valueStack.get(valueStackOffset + 2);
                    if (node.genericName != null) node.genericName.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleInterfaceStmt1383(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTInterfaceStmtNode node = new ASTInterfaceStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.interfaceToken = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.interfaceToken != null) node.interfaceToken.setParent(node);
                    node.genericSpec = (ASTGenericSpecNode)valueStack.get(valueStackOffset + 2);
                    if (node.genericSpec != null) node.genericSpec.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleInterfaceStmt1384(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTInterfaceStmtNode node = new ASTInterfaceStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.interfaceToken = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.interfaceToken != null) node.interfaceToken.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleInterfaceStmt1385(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTInterfaceStmtNode node = new ASTInterfaceStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.isAbstract = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.isAbstract != null) node.isAbstract.setParent(node);
                    node.interfaceToken = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.interfaceToken != null) node.interfaceToken.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleEndInterfaceStmt1386(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTEndInterfaceStmtNode node = new ASTEndInterfaceStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTEndinterface = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTEndinterface != null) node.hiddenTEndinterface.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleEndInterfaceStmt1387(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTEndInterfaceStmtNode node = new ASTEndInterfaceStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTEndinterface = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTEndinterface != null) node.hiddenTEndinterface.setParent(node);
                    ASTEndNameNode tmp2 = new ASTEndNameNode();
                    tmp2.endName = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 2)).get("endName");
                    if (tmp2.endName != null) tmp2.endName.setParent(tmp2);
                    node.endName = tmp2;
                    if (tmp2 != null) tmp2.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleEndInterfaceStmt1388(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTEndInterfaceStmtNode node = new ASTEndInterfaceStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTEnd = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTEnd != null) node.hiddenTEnd.setParent(node);
                    node.hiddenTInterface = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTInterface != null) node.hiddenTInterface.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleEndInterfaceStmt1389(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTEndInterfaceStmtNode node = new ASTEndInterfaceStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTEnd = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTEnd != null) node.hiddenTEnd.setParent(node);
                    node.hiddenTInterface = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTInterface != null) node.hiddenTInterface.setParent(node);
                    ASTEndNameNode tmp3 = new ASTEndNameNode();
                    tmp3.endName = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 3)).get("endName");
                    if (tmp3.endName != null) tmp3.endName.setParent(tmp3);
                    node.endName = tmp3;
                    if (tmp3 != null) tmp3.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleInterfaceBody1390(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTInterfaceBodyNode node = new ASTInterfaceBodyNode();
                    node.functionStmt = (ASTFunctionStmtNode)valueStack.get(valueStackOffset + 0);
                    if (node.functionStmt != null) node.functionStmt.setParent(node);
                    node.subprogramInterfaceBody = (IASTListNode<ISpecificationPartConstruct>)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("subprogramInterfaceBody");
                    if (node.subprogramInterfaceBody != null) node.subprogramInterfaceBody.setParent(node);
                    node.endFunctionStmt = (ASTEndFunctionStmtNode)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("endFunctionStmt");
                    if (node.endFunctionStmt != null) node.endFunctionStmt.setParent(node);
                    return node;

        }
        public Object handleInterfaceBody1391(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTInterfaceBodyNode node = new ASTInterfaceBodyNode();
                    node.subroutineStmt = (ASTSubroutineStmtNode)valueStack.get(valueStackOffset + 0);
                    if (node.subroutineStmt != null) node.subroutineStmt.setParent(node);
                    node.subprogramInterfaceBody = (IASTListNode<ISpecificationPartConstruct>)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("subprogramInterfaceBody");
                    if (node.subprogramInterfaceBody != null) node.subprogramInterfaceBody.setParent(node);
                    node.endSubroutineStmt = (ASTEndSubroutineStmtNode)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("endSubroutineStmt");
                    if (node.endSubroutineStmt != null) node.endSubroutineStmt.setParent(node);
                    return node;

        }
        public Object handleFunctionInterfaceRange1392(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 3 and 4
                    Map<String, Object> node = new HashMap<String, Object>();
                    node.put("subprogramInterfaceBody", (IASTListNode<ISpecificationPartConstruct>)valueStack.get(valueStackOffset + 0));
                    node.put("endFunctionStmt", (ASTEndFunctionStmtNode)valueStack.get(valueStackOffset + 1));
                    ASTListNode<IASTNode> embeddedList = new ASTListNode<IASTNode>();
                    embeddedList.add((IASTNode)(node.get("subprogramInterfaceBody")));
                    embeddedList.add((IASTNode)(node.get("endFunctionStmt")));
                    node.put("errorRecoveryList", embeddedList);
                    return node;

        }
        public Object handleFunctionInterfaceRange1393(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 3 and 4
                    Map<String, Object> node = new HashMap<String, Object>();
                    node.put("endFunctionStmt", (ASTEndFunctionStmtNode)valueStack.get(valueStackOffset + 0));
                    ASTListNode<IASTNode> embeddedList = new ASTListNode<IASTNode>();
                    embeddedList.add((IASTNode)(node.get("subprogramInterfaceBody")));
                    embeddedList.add((IASTNode)(node.get("endFunctionStmt")));
                    node.put("errorRecoveryList", embeddedList);
                    return node;

        }
        public Object handleSubroutineInterfaceRange1394(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 3 and 4
                    Map<String, Object> node = new HashMap<String, Object>();
                    node.put("subprogramInterfaceBody", (IASTListNode<ISpecificationPartConstruct>)valueStack.get(valueStackOffset + 0));
                    node.put("endSubroutineStmt", (ASTEndSubroutineStmtNode)valueStack.get(valueStackOffset + 1));
                    ASTListNode<IASTNode> embeddedList = new ASTListNode<IASTNode>();
                    embeddedList.add((IASTNode)(node.get("subprogramInterfaceBody")));
                    embeddedList.add((IASTNode)(node.get("endSubroutineStmt")));
                    node.put("errorRecoveryList", embeddedList);
                    return node;

        }
        public Object handleSubroutineInterfaceRange1395(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 3 and 4
                    Map<String, Object> node = new HashMap<String, Object>();
                    node.put("endSubroutineStmt", (ASTEndSubroutineStmtNode)valueStack.get(valueStackOffset + 0));
                    ASTListNode<IASTNode> embeddedList = new ASTListNode<IASTNode>();
                    embeddedList.add((IASTNode)(node.get("subprogramInterfaceBody")));
                    embeddedList.add((IASTNode)(node.get("endSubroutineStmt")));
                    node.put("errorRecoveryList", embeddedList);
                    return node;

        }
        public Object handleSubprogramInterfaceBody1396(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 7
                    IASTListNode<ISpecificationPartConstruct> list = new ASTListNode<ISpecificationPartConstruct>();
                    ISpecificationPartConstruct elt = (ISpecificationPartConstruct)valueStack.get(valueStackOffset + 0);
                    list.add(elt);
                    if (elt != null) elt.setParent(list);
                    return list;

        }
        public Object handleSubprogramInterfaceBody1397(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 8
                    IASTListNode<ISpecificationPartConstruct> list = (IASTListNode<ISpecificationPartConstruct>)valueStack.get(valueStackOffset);
                    ISpecificationPartConstruct elt = (ISpecificationPartConstruct)valueStack.get(valueStackOffset + 1);
                    list.add(elt);
                    if (elt != null) elt.setParent(list);
                    return list;

        }
        public Object handleModuleProcedureStmt1398(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTModuleProcedureStmtNode node = new ASTModuleProcedureStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTModule = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTModule != null) node.hiddenTModule.setParent(node);
                    node.hiddenTProcedure = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTProcedure != null) node.hiddenTProcedure.setParent(node);
                    node.procedureNameList = (IASTListNode<ASTProcedureNameListNode>)valueStack.get(valueStackOffset + 3);
                    if (node.procedureNameList != null) node.procedureNameList.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleProcedureNameList1399(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 10
                    ASTProcedureNameListNode node = new ASTProcedureNameListNode();
                    node.procedureName = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("procedureName");
                    if (node.procedureName != null) node.procedureName.setParent(node);
                    ASTListNode<ASTProcedureNameListNode> list = new ASTListNode<ASTProcedureNameListNode>();
                    list.add(node);
                    node.setParent(list);
                    return list;

        }
        public Object handleProcedureNameList1400(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 11
                    ASTProcedureNameListNode node = new ASTProcedureNameListNode();
                    node.hiddenTComma = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTComma != null) node.hiddenTComma.setParent(node);
                    node.procedureName = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 2)).get("procedureName");
                    if (node.procedureName != null) node.procedureName.setParent(node);
                    ASTListNode<ASTProcedureNameListNode> list = (ASTListNode<ASTProcedureNameListNode>)valueStack.get(valueStackOffset);
                    list.add(node);
                    node.setParent(list);
                    return list;

        }
        public Object handleProcedureName1401(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 3 and 4
                    Map<String, Object> node = new HashMap<String, Object>();
                    node.put("procedureName", (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0));
                    ASTListNode<IASTNode> embeddedList = new ASTListNode<IASTNode>();
                    embeddedList.add((IASTNode)(node.get("procedureName")));
                    node.put("errorRecoveryList", embeddedList);
                    return node;

        }
        public Object handleGenericSpec1402(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTGenericSpecNode node = new ASTGenericSpecNode();
                    node.isDefinedOperator = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.isDefinedOperator != null) node.isDefinedOperator.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.definedOperator = (IDefinedOperator)valueStack.get(valueStackOffset + 2);
                    if (node.definedOperator != null) node.definedOperator.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    return node;

        }
        public Object handleGenericSpec1403(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTGenericSpecNode node = new ASTGenericSpecNode();
                    node.isAssignmentOperator = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.isAssignmentOperator != null) node.isAssignmentOperator.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.equalsToken = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.equalsToken != null) node.equalsToken.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    return node;

        }
        public Object handleGenericSpec1404(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTGenericSpecNode node = new ASTGenericSpecNode();
                    node.isDerivedTypeIO = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.isDerivedTypeIO != null) node.isDerivedTypeIO.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.formattingSpec = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.formattingSpec != null) node.formattingSpec.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    return node;

        }
        public Object handleGenericSpec1405(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTGenericSpecNode node = new ASTGenericSpecNode();
                    node.isDerivedTypeIO = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.isDerivedTypeIO != null) node.isDerivedTypeIO.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.formattingSpec = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.formattingSpec != null) node.formattingSpec.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    return node;

        }
        public Object handleImportStmt1406(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTImportStmtNode node = new ASTImportStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTImport = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTImport != null) node.hiddenTImport.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleImportStmt1407(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTImportStmtNode node = new ASTImportStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTImport = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTImport != null) node.hiddenTImport.setParent(node);
                    node.importList = (IASTListNode<org.eclipse.photran.internal.core.lexer.Token>)valueStack.get(valueStackOffset + 2);
                    if (node.importList != null) node.importList.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleImportStmt1408(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTImportStmtNode node = new ASTImportStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTImport = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTImport != null) node.hiddenTImport.setParent(node);
                    node.hiddenTColon = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTColon != null) node.hiddenTColon.setParent(node);
                    node.hiddenTColon2 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTColon2 != null) node.hiddenTColon2.setParent(node);
                    node.importList = (IASTListNode<org.eclipse.photran.internal.core.lexer.Token>)valueStack.get(valueStackOffset + 4);
                    if (node.importList != null) node.importList.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 5);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleImportList1409(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 7 with separator
                    ASTSeparatedListNode<org.eclipse.photran.internal.core.lexer.Token> list = new ASTSeparatedListNode<org.eclipse.photran.internal.core.lexer.Token>();
                    org.eclipse.photran.internal.core.lexer.Token elt = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    list.add(null, elt);
                    if (elt != null) elt.setParent(list);
                    return list;

        }
        public Object handleImportList1410(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 8 with separator
                    ASTSeparatedListNode<org.eclipse.photran.internal.core.lexer.Token> list = (ASTSeparatedListNode<org.eclipse.photran.internal.core.lexer.Token>)valueStack.get(valueStackOffset);
                    org.eclipse.photran.internal.core.lexer.Token token = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    org.eclipse.photran.internal.core.lexer.Token elt = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    list.add(token, elt);
                    token.setParent(list);
                    if (elt != null) elt.setParent(list);
                    return list;

        }
        public Object handleProcedureDeclarationStmt1411(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTProcedureDeclarationStmtNode node = new ASTProcedureDeclarationStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTProcedure = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTProcedure != null) node.hiddenTProcedure.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.procInterface = (ASTProcInterfaceNode)valueStack.get(valueStackOffset + 3);
                    if (node.procInterface != null) node.procInterface.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    node.hiddenTComma = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 5);
                    if (node.hiddenTComma != null) node.hiddenTComma.setParent(node);
                    node.procAttrSpecList = (IASTListNode<ASTAttrSpecNode>)valueStack.get(valueStackOffset + 6);
                    if (node.procAttrSpecList != null) node.procAttrSpecList.setParent(node);
                    node.hiddenTColon = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 7);
                    if (node.hiddenTColon != null) node.hiddenTColon.setParent(node);
                    node.hiddenTColon2 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 8);
                    if (node.hiddenTColon2 != null) node.hiddenTColon2.setParent(node);
                    node.procDeclList = (IASTListNode<ASTProcDeclNode>)valueStack.get(valueStackOffset + 9);
                    if (node.procDeclList != null) node.procDeclList.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 10);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleProcedureDeclarationStmt1412(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTProcedureDeclarationStmtNode node = new ASTProcedureDeclarationStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTProcedure = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTProcedure != null) node.hiddenTProcedure.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.procInterface = (ASTProcInterfaceNode)valueStack.get(valueStackOffset + 3);
                    if (node.procInterface != null) node.procInterface.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    node.hiddenTColon = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 5);
                    if (node.hiddenTColon != null) node.hiddenTColon.setParent(node);
                    node.hiddenTColon2 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 6);
                    if (node.hiddenTColon2 != null) node.hiddenTColon2.setParent(node);
                    node.procDeclList = (IASTListNode<ASTProcDeclNode>)valueStack.get(valueStackOffset + 7);
                    if (node.procDeclList != null) node.procDeclList.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 8);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleProcedureDeclarationStmt1413(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTProcedureDeclarationStmtNode node = new ASTProcedureDeclarationStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTProcedure = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTProcedure != null) node.hiddenTProcedure.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.procInterface = (ASTProcInterfaceNode)valueStack.get(valueStackOffset + 3);
                    if (node.procInterface != null) node.procInterface.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    node.procDeclList = (IASTListNode<ASTProcDeclNode>)valueStack.get(valueStackOffset + 5);
                    if (node.procDeclList != null) node.procDeclList.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 6);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleProcedureDeclarationStmt1414(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTProcedureDeclarationStmtNode node = new ASTProcedureDeclarationStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTProcedure = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTProcedure != null) node.hiddenTProcedure.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    node.hiddenTComma = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenTComma != null) node.hiddenTComma.setParent(node);
                    node.procAttrSpecList = (IASTListNode<ASTAttrSpecNode>)valueStack.get(valueStackOffset + 5);
                    if (node.procAttrSpecList != null) node.procAttrSpecList.setParent(node);
                    node.hiddenTColon = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 6);
                    if (node.hiddenTColon != null) node.hiddenTColon.setParent(node);
                    node.hiddenTColon2 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 7);
                    if (node.hiddenTColon2 != null) node.hiddenTColon2.setParent(node);
                    node.procDeclList = (IASTListNode<ASTProcDeclNode>)valueStack.get(valueStackOffset + 8);
                    if (node.procDeclList != null) node.procDeclList.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 9);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleProcedureDeclarationStmt1415(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTProcedureDeclarationStmtNode node = new ASTProcedureDeclarationStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTProcedure = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTProcedure != null) node.hiddenTProcedure.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    node.hiddenTColon = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenTColon != null) node.hiddenTColon.setParent(node);
                    node.hiddenTColon2 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 5);
                    if (node.hiddenTColon2 != null) node.hiddenTColon2.setParent(node);
                    node.procDeclList = (IASTListNode<ASTProcDeclNode>)valueStack.get(valueStackOffset + 6);
                    if (node.procDeclList != null) node.procDeclList.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 7);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleProcedureDeclarationStmt1416(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTProcedureDeclarationStmtNode node = new ASTProcedureDeclarationStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTProcedure = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTProcedure != null) node.hiddenTProcedure.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    node.procDeclList = (IASTListNode<ASTProcDeclNode>)valueStack.get(valueStackOffset + 4);
                    if (node.procDeclList != null) node.procDeclList.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 5);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleProcAttrSpecList1417(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 7 with separator
                    ASTSeparatedListNode<ASTAttrSpecNode> list = new ASTSeparatedListNode<ASTAttrSpecNode>();
                    ASTAttrSpecNode elt = (ASTAttrSpecNode)valueStack.get(valueStackOffset + 0);
                    list.add(null, elt);
                    if (elt != null) elt.setParent(list);
                    return list;

        }
        public Object handleProcAttrSpecList1418(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 8 with separator
                    ASTSeparatedListNode<ASTAttrSpecNode> list = (ASTSeparatedListNode<ASTAttrSpecNode>)valueStack.get(valueStackOffset);
                    org.eclipse.photran.internal.core.lexer.Token token = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    ASTAttrSpecNode elt = (ASTAttrSpecNode)valueStack.get(valueStackOffset + 2);
                    list.add(token, elt);
                    token.setParent(list);
                    if (elt != null) elt.setParent(list);
                    return list;

        }
        public Object handleProcAttrSpec1419(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTAttrSpecNode node = new ASTAttrSpecNode();
                    node.accessSpec = (ASTAccessSpecNode)valueStack.get(valueStackOffset + 0);
                    if (node.accessSpec != null) node.accessSpec.setParent(node);
                    return node;

        }
        public Object handleProcAttrSpec1420(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTAttrSpecNode node = new ASTAttrSpecNode();
                    node.isIntent = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.isIntent != null) node.isIntent.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.intentSpec = (ASTIntentSpecNode)valueStack.get(valueStackOffset + 2);
                    if (node.intentSpec != null) node.intentSpec.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    return node;

        }
        public Object handleProcAttrSpec1421(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTAttrSpecNode node = new ASTAttrSpecNode();
                    node.isOptional = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.isOptional != null) node.isOptional.setParent(node);
                    return node;

        }
        public Object handleProcAttrSpec1422(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTAttrSpecNode node = new ASTAttrSpecNode();
                    node.isPointer = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.isPointer != null) node.isPointer.setParent(node);
                    return node;

        }
        public Object handleProcAttrSpec1423(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTAttrSpecNode node = new ASTAttrSpecNode();
                    node.isSave = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.isSave != null) node.isSave.setParent(node);
                    return node;

        }
        public Object handleExternalStmt1424(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTExternalStmtNode node = new ASTExternalStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTExternal = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTExternal != null) node.hiddenTExternal.setParent(node);
                    node.externalNameList = (IASTListNode<ASTExternalNameListNode>)valueStack.get(valueStackOffset + 2);
                    if (node.externalNameList != null) node.externalNameList.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleExternalStmt1425(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTExternalStmtNode node = new ASTExternalStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTExternal = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTExternal != null) node.hiddenTExternal.setParent(node);
                    node.hiddenTColon = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTColon != null) node.hiddenTColon.setParent(node);
                    node.hiddenTColon2 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTColon2 != null) node.hiddenTColon2.setParent(node);
                    node.externalNameList = (IASTListNode<ASTExternalNameListNode>)valueStack.get(valueStackOffset + 4);
                    if (node.externalNameList != null) node.externalNameList.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 5);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleExternalNameList1426(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 10
                    ASTExternalNameListNode node = new ASTExternalNameListNode();
                    node.externalName = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("externalName");
                    if (node.externalName != null) node.externalName.setParent(node);
                    ASTListNode<ASTExternalNameListNode> list = new ASTListNode<ASTExternalNameListNode>();
                    list.add(node);
                    node.setParent(list);
                    return list;

        }
        public Object handleExternalNameList1427(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 11
                    ASTExternalNameListNode node = new ASTExternalNameListNode();
                    node.hiddenTComma = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTComma != null) node.hiddenTComma.setParent(node);
                    node.externalName = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 2)).get("externalName");
                    if (node.externalName != null) node.externalName.setParent(node);
                    ASTListNode<ASTExternalNameListNode> list = (ASTListNode<ASTExternalNameListNode>)valueStack.get(valueStackOffset);
                    list.add(node);
                    node.setParent(list);
                    return list;

        }
        public Object handleIntrinsicStmt1428(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTIntrinsicStmtNode node = new ASTIntrinsicStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTIntrinsic = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTIntrinsic != null) node.hiddenTIntrinsic.setParent(node);
                    node.intrinsicList = (IASTListNode<ASTIntrinsicListNode>)valueStack.get(valueStackOffset + 2);
                    if (node.intrinsicList != null) node.intrinsicList.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleIntrinsicStmt1429(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTIntrinsicStmtNode node = new ASTIntrinsicStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTIntrinsic = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTIntrinsic != null) node.hiddenTIntrinsic.setParent(node);
                    node.hiddenTColon = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTColon != null) node.hiddenTColon.setParent(node);
                    node.hiddenTColon2 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTColon2 != null) node.hiddenTColon2.setParent(node);
                    node.intrinsicList = (IASTListNode<ASTIntrinsicListNode>)valueStack.get(valueStackOffset + 4);
                    if (node.intrinsicList != null) node.intrinsicList.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 5);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleIntrinsicList1430(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 10
                    ASTIntrinsicListNode node = new ASTIntrinsicListNode();
                    node.intrinsicProcedureName = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("intrinsicProcedureName");
                    if (node.intrinsicProcedureName != null) node.intrinsicProcedureName.setParent(node);
                    ASTListNode<ASTIntrinsicListNode> list = new ASTListNode<ASTIntrinsicListNode>();
                    list.add(node);
                    node.setParent(list);
                    return list;

        }
        public Object handleIntrinsicList1431(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 11
                    ASTIntrinsicListNode node = new ASTIntrinsicListNode();
                    node.hiddenTComma = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTComma != null) node.hiddenTComma.setParent(node);
                    node.intrinsicProcedureName = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 2)).get("intrinsicProcedureName");
                    if (node.intrinsicProcedureName != null) node.intrinsicProcedureName.setParent(node);
                    ASTListNode<ASTIntrinsicListNode> list = (ASTListNode<ASTIntrinsicListNode>)valueStack.get(valueStackOffset);
                    list.add(node);
                    node.setParent(list);
                    return list;

        }
        public Object handleFunctionReference1432(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 3 and 4
                    Map<String, Object> node = new HashMap<String, Object>();
                    ASTNameNode tmp0 = new ASTNameNode();
                    tmp0.name = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("name");
                    if (tmp0.name != null) tmp0.name.setParent(tmp0);
                    node.put("name", tmp0);
                    node.put("hiddenTLparen", (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1));
                    node.put("hiddenTRparen", (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2));
                    ASTListNode<IASTNode> embeddedList = new ASTListNode<IASTNode>();
                    embeddedList.add((IASTNode)(node.get("name")));
                    embeddedList.add((IASTNode)(node.get("hiddenTLparen")));
                    embeddedList.add((IASTNode)(node.get("functionArgList")));
                    embeddedList.add((IASTNode)(node.get("hiddenTRparen")));
                    node.put("errorRecoveryList", embeddedList);
                    return node;

        }
        public Object handleFunctionReference1433(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 3 and 4
                    Map<String, Object> node = new HashMap<String, Object>();
                    ASTNameNode tmp0 = new ASTNameNode();
                    tmp0.name = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("name");
                    if (tmp0.name != null) tmp0.name.setParent(tmp0);
                    node.put("name", tmp0);
                    node.put("hiddenTLparen", (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1));
                    node.put("functionArgList", (IASTListNode<ASTFunctionArgListNode>)valueStack.get(valueStackOffset + 2));
                    node.put("hiddenTRparen", (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3));
                    ASTListNode<IASTNode> embeddedList = new ASTListNode<IASTNode>();
                    embeddedList.add((IASTNode)(node.get("name")));
                    embeddedList.add((IASTNode)(node.get("hiddenTLparen")));
                    embeddedList.add((IASTNode)(node.get("functionArgList")));
                    embeddedList.add((IASTNode)(node.get("hiddenTRparen")));
                    node.put("errorRecoveryList", embeddedList);
                    return node;

        }
        public Object handleCallStmt1434(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTCallStmtNode node = new ASTCallStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTCall = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTCall != null) node.hiddenTCall.setParent(node);
                    node.subroutineName = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 2)).get("subroutineName");
                    if (node.subroutineName != null) node.subroutineName.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleCallStmt1435(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTCallStmtNode node = new ASTCallStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTCall = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTCall != null) node.hiddenTCall.setParent(node);
                    node.subroutineName = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 2)).get("subroutineName");
                    if (node.subroutineName != null) node.subroutineName.setParent(node);
                    node.derivedTypeQualifiers = (IASTListNode<ASTDerivedTypeQualifiersNode>)valueStack.get(valueStackOffset + 3);
                    if (node.derivedTypeQualifiers != null) node.derivedTypeQualifiers.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleCallStmt1436(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTCallStmtNode node = new ASTCallStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTCall = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTCall != null) node.hiddenTCall.setParent(node);
                    node.subroutineName = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 2)).get("subroutineName");
                    if (node.subroutineName != null) node.subroutineName.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 3)).get("hiddenTLparen");
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.argList = (IASTListNode<ASTSubroutineArgNode>)((Map<String, Object>)valueStack.get(valueStackOffset + 3)).get("argList");
                    if (node.argList != null) node.argList.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 3)).get("hiddenTRparen");
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleCallStmt1437(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTCallStmtNode node = new ASTCallStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTCall = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTCall != null) node.hiddenTCall.setParent(node);
                    node.subroutineName = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 2)).get("subroutineName");
                    if (node.subroutineName != null) node.subroutineName.setParent(node);
                    node.derivedTypeQualifiers = (IASTListNode<ASTDerivedTypeQualifiersNode>)valueStack.get(valueStackOffset + 3);
                    if (node.derivedTypeQualifiers != null) node.derivedTypeQualifiers.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 4)).get("hiddenTLparen");
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.argList = (IASTListNode<ASTSubroutineArgNode>)((Map<String, Object>)valueStack.get(valueStackOffset + 4)).get("argList");
                    if (node.argList != null) node.argList.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 4)).get("hiddenTRparen");
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 5);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleDerivedTypeQualifiers1438(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 10
                    ASTDerivedTypeQualifiersNode node = new ASTDerivedTypeQualifiersNode();
                    node.hiddenTPercent = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.hiddenTPercent != null) node.hiddenTPercent.setParent(node);
                    node.name = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("name");
                    if (node.name != null) node.name.setParent(node);
                    ASTListNode<ASTDerivedTypeQualifiersNode> list = new ASTListNode<ASTDerivedTypeQualifiersNode>();
                    list.add(node);
                    node.setParent(list);
                    return list;

        }
        public Object handleDerivedTypeQualifiers1439(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 10
                    ASTDerivedTypeQualifiersNode node = new ASTDerivedTypeQualifiersNode();
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("hiddenTLparen");
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.argList = (IASTListNode<ASTSubroutineArgNode>)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("argList");
                    if (node.argList != null) node.argList.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("hiddenTRparen");
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    node.hiddenTPercent = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTPercent != null) node.hiddenTPercent.setParent(node);
                    node.name = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 2)).get("name");
                    if (node.name != null) node.name.setParent(node);
                    ASTListNode<ASTDerivedTypeQualifiersNode> list = new ASTListNode<ASTDerivedTypeQualifiersNode>();
                    list.add(node);
                    node.setParent(list);
                    return list;

        }
        public Object handleDerivedTypeQualifiers1440(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 11
                    ASTDerivedTypeQualifiersNode node = new ASTDerivedTypeQualifiersNode();
                    node.hiddenTPercent = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTPercent != null) node.hiddenTPercent.setParent(node);
                    node.name = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 2)).get("name");
                    if (node.name != null) node.name.setParent(node);
                    ASTListNode<ASTDerivedTypeQualifiersNode> list = (ASTListNode<ASTDerivedTypeQualifiersNode>)valueStack.get(valueStackOffset);
                    list.add(node);
                    node.setParent(list);
                    return list;

        }
        public Object handleDerivedTypeQualifiers1441(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 11
                    ASTDerivedTypeQualifiersNode node = new ASTDerivedTypeQualifiersNode();
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("hiddenTLparen");
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.argList = (IASTListNode<ASTSubroutineArgNode>)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("argList");
                    if (node.argList != null) node.argList.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("hiddenTRparen");
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    node.hiddenTPercent = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTPercent != null) node.hiddenTPercent.setParent(node);
                    node.name = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 3)).get("name");
                    if (node.name != null) node.name.setParent(node);
                    ASTListNode<ASTDerivedTypeQualifiersNode> list = (ASTListNode<ASTDerivedTypeQualifiersNode>)valueStack.get(valueStackOffset);
                    list.add(node);
                    node.setParent(list);
                    return list;

        }
        public Object handleParenthesizedSubroutineArgList1442(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 3 and 4
                    Map<String, Object> node = new HashMap<String, Object>();
                    node.put("hiddenTLparen", (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0));
                    node.put("hiddenTRparen", (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1));
                    ASTListNode<IASTNode> embeddedList = new ASTListNode<IASTNode>();
                    embeddedList.add((IASTNode)(node.get("hiddenTLparen")));
                    embeddedList.add((IASTNode)(node.get("argList")));
                    embeddedList.add((IASTNode)(node.get("hiddenTRparen")));
                    node.put("errorRecoveryList", embeddedList);
                    return node;

        }
        public Object handleParenthesizedSubroutineArgList1443(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 3 and 4
                    Map<String, Object> node = new HashMap<String, Object>();
                    node.put("hiddenTLparen", (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0));
                    node.put("argList", (IASTListNode<ASTSubroutineArgNode>)valueStack.get(valueStackOffset + 1));
                    node.put("hiddenTRparen", (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2));
                    ASTListNode<IASTNode> embeddedList = new ASTListNode<IASTNode>();
                    embeddedList.add((IASTNode)(node.get("hiddenTLparen")));
                    embeddedList.add((IASTNode)(node.get("argList")));
                    embeddedList.add((IASTNode)(node.get("hiddenTRparen")));
                    node.put("errorRecoveryList", embeddedList);
                    return node;

        }
        public Object handleSubroutineArgList1444(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 7 with separator
                    ASTSeparatedListNode<ASTSubroutineArgNode> list = new ASTSeparatedListNode<ASTSubroutineArgNode>();
                    ASTSubroutineArgNode elt = (ASTSubroutineArgNode)valueStack.get(valueStackOffset + 0);
                    list.add(null, elt);
                    if (elt != null) elt.setParent(list);
                    return list;

        }
        public Object handleSubroutineArgList1445(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 8 with separator
                    ASTSeparatedListNode<ASTSubroutineArgNode> list = (ASTSeparatedListNode<ASTSubroutineArgNode>)valueStack.get(valueStackOffset);
                    org.eclipse.photran.internal.core.lexer.Token token = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    ASTSubroutineArgNode elt = (ASTSubroutineArgNode)valueStack.get(valueStackOffset + 2);
                    list.add(token, elt);
                    token.setParent(list);
                    if (elt != null) elt.setParent(list);
                    return list;

        }
        public Object handleFunctionArgList1446(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 10
                    ASTFunctionArgListNode node = new ASTFunctionArgListNode();
                    node.functionArg = (ASTFunctionArgNode)valueStack.get(valueStackOffset + 0);
                    if (node.functionArg != null) node.functionArg.setParent(node);
                    ASTListNode<ASTFunctionArgListNode> list = new ASTListNode<ASTFunctionArgListNode>();
                    list.add(node);
                    node.setParent(list);
                    return list;

        }
        public Object handleFunctionArgList1447(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 10
                    ASTFunctionArgListNode node = new ASTFunctionArgListNode();
                    node.sectionSubscriptList = (IASTListNode<ASTSectionSubscriptNode>)valueStack.get(valueStackOffset + 0);
                    if (node.sectionSubscriptList != null) node.sectionSubscriptList.setParent(node);
                    node.hiddenTComma = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTComma != null) node.hiddenTComma.setParent(node);
                    node.functionArg = (ASTFunctionArgNode)valueStack.get(valueStackOffset + 2);
                    if (node.functionArg != null) node.functionArg.setParent(node);
                    ASTListNode<ASTFunctionArgListNode> list = new ASTListNode<ASTFunctionArgListNode>();
                    list.add(node);
                    node.setParent(list);
                    return list;

        }
        public Object handleFunctionArgList1448(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 11
                    ASTFunctionArgListNode node = new ASTFunctionArgListNode();
                    node.hiddenTComma = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTComma != null) node.hiddenTComma.setParent(node);
                    node.functionArg = (ASTFunctionArgNode)valueStack.get(valueStackOffset + 2);
                    if (node.functionArg != null) node.functionArg.setParent(node);
                    ASTListNode<ASTFunctionArgListNode> list = (ASTListNode<ASTFunctionArgListNode>)valueStack.get(valueStackOffset);
                    list.add(node);
                    node.setParent(list);
                    return list;

        }
        public Object handleFunctionArg1449(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTFunctionArgNode node = new ASTFunctionArgNode();
                    node.name = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("name");
                    if (node.name != null) node.name.setParent(node);
                    node.hiddenTEquals = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTEquals != null) node.hiddenTEquals.setParent(node);
                    node.expr = (IExpr)valueStack.get(valueStackOffset + 2);
                    if (node.expr != null) node.expr.setParent(node);
                    return node;

        }
        public Object handleSubroutineArg1450(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTSubroutineArgNode node = new ASTSubroutineArgNode();
                    node.expr = (IExpr)valueStack.get(valueStackOffset + 0);
                    if (node.expr != null) node.expr.setParent(node);
                    return node;

        }
        public Object handleSubroutineArg1451(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTSubroutineArgNode node = new ASTSubroutineArgNode();
                    node.hiddenTAsterisk = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.hiddenTAsterisk != null) node.hiddenTAsterisk.setParent(node);
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    return node;

        }
        public Object handleSubroutineArg1452(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTSubroutineArgNode node = new ASTSubroutineArgNode();
                    node.name = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("name");
                    if (node.name != null) node.name.setParent(node);
                    node.hiddenTEquals = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTEquals != null) node.hiddenTEquals.setParent(node);
                    node.expr = (IExpr)valueStack.get(valueStackOffset + 2);
                    if (node.expr != null) node.expr.setParent(node);
                    return node;

        }
        public Object handleSubroutineArg1453(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTSubroutineArgNode node = new ASTSubroutineArgNode();
                    node.name = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("name");
                    if (node.name != null) node.name.setParent(node);
                    node.hiddenTEquals = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTEquals != null) node.hiddenTEquals.setParent(node);
                    node.hiddenTAsterisk = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTAsterisk != null) node.hiddenTAsterisk.setParent(node);
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 3)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    return node;

        }
        public Object handleSubroutineArg1454(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTSubroutineArgNode node = new ASTSubroutineArgNode();
                    node.hollerith = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.hollerith != null) node.hollerith.setParent(node);
                    return node;

        }
        public Object handleSubroutineArg1455(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTSubroutineArgNode node = new ASTSubroutineArgNode();
                    node.name = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("name");
                    if (node.name != null) node.name.setParent(node);
                    node.hiddenTEquals = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTEquals != null) node.hiddenTEquals.setParent(node);
                    node.hollerith = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hollerith != null) node.hollerith.setParent(node);
                    return node;

        }
        public Object handleFunctionStmt1456(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTFunctionStmtNode node = new ASTFunctionStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.prefixSpecList = (IASTListNode<ASTPrefixSpecNode>)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("prefixSpecList");
                    if (node.prefixSpecList != null) node.prefixSpecList.setParent(node);
                    node.hiddenTFunction = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("hiddenTFunction");
                    if (node.hiddenTFunction != null) node.hiddenTFunction.setParent(node);
                    node.functionName = (ASTFunctionNameNode)valueStack.get(valueStackOffset + 2);
                    if (node.functionName != null) node.functionName.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 5);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleFunctionStmt1457(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTFunctionStmtNode node = new ASTFunctionStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.prefixSpecList = (IASTListNode<ASTPrefixSpecNode>)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("prefixSpecList");
                    if (node.prefixSpecList != null) node.prefixSpecList.setParent(node);
                    node.hiddenTFunction = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("hiddenTFunction");
                    if (node.hiddenTFunction != null) node.hiddenTFunction.setParent(node);
                    node.functionName = (ASTFunctionNameNode)valueStack.get(valueStackOffset + 2);
                    if (node.functionName != null) node.functionName.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    node.hasResultClause = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 5);
                    if (node.hasResultClause != null) node.hasResultClause.setParent(node);
                    node.hiddenTLparen2 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 6);
                    if (node.hiddenTLparen2 != null) node.hiddenTLparen2.setParent(node);
                    node.name = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 7)).get("name");
                    if (node.name != null) node.name.setParent(node);
                    node.hiddenTRparen2 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 8);
                    if (node.hiddenTRparen2 != null) node.hiddenTRparen2.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 9);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleFunctionStmt1458(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTFunctionStmtNode node = new ASTFunctionStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.prefixSpecList = (IASTListNode<ASTPrefixSpecNode>)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("prefixSpecList");
                    if (node.prefixSpecList != null) node.prefixSpecList.setParent(node);
                    node.hiddenTFunction = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("hiddenTFunction");
                    if (node.hiddenTFunction != null) node.hiddenTFunction.setParent(node);
                    node.functionName = (ASTFunctionNameNode)valueStack.get(valueStackOffset + 2);
                    if (node.functionName != null) node.functionName.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.functionPars = (IASTListNode<ASTFunctionParNode>)valueStack.get(valueStackOffset + 4);
                    if (node.functionPars != null) node.functionPars.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 5);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 6);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleFunctionStmt1459(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTFunctionStmtNode node = new ASTFunctionStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.prefixSpecList = (IASTListNode<ASTPrefixSpecNode>)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("prefixSpecList");
                    if (node.prefixSpecList != null) node.prefixSpecList.setParent(node);
                    node.hiddenTFunction = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("hiddenTFunction");
                    if (node.hiddenTFunction != null) node.hiddenTFunction.setParent(node);
                    node.functionName = (ASTFunctionNameNode)valueStack.get(valueStackOffset + 2);
                    if (node.functionName != null) node.functionName.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.functionPars = (IASTListNode<ASTFunctionParNode>)valueStack.get(valueStackOffset + 4);
                    if (node.functionPars != null) node.functionPars.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 5);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    node.hasResultClause = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 6);
                    if (node.hasResultClause != null) node.hasResultClause.setParent(node);
                    node.hiddenTLparen2 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 7);
                    if (node.hiddenTLparen2 != null) node.hiddenTLparen2.setParent(node);
                    node.name = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 8)).get("name");
                    if (node.name != null) node.name.setParent(node);
                    node.hiddenTRparen2 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 9);
                    if (node.hiddenTRparen2 != null) node.hiddenTRparen2.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 10);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleFunctionStmt1460(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTFunctionStmtNode node = new ASTFunctionStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.prefixSpecList = (IASTListNode<ASTPrefixSpecNode>)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("prefixSpecList");
                    if (node.prefixSpecList != null) node.prefixSpecList.setParent(node);
                    node.hiddenTFunction = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("hiddenTFunction");
                    if (node.hiddenTFunction != null) node.hiddenTFunction.setParent(node);
                    node.functionName = (ASTFunctionNameNode)valueStack.get(valueStackOffset + 2);
                    if (node.functionName != null) node.functionName.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    node.hiddenHiddenTBind8 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 5);
                    if (node.hiddenHiddenTBind8 != null) node.hiddenHiddenTBind8.setParent(node);
                    node.hiddenHiddenLParen8 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 6);
                    if (node.hiddenHiddenLParen8 != null) node.hiddenHiddenLParen8.setParent(node);
                    node.hiddenHiddenTIdent8 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 7);
                    if (node.hiddenHiddenTIdent8 != null) node.hiddenHiddenTIdent8.setParent(node);
                    node.hiddenHiddenRParen8 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 8);
                    if (node.hiddenHiddenRParen8 != null) node.hiddenHiddenRParen8.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 9);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleFunctionStmt1461(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTFunctionStmtNode node = new ASTFunctionStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.prefixSpecList = (IASTListNode<ASTPrefixSpecNode>)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("prefixSpecList");
                    if (node.prefixSpecList != null) node.prefixSpecList.setParent(node);
                    node.hiddenTFunction = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("hiddenTFunction");
                    if (node.hiddenTFunction != null) node.hiddenTFunction.setParent(node);
                    node.functionName = (ASTFunctionNameNode)valueStack.get(valueStackOffset + 2);
                    if (node.functionName != null) node.functionName.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    node.hiddenHiddenTBind8 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 5);
                    if (node.hiddenHiddenTBind8 != null) node.hiddenHiddenTBind8.setParent(node);
                    node.hiddenHiddenLParen8 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 6);
                    if (node.hiddenHiddenLParen8 != null) node.hiddenHiddenLParen8.setParent(node);
                    node.hiddenHiddenTIdent8 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 7);
                    if (node.hiddenHiddenTIdent8 != null) node.hiddenHiddenTIdent8.setParent(node);
                    node.hiddenHiddenRParen8 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 8);
                    if (node.hiddenHiddenRParen8 != null) node.hiddenHiddenRParen8.setParent(node);
                    node.hasResultClause = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 9);
                    if (node.hasResultClause != null) node.hasResultClause.setParent(node);
                    node.hiddenTLparen2 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 10);
                    if (node.hiddenTLparen2 != null) node.hiddenTLparen2.setParent(node);
                    node.name = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 11)).get("name");
                    if (node.name != null) node.name.setParent(node);
                    node.hiddenTRparen2 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 12);
                    if (node.hiddenTRparen2 != null) node.hiddenTRparen2.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 13);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleFunctionStmt1462(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTFunctionStmtNode node = new ASTFunctionStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.prefixSpecList = (IASTListNode<ASTPrefixSpecNode>)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("prefixSpecList");
                    if (node.prefixSpecList != null) node.prefixSpecList.setParent(node);
                    node.hiddenTFunction = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("hiddenTFunction");
                    if (node.hiddenTFunction != null) node.hiddenTFunction.setParent(node);
                    node.functionName = (ASTFunctionNameNode)valueStack.get(valueStackOffset + 2);
                    if (node.functionName != null) node.functionName.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.functionPars = (IASTListNode<ASTFunctionParNode>)valueStack.get(valueStackOffset + 4);
                    if (node.functionPars != null) node.functionPars.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 5);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    node.hiddenHiddenTBind8 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 6);
                    if (node.hiddenHiddenTBind8 != null) node.hiddenHiddenTBind8.setParent(node);
                    node.hiddenHiddenLParen8 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 7);
                    if (node.hiddenHiddenLParen8 != null) node.hiddenHiddenLParen8.setParent(node);
                    node.hiddenHiddenTIdent8 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 8);
                    if (node.hiddenHiddenTIdent8 != null) node.hiddenHiddenTIdent8.setParent(node);
                    node.hiddenHiddenRParen8 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 9);
                    if (node.hiddenHiddenRParen8 != null) node.hiddenHiddenRParen8.setParent(node);
                    node.hasResultClause = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 10);
                    if (node.hasResultClause != null) node.hasResultClause.setParent(node);
                    node.hiddenTLparen2 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 11);
                    if (node.hiddenTLparen2 != null) node.hiddenTLparen2.setParent(node);
                    node.name = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 12)).get("name");
                    if (node.name != null) node.name.setParent(node);
                    node.hiddenTRparen2 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 13);
                    if (node.hiddenTRparen2 != null) node.hiddenTRparen2.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 14);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleFunctionStmt1463(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTFunctionStmtNode node = new ASTFunctionStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.prefixSpecList = (IASTListNode<ASTPrefixSpecNode>)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("prefixSpecList");
                    if (node.prefixSpecList != null) node.prefixSpecList.setParent(node);
                    node.hiddenTFunction = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("hiddenTFunction");
                    if (node.hiddenTFunction != null) node.hiddenTFunction.setParent(node);
                    node.functionName = (ASTFunctionNameNode)valueStack.get(valueStackOffset + 2);
                    if (node.functionName != null) node.functionName.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    node.hasResultClause = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 5);
                    if (node.hasResultClause != null) node.hasResultClause.setParent(node);
                    node.hiddenTLparen2 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 6);
                    if (node.hiddenTLparen2 != null) node.hiddenTLparen2.setParent(node);
                    node.name = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 7)).get("name");
                    if (node.name != null) node.name.setParent(node);
                    node.hiddenTRparen2 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 8);
                    if (node.hiddenTRparen2 != null) node.hiddenTRparen2.setParent(node);
                    node.hiddenHiddenTBind9 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 9);
                    if (node.hiddenHiddenTBind9 != null) node.hiddenHiddenTBind9.setParent(node);
                    node.hiddenHiddenLParen9 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 10);
                    if (node.hiddenHiddenLParen9 != null) node.hiddenHiddenLParen9.setParent(node);
                    node.hiddenHiddenTIdent9 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 11);
                    if (node.hiddenHiddenTIdent9 != null) node.hiddenHiddenTIdent9.setParent(node);
                    node.hiddenHiddenRParen9 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 12);
                    if (node.hiddenHiddenRParen9 != null) node.hiddenHiddenRParen9.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 13);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleFunctionStmt1464(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTFunctionStmtNode node = new ASTFunctionStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.prefixSpecList = (IASTListNode<ASTPrefixSpecNode>)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("prefixSpecList");
                    if (node.prefixSpecList != null) node.prefixSpecList.setParent(node);
                    node.hiddenTFunction = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("hiddenTFunction");
                    if (node.hiddenTFunction != null) node.hiddenTFunction.setParent(node);
                    node.functionName = (ASTFunctionNameNode)valueStack.get(valueStackOffset + 2);
                    if (node.functionName != null) node.functionName.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.functionPars = (IASTListNode<ASTFunctionParNode>)valueStack.get(valueStackOffset + 4);
                    if (node.functionPars != null) node.functionPars.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 5);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    node.hiddenHiddenTBind8 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 6);
                    if (node.hiddenHiddenTBind8 != null) node.hiddenHiddenTBind8.setParent(node);
                    node.hiddenHiddenLParen8 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 7);
                    if (node.hiddenHiddenLParen8 != null) node.hiddenHiddenLParen8.setParent(node);
                    node.hiddenHiddenTIdent8 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 8);
                    if (node.hiddenHiddenTIdent8 != null) node.hiddenHiddenTIdent8.setParent(node);
                    node.hiddenHiddenRParen8 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 9);
                    if (node.hiddenHiddenRParen8 != null) node.hiddenHiddenRParen8.setParent(node);
                    node.hiddenHiddenTBind9 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 10);
                    if (node.hiddenHiddenTBind9 != null) node.hiddenHiddenTBind9.setParent(node);
                    node.hiddenHiddenLParen9 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 11);
                    if (node.hiddenHiddenLParen9 != null) node.hiddenHiddenLParen9.setParent(node);
                    node.hiddenHiddenTIdent9 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 12);
                    if (node.hiddenHiddenTIdent9 != null) node.hiddenHiddenTIdent9.setParent(node);
                    node.hiddenHiddenRParen9 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 13);
                    if (node.hiddenHiddenRParen9 != null) node.hiddenHiddenRParen9.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 14);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleFunctionStmt1465(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTFunctionStmtNode node = new ASTFunctionStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.prefixSpecList = (IASTListNode<ASTPrefixSpecNode>)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("prefixSpecList");
                    if (node.prefixSpecList != null) node.prefixSpecList.setParent(node);
                    node.hiddenTFunction = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("hiddenTFunction");
                    if (node.hiddenTFunction != null) node.hiddenTFunction.setParent(node);
                    node.functionName = (ASTFunctionNameNode)valueStack.get(valueStackOffset + 2);
                    if (node.functionName != null) node.functionName.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.functionPars = (IASTListNode<ASTFunctionParNode>)valueStack.get(valueStackOffset + 4);
                    if (node.functionPars != null) node.functionPars.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 5);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    node.hasResultClause = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 6);
                    if (node.hasResultClause != null) node.hasResultClause.setParent(node);
                    node.hiddenTLparen2 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 7);
                    if (node.hiddenTLparen2 != null) node.hiddenTLparen2.setParent(node);
                    node.name = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 8)).get("name");
                    if (node.name != null) node.name.setParent(node);
                    node.hiddenTRparen2 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 9);
                    if (node.hiddenTRparen2 != null) node.hiddenTRparen2.setParent(node);
                    node.hiddenHiddenTBind9 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 10);
                    if (node.hiddenHiddenTBind9 != null) node.hiddenHiddenTBind9.setParent(node);
                    node.hiddenHiddenLParen9 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 11);
                    if (node.hiddenHiddenLParen9 != null) node.hiddenHiddenLParen9.setParent(node);
                    node.hiddenHiddenTIdent9 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 12);
                    if (node.hiddenHiddenTIdent9 != null) node.hiddenHiddenTIdent9.setParent(node);
                    node.hiddenHiddenRParen9 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 13);
                    if (node.hiddenHiddenRParen9 != null) node.hiddenHiddenRParen9.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 14);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleFunctionPars1466(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 7 with separator
                    ASTSeparatedListNode<ASTFunctionParNode> list = new ASTSeparatedListNode<ASTFunctionParNode>();
                    ASTFunctionParNode elt = (ASTFunctionParNode)valueStack.get(valueStackOffset + 0);
                    list.add(null, elt);
                    if (elt != null) elt.setParent(list);
                    return list;

        }
        public Object handleFunctionPars1467(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 8 with separator
                    ASTSeparatedListNode<ASTFunctionParNode> list = (ASTSeparatedListNode<ASTFunctionParNode>)valueStack.get(valueStackOffset);
                    org.eclipse.photran.internal.core.lexer.Token token = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    ASTFunctionParNode elt = (ASTFunctionParNode)valueStack.get(valueStackOffset + 2);
                    list.add(token, elt);
                    token.setParent(list);
                    if (elt != null) elt.setParent(list);
                    return list;

        }
        public Object handleFunctionPar1468(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTFunctionParNode node = new ASTFunctionParNode();
                    node.variableName = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("variableName");
                    if (node.variableName != null) node.variableName.setParent(node);
                    return node;

        }
        public Object handleFunctionPrefix1469(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 3 and 4
                    Map<String, Object> node = new HashMap<String, Object>();
                    node.put("hiddenTFunction", (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0));
                    ASTListNode<IASTNode> embeddedList = new ASTListNode<IASTNode>();
                    embeddedList.add((IASTNode)(node.get("prefixSpecList")));
                    embeddedList.add((IASTNode)(node.get("hiddenTFunction")));
                    node.put("errorRecoveryList", embeddedList);
                    return node;

        }
        public Object handleFunctionPrefix1470(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 3 and 4
                    Map<String, Object> node = new HashMap<String, Object>();
                    node.put("prefixSpecList", (IASTListNode<ASTPrefixSpecNode>)valueStack.get(valueStackOffset + 0));
                    node.put("hiddenTFunction", (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1));
                    ASTListNode<IASTNode> embeddedList = new ASTListNode<IASTNode>();
                    embeddedList.add((IASTNode)(node.get("prefixSpecList")));
                    embeddedList.add((IASTNode)(node.get("hiddenTFunction")));
                    node.put("errorRecoveryList", embeddedList);
                    return node;

        }
        public Object handlePrefixSpecList1471(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 7
                    IASTListNode<ASTPrefixSpecNode> list = new ASTListNode<ASTPrefixSpecNode>();
                    ASTPrefixSpecNode elt = (ASTPrefixSpecNode)valueStack.get(valueStackOffset + 0);
                    list.add(elt);
                    if (elt != null) elt.setParent(list);
                    return list;

        }
        public Object handlePrefixSpecList1472(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 8
                    IASTListNode<ASTPrefixSpecNode> list = (IASTListNode<ASTPrefixSpecNode>)valueStack.get(valueStackOffset);
                    ASTPrefixSpecNode elt = (ASTPrefixSpecNode)valueStack.get(valueStackOffset + 1);
                    list.add(elt);
                    if (elt != null) elt.setParent(list);
                    return list;

        }
        public Object handlePrefixSpec1473(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTPrefixSpecNode node = new ASTPrefixSpecNode();
                    node.typeSpec = (ASTTypeSpecNode)valueStack.get(valueStackOffset + 0);
                    if (node.typeSpec != null) node.typeSpec.setParent(node);
                    return node;

        }
        public Object handlePrefixSpec1474(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTPrefixSpecNode node = new ASTPrefixSpecNode();
                    node.isRecursive = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.isRecursive != null) node.isRecursive.setParent(node);
                    return node;

        }
        public Object handlePrefixSpec1475(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTPrefixSpecNode node = new ASTPrefixSpecNode();
                    node.isPure = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.isPure != null) node.isPure.setParent(node);
                    return node;

        }
        public Object handlePrefixSpec1476(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTPrefixSpecNode node = new ASTPrefixSpecNode();
                    node.isElemental = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.isElemental != null) node.isElemental.setParent(node);
                    return node;

        }
        public Object handlePrefixSpec1477(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTPrefixSpecNode node = new ASTPrefixSpecNode();
                    node.isImpure = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.isImpure != null) node.isImpure.setParent(node);
                    return node;

        }
        public Object handlePrefixSpec1478(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTPrefixSpecNode node = new ASTPrefixSpecNode();
                    node.isModule = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.isModule != null) node.isModule.setParent(node);
                    return node;

        }
        public Object handleEndFunctionStmt1479(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTEndFunctionStmtNode node = new ASTEndFunctionStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTEnd = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTEnd != null) node.hiddenTEnd.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleEndFunctionStmt1480(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTEndFunctionStmtNode node = new ASTEndFunctionStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTEndfunction = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTEndfunction != null) node.hiddenTEndfunction.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleEndFunctionStmt1481(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTEndFunctionStmtNode node = new ASTEndFunctionStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTEndfunction = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTEndfunction != null) node.hiddenTEndfunction.setParent(node);
                    node.endName = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 2)).get("endName");
                    if (node.endName != null) node.endName.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleEndFunctionStmt1482(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTEndFunctionStmtNode node = new ASTEndFunctionStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTEnd = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTEnd != null) node.hiddenTEnd.setParent(node);
                    node.hiddenTFunction = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTFunction != null) node.hiddenTFunction.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleEndFunctionStmt1483(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTEndFunctionStmtNode node = new ASTEndFunctionStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTEnd = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTEnd != null) node.hiddenTEnd.setParent(node);
                    node.hiddenTFunction = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTFunction != null) node.hiddenTFunction.setParent(node);
                    node.endName = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 3)).get("endName");
                    if (node.endName != null) node.endName.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleSubroutineStmt1484(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTSubroutineStmtNode node = new ASTSubroutineStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.prefixSpecList = (IASTListNode<ASTPrefixSpecNode>)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("prefixSpecList");
                    if (node.prefixSpecList != null) node.prefixSpecList.setParent(node);
                    node.hiddenTSubroutine = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("hiddenTSubroutine");
                    if (node.hiddenTSubroutine != null) node.hiddenTSubroutine.setParent(node);
                    node.subroutineName = (ASTSubroutineNameNode)valueStack.get(valueStackOffset + 2);
                    if (node.subroutineName != null) node.subroutineName.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleSubroutineStmt1485(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTSubroutineStmtNode node = new ASTSubroutineStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.prefixSpecList = (IASTListNode<ASTPrefixSpecNode>)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("prefixSpecList");
                    if (node.prefixSpecList != null) node.prefixSpecList.setParent(node);
                    node.hiddenTSubroutine = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("hiddenTSubroutine");
                    if (node.hiddenTSubroutine != null) node.hiddenTSubroutine.setParent(node);
                    node.subroutineName = (ASTSubroutineNameNode)valueStack.get(valueStackOffset + 2);
                    if (node.subroutineName != null) node.subroutineName.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 5);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleSubroutineStmt1486(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTSubroutineStmtNode node = new ASTSubroutineStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.prefixSpecList = (IASTListNode<ASTPrefixSpecNode>)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("prefixSpecList");
                    if (node.prefixSpecList != null) node.prefixSpecList.setParent(node);
                    node.hiddenTSubroutine = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("hiddenTSubroutine");
                    if (node.hiddenTSubroutine != null) node.hiddenTSubroutine.setParent(node);
                    node.subroutineName = (ASTSubroutineNameNode)valueStack.get(valueStackOffset + 2);
                    if (node.subroutineName != null) node.subroutineName.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.subroutinePars = (IASTListNode<ASTSubroutineParNode>)valueStack.get(valueStackOffset + 4);
                    if (node.subroutinePars != null) node.subroutinePars.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 5);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 6);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleSubroutineStmt1487(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTSubroutineStmtNode node = new ASTSubroutineStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.prefixSpecList = (IASTListNode<ASTPrefixSpecNode>)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("prefixSpecList");
                    if (node.prefixSpecList != null) node.prefixSpecList.setParent(node);
                    node.hiddenTSubroutine = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("hiddenTSubroutine");
                    if (node.hiddenTSubroutine != null) node.hiddenTSubroutine.setParent(node);
                    node.subroutineName = (ASTSubroutineNameNode)valueStack.get(valueStackOffset + 2);
                    if (node.subroutineName != null) node.subroutineName.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    node.hiddenTBind = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 5);
                    if (node.hiddenTBind != null) node.hiddenTBind.setParent(node);
                    node.hiddenTLparen2 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 6);
                    if (node.hiddenTLparen2 != null) node.hiddenTLparen2.setParent(node);
                    node.hiddenTIdent = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 7);
                    if (node.hiddenTIdent != null) node.hiddenTIdent.setParent(node);
                    node.hiddenTRparen2 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 8);
                    if (node.hiddenTRparen2 != null) node.hiddenTRparen2.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 9);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleSubroutineStmt1488(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTSubroutineStmtNode node = new ASTSubroutineStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.prefixSpecList = (IASTListNode<ASTPrefixSpecNode>)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("prefixSpecList");
                    if (node.prefixSpecList != null) node.prefixSpecList.setParent(node);
                    node.hiddenTSubroutine = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("hiddenTSubroutine");
                    if (node.hiddenTSubroutine != null) node.hiddenTSubroutine.setParent(node);
                    node.subroutineName = (ASTSubroutineNameNode)valueStack.get(valueStackOffset + 2);
                    if (node.subroutineName != null) node.subroutineName.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.subroutinePars = (IASTListNode<ASTSubroutineParNode>)valueStack.get(valueStackOffset + 4);
                    if (node.subroutinePars != null) node.subroutinePars.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 5);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    node.hiddenTBind = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 6);
                    if (node.hiddenTBind != null) node.hiddenTBind.setParent(node);
                    node.hiddenTLparen2 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 7);
                    if (node.hiddenTLparen2 != null) node.hiddenTLparen2.setParent(node);
                    node.hiddenTIdent = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 8);
                    if (node.hiddenTIdent != null) node.hiddenTIdent.setParent(node);
                    node.hiddenTRparen2 = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 9);
                    if (node.hiddenTRparen2 != null) node.hiddenTRparen2.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 10);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleSubroutinePrefix1489(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 3 and 4
                    Map<String, Object> node = new HashMap<String, Object>();
                    node.put("hiddenTSubroutine", (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0));
                    ASTListNode<IASTNode> embeddedList = new ASTListNode<IASTNode>();
                    embeddedList.add((IASTNode)(node.get("prefixSpecList")));
                    embeddedList.add((IASTNode)(node.get("hiddenTSubroutine")));
                    node.put("errorRecoveryList", embeddedList);
                    return node;

        }
        public Object handleSubroutinePrefix1490(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 3 and 4
                    Map<String, Object> node = new HashMap<String, Object>();
                    node.put("prefixSpecList", (IASTListNode<ASTPrefixSpecNode>)valueStack.get(valueStackOffset + 0));
                    node.put("hiddenTSubroutine", (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1));
                    ASTListNode<IASTNode> embeddedList = new ASTListNode<IASTNode>();
                    embeddedList.add((IASTNode)(node.get("prefixSpecList")));
                    embeddedList.add((IASTNode)(node.get("hiddenTSubroutine")));
                    node.put("errorRecoveryList", embeddedList);
                    return node;

        }
        public Object handleSubroutinePars1491(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 7 with separator
                    ASTSeparatedListNode<ASTSubroutineParNode> list = new ASTSeparatedListNode<ASTSubroutineParNode>();
                    ASTSubroutineParNode elt = (ASTSubroutineParNode)valueStack.get(valueStackOffset + 0);
                    list.add(null, elt);
                    if (elt != null) elt.setParent(list);
                    return list;

        }
        public Object handleSubroutinePars1492(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 8 with separator
                    ASTSeparatedListNode<ASTSubroutineParNode> list = (ASTSeparatedListNode<ASTSubroutineParNode>)valueStack.get(valueStackOffset);
                    org.eclipse.photran.internal.core.lexer.Token token = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    ASTSubroutineParNode elt = (ASTSubroutineParNode)valueStack.get(valueStackOffset + 2);
                    list.add(token, elt);
                    token.setParent(list);
                    if (elt != null) elt.setParent(list);
                    return list;

        }
        public Object handleSubroutinePar1493(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTSubroutineParNode node = new ASTSubroutineParNode();
                    node.variableName = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("variableName");
                    if (node.variableName != null) node.variableName.setParent(node);
                    return node;

        }
        public Object handleSubroutinePar1494(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTSubroutineParNode node = new ASTSubroutineParNode();
                    node.isAsterisk = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.isAsterisk != null) node.isAsterisk.setParent(node);
                    return node;

        }
        public Object handleEndSubroutineStmt1495(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTEndSubroutineStmtNode node = new ASTEndSubroutineStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTEnd = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTEnd != null) node.hiddenTEnd.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleEndSubroutineStmt1496(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTEndSubroutineStmtNode node = new ASTEndSubroutineStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTEndsubroutine = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTEndsubroutine != null) node.hiddenTEndsubroutine.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleEndSubroutineStmt1497(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTEndSubroutineStmtNode node = new ASTEndSubroutineStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTEndsubroutine = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTEndsubroutine != null) node.hiddenTEndsubroutine.setParent(node);
                    node.endName = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 2)).get("endName");
                    if (node.endName != null) node.endName.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleEndSubroutineStmt1498(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTEndSubroutineStmtNode node = new ASTEndSubroutineStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTEnd = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTEnd != null) node.hiddenTEnd.setParent(node);
                    node.hiddenTSubroutine = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTSubroutine != null) node.hiddenTSubroutine.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleEndSubroutineStmt1499(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTEndSubroutineStmtNode node = new ASTEndSubroutineStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTEnd = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTEnd != null) node.hiddenTEnd.setParent(node);
                    node.hiddenTSubroutine = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTSubroutine != null) node.hiddenTSubroutine.setParent(node);
                    node.endName = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 3)).get("endName");
                    if (node.endName != null) node.endName.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleEntryStmt1500(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTEntryStmtNode node = new ASTEntryStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTEntry = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTEntry != null) node.hiddenTEntry.setParent(node);
                    node.entryName = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 2)).get("entryName");
                    if (node.entryName != null) node.entryName.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleEntryStmt1501(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTEntryStmtNode node = new ASTEntryStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTEntry = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTEntry != null) node.hiddenTEntry.setParent(node);
                    node.entryName = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 2)).get("entryName");
                    if (node.entryName != null) node.entryName.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.subroutinePars = (IASTListNode<ASTSubroutineParNode>)valueStack.get(valueStackOffset + 4);
                    if (node.subroutinePars != null) node.subroutinePars.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 5);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 6);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleReturnStmt1502(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTReturnStmtNode node = new ASTReturnStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTReturn = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTReturn != null) node.hiddenTReturn.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleReturnStmt1503(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTReturnStmtNode node = new ASTReturnStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTReturn = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTReturn != null) node.hiddenTReturn.setParent(node);
                    node.expr = (IExpr)valueStack.get(valueStackOffset + 2);
                    if (node.expr != null) node.expr.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleContainsStmt1504(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTContainsStmtNode node = new ASTContainsStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTContains = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTContains != null) node.hiddenTContains.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleStmtFunctionStmt1505(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTStmtFunctionStmtNode node = new ASTStmtFunctionStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    ASTNameNode tmp1 = new ASTNameNode();
                    tmp1.name = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("name");
                    if (tmp1.name != null) tmp1.name.setParent(tmp1);
                    node.name = tmp1;
                    if (tmp1 != null) tmp1.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 2)).get("hiddenTLparen");
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.SFDummyArgNameList = (IASTListNode<ASTSFDummyArgNameListNode>)((Map<String, Object>)valueStack.get(valueStackOffset + 2)).get("SFDummyArgNameList");
                    if (node.SFDummyArgNameList != null) node.SFDummyArgNameList.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 2)).get("hiddenTRparen");
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    node.hiddenTEquals = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 2)).get("hiddenTEquals");
                    if (node.hiddenTEquals != null) node.hiddenTEquals.setParent(node);
                    node.expr = (IExpr)((Map<String, Object>)valueStack.get(valueStackOffset + 2)).get("expr");
                    if (node.expr != null) node.expr.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 2)).get("hiddenTEos");
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleStmtFunctionRange1506(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 3 and 4
                    Map<String, Object> node = new HashMap<String, Object>();
                    node.put("hiddenTLparen", (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0));
                    node.put("hiddenTRparen", (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1));
                    node.put("hiddenTEquals", (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2));
                    node.put("expr", (IExpr)valueStack.get(valueStackOffset + 3));
                    node.put("hiddenTEos", (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4));
                    ASTListNode<IASTNode> embeddedList = new ASTListNode<IASTNode>();
                    embeddedList.add((IASTNode)(node.get("hiddenTLparen")));
                    embeddedList.add((IASTNode)(node.get("SFDummyArgNameList")));
                    embeddedList.add((IASTNode)(node.get("hiddenTRparen")));
                    embeddedList.add((IASTNode)(node.get("hiddenTEquals")));
                    embeddedList.add((IASTNode)(node.get("expr")));
                    embeddedList.add((IASTNode)(node.get("hiddenTEos")));
                    node.put("errorRecoveryList", embeddedList);
                    return node;

        }
        public Object handleStmtFunctionRange1507(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 3 and 4
                    Map<String, Object> node = new HashMap<String, Object>();
                    node.put("hiddenTLparen", (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0));
                    node.put("SFDummyArgNameList", (IASTListNode<ASTSFDummyArgNameListNode>)valueStack.get(valueStackOffset + 1));
                    node.put("hiddenTRparen", (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2));
                    node.put("hiddenTEquals", (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3));
                    node.put("expr", (IExpr)valueStack.get(valueStackOffset + 4));
                    node.put("hiddenTEos", (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 5));
                    ASTListNode<IASTNode> embeddedList = new ASTListNode<IASTNode>();
                    embeddedList.add((IASTNode)(node.get("hiddenTLparen")));
                    embeddedList.add((IASTNode)(node.get("SFDummyArgNameList")));
                    embeddedList.add((IASTNode)(node.get("hiddenTRparen")));
                    embeddedList.add((IASTNode)(node.get("hiddenTEquals")));
                    embeddedList.add((IASTNode)(node.get("expr")));
                    embeddedList.add((IASTNode)(node.get("hiddenTEos")));
                    node.put("errorRecoveryList", embeddedList);
                    return node;

        }
        public Object handleSFDummyArgNameList1508(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 10
                    ASTSFDummyArgNameListNode node = new ASTSFDummyArgNameListNode();
                    node.name = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("name");
                    if (node.name != null) node.name.setParent(node);
                    ASTListNode<ASTSFDummyArgNameListNode> list = new ASTListNode<ASTSFDummyArgNameListNode>();
                    list.add(node);
                    node.setParent(list);
                    return list;

        }
        public Object handleSFDummyArgNameList1509(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Case 11
                    ASTSFDummyArgNameListNode node = new ASTSFDummyArgNameListNode();
                    node.hiddenTComma = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTComma != null) node.hiddenTComma.setParent(node);
                    node.name = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 2)).get("name");
                    if (node.name != null) node.name.setParent(node);
                    ASTListNode<ASTSFDummyArgNameListNode> list = (ASTListNode<ASTSFDummyArgNameListNode>)valueStack.get(valueStackOffset);
                    list.add(node);
                    node.setParent(list);
                    return list;

        }
        public Object handleArrayName1510(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 3 and 4
                    Map<String, Object> node = new HashMap<String, Object>();
                    node.put("arrayName", (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0));
                    ASTListNode<IASTNode> embeddedList = new ASTListNode<IASTNode>();
                    embeddedList.add((IASTNode)(node.get("arrayName")));
                    node.put("errorRecoveryList", embeddedList);
                    return node;

        }
        public Object handleBlockDataName1511(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTBlockDataNameNode node = new ASTBlockDataNameNode();
                    node.blockDataName = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.blockDataName != null) node.blockDataName.setParent(node);
                    return node;

        }
        public Object handleCommonBlockName1512(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 3 and 4
                    Map<String, Object> node = new HashMap<String, Object>();
                    node.put("commonBlockName", (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0));
                    ASTListNode<IASTNode> embeddedList = new ASTListNode<IASTNode>();
                    embeddedList.add((IASTNode)(node.get("commonBlockName")));
                    node.put("errorRecoveryList", embeddedList);
                    return node;

        }
        public Object handleComponentName1513(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTComponentNameNode node = new ASTComponentNameNode();
                    node.componentName = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.componentName != null) node.componentName.setParent(node);
                    return node;

        }
        public Object handleDummyArgName1514(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 3 and 4
                    Map<String, Object> node = new HashMap<String, Object>();
                    node.put("variableName", (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0));
                    ASTListNode<IASTNode> embeddedList = new ASTListNode<IASTNode>();
                    embeddedList.add((IASTNode)(node.get("variableName")));
                    node.put("errorRecoveryList", embeddedList);
                    return node;

        }
        public Object handleEndName1515(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 3 and 4
                    Map<String, Object> node = new HashMap<String, Object>();
                    node.put("endName", (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0));
                    ASTListNode<IASTNode> embeddedList = new ASTListNode<IASTNode>();
                    embeddedList.add((IASTNode)(node.get("endName")));
                    node.put("errorRecoveryList", embeddedList);
                    return node;

        }
        public Object handleEntryName1516(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 3 and 4
                    Map<String, Object> node = new HashMap<String, Object>();
                    node.put("entryName", (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0));
                    ASTListNode<IASTNode> embeddedList = new ASTListNode<IASTNode>();
                    embeddedList.add((IASTNode)(node.get("entryName")));
                    node.put("errorRecoveryList", embeddedList);
                    return node;

        }
        public Object handleExternalName1517(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 3 and 4
                    Map<String, Object> node = new HashMap<String, Object>();
                    node.put("externalName", (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0));
                    ASTListNode<IASTNode> embeddedList = new ASTListNode<IASTNode>();
                    embeddedList.add((IASTNode)(node.get("externalName")));
                    node.put("errorRecoveryList", embeddedList);
                    return node;

        }
        public Object handleFunctionName1518(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTFunctionNameNode node = new ASTFunctionNameNode();
                    node.functionName = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.functionName != null) node.functionName.setParent(node);
                    return node;

        }
        public Object handleGenericName1519(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTGenericNameNode node = new ASTGenericNameNode();
                    node.genericName = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.genericName != null) node.genericName.setParent(node);
                    return node;

        }
        public Object handleImpliedDoVariable1520(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 3 and 4
                    Map<String, Object> node = new HashMap<String, Object>();
                    node.put("impliedDoVariable", (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0));
                    ASTListNode<IASTNode> embeddedList = new ASTListNode<IASTNode>();
                    embeddedList.add((IASTNode)(node.get("impliedDoVariable")));
                    node.put("errorRecoveryList", embeddedList);
                    return node;

        }
        public Object handleIntrinsicProcedureName1521(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 3 and 4
                    Map<String, Object> node = new HashMap<String, Object>();
                    node.put("intrinsicProcedureName", (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0));
                    ASTListNode<IASTNode> embeddedList = new ASTListNode<IASTNode>();
                    embeddedList.add((IASTNode)(node.get("intrinsicProcedureName")));
                    node.put("errorRecoveryList", embeddedList);
                    return node;

        }
        public Object handleModuleName1522(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTModuleNameNode node = new ASTModuleNameNode();
                    node.moduleName = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.moduleName != null) node.moduleName.setParent(node);
                    return node;

        }
        public Object handleNamelistGroupName1523(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 3 and 4
                    Map<String, Object> node = new HashMap<String, Object>();
                    node.put("namelistGroupName", (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0));
                    ASTListNode<IASTNode> embeddedList = new ASTListNode<IASTNode>();
                    embeddedList.add((IASTNode)(node.get("namelistGroupName")));
                    node.put("errorRecoveryList", embeddedList);
                    return node;

        }
        public Object handleObjectName1524(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTObjectNameNode node = new ASTObjectNameNode();
                    node.objectName = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.objectName != null) node.objectName.setParent(node);
                    return node;

        }
        public Object handleProgramName1525(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTProgramNameNode node = new ASTProgramNameNode();
                    node.programName = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.programName != null) node.programName.setParent(node);
                    return node;

        }
        public Object handleSFDummyArgName1526(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 3 and 4
                    Map<String, Object> node = new HashMap<String, Object>();
                    node.put("name", (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("name"));
                    ASTListNode<IASTNode> embeddedList = new ASTListNode<IASTNode>();
                    embeddedList.add((IASTNode)(node.get("name")));
                    node.put("errorRecoveryList", embeddedList);
                    return node;

        }
        public Object handleSFVarName1527(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTSFVarNameNode node = new ASTSFVarNameNode();
                    ASTNameNode tmp0 = new ASTNameNode();
                    tmp0.name = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("name");
                    if (tmp0.name != null) tmp0.name.setParent(tmp0);
                    node.name = tmp0;
                    if (tmp0 != null) tmp0.setParent(node);
                    return node;

        }
        public Object handleSubroutineName1528(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTSubroutineNameNode node = new ASTSubroutineNameNode();
                    node.subroutineName = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0);
                    if (node.subroutineName != null) node.subroutineName.setParent(node);
                    return node;

        }
        public Object handleSubroutineNameUse1529(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 3 and 4
                    Map<String, Object> node = new HashMap<String, Object>();
                    node.put("subroutineName", (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0));
                    ASTListNode<IASTNode> embeddedList = new ASTListNode<IASTNode>();
                    embeddedList.add((IASTNode)(node.get("subroutineName")));
                    node.put("errorRecoveryList", embeddedList);
                    return node;

        }
        public Object handleTypeName1530(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 3 and 4
                    Map<String, Object> node = new HashMap<String, Object>();
                    node.put("typeName", (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0));
                    ASTListNode<IASTNode> embeddedList = new ASTListNode<IASTNode>();
                    embeddedList.add((IASTNode)(node.get("typeName")));
                    node.put("errorRecoveryList", embeddedList);
                    return node;

        }
        public Object handleUseName1531(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 3 and 4
                    Map<String, Object> node = new HashMap<String, Object>();
                    node.put("name", (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 0));
                    ASTListNode<IASTNode> embeddedList = new ASTListNode<IASTNode>();
                    embeddedList.add((IASTNode)(node.get("name")));
                    node.put("errorRecoveryList", embeddedList);
                    return node;

        }
        public Object handleLblDef1532(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 3 and 4
                    Map<String, Object> node = new HashMap<String, Object>();
                    ASTListNode<IASTNode> embeddedList = new ASTListNode<IASTNode>();
                    embeddedList.add((IASTNode)(node.get("label")));
                    node.put("errorRecoveryList", embeddedList);
                    return node;

        }
        public Object handleLblDef1533(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 3 and 4
                    Map<String, Object> node = new HashMap<String, Object>();
                    node.put("label", (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label"));
                    ASTListNode<IASTNode> embeddedList = new ASTListNode<IASTNode>();
                    embeddedList.add((IASTNode)(node.get("label")));
                    node.put("errorRecoveryList", embeddedList);
                    return node;

        }
        public Object handlePauseStmt1534(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTPauseStmtNode node = new ASTPauseStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTPause = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTPause != null) node.hiddenTPause.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handlePauseStmt1535(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTPauseStmtNode node = new ASTPauseStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTPause = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTPause != null) node.hiddenTPause.setParent(node);
                    node.intConst = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.intConst != null) node.intConst.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handlePauseStmt1536(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTPauseStmtNode node = new ASTPauseStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTPause = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTPause != null) node.hiddenTPause.setParent(node);
                    node.stringConst = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.stringConst != null) node.stringConst.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleAssignStmt1537(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTAssignStmtNode node = new ASTAssignStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTAssign = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTAssign != null) node.hiddenTAssign.setParent(node);
                    ASTLblRefNode tmp2 = new ASTLblRefNode();
                    tmp2.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 2)).get("label");
                    if (tmp2.label != null) tmp2.label.setParent(tmp2);
                    node.assignedLblRef = tmp2;
                    if (tmp2 != null) tmp2.setParent(node);
                    node.hiddenTTo = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTTo != null) node.hiddenTTo.setParent(node);
                    node.variableName = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 4)).get("variableName");
                    if (node.variableName != null) node.variableName.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 5);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleAssignedGotoStmt1538(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTAssignedGotoStmtNode node = new ASTAssignedGotoStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTGoto = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("hiddenTGoto");
                    if (node.hiddenTGoto != null) node.hiddenTGoto.setParent(node);
                    node.hiddenTGo = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("hiddenTGo");
                    if (node.hiddenTGo != null) node.hiddenTGo.setParent(node);
                    node.hiddenTTo = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("hiddenTTo");
                    if (node.hiddenTTo != null) node.hiddenTTo.setParent(node);
                    node.variableName = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 2)).get("variableName");
                    if (node.variableName != null) node.variableName.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleAssignedGotoStmt1539(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTAssignedGotoStmtNode node = new ASTAssignedGotoStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTGoto = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("hiddenTGoto");
                    if (node.hiddenTGoto != null) node.hiddenTGoto.setParent(node);
                    node.hiddenTGo = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("hiddenTGo");
                    if (node.hiddenTGo != null) node.hiddenTGo.setParent(node);
                    node.hiddenTTo = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("hiddenTTo");
                    if (node.hiddenTTo != null) node.hiddenTTo.setParent(node);
                    node.variableName = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 2)).get("variableName");
                    if (node.variableName != null) node.variableName.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.lblRefList = (IASTListNode<ASTLblRefListNode>)valueStack.get(valueStackOffset + 4);
                    if (node.lblRefList != null) node.lblRefList.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 5);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 6);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleAssignedGotoStmt1540(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTAssignedGotoStmtNode node = new ASTAssignedGotoStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTGoto = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("hiddenTGoto");
                    if (node.hiddenTGoto != null) node.hiddenTGoto.setParent(node);
                    node.hiddenTGo = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("hiddenTGo");
                    if (node.hiddenTGo != null) node.hiddenTGo.setParent(node);
                    node.hiddenTTo = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("hiddenTTo");
                    if (node.hiddenTTo != null) node.hiddenTTo.setParent(node);
                    node.variableName = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 2)).get("variableName");
                    if (node.variableName != null) node.variableName.setParent(node);
                    node.hiddenTComma = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 2)).get("hiddenTComma");
                    if (node.hiddenTComma != null) node.hiddenTComma.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.lblRefList = (IASTListNode<ASTLblRefListNode>)valueStack.get(valueStackOffset + 4);
                    if (node.lblRefList != null) node.lblRefList.setParent(node);
                    node.hiddenTRparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 5);
                    if (node.hiddenTRparen != null) node.hiddenTRparen.setParent(node);
                    node.hiddenTEos = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 6);
                    if (node.hiddenTEos != null) node.hiddenTEos.setParent(node);
                    return node;

        }
        public Object handleVariableComma1541(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 3 and 4
                    Map<String, Object> node = new HashMap<String, Object>();
                    node.put("variableName", (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("variableName"));
                    node.put("hiddenTComma", (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1));
                    ASTListNode<IASTNode> embeddedList = new ASTListNode<IASTNode>();
                    embeddedList.add((IASTNode)(node.get("variableName")));
                    embeddedList.add((IASTNode)(node.get("hiddenTComma")));
                    node.put("errorRecoveryList", embeddedList);
                    return node;

        }
        public Object handleProgramUnitError0(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTErrorProgramUnitNode node = new ASTErrorProgramUnitNode();
                    node.errorInfo = errorInfo;
                    if (node.getSymbolsDiscardedDuringErrorRecovery() != null)
                        for (IASTNode n : node.getSymbolsDiscardedDuringErrorRecovery())
                            if (n != null)
                                n.setParent(node);
                    return node;

        }
        public Object handleBodyConstructError1(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTErrorConstructNode node = new ASTErrorConstructNode();
                    node.errorInfo = errorInfo;
                    if (node.getSymbolsDiscardedDuringErrorRecovery() != null)
                        for (IASTNode n : node.getSymbolsDiscardedDuringErrorRecovery())
                            if (n != null)
                                n.setParent(node);
                    return node;

        }
        public Object handleTypeDeclarationStmtError2(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTTypeDeclarationStmtNode node = new ASTTypeDeclarationStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.typeSpec = (ASTTypeSpecNode)valueStack.get(valueStackOffset + 1);
                    if (node.typeSpec != null) node.typeSpec.setParent(node);
                    node.errorInfo = errorInfo;
                    if (node.getSymbolsDiscardedDuringErrorRecovery() != null)
                        for (IASTNode n : node.getSymbolsDiscardedDuringErrorRecovery())
                            if (n != null)
                                n.setParent(node);
                    return node;

        }
        public Object handleDataStmtError3(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTDataStmtNode node = new ASTDataStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTData = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTData != null) node.hiddenTData.setParent(node);
                    node.errorInfo = errorInfo;
                    if (node.getSymbolsDiscardedDuringErrorRecovery() != null)
                        for (IASTNode n : node.getSymbolsDiscardedDuringErrorRecovery())
                            if (n != null)
                                n.setParent(node);
                    return node;

        }
        public Object handleAllocateStmtError4(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTAllocateStmtNode node = new ASTAllocateStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTAllocate = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTAllocate != null) node.hiddenTAllocate.setParent(node);
                    node.hiddenTLparen = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTLparen != null) node.hiddenTLparen.setParent(node);
                    node.errorInfo = errorInfo;
                    if (node.getSymbolsDiscardedDuringErrorRecovery() != null)
                        for (IASTNode n : node.getSymbolsDiscardedDuringErrorRecovery())
                            if (n != null)
                                n.setParent(node);
                    return node;

        }
        public Object handleAssignmentStmtError5(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTAssignmentStmtNode node = new ASTAssignmentStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    ASTNameNode tmp1 = new ASTNameNode();
                    tmp1.name = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("name");
                    if (tmp1.name != null) tmp1.name.setParent(tmp1);
                    node.lhsVariable = tmp1;
                    if (tmp1 != null) tmp1.setParent(node);
                    node.errorInfo = errorInfo;
                    if (node.getSymbolsDiscardedDuringErrorRecovery() != null)
                        for (IASTNode n : node.getSymbolsDiscardedDuringErrorRecovery())
                            if (n != null)
                                n.setParent(node);
                    return node;

        }
        public Object handleForallConstructStmtError6(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTForallConstructStmtNode node = new ASTForallConstructStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTForall = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTForall != null) node.hiddenTForall.setParent(node);
                    node.errorInfo = errorInfo;
                    if (node.getSymbolsDiscardedDuringErrorRecovery() != null)
                        for (IASTNode n : node.getSymbolsDiscardedDuringErrorRecovery())
                            if (n != null)
                                n.setParent(node);
                    return node;

        }
        public Object handleForallConstructStmtError7(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTForallConstructStmtNode node = new ASTForallConstructStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.name = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("name");
                    if (node.name != null) node.name.setParent(node);
                    node.hiddenTColon = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTColon != null) node.hiddenTColon.setParent(node);
                    node.hiddenTForall = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTForall != null) node.hiddenTForall.setParent(node);
                    node.errorInfo = errorInfo;
                    if (node.getSymbolsDiscardedDuringErrorRecovery() != null)
                        for (IASTNode n : node.getSymbolsDiscardedDuringErrorRecovery())
                            if (n != null)
                                n.setParent(node);
                    return node;

        }
        public Object handleIfThenErrorError8(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTIfThenErrorNode node = new ASTIfThenErrorNode();
                    node.errorInfo = errorInfo;
                    if (node.getSymbolsDiscardedDuringErrorRecovery() != null)
                        for (IASTNode n : node.getSymbolsDiscardedDuringErrorRecovery())
                            if (n != null)
                                n.setParent(node);
                    return node;

        }
        public Object handleElseIfStmtError9(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTElseIfStmtNode node = new ASTElseIfStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTElseif = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTElseif != null) node.hiddenTElseif.setParent(node);
                    node.errorInfo = errorInfo;
                    if (node.getSymbolsDiscardedDuringErrorRecovery() != null)
                        for (IASTNode n : node.getSymbolsDiscardedDuringErrorRecovery())
                            if (n != null)
                                n.setParent(node);
                    return node;

        }
        public Object handleElseIfStmtError10(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTElseIfStmtNode node = new ASTElseIfStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTElse = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTElse != null) node.hiddenTElse.setParent(node);
                    node.hiddenTIf = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTIf != null) node.hiddenTIf.setParent(node);
                    node.errorInfo = errorInfo;
                    if (node.getSymbolsDiscardedDuringErrorRecovery() != null)
                        for (IASTNode n : node.getSymbolsDiscardedDuringErrorRecovery())
                            if (n != null)
                                n.setParent(node);
                    return node;

        }
        public Object handleElseStmtError11(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTElseStmtNode node = new ASTElseStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTElse = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTElse != null) node.hiddenTElse.setParent(node);
                    node.errorInfo = errorInfo;
                    if (node.getSymbolsDiscardedDuringErrorRecovery() != null)
                        for (IASTNode n : node.getSymbolsDiscardedDuringErrorRecovery())
                            if (n != null)
                                n.setParent(node);
                    return node;

        }
        public Object handleIfStmtError12(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTIfStmtNode node = new ASTIfStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.tIf = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.tIf != null) node.tIf.setParent(node);
                    node.errorInfo = errorInfo;
                    if (node.getSymbolsDiscardedDuringErrorRecovery() != null)
                        for (IASTNode n : node.getSymbolsDiscardedDuringErrorRecovery())
                            if (n != null)
                                n.setParent(node);
                    return node;

        }
        public Object handleSelectCaseStmtError13(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTSelectCaseStmtNode node = new ASTSelectCaseStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.name = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("name");
                    if (node.name != null) node.name.setParent(node);
                    node.hiddenTColon = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTColon != null) node.hiddenTColon.setParent(node);
                    node.hiddenTSelectcase = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTSelectcase != null) node.hiddenTSelectcase.setParent(node);
                    node.errorInfo = errorInfo;
                    if (node.getSymbolsDiscardedDuringErrorRecovery() != null)
                        for (IASTNode n : node.getSymbolsDiscardedDuringErrorRecovery())
                            if (n != null)
                                n.setParent(node);
                    return node;

        }
        public Object handleSelectCaseStmtError14(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTSelectCaseStmtNode node = new ASTSelectCaseStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTSelectcase = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTSelectcase != null) node.hiddenTSelectcase.setParent(node);
                    node.errorInfo = errorInfo;
                    if (node.getSymbolsDiscardedDuringErrorRecovery() != null)
                        for (IASTNode n : node.getSymbolsDiscardedDuringErrorRecovery())
                            if (n != null)
                                n.setParent(node);
                    return node;

        }
        public Object handleSelectCaseStmtError15(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTSelectCaseStmtNode node = new ASTSelectCaseStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.name = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("name");
                    if (node.name != null) node.name.setParent(node);
                    node.hiddenTColon = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTColon != null) node.hiddenTColon.setParent(node);
                    node.hiddenTSelect = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 3);
                    if (node.hiddenTSelect != null) node.hiddenTSelect.setParent(node);
                    node.hiddenTCase = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 4);
                    if (node.hiddenTCase != null) node.hiddenTCase.setParent(node);
                    node.errorInfo = errorInfo;
                    if (node.getSymbolsDiscardedDuringErrorRecovery() != null)
                        for (IASTNode n : node.getSymbolsDiscardedDuringErrorRecovery())
                            if (n != null)
                                n.setParent(node);
                    return node;

        }
        public Object handleSelectCaseStmtError16(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTSelectCaseStmtNode node = new ASTSelectCaseStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTSelect = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTSelect != null) node.hiddenTSelect.setParent(node);
                    node.hiddenTCase = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 2);
                    if (node.hiddenTCase != null) node.hiddenTCase.setParent(node);
                    node.errorInfo = errorInfo;
                    if (node.getSymbolsDiscardedDuringErrorRecovery() != null)
                        for (IASTNode n : node.getSymbolsDiscardedDuringErrorRecovery())
                            if (n != null)
                                n.setParent(node);
                    return node;

        }
        public Object handleCaseStmtError17(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTCaseStmtNode node = new ASTCaseStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTCase = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTCase != null) node.hiddenTCase.setParent(node);
                    node.errorInfo = errorInfo;
                    if (node.getSymbolsDiscardedDuringErrorRecovery() != null)
                        for (IASTNode n : node.getSymbolsDiscardedDuringErrorRecovery())
                            if (n != null)
                                n.setParent(node);
                    return node;

        }
        public Object handleFormatStmtError18(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTFormatStmtNode node = new ASTFormatStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.hiddenTFormat = (org.eclipse.photran.internal.core.lexer.Token)valueStack.get(valueStackOffset + 1);
                    if (node.hiddenTFormat != null) node.hiddenTFormat.setParent(node);
                    node.errorInfo = errorInfo;
                    if (node.getSymbolsDiscardedDuringErrorRecovery() != null)
                        for (IASTNode n : node.getSymbolsDiscardedDuringErrorRecovery())
                            if (n != null)
                                n.setParent(node);
                    return node;

        }
        public Object handleFunctionStmtError19(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTFunctionStmtNode node = new ASTFunctionStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.prefixSpecList = (IASTListNode<ASTPrefixSpecNode>)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("prefixSpecList");
                    if (node.prefixSpecList != null) node.prefixSpecList.setParent(node);
                    node.hiddenTFunction = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("hiddenTFunction");
                    if (node.hiddenTFunction != null) node.hiddenTFunction.setParent(node);
                    node.functionName = (ASTFunctionNameNode)valueStack.get(valueStackOffset + 2);
                    if (node.functionName != null) node.functionName.setParent(node);
                    node.errorInfo = errorInfo;
                    if (node.getSymbolsDiscardedDuringErrorRecovery() != null)
                        for (IASTNode n : node.getSymbolsDiscardedDuringErrorRecovery())
                            if (n != null)
                                n.setParent(node);
                    return node;

        }
        public Object handleSubroutineStmtError20(int productionIndex, List<Object> valueStack, int valueStackOffset, int valueStackSize, ErrorRecoveryInfo errorInfo)
        {
                    // Cases 1 and 2
                    ASTSubroutineStmtNode node = new ASTSubroutineStmtNode();
                    node.label = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 0)).get("label");
                    if (node.label != null) node.label.setParent(node);
                    node.prefixSpecList = (IASTListNode<ASTPrefixSpecNode>)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("prefixSpecList");
                    if (node.prefixSpecList != null) node.prefixSpecList.setParent(node);
                    node.hiddenTSubroutine = (org.eclipse.photran.internal.core.lexer.Token)((Map<String, Object>)valueStack.get(valueStackOffset + 1)).get("hiddenTSubroutine");
                    if (node.hiddenTSubroutine != null) node.hiddenTSubroutine.setParent(node);
                    node.subroutineName = (ASTSubroutineNameNode)valueStack.get(valueStackOffset + 2);
                    if (node.subroutineName != null) node.subroutineName.setParent(node);
                    node.errorInfo = errorInfo;
                    if (node.getSymbolsDiscardedDuringErrorRecovery() != null)
                        for (IASTNode n : node.getSymbolsDiscardedDuringErrorRecovery())
                            if (n != null)
                                n.setParent(node);
                    return node;

        }
}
