【问题标题】:How do I translate LR(1) Parse into a Abstract syntax tree?如何将 LR(1) Parse 翻译成抽象语法树?
【发布时间】:2015-05-25 20:21:52
【问题描述】:

我编写了一个表驱动的 LR(1) 解析器,它工作得很好,但是在将解析转换为语法树/抽象语法树的阶段我有点脱节。这是一个我非常热衷的项目,但我真的在这里遇到了死胡同。提前谢谢你的帮助。

编辑:我的解析器也只使用一个二维数组和一个动作对象,告诉它下一步去哪里,或者它是否减少去哪里以及要弹出多少项目。我注意到很多人使用访问者模式。我不确定他们如何知道要制作什么类型的节点。

这是上下文的下推自动机

 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;
        }

【问题讨论】:

    标签: abstract-syntax-tree lr semantic-analysis lr1 concrete-syntax-tree


    【解决方案1】:

    LR 解析过程中的每个约简对应于解析树中的一个内部节点。被缩减的规则是内部 AST 节点,从堆栈中弹出的项目对应于该内部节点的子节点。 goto推送的item对应内部节点,shift action推送的item对应AST的叶子(tokens)。

    将所有这些放在一起,您可以通过在每次进行归约时创建一个新的内部节点并将所有内容适当地连接在一起来轻松构建 AST。

    【讨论】:

    • 非常感谢。我将尝试立即实施。
    • 只是为了澄清一下,每个班次都会创建一个新的叶节点吗?
    • 是的,AST的叶子对应tokens,每个shift都是一个token。
    • 我还有一个问题。我将它添加到标有“编辑:”的初始问题中,再次感谢您的所有帮助。
    • 你从被缩减的规则中知道类型。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-27
    • 1970-01-01
    • 1970-01-01
    • 2013-07-30
    相关资源
    最近更新 更多