[英]How to represent negation in BNF?
BNF 或 ABNF 是否支持否定。 那是排除集合中的某些成員嗎? 我在它的語法中沒有看到任何這樣的否定運算符。
例如,假設S
是不等於"foo"
的所有字母數字字符串的集合。 S
的 BNF 是什么?
上下文無關文法不會在“差異”或“補語”下關閉。 因此,雖然您可能決定向 BNF 添加運算符“減法”,但結果不會是上下文無關文法,即使它有一種簡單的表達方式。 結果:人們不允許在用於表達上下文無關文法的 BNF 文法中使用此類運算符。
雖然不在 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”。
但是,重要的是要注意 Ira Baxter 在他們的回答中,允許任何例外(否定)因素都會導致問題。 ISO標准中也指出了這一點:
一個句法異常由一個句法因子組成,該限制是由該句法異常表示的符號序列同樣可以由不包含元標識符的句法因子表示。
注意- 如果允許句法異常是任意句法因素,擴展 BNF可以定義比上下文無關文法更廣泛的語言類別,包括導致類似羅素悖論的嘗試,例如
xx = "A" - xx;
“A”是 xx 的一個例子嗎? 這種許可是不可取的,因此語法異常的形式僅限於可以證明是安全的情況。 因此,句法因素通常等同於某些上下文無關文法,而句法異常總是等同於某些常規文法。 可以證明,上下文無關文法和正則文法之間的區別總是另一種上下文無關文法; 因此,句法術語(以及根據該標准定義的任何文法)等價於一些上下文無關文法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.