BNF或ABNF是否支持否定。那是否排除了某些成员? 我的语法中没有看到任何这样的否定运算符。
例如,假设S
是不等于到"foo"
的所有字母数字字符串的集合
S
的BNF是多少?
答案 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:
中指出句法异常由句法因素主题组成 对符号序列所代表的限制 语法异常同样可以表示为 一个不包含元标识符的句法因子。
注意 - 如果允许语法异常是任意的 句法因子,扩展BNF 可以定义更广泛的类 语言比无上下文语法,包括尝试 这导致了类似拉塞尔的悖论,例如
xx = "A" - xx;
" A" xx的一个例子?这种许可是不可取的 因此限制了句法异常的形式 对于可以证明是安全的案件。因此,而a 句法因子通常相当于一些无上下文 语法,一个句法异常总是等同于一些 常规语法。可能表明a之间的区别 无上下文语法和常规语法总是另一种 无上下文语法;因此是一个句法术语(因此任何 根据本标准定义的语法)相当于 一些无上下文的语法。