Files
dhbw-compilerbau/ÜB-Praxis-Scanner für Namen-Leer/src/de/dhbw/compiler/namenscanner/NamenScanner.java
2020-04-27 13:22:10 +02:00

118 lines
2.9 KiB
Java

/* **********************************************
* Duale Hochschule Baden-Württemberg Karlsruhe
* Prof. Dr. Jörn Eisenbiegler
*
* Vorlesung Übersetzerbau
* Praxis AS-Scanner tabellengesteuert 1
*
* **********************************************
*/
package de.dhbw.compiler.namenscanner;
import java.io.IOException;
import java.io.Reader;
import de.dhbw.compiler.namenscanner.Token;
public class NamenScanner {
private final int ignore = -2;
private Reader in = null;
private StringBuffer text = new StringBuffer();
private enum NamenState { WS, P, PE, PET, PETR, PETRA, PETE, PETER, A, AN, ANN, ANNA, EOF};
private NamenState state = NamenState.WS;
private int tokentype = Token.INVALID;
public NamenScanner(Reader input) {
this.in = input;
}
private Token step(int c, NamenState newState, boolean create, int newTokenType) {
Token res = null;
if (create) {
res = new Token(tokentype, text.toString());
text = new StringBuffer();
}
if (c!=ignore) {
text.append((char)c);
}
state = newState;
tokentype = newTokenType;
return res;
}
public Token nextToken() throws Exception {
Token token = null;
while (token == null) {
char c = nextCharacter();
// peter
switch (state) {
case WS:
switch (c) {
case (char) -1: token = step(ignore, NamenState.EOF, false, Token.EOF); break;
case ' ': case '\t': case '\n': case '\r': token = step(ignore, NamenState.WS, false, Token.INVALID); break;
case 'p': token = step(c, NamenState.P, false, Token.INVALID); break;
case 'a': token = step(c, NamenState.A, false, Token.INVALID); break;
default:
if (('a' <= c && c <= 'z') || ('A' <= c && c <= 'Z')) {
token = step(c, NamenState.WS, false, Token.INVALID);
} else {
throw new Exception("Unexpected character: " + c + " (" + (int) c + ")");
} break;
} break;
case P:
switch (c) {
case (char) -1: token = step(ignore, NamenState.EOF, false, Token.EOF); break;
case ' ': case '\t': case '\n': case '\r': token = step(ignore, NamenState.WS, false, Token.INVALID); break;
case '': token = step(c, NamenState.P, false, Token.INVALID); break;
case 'A': token = step(c, NamenState.A, false, Token.INVALID); break;
default:
if (('a' <= c && c <= 'z') || ('A' <= c && c <= 'Z')) {
token = step(c, NamenState.WS, false, Token.INVALID);
} else {
throw new Exception("Unexpected character: " + c + " (" + (int) c + ")");
} break;
} break;
case PE:
break;
case PET:
break;
case PETR:
break;
case PETRA:
break;
case PETE:
break;
case PETER:
break;
case A:
break;
case AN:
break;
case ANN:
break;
case ANNA:
break;
case EOF:
break;
}
}
return token;
}
private char nextCharacter() {
try {
return (char) in.read();
} catch (IOException e) {
e.printStackTrace();
}
}
}