摘要:
- 這個符號被稱爲擴展巴科斯範式。
- 它並不特定於SIP。
- 你的假設是部分正確的。
- 我會解釋這些符號在更長的版本
- 我給英文翻譯的例子在更長的版本
- 是的,這是一個片段的意思。並非所有的定義都存在。
加長版:
你們看到的是,@pedrofurla指出,擴展巴科斯範式,這是不幸的是沒有明確界定。 This link列出了您可能在野外找到的許多不同變體。像僞代碼一樣,你會看到許多反覆出現的約定,因此在大多數實際情況下,EBNF的含義是毫不含糊的。它用於指定某種語法*,即所有字符串中任務的「有效」子集(例如,給定語言中語法正確的代碼)。它不是特定於SIP。
它通常是(在使用該特定變體時的例外)添加劑規格。每一行都是一個新的規則,爲我們定義的所有字符串的有效子集添加一種新的有效字符串。
接下來我將介紹的是這裏使用的特定變體,但大多數其他變體與小的語法差異或重新繪製相似。
每條規則(通常稱爲生產規則)由兩部分組成:左側的變量名稱(通常稱爲非終止符號),後跟::=
,您可以將其讀作「定義爲」和一系列然後定義變量的字符。
在這種特殊情況下,引用`
和'
的東西是常量(通常稱爲終端符號),即始終被視爲有效的原子字符串。所有未加引號的名稱都是變量(也是非終結符號),它們是指定義該變量的規則認爲有效的字符串。
|
的確被認爲是「或」。
\
是該符號的附加性質的例外。這意味着被解讀爲「除了」。這是數學中用來表示集合差異的相同符號(從另一個集合中減去一個集合的元素)。
{...}
被讀爲「0或更多這些」。
[...]
被讀爲「0或1這些」。
(...)
是傳統的分組/關聯,就像你可能在任何編程語言中發現的一樣。
最後
(只是一個空格)用於連接。
讓我們把它放在一起的一些基本的例子!
trivialidentifier ::= `this' | `that'
英文:「設定我認爲有效的字符串是都是字符串trivialidentifiers
trivialidentifiers
是‘這個’或‘那個’。」因此,這裏認爲有效的唯一字符串是「this」和「that」。
讓我們嘗試更多的東西:
name ::= `John' | `Mary' | `Jane'
verb ::= `runs' | `walks'
sentence ::= (name \ `Mary') ` ' verb
英文:「這是我們關心的有效字符串:A name
是‘約翰’,‘瑪麗’,或‘簡’A verb
是「運行'或'walking'。sentence
是任何name
,除了'Mary'後跟一個空格和任何verb
。「因此,例如「約翰跑」是一個有效的sentence
,但「瑪麗跑」不是。
現在來一些遞歸:
thing ::= `a' | { thing }
英文:「這是我們大家關心的有效串A thing
要麼是‘A’或零或thing
更多的重複。」換句話說,重複「a」,例如「」,「a」,「aa」,「aaa」等。
注意的是,上述相當於
thing ::= ` ' | `a' | `a' [ (thing \ ` ') ]
現在,讓我們回到SIP,只是翻譯processedStringLiteral
產生式規則。
甲processedStringLiteral
是alphaid
後跟一個報價,隨後通過一個或多個printableChar
S(除了報價或美元符號)或escape
S(與兩個可能的混雜)的另一報價結束。
或者它是一個alphaid
跟着三個引號後面跟着一個或多個以下:最多連續兩個單引號之後,除了其他報價或美元符號任何char
或escape
。然後,您可以添加任意數量的引號,然後加上最後三個引號。
* EBNF功能不足以描述所有語法。它只描述稱爲context free grammars的語法。
該符號稱爲EBNF,https://en.wikipedia.org/wiki/Extended_Backus%E2%80%93Naur_form,但它是用乳膠書寫的,所以'和'之間的東西實際上是終端。 – pedrofurla