我有以下语法(SSCCE):如何最好地处理野牛同样规则的不同动作?
%token WORD
%%
program : word word
;
word : WORD // have to translate only for first word
;
规则word : WORD
应具有动作,即对WORD
令牌语义值被适当地“翻译”的语义值的左手侧,仅当这是规则program: word word
中的第一个word
。
在野牛中这样做的最佳做法是什么?
我不明白如何做到这一点与行动。我必须扩展语法本身,以此:
%token WORD
%%
program : word_translated word_not_translated
;
word_translated : WORD { // translate }
;
word_not_translated : WORD { // do not translate }
;
好的,但是我不喜欢。因为语法有两个符号word_translated
和word_not_translated
,就语法而言,它们完全一样,所以语法太复杂了,应该简化成一个word
。增加复杂性的唯一原因是,行动可能会有所不同。
这是做到这一点的唯一方法,这是野牛处理这种情况的最佳做法吗?
是的,这是最好的做法 - 当你需要做同样的符号不同的动作(终端或非终端)的不同的上下文,你只需创建一个新的单例规则。 –
@Chris好的谢谢你,但在此期间,我想出了如何做到这一点:使用'$ 0' –
@ChrisDodd我发现了全面的情况,而不是我的帖子中简单的SSCCE,使用' $ 0','$ -1'等是不切实际的。它真的就像自己构建树并走路。所以你的评论是黄金。你应该让它成为我会接受的答案。 –