public final NTSParser.subsystem_annot_return subsystem_annot() throws RecognitionException {
        NTSParser.subsystem_annot_return retval = new NTSParser.subsystem_annot_return();
        retval.start = input.LT(1);

        CommonTree root_0 = null;

        Token IDN45=null;
        Token LPAR_C46=null;
        Token RPAR_C50=null;
        NTSParser.declar_return declar47 = null;

        NTSParser.marking_return marking48 = null;

        NTSParser.transition_return transition49 = null;


        CommonTree IDN45_tree=null;
        CommonTree LPAR_C46_tree=null;
        CommonTree RPAR_C50_tree=null;

        try {
            // /home/filip/workspace/nts/src/nts/parser/NTS.g:478:3: ( IDN LPAR_C ( declar )? ( marking )? ( transition )+ RPAR_C )
            // /home/filip/workspace/nts/src/nts/parser/NTS.g:478:5: IDN LPAR_C ( declar )? ( marking )? ( transition )+ RPAR_C
            {
            root_0 = (CommonTree)adaptor.nil();

            IDN45=(Token)match(input,IDN,FOLLOW_IDN_in_subsystem_annot1314); 
            IDN45_tree = (CommonTree)adaptor.create(IDN45);
            adaptor.addChild(root_0, IDN45_tree);

            LPAR_C46=(Token)match(input,LPAR_C,FOLLOW_LPAR_C_in_subsystem_annot1316); 
            LPAR_C46_tree = (CommonTree)adaptor.create(LPAR_C46);
            adaptor.addChild(root_0, LPAR_C46_tree);

             listener.subsystemInit(IDN45); 
            // /home/filip/workspace/nts/src/nts/parser/NTS.g:481:5: ( declar )?
            int alt11=2;
            alt11 = dfa11.predict(input);
            switch (alt11) {
                case 1 :
                    // /home/filip/workspace/nts/src/nts/parser/NTS.g:481:5: declar
                    {
                    pushFollow(FOLLOW_declar_in_subsystem_annot1334);
                    declar47=declar();

                    state._fsp--;

                    adaptor.addChild(root_0, declar47.getTree());

                    }
                    break;

            }

            // /home/filip/workspace/nts/src/nts/parser/NTS.g:483:5: ( marking )?
            int alt12=2;
            int LA12_0 = input.LA(1);

            if ( ((LA12_0>=STATES && LA12_0<=ERROR)) ) {
                alt12=1;
            }
            switch (alt12) {
                case 1 :
                    // /home/filip/workspace/nts/src/nts/parser/NTS.g:483:7: marking
                    {
                    pushFollow(FOLLOW_marking_in_subsystem_annot1348);
                    marking48=marking();

                    state._fsp--;

                    adaptor.addChild(root_0, marking48.getTree());

                    }
                    break;

            }

            // /home/filip/workspace/nts/src/nts/parser/NTS.g:483:18: ( transition )+
            int cnt13=0;
            loop13:
            do {
                int alt13=2;
                int LA13_0 = input.LA(1);

                if ( (LA13_0==IDN) ) {
                    alt13=1;
                }


                switch (alt13) {
            	case 1 :
            	    // /home/filip/workspace/nts/src/nts/parser/NTS.g:483:20: transition
            	    {
            	    pushFollow(FOLLOW_transition_in_subsystem_annot1355);
            	    transition49=transition();

            	    state._fsp--;

            	    adaptor.addChild(root_0, transition49.getTree());

            	    }
            	    break;

            	default :
            	    if ( cnt13 >= 1 ) break loop13;
                        EarlyExitException eee =
                            new EarlyExitException(13, input);
                        throw eee;
                }
                cnt13++;
            } while (true);

            RPAR_C50=(Token)match(input,RPAR_C,FOLLOW_RPAR_C_in_subsystem_annot1360); 
            RPAR_C50_tree = (CommonTree)adaptor.create(RPAR_C50);
            adaptor.addChild(root_0, RPAR_C50_tree);

             listener.subsystemFinalize(); 

            }

            retval.stop = input.LT(-1);

            retval.tree = (CommonTree)adaptor.rulePostProcessing(root_0);
            adaptor.setTokenBoundaries(retval.tree, retval.start, retval.stop);

        }

          catch (RecognitionException ex) {
            reportError(ex);
            System.exit(1);
          }
        finally {
        }
        return retval;
    }