2012-02-01 3 views
1

번역 된 언어에 대한 사용자 정의 문법이 있으며 쿼리 할 수있는 트리를 만드는 파서에 대한 조언을 찾고 있습니다. 구조에서 나는 해석 된 언어로 코드를 생성 할 수 있기를 원합니다. 필자가 본 대부분의 문법 파서는 이미 기존 코드의 유효성을 검사합니다. 내 질문의 두 번째 부분은 실제 코드 용어에 대해 파이썬 코드가 트리의 심볼을 대체한다는 점에서 문법을 추상화해야 하는가? 이상적으로, 나는 루트 심볼을 질의 할 수 있어야하고 그 루트 밑에있는 모든 심볼들을 터미널 심볼까지 반환했으면 좋겠다.Python 용 문법 파서 사용 및 트리에서 파일 구성

이 과정이나 내 어휘에 관한 조언은 매우 유용 할 것입니다. 고맙습니다.

답변

2

대다수의 파서 라이브러리는 생성하는 코드에 관계없이 추상 구문 트리 (AST)를 생성합니다. 무엇이든 사용할 수 있습니다 (예 : pyparsing). AST에서 코드로 이동하려면 수동으로 함수를 작성해야 할 수도 있지만 재귀 적으로 수행하는 것은 매우 쉽습니다. 예를 들어 : [+, 4, [*, 'x', 5]] :

def generate(ast): 
    if ast[0] == '+': 
     return generate(ast[1]) + " + " + generate(ast[2]) 
    elif ast[0] == 'for': 
     return "for %s in %s:\n" % (ast[1], generate(ast[2])) + generate(ast[3]) 
    ... 

모든 인수 나무 뒤에 바로 첫 번째 요소는 노드 이름에 대한 태그리스트의 인 AST 구조를 가정. 물론 파서를 직접 작성하지 않는 한 파서 라이브러리에서 사용하는 모든 것을 사용해야합니다.

파이썬 코드가 실제 코드 용어로 트리에서 심볼을 대체하는 것을 이해하지 못합니다.

당신은 루트 노드 아래에있는 모든 기호를 반복하기 쉬운 기능을 작성할 수

두 번째 생각에
def traverse_preorder(ast): 
    yield ast[0] 
    for arg in ast[1:]: 
     for x in traverse_preorder(arg): 
      yield x 

, 변수 이름 ast 때문에 AST 모듈의 어쩌면 좋지 선택입니다.

+0

감사합니다. 이제 어떻게해야 할 지 잘 알고 있습니다. – daybreak

2

ANTLR을 사용합니다. 버전 3 (현재)은 generating Python code을 지원합니다. 파싱하는 동안 AST (Abstract Syntax Tree)를 자동으로 생성하여 트래버스 할 수 있습니다. 이 중 중요한 부분은 토큰을 하위 트리 (예 : 운영자)로 처리해야하는 문법에 주석을 추가하는 것입니다.