public final SymbolraetselASTNormalizer.redraw_return redraw() throws RecognitionException {
        SymbolraetselASTNormalizer.redraw_return retval = new SymbolraetselASTNormalizer.redraw_return();
        retval.start = input.LT(1);

        CommonTree root_0 = null;

        CommonTree _first_0 = null;
        CommonTree _last = null;

        CommonTree a=null;
        CommonTree b=null;
        CommonTree c=null;
        CommonTree EQUALS2=null;
        CommonTree PLUS3=null;
        CommonTree EQUALS4=null;
        CommonTree MINUS5=null;

        CommonTree a_tree=null;
        CommonTree b_tree=null;
        CommonTree c_tree=null;
        CommonTree EQUALS2_tree=null;
        CommonTree PLUS3_tree=null;
        CommonTree EQUALS4_tree=null;
        CommonTree MINUS5_tree=null;
        RewriteRuleNodeStream stream_PLUS=new RewriteRuleNodeStream(adaptor,"token PLUS");
        RewriteRuleNodeStream stream_EQUALS=new RewriteRuleNodeStream(adaptor,"token EQUALS");
        RewriteRuleNodeStream stream_MINUS=new RewriteRuleNodeStream(adaptor,"token MINUS");
        RewriteRuleNodeStream stream_LETTER=new RewriteRuleNodeStream(adaptor,"token LETTER");

        try {
            // C:\\Users\\Florian\\Dropbox\\Git\\CI_WiSe2013-2014\\CI_Aufgabe3\\teil1\\symbolraetsel_AST_Normalisiert\\SymbolraetselASTNormalizer.g:20:7: ( ^( EQUALS ^( PLUS a= LETTER b= LETTER ) c= LETTER ) -> ^( EQUALS ^( ADDITION $a $b) $c) | ^( EQUALS ^( MINUS a= LETTER b= LETTER ) c= LETTER ) -> ^( EQUALS ^( ADDITION $c $b) $a) )
            int alt2=2;
            int LA2_0 = input.LA(1);

            if ( (LA2_0==EQUALS) ) {
                int LA2_1 = input.LA(2);

                if ( (LA2_1==DOWN) ) {
                    int LA2_2 = input.LA(3);

                    if ( (LA2_2==PLUS) ) {
                        alt2=1;
                    }
                    else if ( (LA2_2==MINUS) ) {
                        alt2=2;
                    }
                    else {
                        NoViableAltException nvae =
                            new NoViableAltException("", 2, 2, input);

                        throw nvae;
                    }
                }
                else {
                    NoViableAltException nvae =
                        new NoViableAltException("", 2, 1, input);

                    throw nvae;
                }
            }
            else {
                NoViableAltException nvae =
                    new NoViableAltException("", 2, 0, input);

                throw nvae;
            }
            switch (alt2) {
                case 1 :
                    // C:\\Users\\Florian\\Dropbox\\Git\\CI_WiSe2013-2014\\CI_Aufgabe3\\teil1\\symbolraetsel_AST_Normalisiert\\SymbolraetselASTNormalizer.g:20:10: ^( EQUALS ^( PLUS a= LETTER b= LETTER ) c= LETTER )
                    {
                    _last = (CommonTree)input.LT(1);
                    {
                    CommonTree _save_last_1 = _last;
                    CommonTree _first_1 = null;
                    CommonTree root_1 = (CommonTree)adaptor.nil();_last = (CommonTree)input.LT(1);
                    EQUALS2=(CommonTree)match(input,EQUALS,FOLLOW_EQUALS_in_redraw75);  
                    stream_EQUALS.add(EQUALS2);



                    match(input, Token.DOWN, null); 
                    _last = (CommonTree)input.LT(1);
                    {
                    CommonTree _save_last_2 = _last;
                    CommonTree _first_2 = null;
                    CommonTree root_2 = (CommonTree)adaptor.nil();_last = (CommonTree)input.LT(1);
                    PLUS3=(CommonTree)match(input,PLUS,FOLLOW_PLUS_in_redraw78);  
                    stream_PLUS.add(PLUS3);



                    match(input, Token.DOWN, null); 
                    _last = (CommonTree)input.LT(1);
                    a=(CommonTree)match(input,LETTER,FOLLOW_LETTER_in_redraw82);  
                    stream_LETTER.add(a);

                    _last = (CommonTree)input.LT(1);
                    b=(CommonTree)match(input,LETTER,FOLLOW_LETTER_in_redraw86);  
                    stream_LETTER.add(b);


                    match(input, Token.UP, null); adaptor.addChild(root_1, root_2);_last = _save_last_2;
                    }

                    _last = (CommonTree)input.LT(1);
                    c=(CommonTree)match(input,LETTER,FOLLOW_LETTER_in_redraw91);  
                    stream_LETTER.add(c);


                    match(input, Token.UP, null); adaptor.addChild(root_0, root_1);_last = _save_last_1;
                    }



                    // AST REWRITE
                    // elements: b, EQUALS, c, a
                    // token labels: b, c, a
                    // rule labels: retval
                    // token list labels: 
                    // rule list labels: 
                    // wildcard labels: 
                    retval.tree = root_0;
                    RewriteRuleNodeStream stream_b=new RewriteRuleNodeStream(adaptor,"token b",b);
                    RewriteRuleNodeStream stream_c=new RewriteRuleNodeStream(adaptor,"token c",c);
                    RewriteRuleNodeStream stream_a=new RewriteRuleNodeStream(adaptor,"token a",a);
                    RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

                    root_0 = (CommonTree)adaptor.nil();
                    // 21:4: -> ^( EQUALS ^( ADDITION $a $b) $c)
                    {
                        // C:\\Users\\Florian\\Dropbox\\Git\\CI_WiSe2013-2014\\CI_Aufgabe3\\teil1\\symbolraetsel_AST_Normalisiert\\SymbolraetselASTNormalizer.g:21:7: ^( EQUALS ^( ADDITION $a $b) $c)
                        {
                        CommonTree root_1 = (CommonTree)adaptor.nil();
                        root_1 = (CommonTree)adaptor.becomeRoot(stream_EQUALS.nextNode(), root_1);

                        // C:\\Users\\Florian\\Dropbox\\Git\\CI_WiSe2013-2014\\CI_Aufgabe3\\teil1\\symbolraetsel_AST_Normalisiert\\SymbolraetselASTNormalizer.g:21:16: ^( ADDITION $a $b)
                        {
                        CommonTree root_2 = (CommonTree)adaptor.nil();
                        root_2 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(ADDITION, "ADDITION"), root_2);

                        adaptor.addChild(root_2, stream_a.nextNode());
                        adaptor.addChild(root_2, stream_b.nextNode());

                        adaptor.addChild(root_1, root_2);
                        }
                        adaptor.addChild(root_1, stream_c.nextNode());

                        adaptor.addChild(root_0, root_1);
                        }

                    }

                    retval.tree = root_0;
                    }
                    break;
                case 2 :
                    // C:\\Users\\Florian\\Dropbox\\Git\\CI_WiSe2013-2014\\CI_Aufgabe3\\teil1\\symbolraetsel_AST_Normalisiert\\SymbolraetselASTNormalizer.g:22:3: ^( EQUALS ^( MINUS a= LETTER b= LETTER ) c= LETTER )
                    {
                    _last = (CommonTree)input.LT(1);
                    {
                    CommonTree _save_last_1 = _last;
                    CommonTree _first_1 = null;
                    CommonTree root_1 = (CommonTree)adaptor.nil();_last = (CommonTree)input.LT(1);
                    EQUALS4=(CommonTree)match(input,EQUALS,FOLLOW_EQUALS_in_redraw119);  
                    stream_EQUALS.add(EQUALS4);



                    match(input, Token.DOWN, null); 
                    _last = (CommonTree)input.LT(1);
                    {
                    CommonTree _save_last_2 = _last;
                    CommonTree _first_2 = null;
                    CommonTree root_2 = (CommonTree)adaptor.nil();_last = (CommonTree)input.LT(1);
                    MINUS5=(CommonTree)match(input,MINUS,FOLLOW_MINUS_in_redraw122);  
                    stream_MINUS.add(MINUS5);



                    match(input, Token.DOWN, null); 
                    _last = (CommonTree)input.LT(1);
                    a=(CommonTree)match(input,LETTER,FOLLOW_LETTER_in_redraw126);  
                    stream_LETTER.add(a);

                    _last = (CommonTree)input.LT(1);
                    b=(CommonTree)match(input,LETTER,FOLLOW_LETTER_in_redraw130);  
                    stream_LETTER.add(b);


                    match(input, Token.UP, null); adaptor.addChild(root_1, root_2);_last = _save_last_2;
                    }

                    _last = (CommonTree)input.LT(1);
                    c=(CommonTree)match(input,LETTER,FOLLOW_LETTER_in_redraw135);  
                    stream_LETTER.add(c);


                    match(input, Token.UP, null); adaptor.addChild(root_0, root_1);_last = _save_last_1;
                    }



                    // AST REWRITE
                    // elements: a, b, EQUALS, c
                    // token labels: b, c, a
                    // rule labels: retval
                    // token list labels: 
                    // rule list labels: 
                    // wildcard labels: 
                    retval.tree = root_0;
                    RewriteRuleNodeStream stream_b=new RewriteRuleNodeStream(adaptor,"token b",b);
                    RewriteRuleNodeStream stream_c=new RewriteRuleNodeStream(adaptor,"token c",c);
                    RewriteRuleNodeStream stream_a=new RewriteRuleNodeStream(adaptor,"token a",a);
                    RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.tree:null);

                    root_0 = (CommonTree)adaptor.nil();
                    // 23:3: -> ^( EQUALS ^( ADDITION $c $b) $a)
                    {
                        // C:\\Users\\Florian\\Dropbox\\Git\\CI_WiSe2013-2014\\CI_Aufgabe3\\teil1\\symbolraetsel_AST_Normalisiert\\SymbolraetselASTNormalizer.g:23:6: ^( EQUALS ^( ADDITION $c $b) $a)
                        {
                        CommonTree root_1 = (CommonTree)adaptor.nil();
                        root_1 = (CommonTree)adaptor.becomeRoot(stream_EQUALS.nextNode(), root_1);

                        // C:\\Users\\Florian\\Dropbox\\Git\\CI_WiSe2013-2014\\CI_Aufgabe3\\teil1\\symbolraetsel_AST_Normalisiert\\SymbolraetselASTNormalizer.g:23:15: ^( ADDITION $c $b)
                        {
                        CommonTree root_2 = (CommonTree)adaptor.nil();
                        root_2 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(ADDITION, "ADDITION"), root_2);

                        adaptor.addChild(root_2, stream_c.nextNode());
                        adaptor.addChild(root_2, stream_b.nextNode());

                        adaptor.addChild(root_1, root_2);
                        }
                        adaptor.addChild(root_1, stream_a.nextNode());

                        adaptor.addChild(root_0, root_1);
                        }

                    }

                    retval.tree = root_0;
                    }
                    break;

            }
            retval.tree = (CommonTree)adaptor.rulePostProcessing(root_0);

        }
        catch (RecognitionException re) {
            reportError(re);
            recover(input,re);
        }
        finally {
        }
        return retval;
    }