处理pyparsing中的逃逸

时间:2014-04-18 22:46:07

标签: python pyparsing

我试图使用pyparsing编写SGF解析器。解析器大部分都是完成的;但我无法找出Text令牌。这是我目前的代码:

import pyparsing as pp

Number = pp.Optional(pp.Literal("+") ^ pp.Literal("-")) \
             + pp.OneOrMore(pp.nums) 
Real   = Number + pp.Optional(pp.Literal(".") + pp.OneOrMore(pp.nums))
Double = pp.Literal("1") ^ pp.Literal("2")
Color  = pp.Literal("B") ^ pp.Literal("W")
Text   = """???"""
Stone  = Move = Point = pp.Word("abcdefghijklm", exact=2)

ValueType = pp.Empty() ^ Number ^ Real ^ Double ^ Color \
                ^ Text ^ Point ^ Move ^ Stone

Compose    = ValueType + pp.Literal(":") + ValueType
CValueType = ValueType ^ Compose

PropIdent = pp.Word(pp.alphas.upper(), min=1)
PropValue = pp.Literal("[") + CValueType + pp.Literal("]")
Property  = PropIdent + pp.OneOrMore(PropValue)

Node = pp.Literal(";") + pp.ZeroOrMore(Property)
Sequence  = pp.ZeroOrMore(Node)

GameTree = pp.Forward()
GameTree << pp.Literal("(") \
               + Sequence \
               + pp.ZeroOrMore(GameTree) \
            + pp.Literal(")")

Collection = pp.OneOrMore(GameTree)

以下是SGF spec中定义的Text令牌:

  

文字是带格式的文字。换行以外的空白区域是   转换为空格(例如没有标签,垂直标签,..)。

     

格式化:软换行符:换行符前面带有&#34; \&#34; (柔软的   换行符转换为&#34;&#34;,即它们被删除)硬线   中断:遇到的任何其他换行符

     

逃避:&#34; \&#34;是逃避角色。任何关注&#34; \&#34;是   插入逐字(例外:空格仍然需要转换   太空了!)。在文本中使用时,必须转义以下字符:   &#34;]&#34;,&#34; \&#34;和&#34;:&#34; (仅在撰写数据类型时使用)。

问题在于逃避部分,我无法找出语法或正则表达式来指定此令牌;看起来我应该定义&#34;有些文字没有未转义的]\:&#34; ,但我不明白。

以下是一个例子:

C[emlroka [11k\] gg]

这是Property,其中包含TextText部分为emlroka [11k\] gg

pyparsing.QuotedString看起来像我想要的那样,但它需要包含字符,例如",所以它在我的问题中不起作用。

感谢您的时间。

1 个答案:

答案 0 :(得分:0)

我想我明白了。

Escape = Suppress(Literal("\\")) + Word("\\)]:", exact=1)
Text   = Combine(ZeroOrMore(Escape ^ Regex("[^\\]\\\\:]")))

我可能会遗漏一些优势,但现在这对我有用。