正規表現自体・・・
呪文
と呼ばれているので
下のテキストから正規表現の部分をパースしなさいとかは、難題
(* 文法 *)
syntax = rule_list /\s*/ ;
rule_list = { ( rule | special_effect | comment ) } + ;
rule = identifier defining_symbol definitions ";" ;
defining_symbol = "=" | "::=" ; (* 終端記号 '=':EBNF, '::=':BNF *)
(* 定義 *)
definitions = definition { "|" definition } ; (* 定義リスト *)
definition = choice ; (* 定義 *)
(* リスト *)
choice = sequence { "|" sequence } ; (* アレかコレかソレかのどれか *)
sequence = exception { [ "," ] exception } ; (* アレとコレとソレの一式。","は空白改行と同義 *)
exception = words, { "-" words } ; (* アレが良いが、コレとソレを除く。 *)
(* 語彙 *)
words = [ comments ] word [ comments ] ;
special_effect = (*$ NO SPACE SKIP $*) "(*$" /[^\\?]*/ "$*)" ; (* 特殊効果 *)
comments = ( special_effect | comment ) repeat_symbol;
word = ( sq_string | wq_string | wraper | special_text | regexp | identifier ) ;
comment = /(?:\(*))(?![*][/])(.*)(?:*\))/ ; (* 注意書き *)
sq_string = /(?:')(?!\\\\)[^']*(?:')/ ; (* ' で括られたテキスト *)
wq_string = /(?:")(?!\\\\)[^"]*(?:")/ ; (* " で括られたテキスト *)
bq_string = /(?:\`)(?!\\\\)[^"]*(?:\`)/ ; (* " で括られたテキスト *)
(* 囲み *)
wraper = ( group | option | repeate ) repeat_symbol ;
group = "(" choice ")" ; (* choiceを明示的に括る表現 *)
option = "[" choice "]" ; (* あれば尚良し *)
repeate = "{" choice "}" ; (* 0回以上繰り返す *: 0回以上、+:1回以上 *) (* TODO choiceを使うと exceptionで[undefined]が返る *)
regexp = /.+/([a-z]*) ;
identifier = /[A-Za-z][A-Z_a-z0-9\\x20]*[A-Z_a-z0-9]*/; (* 識別子 *)
special_text = (*$ NO SPACE SKIP $*) "?" /[^\\?]*/ "?" ; (* 特殊文字列 *)
repeat_symbol= [ "*" | "+" | '{' [ number ] ',' [ number ] '}']; (* 繰返し記号 *)
number = /\d+/ ;
なので
regexp = /.+/([a-z]*) ;
とか表記は誤魔化してたけど、
実際にはこれでパースするとテキストの終りの手前までヒットしてしまう。
とある記事で、エスケープ表現の文字を潜り抜けさせる方法が載ってた。
/@( (¥¥@)|([^@]) )+ @/ ※@は任意の文字
な感じで@のエスケープ表現の2文字と@以外の文字を来るかえす表現をしていた。
これを真似て
/ ( ( \ / ( ( \ \ / ) | ( [ \ / ) | [^\ / ] ) * \ / ) ( [ a – z ] * ) ) /
※崩れた顔文字ではありません、読みにくいので空白を挿入しました。
を作って試してみた結果は

うまくいってるみたいだ。
しかし、長い。長すぎる。