
aima.core.logic.common.Parser Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of aima-core Show documentation
Show all versions of aima-core Show documentation
AIMA-Java Core Algorithms from the book Artificial Intelligence a Modern Approach 3rd Ed.
package aima.core.logic.common;
/**
* @author Ravi Mohan
*
*/
public abstract class Parser {
protected Lexer lexer;
protected Token[] lookAheadBuffer;
protected int lookAhead = 3;
public abstract ParseTreeNode parse(String input);
/*
* Stores the next token in the lookahead buffer to make parsing action
* decisions.
*/
protected void fillLookAheadBuffer() {
for (int i = 0; i < lookAhead; i++) {
lookAheadBuffer[i] = lexer.nextToken();
}
}
/*
* Returns the token at the specified position in the lookahead buffer.
*/
protected Token lookAhead(int i) {
return lookAheadBuffer[i - 1];
}
protected void consume() {
loadNextTokenFromInput();
}
/*
* Loads the next token into the lookahead buffer if the end of the stream
* has not already been reached.
*/
protected void loadNextTokenFromInput() {
boolean eoiEncountered = false;
for (int i = 0; i < lookAhead - 1; i++) {
lookAheadBuffer[i] = lookAheadBuffer[i + 1];
if (isEndOfInput(lookAheadBuffer[i])) {
eoiEncountered = true;
break;
}
}
if (!eoiEncountered) {
try {
lookAheadBuffer[lookAhead - 1] = lexer.nextToken();
} catch (Exception e) {
e.printStackTrace();
}
}
}
/*
* Returns true if the end of the stream has been reached.
*/
protected boolean isEndOfInput(Token t) {
return (t.getType() == LogicTokenTypes.EOI);
}
protected void match(String terminalSymbol) {
if (lookAhead(1).getText().equals(terminalSymbol)) {
consume();
} else {
throw new RuntimeException(
"Syntax error detected at match. Expected "
+ terminalSymbol + " but got "
+ lookAhead(1).getText());
}
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy