📄 parser.java
字号:
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ücken, dies schließ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ür den bei erfolgreicher Compilierung erstellten
* Javacode.
*
* @return String
*/
public String getJavaCode() {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -