⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 parser.java

📁 Pasc+Java 这是一个国外的随机自动机*(RAM)一个学习用的程序
💻 JAVA
📖 第 1 页 / 共 5 页
字号:
        return javaCode;
    }
    
    /**
     * Accessormethode für den Vector mit den sich im Verlauf der
     * Kompilierung angesammelten Fehlern und Fehlermeldungen.
     *
     * @return Vector
     */
    public Vector getErrors() {
        return errorVector;
    }
    
    /**
     * Methode dient dem Verhindern von Zuweisungen an die Indexvariable innerhalb
     * einer Forschleife. Das ist nämlich gemäß der Definition von
     * Ries nicht erlaubt.
     *
     * @param   Token
     * @return  boolean
     */
    private boolean istErlaubterLinkerWert(Token token) {
        for (int i = 0; i < forVector.size(); i++) {
            if (((Token)forVector.elementAt(i)).toString().equals(token.toString())){
                return false;
            }
        }
        return true;
    }
    
    
    /**
     * Parst eine Ries-Bedingung und gibt den Java-Code zur&uuml;ck.
     *
     * @return      Java-Code der Bedingung.
     * @exception   ParserException
     */
    private String parseBedingung() throws ParserException {
        
        String ergebnis = ""; // Ergebnis von parseBedingung
        
        /* Der n鋍hste Token wird abgeholt und gepr黤t, ob es sich um eine
         * "(" handelt.
         * .1: Falls es sich um eine "(" handelt, so kann die Bedingung eine
         *     logische Verkn黳fung mit "and" bzw. "or" oder ein Vergleich mit
         *    "<", ">", "<=", ">=", "=", "!=" sein.
         * .2: Falls es sich um ein "not" handelt, so kommt eine Negation.
         * .3: Ansonsten trat ein Token auf, das hier nicht hingeh鰎t.
         */
        aktuellerToken = scanner.getNextToken(); // Token abholen
        
        if (aktuellerToken.equals("(")) { // Token ist (
            
            /* Der Fall .1 trat ein. Er besteht aus den Schritten
             * .1-1, .1-2 und .1-3.
             * 
             * .1    : Bedingung mit logischer Verkn黳fung oder Vergleich
             * --
             * .1-1  : (
             * .1-2  : logische Verkn黳fung oder Vergleich
             * .1-3  : )
             * ----
             */
            
            /* .1-1: "(" ist schon getestet, wird nun geschrieben
             */
            ergebnis += "("; // ( in den bisher erstellten Java-Code schreiben
            
            /* .1-2.2  : Es handelt sich um log. Verkn黳fung oder um Vergleich
             * ----
             * .1-2.1: Falls eine zweite Klammer getoucht wird, so handelt es
             *         sich um eine logische Verkn黳fung.
             * .1-2.2: Ansonsten handelt es sich um einen Vergleich.
             */
            
            if (this.isLogisch()) {
                /* Der Fall .1-2.1 trat ein, es handelt sich um eine
                 * logische Verkn黳fung.
                 * Eine logische Verkn黳fung ist wie folgt aufgebaut:
                 * .1-2.1  : logische Verkn黳fung
                 * ------
                 * .1-2.1-1: Bedingung
                 * .1-2.1-2: and bzw. or
                 * .1-2.1-3: Bedingung
                 * Wir haben die erste Klammer verarbeitet und uns die Klammer
                 * der Bedingung angesehen.
                 */
                
                /* .1-2.1-1 Es handelt sich um eine Bedingung => parsen
                 */
                ergebnis += parseBedingung(); // Bed. schreiben
                
                /* .1-2.1-2  : ist abzuarbeiten. Das n鋍hste Token sollte ein
                 *             "and" oder ein "or" sein. Token wird abgeholt.
                 * --------
                 * .1-2.1-2.1: "and"
                 * .1-2.1-2.2: "or"
                 * .1-2.1-2.3: falsches Token
                 */
                aktuellerToken = scanner.getNextToken(); // Token abholen
                if (aktuellerToken.equals("and")) {
                    /* .1-2.1-2.1: Es handelt sich um ein "and".
                     */
                    ergebnis += " && ";        // and schreiben
                }
                else if (aktuellerToken.equals("or")) {
                    /* .1-2.1-2.2 Es handelt sich um ein "or".
                     */
                    ergebnis += " || ";         // or schreiben
                }
                else {
                    /* .1-2.1-2.3 Es handelt sich um ein falsches Token.
                     */
                    throw new ParserException("Schl黶selw鰎ter 'and' oder"
                                              +" 'or' erwartet in Zeile "
                                              +aktuellerToken.getLineNumber(),
                                              aktuellerToken);
                } // end .1-2.1-2
                
                /* .1-2.1-3 Es handelt sich um eine Bedingung => parsen
                 */
                ergebnis += parseBedingung(); // Bedingung schreiben
                
            } // end .1-2.1
            else {
                /* Der Fall .1-2.2 trat ein, es handelt sich um einen
                 * Vergleich.
                 * Ein Vergleich ist wie folgt aufgebaut:
                 * .1-2.2  : Vergleich
                 * ------
                 * .1-2.2-1: Wertausdruck
                 * .1-2.2-2: "<",">","<=",">=","=","!=",
                 * .1-2.2-3: Wertausdruck
                 */
                
                /* .1-2.2-1: Es handelt sich um einen Wertausdruck => parsen
                 */
                ergebnis += parseWertausdruck(); // Wertausdr. schreiben
                
                /* .1-2.2-2: Es handelt sich um eine Vergleichsart
                 * ------
                 * .1-2.2-2.1: <
                 * .1-2.2-2.2: >
                 * .1-2.2-2.3: <=
                 * .1-2.2-2.4: >=
                 * .1-2.2-2.5: =
                 * .1-2.2-2.6: !=
                 * .1-2.2-2.7: falsches Token
                 */
                aktuellerToken = scanner.getNextToken(); // Token abholen
                if (aktuellerToken.equals("<")) {
                    /* .1-2.2-2.1 Es handelt sich um ein <
                     */
                    ergebnis += ".lt(";
                }
                else if (aktuellerToken.equals(">")) {
                    /* .1-2.2-2.2 Es handelt sich um ein >
                     */
                    ergebnis += ".gt(";
                }
                else if (aktuellerToken.equals("<=")) {
                    /* .1-2.2-2.3 Es handelt sich um ein <=
                     */
                    ergebnis += ".le(";
                }
                else if (aktuellerToken.equals(">=")) {
                    /* .1-2.2-2.4 Es handelt sich um ein >=
                     */
                    ergebnis += ".ge(";
                }
                else if (aktuellerToken.equals("=")) {
                    /* .1-2.2-2.5 Es handelt sich um ein =
                     */
                    ergebnis += ".eq(";
                }
                else if (aktuellerToken.equals("!=")) {
                    /* .1-2.2-2.6 Es handelt sich um ein !=
                     */
                    ergebnis += ".ne(";
                }
                else {
                    /* .1-2.2-2.7 Es handelt sich um ein falsches Token.
                     */
                    throw new ParserException("Vergleichsoperator erwartet"
                                              +" in Zeile "
                                              +aktuellerToken.getLineNumber(),
                                              aktuellerToken);
                } // end .1-2.2-2
                
                /* .1-2.2-3: Es handelt sich um einen Wertausdruck => parsen
                 */
                ergebnis += parseWertausdruck()+")"; // Wertausdr. schreiben
                
            } // end .1-2.2
            
            /* .1-3   : Es sollte eine ")" folgen.
             * .1-3.1 : ")"
             * .1-3.2 : falsches Token
             */
            aktuellerToken = scanner.getNextToken(); // Token abholen
            if (aktuellerToken.equals(")")) { // bei )
                /* .1-3.1: Es handelt sich um eine "(".
                 */
                ergebnis += ")";     // ) schreiben
            }
            else {
                /* .1-3.2: Es handelt sich um ein falsches Token.
                 */
                throw new ParserException("Zum Abschluss eines" +
                                          " Bedingungsausdrucks ')' erwartet"
                                          +" in Zeile "
                                          +aktuellerToken.getLineNumber(),
                                          aktuellerToken);
            } // end .1-3
        } // end .1
        
        /* Der Fall .1 trat nicht ein, d.h. es kam am Anfang keine "(".
         * Vielleicht ist das Token aber ein not und somit eine Negation.
         * 
         * .2 : Negation
         * --
         * .2-1: not
         * .2-2: (
         * .2-3: Bedingung
         * .2-4: )
         */
        else if (aktuellerToken.equals("not")) {
            /* Der Fall .2 trat ein. Es handelt sich um eine Negation.
             */            
            
            /* .2-1: not-Token wurde schon abgeholt, wird jetzt geschrieben.
             * Die "(" dient dazu, dass alle 黚ersetzten Bedingungen in
             * Klammern stehen. Die ")" wird in .2-4 angeh鋘gt.
             */
            ergebnis += "(!";                // ! schreiben
            
            /* .2-2  : Es sollte sich um eine "(" handeln
             * ----
             * .2-2.1: (
             * .2-2.2: falsches Token
             */
            aktuellerToken = scanner.getNextToken(); // Token abholen
            if (aktuellerToken.equals("(")) {
                /* Der Fall .2-2.1 trat ein. "(" wird in Java nicht ben鰐igt,
                 * da jede 黚ersetzte Bedingung in Klammern steht. (.2-1)
                 */
            }    
            else {
                /* .2-2.2 Es handelt sich um ein falsches Token.
                 */
                throw new ParserException("Nach 'not' runde Klammer '('"
                                          +" erwartet in Zeile "
                                          +aktuellerToken.getLineNumber(),
                                          aktuellerToken);
            } // end .2-2
            
            /* .2-3: Es handelt sich um eine Bedingung.
             */
            ergebnis += parseBedingung(); // Bed. schreiben
            
            /* .2-4  : Es sollte sich um eine ")" handeln.
             * ----
             * .2-4.1: )
             * .2-4.2: falsches Token
             */
            aktuellerToken = scanner.getNextToken(); // Token abholen
            if(aktuellerToken.equals(")")) {
                
                /* Der Fall .2-4.1 trat ein. ")" wird geschrieben, damit
                 * jede 黚ersetzte Bedingung in Klammern steht.
                 */
                ergebnis += ")";
            }
            else {
                /* .2-4.2: Es handelt sich um ein falsches Token.
                 */
                throw new ParserException("Zum Abschluss einer negierten"
                                          +" Bedingung ')' erwartet in Zeile "
                                          +aktuellerToken.getLineNumber(),
                                          aktuellerToken);
            } // end .2-4
            
        } // end .2
        
        else {
            /* Weder .1 noch .2 trat ein. Damit tritt der Fall .3 ein.
             * Es handelt sich um ein falsches Token.
             */
            throw new ParserException("Bedingungsausdruck erwartet"
                                      +" in Zeile "
                                      +aktuellerToken.getLineNumber(),
                                      aktuellerToken);
        }
        return ergebnis; // gebe Java-Code zur點k
        
    } // end parseBedingung
    
    
    /**
     * Parst eine Funktion.
     *
     * @return      Java-Code der Funktion
     */
    private String parseFunktion() {
        String ergebnis = "";               // Ergebnis von parseFunktion
        Vector parameterVector = new Vector(); // Vector mit Parameternamen
        
        /* 躡ersetzungstabellen der Variablen bzw. Arraynamen von
         * RiesName -> JavaName
         * Dies ist notwendig, um in Ries erlaubte, aber in Java
         * reservierte Namen (wie return) verwenden zu k鰊nen.
         */
        varTrans = new TransHash("variable");
        arrayTrans = new TransHash("array");
        
        /* parseFunktion f鋘gt die IndexOutOfBoundsExceptions ab, die geworfen
         * werden, wenn der Scanner keine weiteren Tokens mehr besitzt.
         * Werden diese innerhalb einer Funktion geworfen, so gibt es schon
         * vor deren Ende keine Tokens mehr. Es folgt eine Fehlermeldung.
         * .1: Funktionsanweisung in Ries wird abgearbeitet, bei Fehler .2
         * .2: Parser Fehler gefunden.
         * .3: W鋒ren

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -