我一直在考虑使用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 *然而,我不确定这个方法是否适用于所有用例,并且对所有边缘用例都有很好的定义。有没有一种我可以复制和依赖的标准方法?如果我可以避免的话,我宁愿不依赖我的特别的、没有经过深思熟虑的语言规范。
发布于 2012-08-09 07:02:46
在markdown的情况下没有标准,在边缘情况下实现也不同。对于markdown情况下的一组选择,您可以查看MultiMarkdown中也使用的peg-markdown。当然,在这方面,markdown比textile更复杂,因为它使用**表示粗体,使用*表示斜体,这会导致更多关于如何处理*hello**there**等内容的决定。
PHP markdown extra的开发人员Michel Fortin有一个test suite,其中包含许多用于粗体/斜体的边界大小写。然而,我不认为在这里对他的决定有普遍的共识,许多实现都有不同的解析方式。
也就是说,我认为以下决定在降价方面是相当没有争议的:
如果下一个字符是non-whitespace.
*,则*仅开始强调;如果前一个字符是non-whitespace.he*ll*o中,强调了两个l(尽管一些标记实现对_字符禁用了此功能,因为下划线在identifiers).中很常见
发布于 2012-08-09 07:23:04
在寻找了一段时间后,我找到了inline markup recognition rules for reStructuredText。
它不遵循markdown的规则;特别是像t*hi*s这样的东西不会被解析为内联标签,但它非常相似,并且具有相似的总体用途。
这也是一个有点复杂的规范(例如,使用特殊的括号和标点符号),但它非常详细,充分的解释和合理的。我发现它的规范是一个非常坚实的基础。
https://stackoverflow.com/questions/11769211
复制相似问题