EBNF

Takami Torao #EBNF

概要

EBNF (extended Backus-Naur form) は BNF を拡張した構文メタ言語 (syntactic meta-language) の一種。プログラミング言語や HTML のようなデータフォーマットの構文定義を記述することができる。

BNF (Backus-Naur form), ABNF (augmented Backus-Naur form) EBNF を称する仕様が多い。ここでは国際仕様である ISO/IEC 14977:1996 について記述する。

Table of Contents

  1. 概要
  2. W3C 仕様
  3. ISO/IEC 14977:1996 規格
  4. 参照

W3C 仕様

ISO/IEC 14977:1996 規格

言語仕様を記述する構文メタ言語は Algol 60 (BNF) から導入され、COBOL, FORTRAN 90 などの様々な構文メタ言語、およびそれらの亜種が開発された。ISO/IEC 14977:1996 Extended BNF [1] (以降 ISO EBNF) はそのような構文メタ言語の混乱を解消するために国際規格として定義されたものだが、表現にいくつかの制限や非力な点があったことから、この後にも XML EBNF や ABNF などの派生を止めるには至らなかった。

ISO EBNF の構文は以下のようになる。

meta identifier = ("terminal string" | other meta identifier), {repeat}, [option];
  • 不可分なシンボルは (単一文字でも) ' または " で囲わなければならない。
  • それぞれの定義は ; で区切らなければならない。
使用可能な文字の制限

ISO EBNF は 7-bit 文字 (us-ascii) のみを規定しており、Unicode 文字やマルチバイト文字、バイト値を記述することができない。それ以外の文字を使用したければ、ISO EBNF を更に拡張して、other-character の定義にそれらの文字セットを追加しなければならない。また文字をコードポイントで指定する方法がない。

構文上の空白文字の扱い

EBNF 構文上の無視可能な空白、タブ、改行等の空白文字 (gap-separator) の扱いは [1] の 6.3 と 6.4 で定義されている。ここで言わんとしていることは:

  1. 構文全体の前後 (つまりファイルの先頭や末尾のような位置) に配置されている空白文字の連続は無視される。
  2. 引用記号で囲まれた 'xxx' または "xxx" 内の空白文字は無視されない。
  3. 引用記号の外で、個々の terminal-character の間に配置されている空白文字の連続は無視される。

つまり以下の定義はすべて等価である。

  • AB = 'a' | 'b'; ABC = AB | 10 * 'c';
  • AB='a'|'b';ABC=AB|10*'c';
  • A B = 'a' | 'b'; A B C = A B | 1 0 * 'c';

ここで注意したいのは、meta-identifier を構成する meta-identifier-character は 3. に該当するため空白文字で分割されたメタ識別子は分割されていないメタ識別子と等価という点である。同様に integer で示されている数字列も空白は無視される。

構文上のコメントの扱い

ISO EBNF のコメントは (**) で囲って記述することができる。コメントはネストすることができる。コメントを配置できる場所は空白文字のそれと似ているが、メタ識別子や数字を分割する位置に配置することはできない。

繰り返しの表記

ISO EBNF では、任意回数の繰り返しを {'A'}、固定回数の繰り返しを 4 * 'A' と記述できるが、正規表現の *, +, *?, +?, {n}, {min,max} のように簡素でより柔軟な記法は定義されておらず、正規表現に慣れたユーザにとっては表現が非力とも言える。

参照

  1. ISO (1996) ISO/IEC 14977:1996 - Syntactic metalanguage — Extended BNF
  2. W3C (1998) Extensible Markup Language (XML) 1.0, Section 6 Notation