摘要:
- 这个符号被称为扩展巴科斯范式。
- 它并不特定于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