Package abstrasy.pcfx

Source Code of abstrasy.pcfx.PCFx_switch

package abstrasy.pcfx;


import abstrasy.Interpreter;
import abstrasy.Node;
import abstrasy.PCoder;
import abstrasy.StaticHeap;

import abstrasy.interpreter.InterpreterException;
import abstrasy.interpreter.StdErrors;

/**
* Abstrasy Interpreter
*
* Copyright : Copyright (c) 2006-2012, Luc Bruninx.
*
* Concédée sous licence EUPL, version 1.1 uniquement (la «Licence»).
*
* Vous ne pouvez utiliser la présente oeuvre que conformément à la Licence.
* Vous pouvez obtenir une copie de la Licence à l’adresse suivante:
*
*   http://www.osor.eu/eupl
*
* Sauf obligation légale ou contractuelle écrite, le logiciel distribué sous
* la Licence est distribué "en l’état", SANS GARANTIES OU CONDITIONS QUELLES
* QU’ELLES SOIENT, expresses ou implicites.
*
* Consultez la Licence pour les autorisations et les restrictions
* linguistiques spécifiques relevant de la Licence.
*
*
* @author Luc Bruninx
* @version 1.0
*/

public class PCFx_switch extends PCFx {

    public PCFx_switch() {
    }

    /*
     * Passage à une structure plus élégante à base de l'opérateur case avec pour effet des
     * meilleures performance et l'OptCode obsolète pour cet opérateur.
     *
     *
     public void valider(Node startAt) throws Exception {
        int ssize = startAt.size();
        argException(startAt, 4);
        int i = 2;
        int delse = 0;
        int thenCnt = 0;
        if (startAt.elementAt(ssize - 2).isPCode(PCoder.PC_ELSE)) {
            delse = 1;
            ssize -= 2;
            startAt.firstElement().setPCFx_OptCode(Node.OPTCODE_COND_OPTIMIZATION);
        }
        else {
            startAt.firstElement().clrPCFx_OptCode(Node.OPTCODE_COND_OPTIMIZATION);
        }

        while (i < ssize) {
            i++;
            startAt.requirePCode(i++, PCoder.PC_THEN);
            i++;
            thenCnt++;
        }
        if (thenCnt == 0) {
            throw new InterpreterException(StdErrors.Syntax_error);
        }
        argException(startAt, i + delse);
    }
   
    private final static void argException(Node startAt, int minargs) throws Exception {
        if (startAt.size() < minargs) {
            throw new InterpreterException(StdErrors.Argument_count_mismatch);
        }
    }
    *
    *
    * l.bruninx, since 2012-05-16.
    */

    /**
     * eval
     *
     * @param startAt Node
     * @return Node
     * @throws Exception
     * @todo Implémenter cette méthode abstrasy.PCFx
     */
   
   

   

    public Node eval(Node startAt) throws Exception {
        /*
         * forme (switch {a}
         *          case v0 {...}  # au moin une fois...
         *          case v1 {...}
         *          ...
         *          case vn {...}
         *          else {...})    # peut être omis (MAIS TOUJOURS A LA FIN)...
         */
       
        startAt.isGoodArgsLength(false, 5); // plus petite forme (switch{a} case v {...})
       
        int ssize = startAt.size();
       
        StaticHeap global = Interpreter.mySelf().getGLOBAL();
       
        int i = 1;
       
        /*
         * premier élément doit être évalué. C'est la valeur à tester...
         */
        Node refnode = startAt.getSubNode(i++, Node.TYPE_LAZY);
        Node rnode = refnode;
        global.push();
        rnode = refnode.exec(true);
        global.pull();
       
        /*
         * La donnée doit être d'un type équipolent.
         */
        rnode.requireNodeType(Node.VTYPE_EQUALISABLE);

        /*
         * c'est parti...
         */
        while (i < ssize) {
            // case ou else ... ?
            Node op=startAt.getSubNode(i++, Node.TYPE_PCODE);
            if(op.isPCode(PCoder.PC_CASE)){
                // case vn {...}
                Node compnode = startAt.getSubNode(i++, Node.VTYPE_EQUALISABLE);
                if (Node.equalsNodes(rnode, compnode)) {
                    // si a == vn ...
                    Node xnode = startAt.getSubNode(i++, Node.VTYPE_VALUABLE);
                    Node res = xnode;
                    if (xnode.isLazy()) {
                        global.push();
                        res = xnode.exec(true);
                        global.pull();
                    }
                    return res;
                }
                else{
                    // si a!= vn, on saute l'expression...
                    i++;
                }
            }
            else if(op.isPCode(PCoder.PC_ELSE)){
                Node xnode = startAt.getSubNode(i++, Node.VTYPE_VALUABLE);
                // tester si la fin de l'expression est bien atteinte...
                if(i<ssize)
                    throw new InterpreterException(StdErrors.Syntax_error);
                Node res = xnode;
                if (xnode.isLazy()) {
                    global.push();
                    res = xnode.exec(true);
                    global.pull();
                }
                return res;
            }
            else
                throw new InterpreterException(StdErrors.Syntax_error);
           
            // sinon boucler jusqu'à la fin...
        }
        return null;
    }

}
TOP

Related Classes of abstrasy.pcfx.PCFx_switch

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.