본문 바로가기

Programming/Python

python libcst 사용법 - CST, AST, 컴파일러, 인터프리터

python에서는 ast 모듈을 기본적으로 제공한다. AST(Abstract Syntax Tree)와 CST(는 주로 컴파일러(Compiler) 및 구문 분석기(paser)에서 사용되는 용어이다.

 

CST는 문법을 tree 형식으로 바꾼 것이고, 이를 축약해서 데이터 구조로 표현한 것이 AST이다.

그러다 보니 AST는 손실이 발생하기 때문에, 원래의 소스코드를 얻을 수가 없다.

 

CST의 경우 python에서 2to3, lib2to3, black등을 사용하는데, 최근 인터넷을 찾아보면서 libcst를 사용한 문제를 발견했다.

 

python으로 짜여진 .py파일에 대해서 libcst를 사용하면, 소스코드에 대해서 tree형식으로 변환시킨다.

아래의 경우 import math를 tree형식으로 표현한 것이다.

 

 

Module(
    body=[
        SimpleStatementLine(
            body=[
                Import(
                    names=[
                        ImportAlias(
                            name=Name(
                                value='math',
                                lpar=[],
                                rpar=[],
                            ),
                            asname=None,
                            comma=MaybeSentinel.DEFAULT,
                        ),

 

 

소스코드를 tree형식으로 바꾸는 방법은 다음과 같다.

(src.py가 원래의 소스코드. test가 tree형식으로 변환시킨 것을 저장할 파일을 나타낸다.)

 

 

import libcst as cst

with open('src.py') as f:
	src = f.read()

tree = cst.parse_module(src)

with open('test', 'w') as f:
	f.write(str(tree))

 

 

CST의 경우 tree형식으로 변한 소스코드를 다시 원래대로 복구가 가능하다. 사용방법은 다음과 같다.

(cstfile이 tree형식으로 변환된 파일, original_src.py가 tree를 해석해서 원래의 소스코드로 되돌릴 파일이다.)

 

 

from libcst import *

with open('cstfile') as f:
	tree = f.read()

cstdata = eval(tree)
with open('original_src.py', 'w') as f:
	f.write(cst.code)

 

 

복구된 소스코드

import math

print("this is original source code!!")

a = 1 + 2
b = 4 - 3

print(a + b)

 

 

 

 

 

참고 및 출처

https://eli.thegreenplace.net/2009/02/16/abstract-vs-concrete-syntax-trees/

https://libcst.readthedocs.io/en/latest/parser.html