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

📄 parser.java

📁 Pasc+Java 这是一个国外的随机自动机*(RAM)一个学习用的程序
💻 JAVA
📖 第 1 页 / 共 5 页
字号:
                ergebnis = arrayTrans.get(aktuellerToken).toString();
                
            } else {
                // unerlaubter Feldname
                throw new ParserException(/*"Fehler in \"parseWertvariable()\"\n" +*/
                                          "Fehlerhafter Bezeichner in Zeile " +
                                          aktuellerToken.getLineNumber(), aktuellerToken);
            }
            
            // jetzt kommt der Index
            if (scanner.touchToken() != null) {
                if (scanner.touchToken().toString().equals("[")) {
                    scanner.getNextToken();
                    
                    // innerhalb der eckigen Klammern steht ein
                    // Wertausdruck
                    ergebnis +=  ".get(" + parseWertausdruck();
                    
                    // abschlie遝nde eckige Klammern
                    aktuellerToken = scanner.getNextToken();
                    if (!aktuellerToken.toString().equals("]")) {
                        throw new ParserException(/*"Fehler in \"parseWertvariable()\"\n"+*/
                                                  "Indexabschluss ']' " +
                                                  "erwartet in Zeile " +
                                                  aktuellerToken.getLineNumber(), 
                                                  aktuellerToken);
                    }
                    ergebnis += ")";
                }
            }
            
        } else if (aktuellerToken.getType() == FUNKTION) {
            // Behandlung von Funktionsaufrufen
            
            // beginnt die Funktion auch tatsaechlich mit einem Buchstaben
            if (this.isGueltigeWertvariable(aktuellerToken)
                /*aktuellerToken.toString().charAt(0) >= 97 &&
                aktuellerToken.toString().charAt(0) <= 122*/) {
                
                try {
                    ergebnis =
                        funktionsTabelle.getFunktion(aktuellerToken).toString();
                } catch (NullPointerException e) {
                    throw new ParserException(/*"Fehler in \"parseWertvariable()\"\n" +*/
                                              "Aufruf einer nicht deklarierten " +
                                              "Funktion in Zeile " +
                                              aktuellerToken.getLineNumber(), 
                                              aktuellerToken);
                }
                
            } else {
                // unerlaubter Bezeichner
                throw new ParserException(/*"Fehler in \"parseWertvariable()\"\n"+*/
                                          "Fehlerhafter Bezeichner in Zeile " +
                                          aktuellerToken.getLineNumber(), aktuellerToken);
            }
            
            // jetzt kommt die Parameterliste
            if (scanner.touchToken() != null) {
                if (scanner.touchToken().equals("(")) {
                    scanner.getNextToken();
                    ergebnis +=  "(";
                    
                    // Verarbeitung der Parameterliste
                    if (!scanner.touchToken().toString().equals(")")) {
                        ergebnis += parseWertausdruck();
                        while (!scanner.touchToken().equals(")")) {
                            if (scanner.getNextToken().equals(",")) {
                                ergebnis += "," + parseWertausdruck();
                            } else {
                                // fehlendes ',' in Parameterliste
                                throw new ParserException(/*"Fehler in \"parse" +
                                                          "Wertvariable()\"\n"+*/
                                                          "Trennzeichen ',' in " +
                                                          "躡ergabeliste erwartet " +
                                                          "Zeile " +
                                                          aktuellerToken.getLineNumber(),
                                                          aktuellerToken);
                            }
                        }
                    }
                    
                    // Ein ')' beendet die Parameterliste.
                    aktuellerToken = scanner.getNextToken();
                    if ( aktuellerToken.equals(")") ) {
                        ergebnis += ")";
                        
                    } else {
                        // fehlendes ')' am Ende der Parameterliste
                        throw new ParserException(/*"Fehler in \"parse" +
                                                  "Wertvariable()\"\n" +*/
                                                  "Als Abschluss einer " +
                                                  "Parameterliste ')' " +
                                                  "erwartet in Zeile " +
                                                  aktuellerToken.getLineNumber(),
                                                  aktuellerToken);
                    }
                }
            }
        } else {
            
            throw new ParserException("Ung黮tige Wertvariable"+
                                      " in Zeile " +
                                      aktuellerToken.getLineNumber(),
                                      aktuellerToken);
        }
        
        /*// Abfangen der Exception, die mein vorlaeufiger Scanner erzeugt
           } catch (IndexOutOfBoundsException e) {
               throw new ParserException("Fehler in \"parseWertvariable()\"\n" +
                                         "Unerwartetes Dateiende in Zeile " +
                                         aktuellerToken.getLineNumber(),
                                         aktuellerToken);
           }*/
        
        // Rueckgabe des Javacodes in einem String
        return ergebnis;
    }
    
    /**
     * Methode zum Parsen von Wertausdr&uuml;cken, dies schlie&szlig;t
     * insbesondere auch arithmetische Operationen mit ein.
     *
     * @return      String
     * @exception   ParserException
     */
    private String parseWertausdruck() throws ParserException {
        
	// Zwischenspeicher fuer die Javacodeausgabe
	String ergebnis = new String();
        
	/*// 'try', weil mein vorlaeufiger Scanner eine 'NullPointerException'
           // erzeugt, falls der Tokenstream endet
           try {*/
        
        // Zwischenspeicher fuer das aktuelle Token
        Token aktuellerToken = scanner.touchToken();
        
        // '(' eroeffnet eine arithmetische Operation
        if (aktuellerToken.toString().equals("(")) {
            
            // linker Operand
            ergebnis += scanner.getNextToken().toString() +
                        parseWertausdruck();
            aktuellerToken = scanner.getNextToken();
            
            // Operation (Division, Multiplikation, Addition, Subtraktion)
            if (aktuellerToken.toString().equals(":")) {
                ergebnis += ".divide(";
            } else if (aktuellerToken.toString().equals("*")) {
                ergebnis += ".multiply(";
            } else if (aktuellerToken.toString().equals("+")) {
                ergebnis += ".add(";
            } else if (aktuellerToken.toString().equals("-")) {
                ergebnis += ".subtract(";
                
            } else {
                // fehlerhafter Operator
                throw new ParserException(/*"Fehler in \"parseWertausdruck()\"\n" +*/
                                          "Arithmetischer Operator erwartet in Zeile " +
                                          aktuellerToken.getLineNumber(), aktuellerToken);
            }
            
            // rechter Operandn ( ") " wegen z.B. ".add(..." )
            ergebnis += parseWertausdruck() + ")";
            
            // ')' beendet die arithmetische Operation
            aktuellerToken = scanner.getNextToken();
            if (!aktuellerToken.toString().equals(")")) {
                throw new ParserException(/*"Fehler in \"parseWertausdruck()\"\n" +*/
                                          "Zum Abschluss eines arithmetischen " +
                                          "Ausdrucks ')' erwartet in Zeile " +
                                          aktuellerToken.getLineNumber(), aktuellerToken);
            }
            ergebnis += aktuellerToken.toString();
            
        } else if (aktuellerToken.getType() == ZAHL) {
            // letzte Moeglichkeit ist das Auftauchen eines Zahlenliterals
            ergebnis += parseLiteral();
        
        } else if ((aktuellerToken.getType() == REST || 
                   aktuellerToken.getType() == ARRAY ||
                   aktuellerToken.getType() == FUNKTION)&&
                   (!aktuellerToken.toString().equals("get"))
            /*aktuellerToken.toString().charAt(0) >= 97 &&
            aktuellerToken.toString().charAt(0) <= 122*/) {
            // es handelt sich um eine Wertvariable  
            ergebnis += parseWertvariable();
            
        }
         else {
            // unerwarteter Tokentyp
            throw new ParserException(/*"Fehler in \"parseWertvariable()\"\n" +*/
                                      "Wertausdruck erwartet in Zeile " +
                                      aktuellerToken.getLineNumber(),
                                      aktuellerToken);
        }
        
        /*// Abfangen der Exception, die mein vorlaeufiger Scanner erzeugt
           } catch (IndexOutOfBoundsException e) {
               throw new ParserException("Fehler in \"parseWertvariable()\"\n" +
                                         "Unerwartetes Dateiende in Zeile " +
                                         aktuellerToken.getLineNumber(),
                                         aktuellerToken);
           }*/
        
        // Rueckgabe des Javacodes in einem String
	return ergebnis;
    }
    
    /**
     * Methode zum Parsen eines Zahlenliterals etwa der Form '123456'.
     *
     * @return	    String
     * @exception   ParserException
     */
    private String parseLiteral() throws ParserException {
        
        // Zwischenspeicher fuer die Javacodeausgabe
	String ergebnis = new String();
        
	/*// 'try', weil mein vorlaeufiger Scanner eine 'NullPointerException'
           // erzeugt, falls der Tokenstream endet
           try {*/
        
        // Zwischenspeicher fuer das aktuelle Token
        aktuellerToken = scanner.getNextToken();
        
        // Test, ob es sich um eine Zahl handelt
        try {
            new BigInt(aktuellerToken.toString());
            ergebnis += "new BigInt(\"" + aktuellerToken.toString() + "\")";
        } catch (NumberFormatException e) {
            throw new ParserException(/*"Fehler in \"parseLiteral()\"\n" +*/
                                      "Zahlenliteral erwartet in Zeile " +
                                      aktuellerToken.getLineNumber(),
                                      aktuellerToken);
        }
        
        /*// Abfangen der Exception, die mein vorlaeufiger Scanner erzeugt
           } catch (IndexOutOfBoundsException e) {
               throw new ParserException("Fehler in \"parseLiteral()\"\n" +
                                         "Unerwartetes Dateiende in Zeile " +
                                         aktuellerToken.getLineNumber(),
                                         aktuellerToken);
           }*/
        
	// Rueckgabe des Javacodes in einem String
	return ergebnis;
    }
    
    /**
     * Methode zum Parsen einer while-Schleife.
     *
     * @return      String
     * @exception   ParserException
     */
    private String parseWhile() throws ParserException {
        
        // Zwischenspeicher fuer die Javacodeausgabe
	String ergebnis = insertTabs();
        
	/*// 'try', weil mein vorlaeufiger Scanner eine 'NullPointerException'
           // erzeugt, falls der Tokenstream endet
           try {*/
        
        // Zwischenspeicher fuer das aktuelle Token
        Token aktuellerToken = scanner.getNextToken();
        
        // jetzt muss ein 'while' kommen
        if (aktuellerToken.toString().equals("while")) {
            ergebnis += "while ";
            
            // jetzt muss eine Bedingung kommen
            ergebnis += parseBedingung() + "\n";
            aktuellerToken = scanner.getNextToken();
            
            // jetzt muss ein 'do' kommen
            if (aktuellerToken.toString().equals("do")) {
                
                tabs++;
                // jetzt folgen Anweisungen
                ergebnis += parseAnweisung();
                tabs--;
                
            } else {
                // fehlendes 'do'
                throw new ParserException(/*"Fehler in \"parseWhile()\"\n" +*/
                                          "Schl黶selwort 'do' " +
                                          "erwartet in Zeile " +
                                          aktuellerToken.getLineNumber(),
                                          aktuellerToken);
            }
            
        } else {
            // fehlendes 'while'
            throw new ParserException(/*"Fehler in \"parseWhile()\"\n" +*/
                                      "Schl黶selwort 'while' erwartet " +
                                      "in Zeile " +
                                      aktuellerToken.getLineNumber(),
                                      aktuellerToken);
        }
        
        /*// Abfangen der Exception, die mein vorlaeufiger Scanner erzeugt
           } catch (IndexOutOfBoundsException e) {
               throw new ParserException("Fehler in \"parseWhile()\"\n" +
                                         "Unerwartetes Dateiende in Zeile " +
                                         aktuellerToken.getLineNumber(),
                                         aktuellerToken);
           }*/
        
	// Rueckgabe des Javacodes in einem String
	return ergebnis;
    }
    
    /**
     * Accessormethode f&uuml;r den bei erfolgreicher Compilierung erstellten
     * Javacode.
     *
     * @return String
     */
    public String getJavaCode() {

⌨️ 快捷键说明

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