2014-04-18 6 views
1

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은 내가 원하는 것을 수행하지만 "과 같은 문자를 묶어야하므로 문제가되지 않습니다.

감사합니다.

답변

0

나는 그것을 얻었습니다.

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

내가 놓친 가장자리 경우가있을 수 있지만 지금은 나를 위해 작동합니다.