我正在编写一个 Pyparsing 语法来将Creole 标记转换为 HTML。我被卡住了,因为尝试解析这两个结构时存在一些冲突:
图片链接:{{image.jpg|title}}
忽略格式:{{{text}}}
我解析图像链接的方式如下(请注意,这可以很好地转换):
def parse_image(s, l, t):
try:
link, title = t[0].split("|")
except ValueError:
raise ParseFatalException(s,l,"invalid image link reference: " + t[0])
return '<img src="{0}" alt="{1}" />'.format(link, title)
image = QuotedString("{{", endQuoteChar="}}")
image.setParseAction(parse_image)
接下来,我编写了一条规则,以便在遇到 {{{text}}} 时,只需返回左大括号和右大括号之间的内容而不进行格式化:
n = QuotedString("{{{", endQuoteChar="}}}")
n.setParseAction(lambda x: x[0])
但是,当我尝试运行以下测试用例时:
text = italic | bold | hr | newline | image | n
print text.transformString("{{{ //ignore formatting// }}}")
我得到以下堆栈跟踪:
Traceback (most recent call last):
File "C:\Users\User\py\kreyol\parser.py", line 36, in <module>
print text.transformString("{{{ //ignore formatting// }}}")
File "C:\Python27\lib\site-packages\pyparsing.py", line 1210, in transformString
raise exc
pyparsing.ParseFatalException: invalid image link reference: { //ignore formatting// (at char 0), (line:1, col:1)
据我了解,解析器首先遇到 {{ 并尝试将文本解析为图像而不是没有格式化的文本。我该如何解决这种歧义?