📄 parser.java
字号:
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 + -