【问题标题】:EBNF whitespacing in meta identifiers元标识符中的 EBNF 空白
【发布时间】:2013-03-07 10:05:20
【问题描述】:

我查看了 EBNF here 的 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 *);

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

有人知道怎么回事吗?

【问题讨论】:

    标签: ebnf


    【解决方案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 | " " } ;
    

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

    【讨论】:

    • 对,我想我在一个看起来像官方网站的网站上,但实际上是不同的。但是,是的,无论哪种方式,这都令人困惑,所以感谢您的澄清:)
    【解决方案2】:

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

    从 6.1 开始:

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

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

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

    语法的第三部分定义了从构成语法的gap-free-symbols中删除带括号的文本符号。

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

    【讨论】:

      【解决方案3】:

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

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

      适用的定义和规则:

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

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

      6.2 终端字符
      Extended 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 的要求。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-04-13
        • 2014-08-12
        • 1970-01-01
        • 2015-01-14
        • 1970-01-01
        • 2023-03-10
        • 2021-06-10
        • 1970-01-01
        相关资源
        最近更新 更多