我看了一下EBNF here的ISO规范pdf (我找不到官方的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 *);元标识符本身应该是一个元标识符,但据我所知,它不适合元标识符(字母,然后是任何数量的数字或字母)。
有人知道这是怎么回事吗?
发布于 2013-03-11 01:02:43
事实上,ISO EBNF官方规范( ISO /IEC 14977:1996)可以从国际标准化组织网站here免费下载。它实际定义的元标识符如下:
meta identifier = letter, {meta identifier character};
meta identifier character = letter | decimal digit;在这个定义中是指4.14和4.15。它清楚地说明了元标识符字符只由字母和十进制数字组成。
奇怪的是,他们用来指定EBNF的EBNF确实允许标识符中有空格。我一直相信EBNF允许在标识符中使用空格。这也是维基百科所说的(尽管那里的语法在其他方面是不完整的):
identifier = letter , { letter | digit | " " } ;那么,也许他们在标准中忽略了这一点?或者我们都错过了什么。无论如何,我希望你现在已经有了官方标准,也许你能弄清楚。
发布于 2017-09-11 21:33:09
该标准的第6节提供了您的答案:
从6.1开始:
6.2到6.4规定,如果诸如空格或换行符之类的非打印字符在形成单个终止字符的终止串或字符对之外,则该字符对语法没有正式影响。
所以从本质上讲,空白被忽略了。
8.1节将语法分解为4个部分。元标识符在第三部分中定义,其前缀为以下注释(我的粗体编辑):
语法的第三部分
定义了从构成语法的gap-free-symbols中删除带括号的文本符号。
8.1的工作方式是,第1部分定义了输入到第2部分的末尾字符和空格,然后第2部分删除了提供给第3部分的间隙分隔符,该分隔符删除了馈送到构建语法的第4部分的注释。
发布于 2018-11-28 05:35:38
ISO/IEC 14977:1996(E)规定了以下目的:
简介,第八页,
d)元标识符。元标识符(语言中非末尾符号的名称)不需要是单个单词,也不需要用括号括起来,因为有一个显式的连接符号。这还可以确保语法的布局(终端符号除外)不会影响正在定义的语言。
适用的定义和规则:
4.14元标识符
元标识符由一个或多个元标识符字符的有序列表组成,所述一个或多个元标识符字符受第一元标识符字符是字母的条件的约束。
4.15元标识符字符
元标识符字符是字母或十进制数字。
6.2终端字符
扩展BNF的终端字符为以下字符之一:
a)一封信;
b)十进制数字;
等。
6.3无间隙符号
无间隙符号为:
a)既不是第一引号符号也不是第二引号符号的终止字符,或者
b)终端字符串。
6.4间隙-分隔符
可以放置一个或多个间隙分隔符:
a)在语法之前,以及
b)在语法的任意两个无间隙符号之间,以及
c)在语法之后
而不影响语法定义的语言。
meta-identifier不是gap-free-symbol (6.3)。但是,组成meta-identifier的字母和数字是(6.2a、6.2b和6.3a)。因此,可以插入空格(6.4b)来分隔该meta-identifier的单词。
https://stackoverflow.com/questions/15268229
复制相似问题