Python에서 렉싱, 토큰 화 및 구문 분석을위한 리소스
사람들이 Python으로 어휘 분석, 구문 분석 및 토큰 화에 대한 리소스를 알려줄 수 있습니까?
저는 오픈 소스 프로젝트 ( hotwire )를 약간 해킹하고 있으며 입력 된 명령 을 lexes , 구문 분석 및 토큰 화 하는 코드를 몇 가지 변경하고 싶었 습니다. 실제 작업 코드이므로 상당히 복잡하고 해결하기가 약간 어렵습니다.
나는 전에 lex / parse / tokenise를위한 코드에 대해 작업 한 적이 없었기 때문에 한 가지 접근 방식이이 측면에 대한 자습서 또는 두 가지를 통해 작업하는 것이라고 생각했습니다. 실제로 변경하려는 코드를 탐색 할 수있을만큼 충분히 배우고 싶습니다. 거기에 적합한 것이 있습니까? (이상적으로는 드래곤 북을 먼저 사서 읽지 않고도 오후에 할 수 있습니다 ...)
편집 : (2008 년 10 월 7 일) 아래 답변 중 어느 것도 내가 원하는 것을 제공하지 않습니다. 그들과 함께 나는 처음부터 파서를 생성 할 수 있지만, lex와 yacc 또는 유사한 도구를 사용하지 않고 처음부터 내 자신의 기본 파서를 작성하는 방법을 배우고 싶습니다. 그렇게하면 기존 코드를 더 잘 이해할 수 있습니다.
그래서 누군가 파이썬을 사용하여 처음부터 기본 파서를 빌드 할 수있는 튜토리얼을 알려줄 수 있습니까?
나는 PLY 의 행복한 사용자입니다 . 이것은 Lex & Yacc의 순수한 Python 구현으로, 아주 Pythonic하고 사용하기 쉽게 만드는 작은 기능이 많습니다. Lex & Yacc는 가장 인기있는 렉싱 및 구문 분석 도구이며 대부분의 프로젝트에 사용되기 때문에 PLY는 거인의 어깨 위에서는 이점이 있습니다. Lex & Yacc에 대한 많은 지식이 온라인에 존재하며 PLY에 자유롭게 적용 할 수 있습니다.
PLY에는 시작하는 데 도움이되는 몇 가지 간단한 예제 가있는 좋은 문서 페이지 도 있습니다 .
많은 Python 구문 분석 도구 목록은 여기를 참조 하십시오 .
이 질문은 꽤 오래되었지만 내 대답은 기본을 배우고 싶은 사람에게 도움이 될 것입니다. 나는이 자원이 매우 좋다고 생각한다. 외부 라이브러리를 사용하지 않고 파이썬으로 작성된 간단한 인터프리터입니다. 따라서 이것은 구문 분석, 렉싱 및 토큰 화의 내부 작업을 이해하려는 모든 사람에게 도움이 될 것입니다.
"Python의 스크래치에서 얻은 간단한 해석기 :" 파트 1 , 파트 2 , 파트 3 , 파트 4 .
중간 수준의 복잡한 문법의 경우 PyParsing 이 훌륭합니다. 코드 생성없이 Python 코드 내에서 직접 문법을 정의 할 수 있습니다.
>>> from pyparsing import Word, alphas
>>> greet = Word( alphas ) + "," + Word( alphas ) + "!" # <-- grammar defined here
>>> hello = "Hello, World!"
>>>> print hello, "->", greet.parseString( hello )
Hello, World! -> ['Hello', ',', 'World', '!']
(PyParsing 홈페이지에서 가져온 예).
구문 분석 작업 (특정 문법 규칙이 트리거 될 때 호출되는 함수)을 사용하면 구문 분석을 직접 추상 구문 트리 또는 기타 표현으로 변환 할 수 있습니다.
연산자 계층, 인용 된 문자열, 중첩 또는 C 스타일 주석과 같이 반복되는 패턴을 캡슐화하는 많은 도우미 함수가 있습니다.
pygments 는 파이썬으로 작성된 소스 코드 구문 하이 라이터 입니다. 어휘 분석기와 포맷터가 있으며 소스를 들여다 보는 것도 흥미로울 수 있습니다.
다음은 시작하는 데 도움이되는 몇 가지 사항입니다 (대략 가장 단순한 것부터 가장 복잡한 것, 가장 적은 것에서 가장 강력한 것까지).
http://en.wikipedia.org/wiki/Recursive_descent_parser
http://en.wikipedia.org/wiki/Top-down_parsing
http://en.wikipedia.org/wiki/LL_parser
http://effbot.org/zone/simple-top-down-parsing.htm
http://en.wikipedia.org/wiki/Bottom-up_parsing
http://en.wikipedia.org/wiki/LR_parser
http://en.wikipedia.org/wiki/GLR_parser
제가 이걸 배웠을 때 한 학기 400 레벨 대학 과정이었습니다. 우리는 수작업으로 구문 분석을하는 여러 가지 할당을 수행했습니다. 내부에서 무슨 일이 일어나고 있는지 정말로 이해하고 싶다면 동일한 접근 방식을 권장합니다.
이 책은 제가 사용한 책은 아니지만 꽤 좋습니다 : Principles of Compiler Design .
시작하기에 충분하길 바랍니다. :)
표준 모듈 shlex를 살펴보고 쉘에 사용하는 구문과 일치하도록 하나의 사본을 수정하십시오. 좋은 시작점입니다.
렉싱 / 파싱을위한 완전한 솔루션의 모든 힘을 원한다면 ANTLR 은 파이썬도 생성 할 수 있습니다.
나는 순수한 파이썬이고 문법을 배울 필요가 없기 때문에 http://www.canonware.com/Parsing/을 제안합니다 . 그러나 그것은 널리 사용되지 않고 비교적 적은 문서를 가지고 있습니다. 헤비급은 ANTLR과 PyParsing입니다. ANTLR은 자바 및 C ++ 파서와 AST 워커도 생성 할 수 있지만 새로운 언어가 얼마나되는지를 배워야합니다.
Frederico Tomassetti는 BNF에서 바이너리 해독에 이르기까지 모든 것에 대해 짧지 만 간결한 글을 작성했습니다.
- 어휘,
- 파서,
- 추상 구문 트리 (AST) 및
- 구성 / 코드 생성기.
그는 새로운 PEG (Parsing Expression Grammar)에 대해서도 언급했습니다.
https://tomassetti.me/parsing-in-python/
참조 URL : https://stackoverflow.com/questions/36953/resources-for-lexing-tokenising-and-parsing-in-python
'IT story' 카테고리의 다른 글
각각의 하위 명령 세트가있는 Click 명령을 여러 파일로 분할하려면 어떻게해야합니까? (0) | 2020.12.30 |
---|---|
불투명 한 응답에는 어떤 제한이 적용됩니까? (0) | 2020.12.30 |
Hibernate : HQL로 NULL 쿼리 매개 변수 값을 설정하는 방법은 무엇입니까? (0) | 2020.12.30 |
.net에서 유형 안전이란 무엇입니까? (0) | 2020.12.30 |
C # 정적 클래스 확장 메서드가 지원되지 않는 이유는 무엇입니까? (0) | 2020.12.30 |