[Python] pyparsing을 이용하여 Recursive 함수 호출 부분 가져오기 Develop Tip


파이썬 스크립트가 있는데
a.b(aa,1.2,'...',callfunc(d,e,ff('kk')))
와 같이 함수가 호출된다고 가졍해 봅니다.

그러면 위에서는 함수명(패러미터,패러미터,함수(...))
와 같이 Nested 되어 있음을 발견할 수 있습니다.

그런데 단순 정규식을 가지고 위와 같은 것을 파싱하는 것은 불가능합니다.
바로 재귀적 문법이 어디에서 순환될지 몰라 발생하는 현상인데요,

이런 경우 사용할 수 있는 것이 바로 pyparsing 이라는 모듈입니다.

$ pip install pyparsing

과 같이 해당 모듈을 설치합니다. (VirtualEnv 환경이 아니라면 sudo 를 앞에 붙이셔요)

그 다음 다음과 같이 코드를 주면 됩니다.


from pyparsing import Forward, Word, alphas, alphanums, nums, ZeroOrMore, Literal, Group, QuotedString
#파서의 TERM을 지정
lparen = Literal("(").suppress()
rparen = Literal(")").suppress()
identifier = Word(alphas, alphanums + "_" + ".")
digit = Word(nums + '-' + '.')
functor = identifier
strValue = QuotedString("'", escChar='\\') | QuotedString('"', escChar='\\')
# 문법지정
expression = Forward()
arg = Group(expression) | identifier | digit | strValue
args = arg + ZeroOrMore("," + arg)
expression << functor + Group(lparen + args + rparen)
# 적용
print expression.parseString("f(x, y)")
print expression.parseString("f(g(x), y)")
print expression.parseString("a.b(aa,1.2,'...',callfunc(d,e,ff('kk')))")

결과는

['f', ['x', ',', 'y']]
['f', [['g', ['x']], ',', 'y']]
['a.b', ['aa', ',', '1.2', ',', '...', ',', ['callfunc', ['d', ',', 'e', ',', ['ff', ['kk']]]]]]

와 같이 Nested list 로 표현됩니다.

pyparsing 이 예전 yacc (GNU는 bison) 으로 간단한 언어를 만들어 사용해 보고는 하였는데
이제는 pyparsing 으로도 충분히 가능하겠다는 것을 느꼈습니다.

어느분께는 도움이 되셨기를 ..



덧글

  • ZHANITEST 2016/03/02 00:48 # 답글

    좋은 글 감사합니다. 도움이 많이 되었습니다. :-)
  • 지훈현서아빠 2016/03/02 09:17 #

    도움이 되셨다니 저의 보람입니다~ ^^
댓글 입력 영역

구글애드텍스트