有没有人对基于Shunting-Yard的解析器添加函数 definition 支持有任何见解?
单语句定义很简单。我可以修改我的解析器来递归一个块(这非常模糊!)来处理函数定义作为一个子程序,但这感觉就像一个kludge。
有更好的解决方案吗?
更新
所以,我设法通过几乎没有任何修改来实现这一点。 SY阶段将{
和}
都推送到堆栈上。
当解析器(管道中的下一个阶段)遇到{
(blockstart)时,它会创建一个新的Block
(AST)结构并将其推送到RPN堆栈。当解析器到达}
时,它会创建一个AST节点向量,并弹出堆栈直到遇到Block
。此时,块结束和块开始之间遇到的节点向量将添加到块的表达式(语句)集合中。
当解析器到达堆栈上的Block时,它会检查下一个(堆栈中较低的)节点是否是函数调用。如果是,则弹出函数调用,创建函数定义节点,并使用先前生成的块并调用以定义函数。
这是一个非常模糊/半无用的描述 - I will attempt to write up a detailed explanation and post it somewhere。