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