由于我对我的问题根本没有答案 是否有MKS YACC的替代方法支持选择偏好语法或非常相似的内容?, ,我会问一个更基本的问题:

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

如果有的话,您使用了什么?另外,除了规则中的最后一个位置以外的任何其他位置,是否有意义?

我必须照顾一个语法,该语法是:诸如:

    TOKEN1 LPAREN non_terminal1 [^EQUAL] TOKEN2 non_terminal2 RPAREN

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

背景

MKS YACC支持其网站称为“选择偏好语法“。它没有说明,但它由带有男式的方括号中的令牌或令牌列表组成(可能是可选的),它表明特定的令牌不得遵循此构造,但不计算令牌作为此规则的一部分:

non_terminal1:  TOKEN1 non_terminal2 TOKEN2 [^TOKEN3]

因此,该规则说 TOKEN1 然后是 non_terminal2TOKEN2 是一个 non_terminal1, ,除非下一个令牌是 TOKEN3 在这种情况下,其他一些规则适用。

(我尚不清楚括号的项目是否可以是非终端。我使用的符号始终使用令牌或几个空间分离的令牌,而不是非终端。我也不是清楚是否需要套筒;同样,我见过的所有示例都使用了Caret。)

有帮助吗?

解决方案

乔纳森。在凌晨1:30,我不准备自己尝试这样做,但是无论这些规则做什么,它们只能成为可以用像普通BNF之类的规则写的规则。从这里看,看来“选择偏好”正在做的是允许您表达具有一个语法规则的几种作品。

我做了一点挖掘,发现 这个, ,这证实了我的假设:选择偏好是让您明确插入一个lookahead,以便否则会构成的规则可以被歧视。

我建议的是考虑一下如果将这些规则重新编写为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
...

因此,总体效果是为每个操作员采用一个规则 除了 相等, [^ 符号在各种贝尔实验室语言中很常见,例如集合的补充。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top