【问题标题】:How do I parse children nodes?如何解析子节点?
【发布时间】:2015-03-30 17:56:41
【问题描述】:

假设我有以下语法:

let_stat = "let" iden [ "=" expr ];
if_stat = "if" expr "->" stat;
stat = let_stat | if_stat;

这将是以下伪代码:

let_stat parseLetStat() {


if token is "let" {
        consume token

        if token is identifier {
            char *value = consumetoken.value
            let_stat let = new let_stat;
            let.name = value;

            if token is "=" {
                let.value = parseExpression;
            }

            return let
        }
    }
}

if_stat parseIfStat() {
    if token is "if" {
        consume token

        expression expr = parseExpression;
        block block = parseBlock;

        if_stat ifstmt = new if_stat
        ifstmt.expr = expr
        ifstmt.block = block
        return ifstmt
    }
}

stat parseStatement() {

}

parseStatement 函数会做什么?它如何选择调用哪个函数,if_stat 函数或 let_stat 函数?还是我会将所有代码都放入一个函数中?我不太明白,因为我很困惑,所以任何帮助都会很棒。

【问题讨论】:

    标签: parsing compiler-construction grammar ebnf


    【解决方案1】:

    您的具体问题的关键问题是,当 EBNF 规则中存在交替时,非终结符的解析器必须调用 all 备选方案并询问每个备选方案是否识别该构造;每个子解析器必须返回一个表示是或否的标志。

    你可能需要的是general principles for writing a recursive descent parser.

    【讨论】:

    • 哦,我明白了,完美。当然,由唯一的 Ira Baxter 回答,您似乎回答了我的很多问题 :) 谢谢! :)
    • @user3839220:你在我的地盘上提问:-}
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-17
    相关资源
    最近更新 更多