Package macromedia.asc.parser

Source Code of macromedia.asc.parser.NodePrinter

/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements.  See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License.  You may obtain a copy of the License at
*
*     http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

package macromedia.asc.parser;

import macromedia.asc.semantics.Value;
import macromedia.asc.util.Context;
import macromedia.asc.util.NumberUsage;

import java.io.PrintWriter;

import static macromedia.asc.parser.Tokens.*;

/**
* NodePrinter.h
*
* This visitor prints the parse tree
*
* @author Jeff Dyer
*/
public class NodePrinter implements Evaluator
{
    private PrintWriter out;
    private int level;
    private int mode;

    private void separate()
    {
        if (mode == machine_mode)
        {
            out.print("|");
        }
    }

    private void push_in()
    {
        ++level;
        if (mode == machine_mode)
        {
            out.print("[");
        }
        else
        {
            out.print(" ");
        }
    }

    private void pop_out()
    {
        if (mode == machine_mode)
        {
            out.print("]");
        }
        --level;
    }

    private void indent()
    {
        if (mode == man_mode)
        {
            out.println();
            for (int i = level; i != 0; --i)
            {
                out.print("  ");
            }
        }
    }

// public:

    public static final int man_mode = 0;
    public static final int machine_mode = 1;

    public boolean checkFeature(Context cx, Node node)
    {
        return true; // return true;
    }

    public NodePrinter()
    {
        this(man_mode, new PrintWriter(System.out, true));
    }

    public NodePrinter(PrintWriter out)
    {
        this(man_mode, out);
    }

    public NodePrinter(int mode, PrintWriter out)
    {
        this.out = out;
        this.level = 0;
        this.mode = mode;
    }

    // Base node

    public Value evaluate(Context cx, Node node)
    {
        indent();
        out.print("error:undefined printer method");
        return null;
    }

    // Expression evaluators

    public Value evaluate(Context cx, IdentifierNode node)
    {
        indent();

        if(node instanceof TypeIdentifierNode)
        {
            out.print("typeidentifier ");
        }
        else if (node.isAttr())
        {
            out.print("attributeidentifier ");
        }
        else
        {
            out.print("identifier ");
        }
        out.print(node.name);
        if(node instanceof TypeIdentifierNode)
        {
            out.print("types ");
            push_in();
            ((TypeIdentifierNode)node).typeArgs.evaluate(cx, this);
            pop_out();
        }
        return null;
    }

    // Expression evaluators

    public Value evaluate(Context cx, IncrementNode node)
    {
        indent();
        out.print("increment");
        out.print((node.getMode() == LEFTBRACKET_TOKEN ? " bracket" :
            node.getMode() == LEFTPAREN_TOKEN ? " filter" :
            node.getMode() == DOUBLEDOT_TOKEN ? " descend" :
            node.getMode() == DOT_TOKEN ? " dot" :
            node.getMode() == EMPTY_TOKEN ? " lexical" : " error"));
        out.print((node.isPostfix ? " postfix " : " prefix ") + Token.getTokenClassName(node.op));
        push_in();
        pop_out();
        separate();
        push_in();
        if (node.expr != null)
        {
            node.expr.evaluate(cx, this);
        }
        pop_out();
        return null;
    }

    public Value evaluate(Context cx, ThisExpressionNode node)
    {
        indent();
        out.print("this");
        return null;
    }

    public Value evaluate(Context cx, QualifiedIdentifierNode node)
    {
        indent();
        if (node.isAttr())
        {
            out.print("qualifiedattributeidentifier ");
        }
        else
        {
            out.print("qualifiedidentifier ");
        }
        out.print(node.name);
        if (node.qualifier != null)
        {
            push_in();
            indent();
            out.print("qualifier");
            push_in();
            node.qualifier.evaluate(cx, this);
            pop_out();
            pop_out();
        }
        return null;
    }

    public Value evaluate(Context cx, QualifiedExpressionNode node)
    {
        indent();
        if (node.isAttr())
        {
            out.print("qualifiedattributeexpression ");
        }
        else
        {
            out.print("qualifiedexpression ");
        }
        out.print(node.name);
        if (node.qualifier != null)
        {
            push_in();
            indent();
            out.print("qualifier");
            push_in();
            node.qualifier.evaluate(cx, this);
            pop_out();
            pop_out();
        }
        if (node.expr != null)
        {
            push_in();
            indent();
            out.print("expr");
            push_in();
            node.expr.evaluate(cx, this);
            pop_out();
            pop_out();
        }
        return null;
    }

    public Value evaluate(Context cx, LiteralBooleanNode node)
    {
        indent();
        out.print("literalboolean ");
        out.print(node.value ? 1 : 0);
        return null;
    }

    public Value evaluate(Context cx, LiteralNumberNode node)
    {
        indent();
        out.print("literalnumber:");
        out.print(node.value);
        return null;
    }

    public Value evaluate(Context cx, LiteralStringNode node)
    {
        indent();
        out.print("literalstring:");
        out.print(node.value);
        return null;
    }

    public Value evaluate(Context cx, LiteralNullNode node)
    {
        indent();
        out.print("literalnull");
        return null;
    }

    public Value evaluate(Context cx, LiteralRegExpNode node)
    {
        indent();
        out.print("literalregexp:");
        out.print(node.value);
        return null;
    }

    public Value evaluate(Context cx, LiteralXMLNode node)
    {
        indent();
        out.print("literalxml");
        push_in();
        if (node.list != null)
        {
            node.list.evaluate(cx, this);
        }
        pop_out();
        return null;
    }

    public Value evaluate(Context cx, FunctionCommonNode node)
    {
        indent();
        out.print("functioncommon");
        push_in();
        if (node.signature != null)
        {
            node.signature.evaluate(cx, this);
        }
        separate();
        if (node.body != null)
        {
            node.body.evaluate(cx, this);
        }
        pop_out();
        return null;
    }

    public Value evaluate(Context cx, ParenExpressionNode node)
    {
        indent();
        out.print("paren");
        return null;
    }

    public Value evaluate(Context cx, ParenListExpressionNode node)
    {
        indent();
        out.print("parenlist");
        if (node.expr != null)
        {
            node.expr.evaluate(cx, this);
        }
        return null;
    }

    public Value evaluate(Context cx, LiteralObjectNode node)
    {
        indent();
        out.print("literalobject");
        push_in();
        if (node.fieldlist != null)
        {
            node.fieldlist.evaluate(cx, this);
        }
        pop_out();
        return null;
    }

    public Value evaluate(Context cx, LiteralFieldNode node)
    {
        indent();
        out.print("literalfield");
        push_in();
        if (node.name != null)
        {
            node.name.evaluate(cx, this);
        }
        separate();
        if (node.value != null)
        {
            node.value.evaluate(cx, this);
        }
        pop_out();
        return null;
    }

    public Value evaluate(Context cx, LiteralArrayNode node)
    {
        indent();
        out.print("literalarray");
        push_in();
        if (node.elementlist != null)
        {
            node.elementlist.evaluate(cx, this);
        }
        pop_out();
        return null;
    }
   
    public Value evaluate(Context cx, LiteralVectorNode node)
    {
        indent();
        out.print("new<");
        node.type.evaluate(cx, this);
        out.print(">");
       
        push_in();
        if (node.elementlist != null)
        {
            node.elementlist.evaluate(cx, this);
        }
        pop_out();
        return null;
    }

    public Value evaluate(Context cx, SuperExpressionNode node)
    {
        indent();
        out.print("superexpression");
        push_in();
        if (node.expr != null)
        {
            node.expr.evaluate(cx, this);
        }
        pop_out();
        return null;
    }

    public Value evaluate(Context cx, MemberExpressionNode node)
    {
        indent();
        out.print("member");
        push_in();
        if (node.base != null)
        {
            node.base.evaluate(cx, this);
        }
        separate();
        if (node.selector != null)
        {
            node.selector.evaluate(cx, this);
        }
        pop_out();

        return null;
    }

    public Value evaluate(Context cx, InvokeNode node)
    {
        indent();
        out.print("invoke");
        out.print((node.getMode() == LEFTBRACKET_TOKEN ? " bracket" :
            node.getMode() == LEFTPAREN_TOKEN ? " filter" :
            node.getMode() == DOUBLEDOT_TOKEN ? " descend" :
            node.getMode() == EMPTY_TOKEN ? " lexical" : " dot"));
        push_in();
        out.print(node.name);
        separate();
        if (node.args != null)
        {
            node.args.evaluate(cx, this);
        }
        pop_out();
        return null;
    }

    public Value evaluate(Context cx, CallExpressionNode node)
    {
        indent();
        out.print((node.is_new ? "construct" : "call"));
        out.print((node.getMode() == LEFTBRACKET_TOKEN ? " bracket" :
            node.getMode() == LEFTPAREN_TOKEN ? " filter" :
            node.getMode() == DOUBLEDOT_TOKEN ? " descend" :
            node.getMode() == EMPTY_TOKEN ? " lexical" : " dot"));
        push_in();
        if (node.expr != null)
        {
            node.expr.evaluate(cx, this);
        }
        separate();

        if (node.args != null)
        {
            node.args.evaluate(cx, this);
        }
        pop_out();
        return null;
    }

    public Value evaluate(Context cx, DeleteExpressionNode node)
    {
        indent();
        out.print("delete");
        out.print((node.getMode() == LEFTBRACKET_TOKEN ? " bracket" :
            node.getMode() == LEFTPAREN_TOKEN ? " filter" :
            node.getMode() == DOUBLEDOT_TOKEN ? " descend" :
            node.getMode() == EMPTY_TOKEN ? " lexical" : " dot"));
        push_in();
        if (node.expr != null)
        {
            node.expr.evaluate(cx, this);
        }
        pop_out();
        return null;
    }

    public Value evaluate(Context cx, ApplyTypeExprNode node)
    {
        indent();
        out.print("applytype");
        push_in();
        node.typeArgs.evaluate(cx, this);
        pop_out();
        return null;
    }

    public Value evaluate(Context cx, GetExpressionNode node)
    {
        indent();
        out.print("get");
        out.print((node.getMode() == LEFTBRACKET_TOKEN ? " bracket" :
            node.getMode() == LEFTPAREN_TOKEN ? " filter" :
            node.getMode() == DOUBLEDOT_TOKEN ? " descend" :
            node.getMode() == EMPTY_TOKEN ? " lexical" : " dot"));
        push_in();
        if (node.expr != null)
        {
            node.expr.evaluate(cx, this);
        }
        pop_out();
        return null;
    }

    public Value evaluate(Context cx, SetExpressionNode node)
    {
        indent();
        out.print("set");
        out.print((node.getMode() == LEFTBRACKET_TOKEN ? " bracket" :
            node.getMode() == LEFTPAREN_TOKEN ? " filter" :
            node.getMode() == DOUBLEDOT_TOKEN ? " descend" :
            node.getMode() == EMPTY_TOKEN ? " lexical" : " dot"));
        push_in();
        if (node.expr != null)
        {
            node.expr.evaluate(cx, this);
        }
        separate();
        if (node.args != null)
        {
            node.args.evaluate(cx, this);
        }
        pop_out();
        return null;
    }

    public Value evaluate(Context cx, UnaryExpressionNode node)
    {
        indent();
        out.print("unary");
        push_in();
        out.print(Token.getTokenClassName(node.op));
        pop_out();
        separate();
        push_in();
        if (node.expr != null)
        {
            node.expr.evaluate(cx, this);
        }
        pop_out();
        return null;
    }

    public Value evaluate(Context cx, BinaryExpressionNode node)
    {
        indent();
        out.print("binary");
        push_in();
        out.print(Token.getTokenClassName(node.op));
        pop_out();
        separate();
        push_in();
        if (node.lhs != null)
        {
            node.lhs.evaluate(cx, this);
        }
        separate();
        if (node.rhs != null)
        {
            node.rhs.evaluate(cx, this);
        }
        pop_out();
        return null;
    }

    public Value evaluate(Context cx, ConditionalExpressionNode node)
    {
        indent();
        out.print("cond");
        push_in();
        if (node.condition != null)
        {
            node.condition.evaluate(cx, this);
        }
        pop_out();
        separate();
        push_in();
        if (node.thenexpr != null)
        {
            node.thenexpr.evaluate(cx, this);
        }
        separate();
        if (node.elseexpr != null)
        {
            node.elseexpr.evaluate(cx, this);
        }
        pop_out();
        return null;
    }

    public Value evaluate(Context cx, ArgumentListNode node)
    {
        indent();
        out.print("argumentlist");

        push_in();

        for (Node n : node.items)
        {
            n.evaluate(cx, this);
            separate();
        }

        pop_out();

        return null;
    }

    public Value evaluate(Context cx, ListNode node)
    {
        indent();
        out.print("list");

        push_in();

        for (Node n : node.items)
        {
            n.evaluate(cx, this);
            separate();
        }

        pop_out();

        return null;
    }

    // Statements

    public Value evaluate(Context cx, StatementListNode node)
    {
        indent();
        out.print("statementlist");
        push_in();

        for (Node n : node.items)
        {
            if (n != null)
            {
                n.evaluate(cx, this);
            }
        }

        pop_out();

        return null;
    }

    public Value evaluate(Context cx, EmptyElementNode node)
    {
        indent();
        out.print("empty");
        return null;
    }

    public Value evaluate(Context cx, EmptyStatementNode node)
    {
        indent();
        out.print("empty");
        return null;
    }

    public Value evaluate(Context cx, ExpressionStatementNode node)
    {
        indent();
        out.print("expression");
        push_in();
        if (node.expr != null)
        {
            node.expr.evaluate(cx, this);
        }
        pop_out();
        return null;
    }

    public Value evaluate(Context cx, SuperStatementNode node)
    {
        indent();
        out.print("super");
        push_in();
        if (node.call.args != null)
        {
            node.call.args.evaluate(cx, this);
        }
        pop_out();
        return null;
    }

    public Value evaluate(Context cx, LabeledStatementNode node)
    {
        indent();
        out.print("labeled");
        push_in();
        if (node.label != null)
        {
            node.label.evaluate(cx, this);
        }
        pop_out();
        separate();
        push_in();
        if (node.statement != null)
        {
            node.statement.evaluate(cx, this);
        }
        pop_out();
        return null;
    }

    public Value evaluate(Context cx, IfStatementNode node)
    {
        indent();
        out.print("if");
        push_in();
        if (node.condition != null)
        {
            node.condition.evaluate(cx, this);
        }
        pop_out();
        separate();
        push_in();
        if (node.thenactions != null)
        {
            node.thenactions.evaluate(cx, this);
        }
        pop_out();
        separate();
        push_in();
        if (node.elseactions != null)
        {
            node.elseactions.evaluate(cx, this);
        }
        pop_out();
        return null;
    }

    public Value evaluate(Context cx, SwitchStatementNode node)
    {
        indent();
        out.print("switch");
        push_in();
        if (node.expr != null)
        {
            node.expr.evaluate(cx, this);
        }
        pop_out();
        separate();
        push_in();
        if (node.statements != null)
        {
            node.statements.evaluate(cx, this);
        }
        pop_out();
        return null;
    }

    public Value evaluate(Context cx, CaseLabelNode node)
    {
        indent();
        out.print("case");
        push_in();
        if (node.label != null)
        {
            node.label.evaluate(cx, this);
        }
        else
        {
            out.print("default");
        }
        pop_out();
        return null;
    }

    public Value evaluate(Context cx, DoStatementNode node)
    {
        indent();
        out.print("do");
        push_in();
        if (node.expr != null)
        {
            node.expr.evaluate(cx, this);
        }
        pop_out();
        separate();
        push_in();
        if (node.statements != null)
        {
            node.statements.evaluate(cx, this);
        }
        pop_out();
        return null;
    }

    public Value evaluate(Context cx, WhileStatementNode node)
    {
        indent();
        out.print("while");
        push_in();
        if (node.expr != null)
        {
            node.expr.evaluate(cx, this);
        }
        pop_out();
        separate();
        push_in();
        if (node.statement != null)
        {
            node.statement.evaluate(cx, this);
        }
        pop_out();
        return null;
    }

    public Value evaluate(Context cx, ForStatementNode node)
    {
        indent();
        out.print("for");
        push_in();
        if (node.initialize != null)
        {
            node.initialize.evaluate(cx, this);
        }
        pop_out();
        separate();
        push_in();
        if (node.test != null)
        {
            node.test.evaluate(cx, this);
        }
        pop_out();
        separate();
        push_in();
        if (node.increment != null)
        {
            node.increment.evaluate(cx, this);
        }
        pop_out();
        separate();
        push_in();
        if (node.statement != null)
        {
            node.statement.evaluate(cx, this);
        }
        pop_out();
        return null;
    }

    public Value evaluate(Context cx, WithStatementNode node)
    {
        indent();
        out.print("with");
        push_in();
        if (node.expr != null)
        {
            node.expr.evaluate(cx, this);
        }
        pop_out();
        separate();
        push_in();
        if (node.statement != null)
        {
            node.statement.evaluate(cx, this);
        }
        pop_out();
        return null;
    }

    public Value evaluate(Context cx, ContinueStatementNode node)
    {
        indent();
        out.print("continue");
        push_in();
        if (node.id != null)
        {
            node.id.evaluate(cx, this);
        }
        pop_out();
        return null;
    }

    public Value evaluate(Context cx, BreakStatementNode node)
    {
        indent();
        out.print("break");
        push_in();
        if (node.id != null)
        {
            node.id.evaluate(cx, this);
        }
        pop_out();
        return null;
    }

    public Value evaluate(Context cx, ReturnStatementNode node)
    {
        indent();
        out.print("return");
        push_in();
        if (node.expr != null)
        {
            node.expr.evaluate(cx, this);
        }
        pop_out();
        return null;
    }

    public Value evaluate(Context cx, ThrowStatementNode node)
    {
        indent();
        out.print("throw");
        push_in();
        if (node.expr != null)
        {
            node.expr.evaluate(cx, this);
        }
        pop_out();
        return null;
    }

    public Value evaluate(Context cx, TryStatementNode node)
    {
        indent();
        out.print("try");
        push_in();
        if (node.tryblock != null)
        {
            node.tryblock.evaluate(cx, this);
        }
        pop_out();
        separate();
        push_in();
        if (node.catchlist != null)
        {
            node.catchlist.evaluate(cx, this);
        }
        pop_out();
        separate();
        push_in();
        if (node.finallyblock != null)
        {
            node.finallyblock.evaluate(cx, this);
        }
        pop_out();
        return null;
    }

    public Value evaluate(Context cx, CatchClauseNode node)
    {
        indent();
        out.print("catch");
        push_in();
        if (node.parameter != null)
        {
            node.parameter.evaluate(cx, this);
        }
        pop_out();
        separate();
        push_in();
        if (node.statements != null)
        {
            node.statements.evaluate(cx, this);
        }
        pop_out();
        return null;
    }

    public Value evaluate(Context cx, FinallyClauseNode node)
    {
        indent();
        out.print("finally");
        push_in();
        if (node.statements != null)
        {
            node.statements.evaluate(cx, this);
        }
        pop_out();
        return null;
    }

    public Value evaluate(Context cx, UseDirectiveNode node)
    {
        indent();
        out.print("use");
        if( node.expr != null )
        {
            node.expr.evaluate(cx,this);
        }
        return null;
    }

    public Value evaluate(Context cx, IncludeDirectiveNode node)
    {
        indent();
        out.print("include");
        push_in();
        if (node.filespec != null)
        {
            node.filespec.evaluate(cx, this);
        }
        separate();
        if (node.program != null)
        {
            // node.program.evaluate(cx, this);
        }
        pop_out();

        return null;
    }

    // Definitions

    public Value evaluate(Context cx, ImportDirectiveNode node)
    {
        indent();
        out.print("import");
        push_in();
        if (node.attrs != null)
        {
            node.attrs.evaluate(cx, this);
        }
        pop_out();
        separate();
        push_in();
        if (node.name != null)
        {
            node.name.evaluate(cx, this);
        }
        pop_out();

        return null;
    }

    public Value evaluate(Context cx, AttributeListNode node)
    {
        indent();
        out.print("attributelist");

        push_in();

        for (Node n : node.items)
        {
            n.evaluate(cx, this);
            separate();
        }

        pop_out();

        return null;
    }

    public Value evaluate(Context cx, VariableDefinitionNode node)
    {
        indent();
        if (node.kind == CONST_TOKEN)
        {
            out.print("const");
        }
        else
        {
            out.print("var");
        }
        push_in();
        if (node.attrs != null)
        {
            node.attrs.evaluate(cx, this);
        }
        pop_out();
        separate();
        push_in();
        if (node.list != null)
        {
            node.list.evaluate(cx, this);
        }
        pop_out();
        return null;
    }

    public Value evaluate(Context cx, VariableBindingNode node)
    {
        indent();
        out.print("variablebinding");
        push_in();
        if (node.variable != null)
        {
            node.variable.evaluate(cx, this);
        }
        separate();
        if (node.initializer != null)
        {
            node.initializer.evaluate(cx, this);
        }
        pop_out();
        return null;
    }

    public Value evaluate(Context cx, UntypedVariableBindingNode node)
    {
        indent();
        out.print("untypedvariablebinding");
        push_in();
        if (node.identifier != null)
        {
            node.identifier.evaluate(cx, this);
        }
        separate();
        if (node.initializer != null)
        {
            node.initializer.evaluate(cx, this);
        }
        pop_out();
        return null;
    }

    public Value evaluate(Context cx, TypedIdentifierNode node)
    {
        indent();
        out.print("typedidentifier");
        push_in();
        if (node.identifier != null)
        {
            node.identifier.evaluate(cx, this);
        }
        separate();
        if (node.type != null)
        {
            node.type.evaluate(cx, this);
        }
        pop_out();
        return null;
    }

    public Value evaluate(Context cx, BinaryFunctionDefinitionNode node)
    {
        return null;
    }

    public Value evaluate(Context cx, FunctionDefinitionNode node)
    {
        indent();
        out.print("function");
        push_in();
        if (node.attrs != null)
        {
            node.attrs.evaluate(cx, this);
        }
        separate();
        if (node.name != null)
        {
            node.name.evaluate(cx, this);
        }
        separate();
        if (node.fexpr != null)
        {
            node.fexpr.evaluate(cx, this);
        }
        pop_out();
        return null;
    }

    public Value evaluate(Context cx, FunctionNameNode node)
    {
        indent();
        out.print("functionname");
        out.print((node.kind == GET_TOKEN ? " get" :
            node.kind == SET_TOKEN ? " set" : ""));
        push_in();
        if (node.identifier != null)
        {

            node.identifier.evaluate(cx, this);
        }
        pop_out();
        return null;
    }

    public Value evaluate(Context cx, FunctionSignatureNode node)
    {
        indent();
        out.print(node.inits != null ? "constructorsignature" : "functionsignature" );
        push_in();
        if (node.parameter != null)
        {
            node.parameter.evaluate(cx, this);
        }
        separate();
        if (node.result != null)
        {
            node.result.evaluate(cx, this);
        }
        if (node.inits != null)
        {
          node.inits.evaluate(cx, this);
        }
        pop_out();
        return null;
    }

    public Value evaluate(Context cx, ParameterNode node)
    {
        indent();
        out.print("parameter");
        if (node.kind == CONST_TOKEN)
        {
            out.print(" const");
        }
        push_in();
        if (node.identifier != null)
        {
            node.identifier.evaluate(cx, this);
        }
        separate();
        if (node.init != null)
        {
            node.init.evaluate(cx, this);
        }
        separate();
        if (node.type != null)
        {
            node.type.evaluate(cx, this);
        }
        pop_out();
        return null;
    }

    public Value evaluate(Context cx, RestExpressionNode node)
    {
        indent();
        out.print("restexpression");
        push_in();
        if (node.expr != null)
        {
            node.expr.evaluate(cx, this);
        }
        pop_out();
        return null;
    }

    public Value evaluate(Context cx, RestParameterNode node)
    {
        indent();
        out.print("restparameter");
        push_in();
        if (node.parameter != null)
        {
            node.parameter.evaluate(cx, this);
        }
        pop_out();
        return null;
    }

    public Value evaluate(Context cx, ClassDefinitionNode node)
    {
        indent();
        out.print("class");
        push_in();
        if (node.attrs != null)
        {
            node.attrs.evaluate(cx, this);
        }
        separate();
        if (node.name != null)
        {
            node.name.evaluate(cx, this);
        }
        separate();
        if (node.baseclass != null)
        {
            node.baseclass.evaluate(cx, this);
        }
        separate();
        if (node.interfaces != null)
        {
            node.interfaces.evaluate(cx, this);
        }
        separate();
        if (node.statements != null)
        {
            node.statements.evaluate(cx, this);
        }
        pop_out();
        return null;
    }

    public Value evaluate(Context cx, InterfaceDefinitionNode node)
    {
        indent();
        out.print("interface");
        push_in();
        if (node.attrs != null)
        {
            node.attrs.evaluate(cx, this);
        }
        separate();
        if (node.name != null)
        {
            node.name.evaluate(cx, this);
        }
        separate();
        if (node.interfaces != null)
        {
            node.interfaces.evaluate(cx, this);
        }
        separate();
        if (node.statements != null)
        {
            node.statements.evaluate(cx, this);
        }
        pop_out();
        return null;
    }

    public Value evaluate(Context cx, ClassNameNode node)
    {
        indent();
        out.print("classname");
        push_in();
        if (node.pkgname != null)
        {
            node.pkgname.evaluate(cx, this);
        }
        pop_out();
        separate();
        push_in();
        if (node.ident != null)
        {
            node.ident.evaluate(cx, this);
        }
        pop_out();
        return null;
    }

    public Value evaluate(Context cx, InheritanceNode node)
    {
        if (node.baseclass != null)
        {
            indent();
            out.print("extends");
            push_in();
            node.baseclass.evaluate(cx, this);
            pop_out();
        }
        separate();
        if (node.interfaces != null)
        {
            indent();
            out.print("implements");
            push_in();
            node.interfaces.evaluate(cx, this);
            pop_out();
        }
        return null;
    }

    public Value evaluate(Context cx, NamespaceDefinitionNode node)
    {
        indent();
        out.print("namespace");
        push_in();
        if (node.attrs != null)
        {
            node.attrs.evaluate(cx, this);
        }
        pop_out();
        separate();
        push_in();
        if (node.name != null)
        {
            node.name.evaluate(cx, this);
        }
        pop_out();
        separate();
        push_in();
        if (node.value != null)
        {
            node.value.evaluate(cx, this);
        }
        pop_out();
        return null;
    }
    public Value evaluate(Context cx, ConfigNamespaceDefinitionNode node)
    {
        indent();
        out.print("config namespace");
        push_in();
        if (node.attrs != null)
        {
            node.attrs.evaluate(cx, this);
        }
        pop_out();
        separate();
        push_in();
        if (node.name != null)
        {
            node.name.evaluate(cx, this);
        }
        pop_out();
        separate();
        push_in();
        if (node.value != null)
        {
            node.value.evaluate(cx, this);
        }
        pop_out();
        return null;
    }

    public Value evaluate(Context cx, PackageDefinitionNode node)
    {
        indent();
        out.print("package");
        push_in();
        if (node.name != null)
        {
            node.name.evaluate(cx, this);
        }
        pop_out();
        return null;
    }

    public Value evaluate(Context cx, PackageIdentifiersNode node)
    {
        indent();
        out.print("packageidentifiers");
        push_in();

        for (IdentifierNode n : node.list)
        {
            n.evaluate(cx, this);
            separate();
        }

        pop_out();
        return null;
    }

    public Value evaluate(Context cx, PackageNameNode node)
    {
        indent();
        out.print("packagename");
        push_in();
        if (node.id != null)
        {
            node.id.evaluate(cx, this);
        }
        pop_out();
        return null;
    }

    public Value evaluate(Context cx, ProgramNode node)
    {
        indent();
        out.print("program");
        push_in();
        if (node.statements != null)
        {
            node.statements.evaluate(cx, this);
        }
        pop_out();
        out.println();
        return null;
    }

    public Value evaluate(Context cx, ErrorNode node)
    {
        indent();
        out.print("error");
        out.print(node.errorCode);
        return null;
    }

    public Value evaluate(Context cx, ToObjectNode node)
    {
        indent();
        out.print("toobject");
        push_in();
        if (node.expr != null)
        {
            node.expr.evaluate(cx, this);
        }
        pop_out();
        out.println();
        return null;
    }

    public Value evaluate(Context cx, LoadRegisterNode node)
    {
        indent();
        out.print("loadregister");
        push_in();
        if (node.reg != null)
        {
            node.reg.evaluate(cx, this);
        }
        pop_out();
        return null;
    }

    public Value evaluate(Context cx, StoreRegisterNode node)
    {
        indent();
        out.print("storeregister");
        push_in();
        if (node.reg != null)
        {
            node.reg.evaluate(cx, this);
        }
        pop_out();
        push_in();
        if (node.expr != null)
        {
            node.expr.evaluate(cx, this);
        }
        pop_out();
        out.println();
        return null;
    }

    public Value evaluate(Context cx, RegisterNode node)
    {
        indent();
        out.print("register");

        push_in();
        out.print(node.index);
        return null;
    }

    public Value evaluate(Context cx, HasNextNode node)
    {
        indent();
        out.print("hasNext");

        push_in();
        if (node.objectRegister != null)
        {
            node.objectRegister.evaluate(cx, this);
        }
        pop_out();
        push_in();
        if (node.indexRegister != null)
        {
            node.indexRegister.evaluate(cx, this);
        }
        pop_out();
        out.println();
        return null;
    }
   
    public Value evaluate(Context cx, BoxNode node)
    {
        indent();
        out.print("box");
        out.print(node.actual);
        push_in();
        if (node.expr != null)
        {
            node.expr.evaluate(cx, this);
        }
        pop_out();
        return null;
    }

    public Value evaluate(Context cx, CoerceNode node)
    {
        indent();
        out.print("coerce");
        push_in();
        if (node.expr != null)
        {
            node.expr.evaluate(cx, this);
        }
        pop_out();
        return null;
    }

    public Value evaluate(Context cx, PragmaNode node)
    {
        indent();
        out.print("pragma");
        push_in();
        if (node.list != null)
        {
            node.list.evaluate(cx, this);
        }
        pop_out();
        return null;
    }

    public Value evaluate(Context cx, UsePrecisionNode node)
    {
        indent();
        out.print("usePrecision(" + node.precision + ")");
        return null;
    }

    private static String[] usageName = {"Number", "decimal", "double", "int", "uint"};
    public Value evaluate(Context cx, UseNumericNode node)
    {
        indent();
        out.print("useNumeric(" + usageName[node.numeric_mode] + ")");
        return null;
    }

    public Value evaluate(Context cx, UseRoundingNode node)
    {
        indent();
        out.print("useRounding(" + NumberUsage.roundingModeName[node.mode] + ")");
        return null;
    }

    public Value evaluate(Context cx, PragmaExpressionNode node)
    {
        indent();
        out.print("pragmaitem");
        push_in();
        if (node.identifier != null)
        {
            node.identifier.evaluate(cx, this);
        }
        pop_out();
        return null;
    }

    public Value evaluate( Context cx, ParameterListNode node )
    {
        indent();
        out.print("parameterlist");

        push_in();

        for (int i = 0, size = node.items.size(); i < size; i++)
        {
            ParameterNode param = node.items.get(i);

            if (param != null)
            {
                param.evaluate(cx, this);
            }

            if (i < size - 1)
            {
                separate();
            }
        }

        pop_out();

        return null;
    }

    public Value evaluate(Context cx, MetaDataNode node)
    {
        if (node.data != null)
        {
            MetaDataEvaluator mde = new MetaDataEvaluator();
            mde.evaluate(cx, node);
        }

        indent();
        out.print("metadata:");
        out.print(node.getId() !=null? node.getId() :"");
        out.print(" ");
        for (int i = 0, length = (node.getValues() == null) ? 0 : node.getValues().length; i < length; i++)
        {
            Value v = node.getValues()[i];
            if (v instanceof MetaDataEvaluator.KeyValuePair)
            {
                MetaDataEvaluator.KeyValuePair pair = (MetaDataEvaluator.KeyValuePair) v;
                out.print("[" + pair.key + "," + pair.obj + "]");
            }

            if (v instanceof MetaDataEvaluator.KeylessValue)
            {
                MetaDataEvaluator.KeylessValue val = (MetaDataEvaluator.KeylessValue) v;
                out.print("[" + val.obj + "]");
            }
        }
        return null;
    }

    public Value evaluate(Context cx, DefaultXMLNamespaceNode node)
    {
        indent();
        out.print("dxns");
        push_in();
        if (node.expr != null)
        {
            node.expr.evaluate(cx, this);
        }
        pop_out();
        return null;
    }

    public Value evaluate( Context cx, DocCommentNode node )  
    {
        evaluate(cx,(MetaDataNode)node);
        return null;
    }

    public Value evaluate( Context cx, ImportNode node )
    {
        return null;
    }

    public Value evaluate( Context cx, BinaryProgramNode node )
    {
        return null;
    }

    public Value evaluate(Context cx, BinaryClassDefNode node)
    {
        return null;
    }

    public Value evaluate(Context cx, BinaryInterfaceDefinitionNode node)
    {
        return null;
    }

    public Value evaluate(Context cx, TypeExpressionNode node)
    {
        indent();
        out.print("typeexpr");
        push_in();
        if (node.expr != null)
        {
            node.expr.evaluate(cx, this);
        }
        pop_out();
        return null;
    }
}

TOP

Related Classes of macromedia.asc.parser.NodePrinter

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.