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

📄 parser.java

📁 Pasc+Java 这是一个国外的随机自动机*(RAM)一个学习用的程序
💻 JAVA
📖 第 1 页 / 共 5 页
字号:
	String ergebnis = insertTabs();
        
        // Zwischenspeicher fuer den 'ArrayIndikator'
        Token indikator = scanner.touchToken();
        
        // Parsen des 'left-value'
	ergebnis += parseLinks();
        
	/*// 'try', weil mein vorlaeufiger Scanner eine 'NullPointerException'
           // erzeugt, falls der Tokenstream endet
           try {*/
        
        // Zwischenspeicher fuer das aktuelle Token
        aktuellerToken = scanner.getNextToken();
        
        // jetzt muss ein ':=' kommen
        if (aktuellerToken.toString().equals(":=")) {
            if (indikator.getType() != ARRAY && (!indikator.toString().equals("array"))) {
                
                // ':=' in Ries entspricht '=' in Java
                ergebnis += " = ";
                
                // rechts steht ein Wertausdruck
                ergebnis += parseWertausdruck();
            } 
            else if(indikator.toString().equals("array"))
            {
            	ergebnis += ".array_to_RiesArray(";
            	aktuellerToken=scanner.getNextToken();
            	ergebnis += "\""+parseString()+"\""+");";
            	aktuellerToken=scanner.getNextToken();
            	ergebnis += parseAnweisung();
            }
            else {
                
                // rechts steht nur ein Wertausdruck, da fuer Zuweisungen
                // an Felder nicht auf den Java-Zuweisungsoperator '='
                // zurueckgegriffen wird
                ergebnis += parseWertausdruck() + ")";
            }
            
        } else {
            // fehlendes ':='
            throw new ParserException(/*"Fehler in \"parseZuweisung()\"\n" +*/
                                      "Zuweisungsoperator ':=' erwartet " +
                                      "in Zeile " + 
                                      aktuellerToken.getLineNumber(),
                                      aktuellerToken);
        }
        
        /*// Abfangen der Exception, die mein vorlaeufiger Scanner erzeugt
           } catch (IndexOutOfBoundsException e) {
               throw new ParserException("Fehler in \"parseZuweisung()\"\n" +
                                         "Unerwartetes Dateiende in Zeile " +
                                         aktuellerToken.getLineNumber(),
                                         aktuellerToken);
           }*/
        
	// Rueckgabe des Javacodes in einem String
	return ergebnis;
    }
    
    /**
     * Methode zum Parsen des linken Abschnitts (left-value) einer Wertzuweisung.
     *
     * @return      String
     * @exception   ParserException
     */
    private String parseLinks() 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.getNextToken();
        
        // es handelt sich tatsaechlich um eine Variable
        if (aktuellerToken.getType() == REST && (!aktuellerToken.toString().equals("array"))) {
            
            // beginnt die Variable auch tatsaechlich mit einem Buchstaben
            if (isGueltigeWertvariable(aktuellerToken)) {
                if (istErlaubterLinkerWert(aktuellerToken)) {
                    
                    // Funktionsaufrufe sind links von ':=' nicht erlaubt.
                    if (scanner.touchToken() != null) {
                        if (scanner.touchToken().equals("(")) {
                            throw new ParserException(/*"Fehler in \"parseLinks()\"\n" +*/
                                                      "An dieser Stelle nicht " + 
                                                      "erlaubter " +
                                                      "Funktionsaufruf in Zeile " +
                                                      scanner.touchToken().getType(),
                                                      scanner.touchToken());
                            
                        } else {
                            ergebnis += varTrans.get(aktuellerToken).toString();
                        }
                    }
                    
                } else {
                    // Unerlaubte Zuweisung
                    throw new ParserException(/*"Fehler in \"parseLinks()\"\n"+*/
                                              "Unerlaubte Zuweisung an den " +
                                              "Laufparameter einer for-Schleife " +
                                              "in Zeile " +
                                              aktuellerToken.getLineNumber(),
                                              aktuellerToken);
                }
                
            } else {
                // unerlaubter Variablenname
                throw new ParserException(/*"Fehler in \"parseLinks()\"\n"+*/
                                          "Fehlerhafter Bezeichner in Zeile " +
                                          aktuellerToken.getLineNumber(),
                                          aktuellerToken);
            }
            
        } else if (aktuellerToken.getType() == ARRAY) {
            // Behandlung von Arrays
            
            // Handelt es sich um eine gueltige Bezeichnung fuer eine 
            // Feldvariable?
            if (isGueltigeWertvariable(aktuellerToken)
                /*aktuellerToken.toString().charAt(0) >= 97 && 
                aktuellerToken.toString().charAt(0) <= 122*/) {
                ergebnis = arrayTrans.get(aktuellerToken).toString();
            } else {
                throw new ParserException(/*"Fehler in \"parseLinks()\"\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 +=  ".set(" + parseWertausdruck();
                    
                    // abschlie遝nde eckige Klammern
                    aktuellerToken = scanner.getNextToken();
                    if (!aktuellerToken.toString().equals("]")) {
                        // fehlendes ']'
                        throw new ParserException(/*"Fehler in \"parseLinks()\"\n"+*/
                                                  "Indexabschluss ']' " +
                                                  " erwartet in Zeile " +
                                                  aktuellerToken.getLineNumber(),
                                                  aktuellerToken);
                    }
                    ergebnis += ",";
                }
            }
            
        }
        
		else if (aktuellerToken.toString().equals("array")) {
            // Behandlung von RiesArrays
            
            // Handelt es sich um eine gueltige Bezeichnung fuer eine 
            // Feldvariable?
            aktuellerToken=scanner.getNextToken();
            if (isGueltigeWertvariable(aktuellerToken)
                /*aktuellerToken.toString().charAt(0) >= 97 && 
                aktuellerToken.toString().charAt(0) <= 122*/) {
                ergebnis = RiesArrayTabelle.get(aktuellerToken).toString();
            } else {
                throw new ParserException(/*"Fehler in \"parseLinks()\"\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 +=  ".set(" + parseWertausdruck();
                    
                    // abschlie遝nde eckige Klammern
                    aktuellerToken = scanner.getNextToken();
                    if (!aktuellerToken.toString().equals("]")) {
                        // fehlendes ']'
                        throw new ParserException(/*"Fehler in \"parseLinks()\"\n"+*/
                                                  /*"Indexabschluss ']' " +
                                                  " erwartet in Zeile " +
                                                  aktuellerToken.getLineNumber(),
                                                  aktuellerToken);
                    }
                    ergebnis += ",";
                }
            }
            
        }*/        
        
        
         }else {
            // unerlaubter 'left-value'
            throw new ParserException(/*"Fehler in \"parseLinks()\"\n"+*/
                                      "Unerwarteter linker Wert " +
                                      "bei einer Zuweisung in Zeile " +
                                      aktuellerToken.getLineNumber(),
                                      aktuellerToken);
        }
        
        /*// Abfangen der Exception, die mein vorlaeufiger Scanner erzeugt
           } catch (IndexOutOfBoundsException e) {
               throw new ParserException("Fehler in \"parseLinks()\"\n" +
                                         "Unerwartetes Dateiende in Zeile " +
                                         aktuellerToken.getLineNumber(),
                                         aktuellerToken);
               
           }*/
        
        // Rueckgabe des Javacodes in einem String
        return ergebnis;
    }
    
    
    
    /**
     * Methode zum Parsen einer 'Wertvariable'.
     *
     * @return	    String
     * @exception   ParserException
     */
    private String parseWertvariable() 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.getNextToken();
        
        // es handelt sich tatsaechlich um eine Variable
        if (aktuellerToken.getType() == REST) {
            
            // beginnt die Variable auch tatsaechlich mit einem Buchstaben
            if (this.isGueltigeWertvariable(aktuellerToken)) {
                
                /*// jetzt kommt die Parameterliste
                   try {
                   if (scanner.touchToken().equals("(")) {
                   
                   try {
                   ergebnis = funktionsTabelle.getFunktion(
                   aktuellerToken).toString();
                   } catch (NullPointerException e) {
                   throw new ParserException(
                   "Fehler in \"parseWertvariable()\"\n" +
                   "Nicht deklarierte Funktion in Zeile " +
                   aktuellerToken.getLineNumber(),
                   aktuellerToken);
                   }
                   scanner.getNextToken();
                   ergebnis +=  "(";
                   
                   // Verarbeitung der Parameterliste
                   if (!scanner.touchToken().toString().equals(")")) {
                   ergebnis += parseWertausdruck();
                   while (!scanner.touchToken().equals(")")) {
                   if (scanner.getNextToken().equals(",")) {
                   ergebnis += "," + parseWertausdruck();
                   } else {
                   throw new ParserException(
                   "Fehler in \"parseWertvariable()\"\n"+
                   "Fehlendes ',' in 躡ergabeliste" +
                   "  Zeile " +
                   aktuellerToken.getLineNumber(), aktuellerToken);
                   }
                   }
                   }
                   
                   // Ein ')' beendet die Parameterliste.
                   aktuellerToken = scanner.getNextToken();
                   if ( aktuellerToken.equals(")") ) {
                   ergebnis += ")";
                   
                   // fehlendes ')' am Ende der Parameterliste
                   } else {
                   throw new ParserException(
                   "Fehler in \"parseWertvariable()\"\n"+
                   "Fehlendes ')' bei Funktionsaufrufin" +
                   "  Zeile " +
                   aktuellerToken.getLineNumber(), aktuellerToken);
                   }
                   
                   // Es handelt sich nicht um einen Fumktionsaufruf
                   } else {
                   ergebnis += varTrans.get(aktuellerToken).toString();
                   }
                   } catch (IndexOutOfBoundsException e) {*/
                ergebnis += varTrans.get(aktuellerToken).toString();
                /*}*/
                
            } else {
                // unerlaubter Bezeichner
                throw new ParserException(/*"Fehler in \"parseWertvariable()\"\n" +*/
                                          "Fehlerhafter Bezeichner in Zeile " +
                                          aktuellerToken.getLineNumber(), aktuellerToken);
            }
            
        } else if (aktuellerToken.getType() == ARRAY) {
            // Behandlung von Arrays
            
            // beginnt der Feldname auch tatsaechlich mit einem Buchstaben
            if (this.isGueltigeWertvariable(aktuellerToken)
                /*aktuellerToken.toString().charAt(0) >= 97 &&
                aktuellerToken.toString().charAt(0) <= 122*/) {

⌨️ 快捷键说明

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