1

由于我的问题完全没有得到任何答案,是否有替代 MKS Yacc 支持选择偏好语法或类似的东西?,我会问更基本的问题:

  • 有没有人用过 MKS Yacc 提供的“选择偏好”?

如果有,你是用来做什么的?此外,在规则中的最后一个位置以外的任何地方使用它是否有意义?

我必须照顾一个语法,其中包括以下规则:

    TOKEN1 LPAREN non_terminal1 [^EQUAL] TOKEN2 non_terminal2 RPAREN

除非我误解了某些东西,否则嵌入式选择首选项在这种情况下不会提供任何价值。

背景

MKS Yacc 支持他们的网站称为“选择首选项语法”的符号。它没有说明,但它由方括号中的标记或标记列表和插入符号(可能是可选的)组成,并且它指示特定标记不得遵循此构造,但该标记不计为一部分这条规则:

non_terminal1:  TOKEN1 non_terminal2 TOKEN2 [^TOKEN3]

所以,这条规则说 aTOKEN1后跟 anon_terminal2和 aTOKEN2是 a non_terminal1,除非下一个标记是 aTOKEN3在这种情况下适用其他规则。

(我不清楚括号中的项目是否可以是非终端。我看到的使用符号的代码总是使用一个标记或几个空格分隔的标记,而不是非终端。我也不是明确是否需要插入符号;同样,我看到的所有示例都使用插入符号。)

4

1 回答 1

1

乔纳森。在凌晨 1:30 我不准备自己尝试这样做,但无论这些规则做什么,它们只能是可以用普通 BNF 之类的东西编写的规则的简写。从这个角度来看,似乎“选择偏好”正在做的是让你用一个语法规则表达原本会是几个产生式的东西。

我做了一点挖掘,发现了这一点,这证实了我的假设:选择首选项的作用是让您显式地插入一个前瞻,以便可以消除原本会发生冲突的规则的歧义。

我的建议是考虑如果将这些规则之一重写为 yacc 或直接 BNF 会是什么样子。我怀疑它会变成类似

TOKEN1 LPAREN non_terminal1 MULT TOKEN2 non_terminal2 RPAREN
TOKEN1 LPAREN non_terminal1 DIVIDE TOKEN2 non_terminal2 RPAREN
TOKEN1 LPAREN non_terminal1 ADD TOKEN2 non_terminal2 RPAREN
TOKEN1 LPAREN non_terminal1 SUBTRACT TOKEN2 non_terminal2 RPAREN
TOKEN1 LPAREN non_terminal1 EXP TOKEN2 non_terminal2 RPAREN
TOKEN1 LPAREN non_terminal1 MOD TOKEN2 non_terminal2 RPAREN
...

因此,总体效果是对除equal之外的每个运算符采用一个规则,该[^符号在各种贝尔实验室语言中很常见,用于类似于集合的补码。

于 2009-01-26T08:50:05.620 回答