なんか nytra の開発が (ほぼ) 振り出しに戻った

読了まで:約2分


本日、​『オッ!?​ どう​すれば​良いんだ​コレ!?』と、​一瞬​詰った​進捗です。

何が​どうなったのか

最初から​結論を​書くと、​ nytra と​言う、​オレオレ軽量マークアップ言語 (Markdown とかはてな記法とか​そういう​類い​) の​開発を​今日していて、

  • インライン記法の​入れ子が​出来ない!!​1 (割と​致命的)
  • インライン記法が​バグってる​影響で​空行を​正しく​処理出来ない
  • そして、​それに​引き摺られてブロック記法が​定義できない

と​言う​感じに​なった​ため、​一から​ PEG.js の​定義やら​コードの​書き方やらを​見直す事と​なりました。

※ ただし、​テストは​一応は​残った

も​う​ちょっと​詳しく

一応、​僕の​考えている​構文では、

*これは太字*
# => <strong>これは太字</strong>

/これは斜体/
# => <em>これは斜体</em>

*/これは太字かつ斜体/*
# => <strong><em>これは太字かつ斜体</em></strong>

みたいな​コトが​出来る​様に​したかったのですが、​実際には、​上記例の​三番目が、

*/これは太字かつ斜体/*
# => <strong>/これは太字かつ斜体/</strong>

みたいな​出力結果に​なっていました。​つまり​ 構文の​入れ子が​出来て​ない​ っていう。​ そして、​ PEG.js (と​言うか PEG ​その​もの?​) の​場合、​僕の​理解が​合っていれば

ある​構文 A を​含む別の​構文 B は、​ある​構文 A に​無限に​出現する​事は​出来ない

と​いう​制約が​あり、​これは​まあ単純に​言うと、

無限再帰な​構文定義は​出来ない

と​言う​感じに​なります。​つまり、​無限ループに​なる​構文は​定義出来なくて​エラーに​なります。

では、​この​問題は​どう​すれば​良いのか

先に​結論から​書くと、​最初の​例示した​太字とか​斜体の​構文の​話では、

太字構文 (A) と​入れ子に​出来る​構文 (B) を、​キッチリと​定義する

と​言う​手法を​取れば​良いんじゃね、と​いう​結論に​なりました。

つまる​所、​入れ子可能な​構文 (B) に​入れ子元の​構文 (A) が​含まれる​事が​原因で​無限再帰を​起こすので、​ その​入れ子元の​構文 (A) を​除外した​ 入れ子可能な​構文 (B') を​作れば​良いよねって​話です。

ただし、​実際には​これ、​インラインの​ ○○ 構文を​作る​毎に、​その​ ○○ 構文を​含まない​構文 ×× を​定義する​破目になるので、

う​お〜、​なんか​これ 手​書き だと​ テストやら​構文定義で​もの​凄く​組合せ爆発しそうだぞ〜

と​言う​感じな​予感が​した​ため、​とりあえず、​下記の、

  1. PEG.js の​構文定義を​自動定義する​生成器を​作る
  2. その​生成器を​使って​ PEG.js が​パーズ出来る​形の​定義ファイルを​作る
  3. 自動生成した​ PEG.js の​定義ファイルから、​実際の​バーザを​吐く

と​いう​手法を​取るか……と​いう​所で​今日の​作業は​終えました。​はい。

以上

まぁ、​とりあえず​今日の​作業は​そんな​感じでした。​はい。

にゃるら(カラクリスタ)

『輝かしい青春』なんて失かった人。
次に備えて待機中。

今は趣味でプログラミングをして
生活しています。