pyparsing을 사용하여 SGF 파서를 작성하려고합니다. 파서는 대부분 완료됩니다. 하지만 Text
토큰을 알아낼 수는 없습니다. 여기pyparsing에서 이스케이프 처리
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
토큰은 다음과 같습니다 : 여기에 내 현재 코드는
텍스트 포맷 된 텍스트입니다. 줄 바꿈 이외의 공백은 으로 공백으로 변환됩니다 (예 : 탭 없음, 세로 탭 ...). 소프트 줄 바꿈 : : 포맷
는 "\"앞에 줄 바꿈이 (소프트 바꿈 변환하는 "은", 즉 그들이 제거하기 위해) 하드 라인 바꿈 : 다른 바꿈은
이스케이프가 발생했습니다 : "\"는 이스케이프 문자입니다. "\"다음 문자는 축 어적으로 삽입됩니다 (예외 : 공백 문자는 공백으로 변환해야합니다). 다음 문자는 문자 : "]", "\"및 ":"(작성 데이터 유형에서만 사용)에서 이스케이프해야합니다.
문제는 부분을 벗어나고 있습니다.이 토큰을 지정하는 문법이나 정규식을 알 수 없습니다. 마치 "일부 텍스트가 이스케이프 처리되지 않은 ]
, \
또는 :
" 으로 정의되어야하는 것처럼 보입니다.하지만 어떻게 표시되는지 알 수 없습니다.
C[emlroka [11k\] gg]
이것은 Text
함유 Property
이다 : 여기
Text
부분은 emlroka [11k\] gg
입니다. pyparsing.QuotedString
은 내가 원하는 것을 수행하지만 "
과 같은 문자를 묶어야하므로 문제가되지 않습니다.
감사합니다.