如何解释Scala的SIP表示法

时间:2017-09-01 22:47:01

标签: scala

我正在阅读SIP(Scala改进流程)文档并找到了这种语法:

  

我们为已处理的字符串引入了一种新的表达形式:语法:

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

我希望能够理解这种语法,但我甚至不知道:

  • 它叫什么? (如果它被称为任何东西)
  • 如果特定于SIP'

我认为我知道的所有内容都是来自其他编程语言或规范的假设,例如:

  • |表示替代方案,除非在行首处使用,然后它只是说该行继续。
  • \是转义字符
  • 这种表示法首先以牺牲其他概念为代价来定义一个概念,即processedStringLiteral的定义是alphaidescapeprintableChar(即便如此)不知道printableChar在哪里。

问题:

  • 我的假设是否正确?
  • ::="'
  • 等剩余符号如何?
  • 我怎么读这个就好像我在读英语一样?即:"处理后的字符串文字以字母后跟空格开头......" (假设我甚至可以这样读)。

1 个答案:

答案 0 :(得分:3)

摘要:

  • 这种符号称为Extended Backus-Naur Form。
  • 它不是特定于SIP。
  • 您的假设部分正确。
  • 我将解释这些符号在较长版本中的含义
  • 我将举例说明较长版本的英文翻译
  • 是的,这是一个片段。并非所有定义都存在。

更长的版本:

你看到的是,@pedrofurla指出,扩展Backus-Naur表格,遗憾的是没有明确定义。 This link列出了您可能在野外发现的许多不同变种。像伪代码一样,你会看到很多惯例一遍又一遍地出现,因此在大多数实际情况中,EBNF意味着什么是明确的。它用于指定某个语法*,即"有效"所有字符串的任务子集(例如,给定语言中的语法正确的代码)。它并非特定于SIP。

通常为(使用此特定变体的例外)添加剂规格。每一行都是一个新规则,它将一种新的有效字符串添加到我们定义的所有字符串的有效子集中。

我接下来描述的将是这里使用的特定变体,但大多数其他变体类似于较小的句法差异或重命名。

每个规则(通常称为生产规则)由两部分组成:左侧的变量名称(通常称为非终结符号),后跟::=,您可以将其读作"定义作为"和一系列然后定义变量的字符。

在这种特殊情况下,`'引用的内容是常量(通常称为终结符号),即始终被视为有效的原子字符串。所有非引用名称都是变量(同样是非终结符号),它们引用被定义该变量的规则视为有效的字符串。

|确实应该被理解为"或。"

\是此表示法的附加性质的例外。它应该被理解为"除了。"它与数学中用于表示集合差异的符号相同(从一个集合中减去另一个集合的元素)。

{...}被读作" 0或更多。"

[...]被读作" 0或1。"

(...)是您可能在任何编程语言中找到的传统分组/关联。

最后(只是一个空格)用于连接。

让我们把它们放在一起作为一些基本的例子!

trivialidentifier ::= `this' | `that'

英文:"我认为有效的字符串集合都是trivialidentifiers的字符串。 trivialidentifiers是{'这个'或者'那'。"因此,这里认为唯一有效的字符串是"这个"和"那"。

让我们尝试更多:

name ::= `John' | `Mary' | `Jane'
verb ::= `runs' | `walks'
sentence ::= (name \ `Mary') ` ' verb

英文:"以下是我们关注的有效字符串:name是' John',' Mary'或' Jane& #39 ;. verb正在运行'或者'散步' sentencename,除了玛丽'后跟一个空格和任何verb。"所以例如" John跑步"是一个有效的sentence,但" Mary运行"不是。

现在是递归的东西:

thing ::= `a' | { thing }

英文:"以下是我们关注的有效字符串。 thing是' a'或thing重复零次或多次重复。"换句话说,重复" a",例如""," a"," aa"," aaa&# 34;等等。

请注意,上述内容相当于

thing ::= ` ' | `a' | `a' [ ( thing \ ` ' ) ]

现在让我们回到SIP并只翻译processedStringLiteral制作规则。

  

processedStringLiteral是一个alphaid后跟一个引号,后跟一个或多个printableChar s(引号或美元符号除外)或escape s(可能)混合两者)以另一个引语结束。

     

或者它是alphaid后跟三个引号,后跟一个或多个以下内容:最多两个连续引号,后跟任何char,除了另一个引号或美元符号或{{1} }。然后,您可以添加任意数量的引号,然后添加最后三个引号。

* EBNF不足以描述所有语法。它只描述称为context free grammars的语法。