我已经编码了一个表驱动的LR(1)解析器,并且运行良好,但是在将解析解析为语法树/抽象语法树的阶段中,我有些脱节。 这是一个我非常热衷的项目,但是我真的在这里陷入了僵局。 提前谢谢你的帮助。
编辑:同样,我的解析器仅使用2d数组和一个动作对象,该对象告诉它下一步去哪里,或者它减少了哪里去以及弹出多少项目。 我注意到许多人使用访客模式。 我不确定他们如何知道要制作哪种类型的节点。
这是上下文的下推自动机while (lexer.hasNext() || parseStack.size() > 0) {
Action topOfStack = parseStack.peek();
token = parseStack.size() > 0 ? lexer.nextToken() : new Token(TokenType.EOF, "EOF");
topOfStack.setToken(token);
int row = topOfStack.getTransitionIndex();
int column = getTerminalIndex(token.getLexeme());
column = token.getType() == TokenType.IDENTIFIER
&& !terminalsContain(token.getLexeme()) ? 0 : column;
Action action = actionTable[row][column];
if (action instanceof Accept) {
System.out.println("valid parse!!!!!!");
} else if (action instanceof Reduction) {
Reduction reduction = (Reduction) action;
popStack(parseStack, reduction.getNumberOfItemsToPop());
column = reduction.getTransitionIndex();
row = parseStack.peek().getTransitionIndex();
parseStack.push(new Action(gotoTable[row][column]));
lexer.backupTokenStream();
} else if (action != null) {
parseStack.push(actionTable[row][column]);
} else {
System.out.println("Parse error");
System.out.println("On token: " + token.getLexeme());
break;
}