我试图使用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
,其中包含Text
。 Text
部分为emlroka [11k\] gg
。
pyparsing.QuotedString
看起来像我想要的那样,但它需要包含字符,例如"
,所以它在我的问题中不起作用。
感谢您的时间。
答案 0 :(得分:0)
我想我明白了。
Escape = Suppress(Literal("\\")) + Word("\\)]:", exact=1)
Text = Combine(ZeroOrMore(Escape ^ Regex("[^\\]\\\\:]")))
我可能会遗漏一些优势,但现在这对我有用。