2017-09-01 33 views
0

我正在讀一本SIP(斯卡拉改進過程)文件,發現這句法:如何解釋Scala的SIP符號

我們引入一種新的表達形式處理字符串:語法:

SimpleExpr1 ::= … | processedStringLiteral 
processedStringLiteral 
      ::= alphaid`"' {printableChar \ (`"' | `$') | escape} `"' 
       | alphaid `"""' {[`"'] [`"'] char \ (`"' | `$') | escape} {`"'} `"""' 
escape  ::= `$$' 
       | `$' letter { letter | digit } 
       | `$'BlockExpr 
alphaid  ::= upper idrest 
       | varid 

我希望能夠理解這個語法,但我甚至不知道:

  • 那是什麼叫什麼名字? (如果它叫什麼)
  • 如果是特定於SIP的

一切,我想我知道是從其他編程語言或規範假設,如:

  • |表示替代除非在行首時使用,那麼它只是表示該行繼續。
  • \是轉義字符
  • 該符號開始通過在其它概念的成本定義一個概念,即processedStringLiteral是在alphaidescapeprintableChar(甚至壽我不知道在哪裏printableChar是)的成本定義。

的問題:

  • 是我的假設是否正確?
  • 怎麼樣剩下的符號如::=,"'
  • 我該如何閱讀這本書,好像我在讀英文? I.e:「處理過的字符串文字以一個字母后跟一個空格開始......」(假設我甚至可以像這樣讀取它)。
+2

該符號稱爲EBNF,https://en.wikipedia.org/wiki/Extended_Backus%E2%80%93Naur_form,但它是用乳膠書寫的,所以'和'之間的東西實際上是終端。 – pedrofurla

回答

3

摘要:

  • 這個符號被稱爲擴展巴科斯範式。
  • 它並不特定於SIP。
  • 你的假設是部分正確的。
  • 我會解釋這些符號在更長的版本
  • 我給英文翻譯的例子在更長的版本
  • 是的,這是一個片段的意思。並非所有的定義都存在。

加長版:

你們看到的是,@pedrofurla指出,擴展巴科斯範式,這是不幸的是沒有明確界定。 This link列出了您可能在野外找到的許多不同變體。像僞代碼一樣,你會看到許多反覆出現的約定,因此在大多數實際情況下,EBNF的含義是毫不含糊的。它用於指定某種語法*,即所有字符串中任務的「有效」子集(例如,給定語言中語法正確的代碼)。它不是特定於SIP。

它通常是(在使用該特定變體時的例外)添加劑規格。每一行都是一個新的規則,爲我們定義的所有字符串的有效子集添加一種新的有效字符串。

接下來我將介紹的是這裏使用的特定變體,但大多數其他變體與小的語法差異或重新繪製相似。

每條規則(通常稱爲生產規則)由兩部分組成:左側的變量名稱(通常稱爲非終止符號),後跟::=,您可以將其讀作「定義爲」和一系列然後定義變量的字符。

在這種特殊情況下,引用`'的東西是常量(通常稱爲終端符號),即始終被視爲有效的原子字符串。所有未加引號的名稱都是變量(也是非終結符號),它們是指定義該變量的規則認爲有效的字符串。

|的確被認爲是「或」。

\是該符號的附加性質的例外。這意味着被解讀爲「除了」。這是數學中用來表示集合差異的相同符號(從另一個集合中減去一個集合的元素)。

{...}被讀爲「0或更多這些」。

[...]被讀爲「0或1這些」。

(...)是傳統的分組/關聯,就像你可能在任何編程語言中發現的一樣。

最後(只是一個空格)用於連接。

讓我們把它放在一起的一些基本的例子!

trivialidentifier ::= `this' | `that' 

英文:「設定我認爲有效的字符串是都是字符串trivialidentifierstrivialidentifiers是‘這個’或‘那個’。」因此,這裏認爲有效的唯一字符串是「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產生式規則。

processedStringLiteralalphaid後跟一個報價,隨後通過一個或多個printableChar S(除了報價或美元符號)或escape S(與兩個可能的混雜)的另一報價結束。

或者它是一個alphaid跟着三個引號後面跟着一個或多個以下:最多連續兩個單引號之後,除了其他報價或美元符號任何charescape。然後,您可以添加任意數量的引號,然後加上最後三個​​引號。

* EBNF功能不足以描述所有語法。它只描述稱爲context free grammars的語法。