如何为递归下降解析器的一部分编写代码? [重复]

问题描述 投票:1回答:1

我正在寻找此堆栈溢出问题的答案:Can somebody walk me through what this question is trying to ask of me?

它要求执行以下操作,正如答复者所解释的:

编写两个功能,

ifblock
logic_expr

作为您选择的语言的递归下降解析器的一部分。

<ifblock> --> if(<logic_expr>){<stmts>} [else {<stmts>}]
<logic_expr> --> <value> == <value> | <value> != <value>

对于其他非终端符号,'stmts'和'value',可以假定存在相同名称的预写函数。

要从输入流中获取下一个标记,您可以调用'lex()',它返回一个代码,如终端符号的代码中所列。通过调用“ lex()”请求令牌代码来实现“ ifblock”,并根据语言语法对那些具有所需令牌的令牌进行评估和匹配。

要评估'if'的逻辑表达式,您需要进入函数'logic_expr',您需要编写该函数以评估语法中定义的逻辑表达式,并且您可以假定非终结符'值”已经存在。

c parsing recursive-descent
1个回答
2
投票

答案可能是这样。当然,这只是语法分析器的截断的伪代码,没有太多的错误处理或AST构建器。

void parse() {
    while (!EOF)
       if (lex() == IF)
          ifblock()
       else // what is it?
}

void ifblock () {
    if (lex() != LP) 
       return_error;
    le = logic_expr();
    if (lex() != RP) 
       return_error;
    // parse statements in {}, optional else (if (lex() == ELSE) with {}
    // if no errors
    create_if_node(le, st, ...);
}

void logic_expr()
    v1 = value();
    op = lex();
    v2 = value();

    if (op == EQ)
       return create_eq_node(v1, v2);
    else if (op == NEQ)
       return create_neq_node(v1, v2);

    return_error();
}
© www.soinside.com 2019 - 2024. All rights reserved.