Initial commit
This commit is contained in:
@@ -0,0 +1,117 @@
|
||||
/* **********************************************
|
||||
* 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();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user