2012-06-06 31 views
8

BNF或ABNF是否支持否定。這是排除該組中的某些成員? 我沒有在其語法中看到任何這樣的否定運算符。如何在BNF中表示否定?

例如,假設S是集所有字母數字串是不等於"foo"的 什麼是BNF爲S

+0

我認爲可以通過使用單個字符構建字符串,以非常複雜的方式來定義它。 – Jus12

+1

是的,你可以做。總體上你問過否定。對於你的具體例子,這個語法將做到這一點:S = notF any * | 'f'不是任何* | 'f''o'notO any *; notF ='a'| ...'e'| 'g'| ...'z'; notO ='a'| ... | 'n'| 'p'| ...'z'; any ='a'| ... | 'z'; –

回答

3

上下文無關文法未在「差異」或「補充」下關閉。因此,儘管您可能決定向BNF添加一個運算符「減法」,但結果不會是無上下文語法,即使它具有簡單的表達方式。後果:人們不允許BNF語法中的這種操作符用於表達上下文無關語法。

+2

那麼現有的編譯器如何檢查變量不是保留字? – Jus12

+4

識別關鍵詞通常在詞法分析器中完成,而不是在解析器中完成。詞法分析器通常只是*命令*比較,因此您首先查找關鍵字。當且僅當失敗時,你有其他標識符。 –

+0

更復雜的方案將標識符視爲關鍵字,並將它們視爲關鍵字。這要求詞法分析器和解析器進行交互以作出選擇,和/或解析器嘗試關鍵字和標識符替代方法,並選擇關鍵字替代方案(如果有效)。我們用我們的解析器來做到這一點,它工作得非常好。 –

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」。

但是,由於艾拉巴克斯特的回答很重要,因爲除外(否定)因素會導致問題。

4.7句法例外

甲句法的異常由句法因子受試者 到限制該符號的序列表示 由句法的異常同樣可以的:這也是在ISO standard指出由 表示不包含元標識符的語法因素。

注意 - 如果語法的異常被允許任意 句法因素,擴展BNF可以定義一個更廣泛的類 語言不是上下文無關文法,包括試圖 導致羅素類似的矛盾,例如

xx = "A" - xx; 

「A」是xx的一個例子嗎?這種許可證是不受歡迎的 ,因此句法異常的形式被限制爲 可證明是安全的情況。因此,句法因素通常相當於某些上下文無關的語法,但句法異常總是等同於某些常規語法 。可以表明,上下文無關語法和正則語法之間的差別始終是另一個上下文無關語法;因此句法術語(因此根據此標準定義的任何 語法)相當於 某些上下文無關文法。