我正在阅读SIP(Scala改进流程)文档并找到了这种语法:
我们为已处理的字符串引入了一种新的表达形式:语法:
SimpleExpr1 ::= … | processedStringLiteral processedStringLiteral ::= alphaid`"' {printableChar \ (`"' | `$') | escape} `"' | alphaid `"""' {[`"'] [`"'] char \ (`"' | `$') | escape} {`"'} `"""' escape ::= `$$' | `$' letter { letter | digit } | `$'BlockExpr alphaid ::= upper idrest | varid
我希望能够理解这种语法,但我甚至不知道:
我认为我知道的所有内容都是来自其他编程语言或规范的假设,例如:
|
表示替代方案,除非在行首处使用,然后它只是说该行继续。\
是转义字符processedStringLiteral
的定义是alphaid
,escape
和printableChar
(即便如此)不知道printableChar
在哪里。问题:
::=
,"'
。答案 0 :(得分:3)
摘要:
更长的版本:
你看到的是,@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
正在运行'或者'散步' sentence
是name
,除了玛丽'后跟一个空格和任何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的语法。