Minimalな正規表現のBNFの構文ダイアグラムを書いてみた

正規表現の基本3演算を網羅していて、かつ、他の要素はない(というと嘘で、 + とか ? みたいな余分なのがあるし、 . みたいな任意の1文字を表すメタ文字を使っている) Minimalな正規表現の文法を書いてみようということで、書いてみました。

EBNF版

/*
 * Simple Regex Grammar
 */
Expression ::= Sequence ("|" Sequence)* /* 
  (e1|e2) みたいに、e1またはe2を表現できる正規表現 
*/

Sequence ::= Suffix+ /* 
  e1e2 みたいに、e1に続いてe2が来るのを表現できる正規表現。
  多くの言語の正規表現文法では、このような連接は暗黙の内に表現されるので
  あまり意識されることがない
*/

Suffix ::= (
  Primary "?"  /* e? で、eが0回または1回を表現できる正規表現 */
| Primary "*"  /* e+ で、eが1回以上を表現できる正規表現 */
| Primary "+"  /* 
| Primary
)

Primary ::= (
  "(" Expression ")"  // (e) もまた正規表現
| "\" .  // エスケープシーケンス
| .  // . は任意の1文字

構文ダイアグラム版

https://json.org 等でも使われていて、図表にすることによって、人によってはBNFよりわかりやすい(?)らしいので、生成してみました。ちなみに、構文ダイアグラムをEBNFから機械的に生成できる大変便利なサービス

http://bottlecaps.de/rr/ui

があったので、これを使ってみました。

Expression:
Expression.png

Sequence:
Sequence.png

Suffix:
Suffix.png

Primary:
Primary.png

この辺みると、正規表現の基本文法というのはとても単純なものだとわかってもらえるかなとちょっと思っていたり。まあ、本気でわかってもらおうとするなら、 BNF とか シンタックスダイアグラムを說明するべきだとも思うのですが、それは労力がかかるので、とりあえずこんな感じでお茶を濁します。時間があるときに、一度その辺についてきちんと說明したいなあと思ったり。