有人对向基于 Shunting-Yard 的解析器添加函数定义支持有任何见解吗?
单语句定义很简单。我可以修改我的解析器以在块内递归(这非常模糊!)以将函数定义作为子程序处理,但这感觉就像一个杂物。
有更好的解决方案吗?
更新
因此,我设法通过很少的修改来实现它。SY 阶段将两者都{
推}
入堆栈。
当解析器(管道中的下一阶段)遇到{
(blockstart)时,它会创建一个新的Block
(AST)结构并将其推送到 RPN 堆栈上。当解析器到达 a}
时,它会创建一个 AST 节点向量,并弹出堆栈直到遇到 a Block
。此时,在块结束和块开始之间遇到的节点向量被添加到块的表达式(语句)集合中。
当解析器到达堆栈上的块时,它会检查下一个(堆栈上较低的)节点是否是函数调用。如果是,则弹出函数调用,创建函数定义节点,并使用先前生成的块和调用来定义函数。
这都是一个非常模糊/半无用的描述 -我将尝试写一个详细的解释并将其发布在某个地方。