원하는 것은 프로그램 변환 시스템 (PTS)입니다.
이 코드는 AST에 대한 소스 코드를 구문 분석하고 트리를 변형 한 다음 트리에서 유효한 소스 코드를 다시 생성하기위한 도구입니다. 배경에 대한 내 대답은 rewriting Python text입니다. 같은 PTS (내 회사) DMS 소프트웨어 리엔지니어링 Toolkiit와
, 당신은 본질적으로 컴파일시 연산을하는 것을 의미
상수 폴딩을 수행하는 규칙을 작성할 수 있습니다. 당신이 보여 예를 들어
는 다음과 같은 규칙이 영업 이익의 모범을 수행 할 수 있습니다
rule fold_subtract_naturals(n:NATURAL,m:NATURAL): sum->sum =
" \n + \m " -> " \subtract_naturals\(\n\,\m\) ";
rule convert_chr_to_string(c:NATURAL): term->term =
" chr(\c) " -> make_string_from_natural(c) ;
rule convert_character_literal_to_string(c:CHARACTER): term->term =
" \c " -> make_string_from_character(c) ;
rule fold_concatenate_strings(s1:STRING, s2:STRING): sum->sum =
" \s1 + \s2 " -> " \concatenate_strings\(\s1\,\s2\) ";
ruleset fold_strings = {
fold_subtract_naturals,
convert_chr_to_string,
convert_characater_to_string,
fold_concatenate_strings };
개별 규칙의 각
구문/나무 해당 일치합니다. 그것들은 리터럴 상수에만 적용되는 방식으로 작성되었습니다.
fold_add_naturals 추가 작업에 의해 결합 NATURAL 상수 쌍을 발견하고, 합에 의해 두 개의 값을 합산하여 합계를 포함하는 리터럴 값 노드를 생성하는 내장 함수를 사용하는 것으로 대체한다.
convert_chr_to_string은 chr (c)를 해당 문자열 리터럴로 변환합니다.
convert_character_to_string은 'C'를 해당 문자열 "C"로 변환합니다.
fold_concatenate_strings은 add 연산자로 구분 된 두 개의 리터럴 문자열을 결합합니다. fold_add_naturals가 작동하는 것과 유사하게 작동합니다.
subtract_naturals 및 concatenate_strings은 DMS에 내장되어 있습니다. convert_chr_to_string 및 convert_character_to_string은 DMS의 메타 프로그래밍 언어 PARLANSE로 사용자 정의 코딩해야하지만 이러한 루틴은 매우 간단합니다 (10 줄).
규칙 집합은 모든 규칙을 적용 할 수 있도록 패키지화합니다. 파일을 열거 나 파서를 호출하고 규칙 집합이 적용될 때까지 규칙을 적용하는 기본 코드는 표시되지 않습니다. 마지막 단계는 수정 된 AST를 다시 인쇄하기 위해 예비 테스터를 호출하는 것입니다.
다른 많은 PTS도 비슷한 기능을 제공합니다.
https://docs.python.org/2/library/ast.html – Natecat