我一直在考虑使用 Scala 的解析器组合库(基本上是 PEG 解析器)编写 Textile 解析器,并且想知道我应该使用哪种方法来解析内联修饰符
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 *
但是,我不确定此方法是否适用于所有用例,并且是否适用于所有边缘情况。有没有我可以复制和依赖的标准方法?如果可以避免的话,我宁愿不依赖我的临时未经过深思熟虑的语言规范。