Scalaのパーサーコンビネーターライブラリ(基本的にはPEGパーサー)を使用してテキスタイルパーサーを作成することを検討していて、インライン修飾子を解析するためにどのようなアプローチを使用すべきか疑問に思いました。
This is *bold* text, _italic_ text, +underlined+ text, etc.
この場合、何が何で、何を解析する必要があるかはかなり明確です。ただし、それほど明確ではないエッジケースが多数あります。太字のテキストのみに焦点を当てる:
Which sections get bolded:
*onomato*poeia* ?
bold *word*, without a space after?
tyr*annos*aurus
a bold word in a (*bracket*)?
How about *This *case?
明らかに、これは主観的(太字として数える必要があります)と客観的(解析ルールで正しく解析する方法)の組み合わせです。
私は次のようなPEGに傾いています
wordChar = [a-zA-Z]
nonWordChar = [^a-zA-Z]
boldStart = nonWordChar ~ * ~ wordChar
boldEnd = wordChar ~ * ~ nonWordChar
boldSection = boldStart ~ rep(not(boldEnd) ~ anyChar) ~ boldEnd
上記を次のように解析します。
<b>onomato*poeia</b> ?
bold <b>word</b>, without a space after?
tyr*annos*aurus <- fails because of lack of whitespace
a bold word in a (<b>bracket</b>)?
How about *This *case? <- fails because there is no correct closing *
ただし、このメソッドがすべてのユースケースに当てはまり、すべてのエッジケースに明確に定義されているかどうかはわかりません。コピーして信頼できるこれを行うための標準的な方法はありますか?回避できるのであれば、アドホックでよく考えられていない言語仕様に頼りたくありません。