OperationNode: Has enum, left and Optional right members, good constructors and ToString is good VariableReferenceNode: Has name and Optional index, good constructors and ToString is good Constant & Node Pattern:
Java Code: Below are the methods for parser.java. Make sure to use the existing Parser.java file to add in all the methods and show the output.
OperationNode: Has enum, left and Optional right members, good constructors and ToString is good
VariableReferenceNode: Has name and Optional index, good constructors and ToString is good
Constant & Node Pattern: Have name, good constructor and ToString is good
ParseLValue - variables: Accepts a variable name and creates an appropriate Variable Reference Node
ParseLValue - arrays: Accepts a name, appropriately gets an index and creates an appropriate Variable Reference Node
ParseLValue - dollar: Creates an operation node, gets the value of the $ operator appropriately
ParseBottomLevel – constants & patterns: Detects strings, numbers and patterns and creates appropriate nodes
ParseBottomLevel – parenthesis: Creates an operation node AND gets the contents of the parenthesis appropriately
ParseBottomLevel – unary operators: All four are correct
Parser.java
import java.text.ParseException;
import java.util.LinkedList;
import java.util.List;
import java.util.Optional;
import javax.swing.ActionMap;
public class Parser {
private TokenHandler tokenHandler;
private LinkedList<Token> tokens;
public Parser(LinkedList<Token> tokens) {
this.tokenHandler = new TokenHandler(tokens);
this.tokens = tokens;
}
public boolean AcceptSeparators() {
boolean foundSeparator = false;
while (tokenHandler.MoreTokens()) {
Optional<Token> currentToken = tokenHandler.getCurrentToken();
if (currentToken.isPresent() && (currentToken.get().getType() == Token.TokenType.NEWLINE || currentToken.get().getType() == Token.TokenType.SEMICOLON)) {
tokenHandler.consumeMatchedToken();
foundSeparator = true;
} else {
break;
}
}
return foundSeparator;
}
public ProgramNode Parse() throws ParseException {
ProgramNode programNode = new ProgramNode(null, 0);
while (tokenHandler.MoreTokens()) {
if (!ParseFunction(programNode) && !parseAction(programNode)) {
throw new ParseException("Unexpected token: " + tokenHandler.getCurrentToken().getStart());
}
}
return programNode;
}
private boolean ParseFunction(ProgramNode programNode) {
Optional<Token> functionNameToken = tokenHandler.getCurrentToken();
if (tokenHandler.MatchAndRemove(Token.TokenType.IDENTIFIER) != null) {
FunctionDefinitionNode functionNode = new FunctionDefinitionNode(functionNameToken.map(Token::getType).orElse(null).getStart());
programNode.addNode(functionNode);
if (tokenHandler.MatchAndRemove(Token.TokenType.LPAREN) != null) {
if (tokenHandler.MatchAndRemove(Token.TokenType.RPAREN) != null) {
AcceptSeparators();
return true;
}
}
}
return false;
}
private boolean parseAction(ProgramNode programNode) {
Optional<Token> functionNameToken = tokenHandler.getCurrentToken();
if (tokenHandler.MatchAndRemove(Token.TokenType.IDENTIFIER) != null) {
ActionMap actionMap = new ActionMap();
programNode.addNode(actionMap);
AcceptSeparators();
return true;
}
return false;
}
}
Trending now
This is a popular solution!
Step by step
Solved in 3 steps