我查看了ISO规范pdf中的EBNF here(除了在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 *);
元标识符本身应该是元标识符,但据我所知,它不符合元标识符(字母,然后是任意数量的数字或字母)。
有谁知道发生了什么事?
答案 0 :(得分:1)
实际上,官方ISO EBNF规范(ISO / IEC 14977:1996)可以从ISO网站here免费下载。 这实际上将元标识符定义如下:
meta identifier = letter, {meta identifier character};
meta identifier character = letter | decimal digit;
在此定义中指的是4.14和4.15。它清楚地表明元标识符字符只包含字母和十进制数字。
确实很奇怪,他们用来指定EBNF的EBNF确实允许标识符中的空格。我一直认为EBNF允许标识符中的空格。这也是维基百科所说的(虽然其他方面的语法不完整):
identifier = letter , { letter | digit | " " } ;
所以也许他们在标准中忽略了这一点?或者我们都缺少一些东西。无论如何,我希望你可以在你拥有官方标准的情况下弄明白。
答案 1 :(得分:0)
标准的第6部分提供了答案:
从6.1:
6.2到6.4定义如果字符在终结字符串或形成单个终端字符的字符对之外,非打印字符(如空格或换行符)对语法没有正式影响。
基本上,忽略空格。
第8.1节将语法分为4个部分。元标识符在第3部分中定义,其前缀为以下注释(我的粗体编辑):
语法的第三部分定义了从形成语法的 gap-free-symbols 中删除括号内的文本符号。
8.1工作的方式是该部分的第1部分定义了终端字符和间隙,这些字符和间隙被输入到第2部分,然后删除间隙分隔符,这些分隔符将输入第3部分,删除注释,这些注释将提供给构建语法的第4部分。
答案 2 :(得分: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)语法后
而不影响语法定义的语言。
meta-identifier
不是gap-free-symbol
(6.3)。但是,组成meta-identifier
的字母和数字为(6.2a,6.2b和6.3a)。因此,可以插入空格(6.4b)以分隔该meta-identifier
的单词。
在删除每个gap-separator
(6.4)之后,所得的meta-identifier
将由字母组成,后跟零个或多个字母和数字,从而满足4.14和4.15的要求。