如何在BNF中表示否定?

时间:2012-06-06 21:11:03

标签: parsing grammar bnf ebnf

BNF或ABNF是否支持否定。那是否排除了某些成员? 我的语法中没有看到任何这样的否定运算符。

例如,假设S不等于"foo"的所有字母数字字符串的集合 S的BNF是多少?

2 个答案:

答案 0 :(得分:3)

上下文无关语法不会在“差异”或“补充”下关闭。因此,虽然您可能决定向BNF添加运算符“减法”,但结果将不是无上下文语法,即使它有一种简单的表达方式。结果:人们不允许BNF语法中的此类运算符用于表达无上下文的语法。

答案 1 :(得分:2)

虽然不在BNF中,但EBNF确实有除了符号(通常定义为" - ")。在您的情况下,语法将是:

alphaNum="a"|"b"|...|"z"|"0"|"1"|...|"9"|"A"|...|"Z";
S= (alphaNum,{alphaNum}) - "foo";

或者如果您希望它不区分大小写:

foo="f"|"F","o"|"O","o"|"O";
alphaNum="a"|"b"|...|"z"|"0"|"1"|...|"9"|"A"|...|"Z";
S= (alphaNum,{alphaNum}) - foo;

这导致接受标准略微不同于评论中的等同于:

alphaNum="a"|"b"|...|"z"|"0"|"1"|...|"9";
S= alphaNum - "f", {alphaNum} 
  |"f", alphaNum - "o", {alphaNum}
  |"f", "o", alphaNum - "o", {alphaNum};

这就省去了字符串" f"和" fo"。

然而,重要的是要注意,因为艾拉巴克斯特在答案中允许任何事情,因为例外(否定)因素会导致问题。这也在ISO standard

中指出

4.7语法异常

句法异常由句法因素主题组成 对符号序列所代表的限制 语法异常同样可以表示为 一个不包含元标识符的句法因子。

注意 - 如果允许语法异常是任意的 句法因子,扩展BNF 可以定义更广泛的类 语言比无上下文语法,包括尝试 这导致了类似拉塞尔的悖论,例如

xx = "A" - xx;

" A" xx的一个例子?这种许可是不可取的 因此限制了句法异常的形式 对于可以证明是安全的案件。因此,而a 句法因子通常相当于一些无上下文 语法,一个句法异常总是等同于一些 常规语法。可能表明a之间的区别 无上下文语法和常规语法总是另一种 无上下文语法;因此是一个句法术语(因此任何 根据本标准定义的语法)相当于 一些无上下文的语法。