public final TLParser.powExpr_return powExpr() throws RecognitionException {
        TLParser.powExpr_return retval = new TLParser.powExpr_return();
        retval.start = input.LT(1);

        Object root_0 = null;

        Token char_literal127=null;
        TLParser.unaryExpr_return unaryExpr126 = null;

        TLParser.unaryExpr_return unaryExpr128 = null;


        Object char_literal127_tree=null;

        try {
            // src/grammar/TL.g:167:3: ( unaryExpr ( '^' unaryExpr )* )
            // src/grammar/TL.g:167:6: unaryExpr ( '^' unaryExpr )*
            {
            root_0 = (Object)adaptor.nil();

            pushFollow(FOLLOW_unaryExpr_in_powExpr1188);
            unaryExpr126=unaryExpr();

            state._fsp--;

            adaptor.addChild(root_0, unaryExpr126.getTree());
            // src/grammar/TL.g:167:16: ( '^' unaryExpr )*
            loop25:
            do {
                int alt25=2;
                int LA25_0 = input.LA(1);

                if ( (LA25_0==Pow) ) {
                    alt25=1;
                }


                switch (alt25) {
            	case 1 :
            	    // src/grammar/TL.g:167:17: '^' unaryExpr
            	    {
            	    char_literal127=(Token)match(input,Pow,FOLLOW_Pow_in_powExpr1191); 
            	    char_literal127_tree = (Object)adaptor.create(char_literal127);
            	    root_0 = (Object)adaptor.becomeRoot(char_literal127_tree, root_0);

            	    pushFollow(FOLLOW_unaryExpr_in_powExpr1194);
            	    unaryExpr128=unaryExpr();

            	    state._fsp--;

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

            	    }
            	    break;

            	default :
            	    break loop25;
                }
            } while (true);


            }

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

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

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
    	retval.tree = (Object)adaptor.errorNode(input, retval.start, input.LT(-1), re);

        }
        finally {
        }
        return retval;
    }