0

我在这里查看了 EBNF 的 ISO 规范 pdf (除了在 ISO 网站上,我找不到官方的,它似乎要花钱),我不太了解空格。

有谁知道官方标准是否允许元标识符中有空格?根据标准文档(第 8.1 节)中的元标识符,我会说不,但是如果您看一下同一标准文档中的相同示例,它似乎会说是。

在该文档 8.1 顶部的评论中,似乎是说它正在使用自身定义 EBNF。我对此感到困惑的是这样的行:

meta identifier = letter, {letter | decimal digit}
(* A <meta identifier> is the name of a
syntactic element of the language being
defined *);

元标识符本身应该是一个元标识符,但据我所知,它不适合元标识符(字母然后是任何数量的数字或字母)。

有谁知道发生了什么?

4

3 回答 3

1

实际上,官方的 ISO EBNF 规范 (ISO/IEC 14977:1996) 可以从这里的 ISO 网站免费下载。这实际上将元标识符定义如下:

meta identifier = letter, {meta identifier character};

meta identifier character = letter | decimal digit;

指本定义中的4.14和4.15。那里清楚地表明元标识符字符仅由字母和十进制数字组成。

他们用来指定 EBNF 的 EBNF 确实允许标识符中有空格,这确实很奇怪。我一直相信 EBNF 允许标识符中有空格。这也是维基百科所说的(尽管那里的语法在其他方面不完整):

identifier = letter , { letter | digit | " " } ;

那么也许他们在标准中忽略了这一点?或者我们都错过了一些东西。无论如何,我希望您现在有了官方标准就可以弄清楚。

于 2013-03-10T17:02:43.467 回答
0

该标准的第 6 节提供了您的答案:

从 6.1 开始:

6.2 到 6.4 定义了一个非打印字符,如空格或换行符,如果该字符在一个终端字符串或形成单个终端字符的字符对之外,则该字符对语法没有正式影响。

所以本质上,空白被忽略了。

第 8.1 节将语法分为 4 个部分。元标识符在第 3 部分中定义,其前缀为以下注释(我的粗体编辑):

语法的第三部分定义了从形成语法的无间隙符号中删除带括号的文本符号。

8.1 的工作方式是该部分的第 1 部分定义了输入第 2 部分的终端字符和间隙,然后删除输入第 3 部分的间隙分隔符,删除输入第 4 部分的注释,从而构建您的语法。

于 2017-09-11T13:33:09.063 回答
0

ISO/IEC 14977:1996(E) 提供以下意图:

简介,第 viii 页,
d)元标识符。元标识符(语言中非终结符号的名称)不必是单个单词或括在括号中,因为存在显式连接符号。这也确保了语法的布局(终端符号除外)不会影响正在定义的语言。

适用的定义和规则:

4.14 元标识符
元标识符由一个或多个元标识符字符的有序列表组成,条件是第一个元标识符字符是一个字母。

4.15 元标识符字符
元标识符字符是字母或十进制数字。

6.2 终端字符扩展 BNF
的终端字符是下列之一: a) 一个字母; b) 一个十进制数字; 等等


6.3 无间隙符号
无间隙符号是:
a) 既不是第一个引号符号也不是第二个引号符号的终端字符,或
b) 终端字符串。

6.4间隔分隔符
间隔分隔符是非打印字符之一:空格、水平制表、换行符、垂直制表或换页。
一个或多个间隙分隔符可以放置在:
a) 句法之前,和
b) 句法的任意两个无间隙符号之间,以及
c) 句法之后,
而不影响由该句法定义的语言。

Ameta-identifier不是gap-free-symbol(6.3)。但是,组成 的字母和数字meta-identifier是(6.2a、6.2b 和 6.3a)。因此,可以插入空格(6.4b)来分隔 that 的单词meta-identifier

删除每个gap-separator(6.4) 后,结果meta-identifier将由一个字母后跟零个或多个字母和数字组成,从而满足 4.14 和 4.15 的要求。

于 2018-11-27T21:35:37.777 回答