Following system colour scheme Selected dark colour scheme Selected light colour scheme

Python 개선 제안 한국어 번역

PEP 269 – Python용 Pgen 모듈

Author:
Jonathan Riehl <jriehl at spaceship.com>
Status:
Deferred
Type:
Standards Track
Created:
24-Aug-2001
Python-Version:
2.2
Post-History:


Table of Contents

번역·라이선스 안내

이 비공식 한국어 번역은 원문 Copyright 절의 Public Domain 조건에 따라 제공합니다. 원저자와 공식 원문은 그대로 표시합니다. 수정되지 않은 기준 원문 · 공식 최신판

초록

parser 모듈이 파이썬 파서를 노출하는 것과 마찬가지로, 이 PEP는 파이썬 파서를 만드는 데 사용되는 파서 제너레이터인 pgen을 파이썬 모듈로 노출할 것을 제안합니다.

근거

파이썬 역사의 흐름 속에서 파이썬 컴파일러 [1]의 제작에 관한 수많은 논의가 있었습니다. 이러한 논의는 여러 파이썬 파서 구현으로 이어졌으며, 그중 가장 주목할 만한 것은 현재 파이썬 표준 라이브러리 [2]에서 제공되는 parser 모듈과 Jeremy Hylton의 compiler 모듈 [3]입니다. 하지만 여러 언어 변경이 제안되어 왔음에도 [4] [5], 파이썬 문법에 대한 실험은 파이썬을 빌드하는 데 사용되는 실제 파서 제너레이터에 대한 파이썬 바인딩의 이점을 누리지 못했습니다.

Fred Drake Jr.의 파서 래퍼와 유사하지만 pgen 라이브러리를 대상으로 하는 파이썬 래퍼를 제공함으로써, 다음과 같은 주장을 할 수 있습니다:

  1. 문법 변경 사항의 참조 구현을 개발하기가 더 쉬워질 것입니다. 현재 문법 변경 사항의 참조 구현을 만들려면 개발자가 명령줄에서 pgen 도구를 사용해야 합니다. 그 결과로 생성된 파서 데이터 구조는 커스텀 CPython 구현과 상호 작용하도록 재작업하거나, C 확장 모듈로 래핑해야 합니다.
  2. 문법 변경 사항의 참조 구현을 배포하기가 더 쉬워질 것입니다. 파서 제너레이터가 파이썬에서 사용 가능해지면, 그 결과로 만들어지는 파서도 파이썬에서 접근 가능해질 것입니다. 따라서 참조 구현은 기존 CPython 배포판의 커스텀 버전을 사용하거나 컴파일 가능한 확장 모듈로 만드는 대신, 순수 파이썬 코드로 제공될 수 있어야 합니다.
  3. 문법 변경 사항의 참조 구현을 더 많은 대중과 논의하기가 더 쉬워질 것입니다. 파이썬 사용자 커뮤니티가 CPython 개발자 커뮤니티보다 클 가능성이 높으므로, 이는 두 번째 주장에서 어느 정도 파생된 것입니다.
  4. 추가되는 모듈이 완전한 기능을 갖춘 LL(1) 파서 제너레이터가 될 것이므로, 파이썬에서의 소규모 언어 개발이 더욱 향상될 것입니다.

명세

제안된 모듈은 pgen이라고 불릴 것입니다. pgen 모듈은 다음 함수들을 포함할 것입니다:

parseGrammarFile (fileName) -> AST

parseGrammarFile() 함수는 fileName이 가리키는 파일을 읽어 AST 객체를 생성할 것입니다. AST 노드는 파서 제너레이터 메타 문법의 비단말(nonterminal) 숫자 값을 포함할 것입니다. 출력되는 AST는 parser 모듈이 제공하는 AST 확장 클래스의 인스턴스가 될 것입니다. 입력 파일에 구문 오류가 있으면 SyntaxError 예외가 발생할 것입니다.

parseGrammarString (text) -> AST

parseGrammarString() 함수는 parseGrammarFile()의 의미 체계를 따르지만, 파일 이름 대신 문법 텍스트를 문자열로 입력받을 것입니다.

buildParser (grammarAst) -> DFA

buildParser() 함수는 AST 객체를 입력으로 받아 DFA(결정적 유한 오토마타) 데이터 구조를 반환할 것입니다. DFA 데이터 구조는 parser 모듈에서 AST 구조가 제공되는 것과 마찬가지로 C 확장 클래스가 될 것입니다. 입력 AST가 pgen 메타 문법에 정의된 비단말 코드를 준수하지 않으면, buildParser()ValueError 예외를 던질 것입니다.

parseFile (fileName, dfa, start) -> AST

parseFile() 함수는 본질적으로 PyParser_ParseFile() C API 함수를 감싸는 래퍼가 될 것입니다. 래퍼 코드는 DFA C 확장 클래스와 파일 이름을 받을 것입니다. token 모듈의 어휘 값과 DFA에 포함된 비단말 값에 부합하는 AST 인스턴스가 출력될 것입니다.

parseString (text, dfa, start) -> AST

parseString() 함수는 parseFile() 함수와 비슷한 방식으로 동작하지만, 파싱할 텍스트를 인자로 받습니다. parseFile()PyParser_ParseFile() C API 함수를 감싸는 것과 마찬가지로, parseString()PyParser_ParseString() 함수를 감쌀 것입니다.

symbolToStringMap (dfa) -> dict

symbolToStringMap() 함수는 DFA 인스턴스를 받아, DFA의 비단말에 대한 숫자 값을 해당 DFA의 원본 문법 명세에서 찾을 수 있는 비단말의 문자열 이름으로 매핑하는 딕셔너리 객체를 반환할 것입니다.

stringToSymbolMap (dfa) -> dict

stringToSymbolMap() 함수는 입력 DFA의 비단말 이름을 해당하는 숫자 값으로 매핑하는 딕셔너리를 출력합니다.

맵 생성 함수와 파싱 함수가 DFA 확장 클래스의 메서드이기도 하다면 추가 점수가 부여될 것입니다.

구현 계획

이 개선을 달성하기 위해 교묘한 계획이 고안되었습니다:

  1. CPython 명명 표준을 따르도록 pgen 함수들의 이름을 바꿉니다. 이 작업은 Include 하위 디렉터리에 헤더 파일을 몇 개 추가하는 것을 수반할 수 있습니다.
  2. Makefile.pre.in의 pgen C 모듈을 별도의 pgen 요소에서 Python C 라이브러리로 옮깁니다.
  3. AST 확장 클래스가 이해하지 못할 수 있는 AST 타입이 존재한다는 것을 이해하도록 parser 모듈에 필요한 변경을 가하십시오. AST 확장 클래스를 대략 살펴보면 트리가 스위트인지 표현식인지를 추적하고 있음을 알 수 있습니다.
  1. Modules 디렉터리에 추가 C 모듈을 작성하십시오. 이 C 확장 모듈은 DFA 확장 클래스와 이전 절에서 설명한 함수들을 구현할 것입니다.
  2. 빌드 프로세스에 새 모듈을 추가하십시오. 정말이지 흑마법입니다.

제한 사항

이 제안 하에서도 Python 3000의 예비 설계자들은 여전히 Python의 어휘 규칙에 제약을 받게 됩니다. Python 렉서의 추가, 삭제 또는 수정은 이 PEP의 범위를 벗어납니다.

참조 구현

현재 제공되는 참조 구현은 없습니다. http://sourceforge.net/tracker/index.php?func=detail&aid=599331&group_id=5470&atid=305470 에 한때 패치가 제공되었지만, 그 패치는 더 이상 유지 관리되지 않습니다.

참고 자료