如何递归解析表达式?

时间:2015-03-18 19:10:18

标签: c parsing recursion

我正在写一种小语言,而且我真的很依赖表达式解析。我写了一个LR Recursive Descent Parser,它可以工作,但现在我需要解析表达式,我发现它真的很难。我没有定义语法,但如果它有帮助,我就知道它是如何工作的,即使没有语法。目前,我的表达式结构如下所示:

typedef struct s_ExpressionNode {
    Token *value;
    char expressionType;

    struct *s_ExpressionNode lhand;
    char operand;
    struct *s_ExpressionNode rhand;
} ExpressionNode;

我试图让它解析类似的东西:

5 + 5 + 2 * (-3 / 2) * age

我正在阅读有关如何解析表达式的this文章。我试图实现的第一个语法但是效果不好,然后我注意到了第二个语法,它似乎删除了左递归。但是,由于我不明白P,B是什么意思,而且U是-,但-也是B,我不得不试图实现它?此外,我不确定expect(end)应该是什么意思。

1 个答案:

答案 0 :(得分:1)

在您关联的文章的“递归 - 下降识别”部分中,EPBU是非终端符号表达语法呈现。根据他们在文中的定义,我推断“E”被选为“表达式”的助记符,“P”被用作“主要”的助记符,“B”用于“二进制(运算符)”,“U”用于“一元(经营者)“。鉴于这些特征,应该清楚终端符号“ - ”可以缩小为UB,具体取决于上下文:

unary:   -1
binary: x-1

本文中描述的expect()函数用于使用下一个令牌,如果它恰好是指定类型,或者抛出错误。 end标记被定义为表示输入结束的合成标记。因此

expect(end)

表示期望表达式中不再有令牌处理,如果不满足该期望,则其给定的实现会引发错误。

除了选择特定符号EPBU的原因外,所有这些都在文中。如果您在阅读文本时遇到问题,那么您可能需要搜索更简单的内容。