2017-09-01 49 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的语法。