1

在 flex/lex/bison/yacc(我刚刚开始阅读所有这些内容)中,您可以将“$$”设置为某个值($1、$2、$3),这就是返回的值。至少我认为它是这样工作的。

在 ParseKit 中,给你一个堆栈,所以我想 ($1,$2,$3) 将是堆栈上的前三个值。但是我认为您想要做的是将这些值从堆栈中弹出并将您的返回值放入堆栈中。我看到堆栈带有推送方法。在推动某些东西之前,您是否必须先弹出传入的值?

谢谢

4

1 回答 1

2

ParseKit 的开发者在这里。我会说:这取决于。一些想法:

  1. -[PKAssembly push:]是的,通过调用发送到解析器委托回调的程序集,将对象/值存储在程序集的堆栈上通常是有用/可取的。稍后的回调将在程序集的堆栈上找到这些值,并且可能希望在找到它们时采取行动。

  2. 另一种选择:如果您的回调方法正在构建一些结果对象,您通常希望将其存储为-[PKAssembly target]传递给您的回调方法的程序集的属性。因此,您有两个地方可以存储值:程序集的目标或程序集的堆栈。目标是这样做的“正确”位置,但通常堆栈也很方便。两者都可以,但我会说:将临时值存储在堆栈上,但将您正在构建的最终对象存储为目标。但同样,你可以做任何一个。

  3. 是的,您的回调通常应该首先从堆栈中弹出值,但这不是必需的。如果这样想:您的委托回调方法接收一个PKAssembly对象作为参数。通常你的回调方法会检查程序集的堆栈并根据它在那里找到的内容采取行动。通常,在你的回调中,如果你对它们采取行动,你会想要弹出在那里找到的值。基本上:您的回调应该弹出它感兴趣/采取行动的值,因为从某种意义上说,您的回调是这些项目/信息的预期接收者。

于 2011-08-17T19:03:03.513 回答