EBNF在元标识符中添加空格

时间:2013-03-07 10:05:21

标签: ebnf

我查看了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 *);
元标识符本身应该是元标识符,但据我所知,它不符合元标识符(字母,然后是任意数量的数字或字母)。

有谁知道发生了什么事?

3 个答案:

答案 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的要求。