64 lines
1.5 KiB
Java
64 lines
1.5 KiB
Java
package parser;
|
|
|
|
import java.io.InputStream;
|
|
|
|
import error.LispException;
|
|
import scanner.LispScanner;
|
|
import sexpression.SExpression;
|
|
import token.*;
|
|
|
|
/**
|
|
* Converts a stream of bytes into internal representations of Lisp s-expressions.
|
|
*/
|
|
public class LispParser {
|
|
|
|
private LispScanner scanner;
|
|
private Token nextToken;
|
|
private LispException delayedException;
|
|
private boolean isNextTokenStored;
|
|
|
|
public LispParser(InputStream inputStream, String fileName) {
|
|
scanner = new LispScanner(inputStream, fileName);
|
|
nextToken = null;
|
|
delayedException = null;
|
|
isNextTokenStored = false;
|
|
}
|
|
|
|
public boolean isEof() {
|
|
if (!isNextTokenStored)
|
|
storeNextToken();
|
|
|
|
return nextToken instanceof Eof;
|
|
}
|
|
|
|
private void storeNextToken() {
|
|
try {
|
|
nextToken = scanner.getNextToken();
|
|
isNextTokenStored = true;
|
|
} catch (LispException e) {
|
|
delayedException = e;
|
|
}
|
|
}
|
|
|
|
public SExpression getNextSExpression() {
|
|
throwDelayedExceptionIfNecessary();
|
|
|
|
if (!isNextTokenStored)
|
|
nextToken = scanner.getNextToken();
|
|
|
|
isNextTokenStored = false;
|
|
|
|
return nextToken.parseSExpression(scanner::getNextToken);
|
|
}
|
|
|
|
private void throwDelayedExceptionIfNecessary() {
|
|
if (delayedException != null) {
|
|
LispException exceptionToThrow = delayedException;
|
|
delayedException = null;
|
|
|
|
throw exceptionToThrow;
|
|
}
|
|
}
|
|
|
|
}
|