我正在写一种小语言,而且我真的很依赖表达式解析。我写了一个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)
应该是什么意思。
答案 0 :(得分:1)
在您关联的文章的“递归 - 下降识别”部分中,E
,P
,B
和U
是非终端符号表达语法呈现。根据他们在文中的定义,我推断“E”被选为“表达式”的助记符,“P”被用作“主要”的助记符,“B”用于“二进制(运算符)”,“U”用于“一元(经营者)“。鉴于这些特征,应该清楚终端符号“ - ”可以缩小为U
或B
,具体取决于上下文:
unary: -1 binary: x-1
本文中描述的expect()
函数用于使用下一个令牌,如果它恰好是指定类型,或者抛出错误。 end
标记被定义为表示输入结束的合成标记。因此
expect(end)
表示期望表达式中不再有令牌处理,如果不满足该期望,则其给定的实现会引发错误。
除了选择特定符号E
,P
,B
和U
的原因外,所有这些都在文中。如果您在阅读文本时遇到问题,那么您可能需要搜索更简单的内容。