2012-02-10 2 views
1

저는 cStyleComment 변수를 이용하고 싶습니다.이 주석을 무시하는 것보다 특별히 처리해야합니다. pyparsing이 입력란에 내 처리기를 호출 할 수있는 방법이 있습니까?이 입력란은 주석으로 인식되어 버리기 전에 제거됩니까?Pyparsing : C 스타일 주석의 특수 처리를 구현하는 방법은 무엇입니까?

나는 주석 안에 몇 가지 "특수"지시문을 포함하는 일부 C 코드를 처리하고 있습니다.

답변

2

pyparsing에서 정의 된 표현식 중 아무 것도 무시되어 무시됩니다. 일부 의견 형식이 잘못되기 쉽기 때문에 편의성이 있습니다. 당신이 당신의 더 큰 문법에 ignore 메소드를 호출하지 않는 한 그들은 같이 무시되지 않습니다

cHeaderParser.ignore(cStyleComment) 

(. cHeaderParser 당신은 예를 들어, API 정보를 추출 .H 파일을 읽어 쓴 일이있을 경우)

핸들러에 대한 pyparsing 콜백을 가지고 있다면, cStyleComment.setParseAction(commentHandler)을 사용하면됩니다. 대한 파싱이 서명 중 하나와 행동을 구문 분석 처리 할 수 ​​있습니다 : 당신의 commentHandler 문자열 또는 문자열 또는 새로운 ParseResults의 목록을 반환하는 경우

def commentHandler(inputString, locn, tokens): 
def commentHandler(locn, tokens): 
def commentHandler(tokens): 
def commentHandler(): 

,이 입력 토큰을 대체 할 것 - 그것은 없음을 반환하지 않는 경우, 또는 return 문을 생략하면 토큰 객체가 사용됩니다. 토큰 개체를 제 위치에서 수정 (예 : 새 결과 이름 추가) 할 수도 있습니다. 이 같은 변형 구문 분석 작업을 작성할 때 (이 같은 간단한 구문 분석 작업도 cStyleComment.setParseAction(lambda t:t[0].upper())를 작성할 수)

def commentHandler(tokens): 
    return tokens[0].upper()  
cStyleComment.setParseAction(commentHandler) 

:

그래서 당신은 당신의 의견을 대문자 것 같은 것을 쓸 수 하나의 가능성이 t

print cStyleComment.transformString(source) 

이 인쇄됩니다, 오히려 transformString 다음 parseString을 사용 그는 원래의 출처이지만 모든 의견은 대문자가됩니다.

+0

감사합니다. transformString()이 나를 위해 속임수를 사용했습니다! 나는 지금 2 패스를 사용한다. 첫 번째 것은 주석의 나머지 부분을 버리는 동안 @annotation이나 @annotation (value)과 같은 것만 남겨두기 위해'cStyleComment.setParseAction (processComments) .transformString (src)'이고, 두 번째는'parseString() '내 주요 문법에. 나는 주석을 두 번 처리해야한다는 점을 약간 싫어한다. 처음에는 re 모듈을 사용하여 주석을 추출하지만, parseString() 호출 중에 두 번째 시간을 처리하기 위해 원시 문자열로 다시 연결해야한다. 아직도, 그것은 작동한다! – rincewind

+0

원하는 경우 cStyleComment에 첨부 한 구문 분석 액션 내에서 주석을 파싱하고 단일 패스 만 사용해 볼 수 있습니다. 그러나 일을 끝내는 해결책으로 논쟁하기가 어렵습니다. 축하, 그리고 pyparsing에 오신 것을 환영합니다! – PaulMcG