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

📄 parser.java

📁 Pasc+Java 这是一个国外的随机自动机*(RAM)一个学习用的程序
💻 JAVA
📖 第 1 页 / 共 5 页
字号:
     * @return      String
     * @exception   ParserException
     */	
    private String parseString() throws ParserException
    {
	    String ergebnis="";
	    
	    //aktuellerToken=scanner.getNextToken();
	    
			    if(aktuellerToken.toString().equals("\""))
			    {
				    //ergebnis+="\"";
				    while(!(aktuellerToken=scanner.getNextToken()).equals("\""))
				    {
					    ergebnis+=aktuellerToken.toString()+" ";
				    }
			            //ergebnis+="\"";
		    
            } else {
            // fehlendes '""'
            throw new ParserException(/*"Fehler in \"parseString()\"\n" +*/
                                      
                                      "\" erwartet in Zeile " +
                                      aktuellerToken.getLineNumber(),
                                      aktuellerToken);
	    }
	    return ergebnis;
    }
    /**
     * Methode zum Parsen einer if-Anweisung.
     * 
     * @return      String
     * @exception   ParserException
     */
    private String parseIf() 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
        aktuellerToken = scanner.getNextToken();
        
        // da es sich um eine if-Anweisung handeln soll, muss jetzt ein
        // 'if' kommen
        if (aktuellerToken.toString().equals("if")) {
            
            // das Pendant zu 'if' ist in Java auch 'if'
            ergebnis += "if ";
            
            // jetzt muss eine Bedingungsanweisung kommen
            ergebnis += parseBedingung() + " ";
            
            // jetzt muss 'then' kommen
            aktuellerToken = scanner.getNextToken();
            if (aktuellerToken.toString().equals("then")) {
                
                // jetzt muss eine Anweisung kommen
                tabs++;
                ergebnis += parseAnweisung();
                tabs--;
                                
                try {
                    // jetzt kann theoretisch noch ein 'else' kommen
                    aktuellerToken = scanner.touchToken();
                    if (aktuellerToken.toString().equals("else")) {
                        scanner.getNextToken();
                        
                        // das Pendant zu 'else' ist in Java auch 'else'
                        ergebnis += insertTabs() + "else\n";
                        tabs++;
                        ergebnis += parseAnweisung();
                        tabs--;
                    }
                } catch (IndexOutOfBoundsException e) {
                }
                
            } else {
                // fehlendes 'then'
                throw new ParserException(/*"Fehler in \"parseIf()\"\n" +*/
                                          "Schl黶selwort " + 
                                          "'then' erwartet in Zeile " +
                                          aktuellerToken.getLineNumber(),
                                          aktuellerToken);
            }
            
        } else {
            // fehlendes 'if'
            throw new ParserException(/*"Fehler in \"parseIf()\"\n" +*/
                                      "Schl黶selwort " +
                                      "'if' erwartet in Zeile " +
                                      aktuellerToken.getLineNumber(),
                                      aktuellerToken);
        }
        
        /*// Abfangen der Exception, die mein vorlaeufiger Scanner erzeugt
           } catch (IndexOutOfBoundsException e) {
               throw new ParserException("Fehler in \"parseAnweisung()\"\n" +
                                         "Unerwartetes Dateiende in Zeile " +
                                         aktuellerToken.getLineNumber(),
                                         aktuellerToken);
           }*/
        
	// Rueckgabe des Javacodes in einem String
        return ergebnis;
    }
    
    /**
     * Methode zum Parsen einer for-Schleife.
     *
     * @return      String
     * @exception   ParserException
     */
    private String parseFor() throws ParserException {
	
        // Zwischenspeicher fuer die Javacodeausgabe
	String ergebnis = insertTabs();
        
	// die Indexvariable in der for-Schleife; dieselbe wie die, an die
	// nichts mehr zugewiesen werden darf
	Token indexVariable;
        
	/*// 'try', weil mein vorlaeufiger Scanner eine 'NullPointerException'
           // erzeugt, falls der Tokenstream endet
           try {*/
        
        // Zwischenspeicher fuer das aktuelle Token
        aktuellerToken = scanner.getNextToken();
        
        // da es sich um eine for-Schleife handeln soll, muss jetzt ein
        // 'for' kommen
        if (aktuellerToken.toString().equals("for")) {
            
            // Umwandlung in eine 鋛uivalente Java-for-Schleife
            ergebnis += "for (";
            
            // Zwichenspeicherung der Indexvariable
            Token index = scanner.touchToken();
            indexVariable = varTrans.get(scanner.touchToken());
            
            if (scanner.touchToken().getType() == REST) {
                // Hinzufuegen der Indexvariable zum Javacode
                ergebnis += parseLinks() + " ";
                forVector.addElement(index);
            } else {
                // Zuweisung an Indexvariable in for-Schleife!
                throw new ParserException(/*"Fehler in \"parseFor()\"\n" +*/
                                          "Unerlaubte Zuweisung eines Wertes" +
                                          "an den Laufparameter " +
                                          "einer for-Schleife in Zeile " +
                                          aktuellerToken.getLineNumber(),
                                          aktuellerToken);
            }
            
            // jetzt muss ein ':=' kommen
            aktuellerToken = scanner.getNextToken();
            if (aktuellerToken.toString().equals(":=")) {
                
                // jetzt muss ein Wertausdruck kommen
                ergebnis += "= " + parseWertausdruck() + "; " +
                          indexVariable.toString() + ".le(";
                
                // jetzt muss ein 'to' kommen
                aktuellerToken = scanner.getNextToken();
                if (aktuellerToken.equals("to")) {
                    
                    // Java verlangt explizit die Abbruchbedingung der
                    // for-Schleife (im Gegensatz zu Ries)
                    ergebnis += parseWertausdruck() + "); " +
                              indexVariable.toString() +
                              " = " +
                              indexVariable.toString() +
                              ".add(new BigInt(\"1\")))\n";
                    
                    // jetzt muss ein 'do' kommen
                    aktuellerToken = scanner.getNextToken();
                    if (aktuellerToken.equals("do")) {
                        
                        // jetzt kommen Anweisungen
                        tabs++;
                        ergebnis += parseAnweisung();
                        tabs--;
                        
                        // Forschleife beendet, Zuweisungen an Indexvariable wieder
                        // erlaubt
                        forVector.removeElementAt(forVector.size() - 1);
                        
                    } else {
                        // fehlendes 'do'
                        throw new ParserException(/*"Fehler in \"parseFor()\"\n" +*/
                                                  "Schl黶selwort " +
                                                  "'do' erwartet in Zeile " +
                                                  aktuellerToken.getLineNumber(),
                                                  aktuellerToken);
                    }
                    
                } else {
                    // fehlendes 'to'
                    throw new ParserException(/*"Fehler in \"parseFor()\"\n" +*/
                                              "Schl黶selwort " +
                                              "'to' erwartet in Zeile " +
                                              aktuellerToken.getLineNumber(),
                                              aktuellerToken);
                }
                
            } else {
                // fehlendes ':='
                throw new ParserException(/*"Fehler in \"parseFor()\"\n" +*/
                                          "Zuweisungsoperator " +
                                          "':=' erwartet in Zeile " +
                                          aktuellerToken.getLineNumber(),
                                          aktuellerToken);
            }
            
        } else {
            // fehlendes 'for'
            throw new ParserException(/*"Fehler in \"parseFor()\"\n" +*/
                                      "Schl黶selwort " +
                                      "'for' erwartet in Zeile " +
                                      aktuellerToken.getLineNumber(),
                                      aktuellerToken);
        }
        
        /*// Abfangen der Exception, die mein vorlaeufiger Scanner erzeugt
           } catch (IndexOutOfBoundsException e) {
               throw new ParserException("Fehler in \"parseFor()\"\n" +
                                         "Unerwartetes Dateiende in Zeile " +
                                         aktuellerToken.getLineNumber(),
                                         aktuellerToken);
           }*/
        
	// Rueckgabe des Javacodes in einem String
	return ergebnis;
    }
    
    
    /**
     * Methode zum Parsen einer mit 'begin' beginnenden und mit 'end' endenden
     * Verbundanweisung.
     *
     * @return      String
     * @exception   ParserException
     */
    private String parseVerbund() 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 'begin' kommen
        if (aktuellerToken.toString().equals("begin")) {
            
            ergebnis += "{\n";
            
            // jetzt kommen eingerueckte Anweisungen
            tabs++;
            do {
                try {
                    ergebnis += parseAnweisung();
                } catch (ParserException e) {
                    // Synchronisieren des Scanners bei aufgetretenem Fehler
                    String[] uebergabe = {";", "end"};
                    syncScanner(uebergabe);
                    
                    // Fehler in Vector sammeln
                    errorVector.add(e);
                }
            } while ((!scanner.touchToken().equals("end")) &&
                     scanner.getNextToken().equals(";"));
            // Einrueckung zuruecknehmen
            tabs--;
            
            // jetzt muss ein 'end' kommen
            aktuellerToken = scanner.getNextToken();
            if (aktuellerToken.toString().equals("end")) {
                ergebnis += insertTabs() + "}\n";
                
            } else {
                // fehlendes 'end'
                throw new ParserException(/*"Fehler in \"parseVerbund()\"\n" +*/
                                          "Schl黶selwort 'end' " +
                                          "oder ';' erwartet in Zeile " +
                                          scanner.touchToken().getLineNumber(),
                                          aktuellerToken);
            }
            
        } else {
            // fehlendes 'begin'
            throw new ParserException(/*"Fehler in \"parseVerbund()\"\n" +*/
                                      "Schl黶selwort 'begin' " +
                                      "erwartet in Zeile " +
                                      aktuellerToken.getLineNumber(),
                                      aktuellerToken);
        }
        
        /*// Abfangen der Exception, die mein vorlaeufiger Scanner erzeugt
           } catch (IndexOutOfBoundsException e) {
               throw new ParserException("Fehler in \"parseVerbund()\"");
           }*/
        
        // Rueckgabe des Javacodes in einem String
        return ergebnis;
    }
    
    /**
     * Methode zum Parsen einer Zuweisung z.B. der Form 'variable := (6+7)'.
     * 
     * @return      String
     * @exception   ParserException
     */
    private String parseZuweisung() throws ParserException {
        
        // Zwischenspeicher fuer die Javacodeausgabe

⌨️ 快捷键说明

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