부수적 프로젝트로 파이썬을 사용하여 언어를 작성하고 있습니다. 나는 Ply라는 flex / bison 클론을 사용하여 시작했지만, 그 스타일의 문법으로 표현할 수있는 것의 힘에서 우위에 섰습니다. 도구. 그러므로 나는 내 자신을 쓰는 것을 싫어하지 않습니다.
가장 강력한 파서 유형은 무엇입니까? 논문에 대한 인용 (더 많은 입문 기사)도 환영합니다.
( '강력한'은 정확하게 정의되어 있지는 않지만 조금 느슨하게하고 답이 어디로 가자고 보자)
부수적 프로젝트로 파이썬을 사용하여 언어를 작성하고 있습니다. 나는 Ply라는 flex / bison 클론을 사용하여 시작했지만, 그 스타일의 문법으로 표현할 수있는 것의 힘에서 우위에 섰습니다. 도구. 그러므로 나는 내 자신을 쓰는 것을 싫어하지 않습니다.
가장 강력한 파서 유형은 무엇입니까? 논문에 대한 인용 (더 많은 입문 기사)도 환영합니다.
( '강력한'은 정확하게 정의되어 있지는 않지만 조금 느슨하게하고 답이 어디로 가자고 보자)
답변:
문법은 일반적으로 정의 컨텍스트 무료 문법 정확한 정의는 위키 백과 페이지에 기재되어 있지만,이 기반으로 PLY,에서와 같이 동일한 작동 - 들소 차례로을 기반으로, yacc에 .
여기서 PLY는 LALR 파서를 사용 한다고 말합니다 . 이것은 본질적이고 LR 파서 룩업 테이블이 가능한 (즉, LR 파서는 문맥 자유 문법 구문 분석 할 수 있음), 파싱 충돌을 일으킴 LR 문법의 표현의 일부를 감소 응축된다. 이 특정 파서 분기와 다른 파서의 분기에 대한 제한을 알고 싶다면 모든 종류의 구문 분석 기술 (LL, LR 및 기타)에 대한 개요가 여기 에 제공 됩니다 .
귀하의 질문에 대답하기 위해 : 언어가 모호한 경우에도 (즉, 입력을 해석하는 방법이 두 가지 이상임) 컨텍스트가없는 언어를 구문 분석 할 수있는 구문 분석 알고리즘이 있습니다.
첫 번째 알고리즘은 CYK 알고리즘으로 , 불행히도 의 실행 시간을 갖습니다 . 여기서 은 입력 문자열의 길이이고문법의 크기이므로 언어를 구문 분석하는 데 실용적이지 않습니다.
두 번째 알고리즘은 Earley 알고리즘 입니다. 이 알고리즘은 컨텍스트 프리 문법을 파싱 할 수도 있습니다. 알고리즘 이 모호한 언어를 구문 분석하는 데 시간이 필요 하지만 모호하지 않은 언어를 구문 분석하는 데 시간 만 필요 합니다. 또한 대부분의 LR 문법에서 선형 시간으로 작동하며 특히 왼쪽 재귀 문법에서 잘 작동합니다.
여기서는 Earley 알고리즘의 실제 구현 (적응)에 대해 설명하는 논문을 찾을 수 있습니다. "LALR (1) 파싱 ((대략 PLY가하는 것))과 비교하여 Earley 파싱의 일반성을 부여했으며, PEP ((Earley 알고리즘의 구현)) 최악의 시간조차도 "이것은 훌륭한 결과입니다."
파서의 마지막 유형은 GLR 파서 입니다. 이것은 문맥이없는 언어를 구문 분석 할 수있는 일반화 된 LR 구문 분석 버전입니다.
GLR의 성숙한 구현은 ASF + SDF 입니다. Bison은 GLR 파서를 생성 할 수도 있지만 구현은 '표준'GLR 알고리즘과 약간 다릅니다. Elkhound 알고리즘 GLR / LALR 하이브리드 알고리즘이다. 문법을 신속하고 구문 분석 할 수 있도록 가능하면 LALR과 필요할 때 GLR을 사용합니다.
문맥 자유 문법 외에도 문맥에 민감한 문법 이 있지만 구문 분석하기가 어렵고 표현력을 많이 추가하지 않습니다. 더 많은 것을 할 수는 있지만 대부분의 응용 프로그램의 경우 추가 용도는 관련이 없습니다. 자연어.
마지막 단계로 무제한 문법이 있습니다. 이 시점에서 문법은 Turing-complete이므로 특정 언어를 구문 분석하는 데 걸리는 시간에 대한 제한이 없으므로 대부분의 구문 분석 응용 프로그램에는 바람직하지 않습니다. 여분의 힘은 거의 필요하지 않습니다. 모든 힘을 사용하고 싶다면 사용 가능한 언어 기계가 있습니다.
마지막으로, 자신의 파서 생성기를 구현하는 것은 특히 빠르기 위해 사소한 일이 아닙니다. 나는 개인적으로 방금 자체 버전의 플렉스 (렉서 생성기)를 완성했으며, 비교적 간단한 알고리즘 문제의 연습처럼 보였지만 특히 유니 코드를 지원하려고 할 때 올바르게 이해하는 것이 상당히 복잡해졌습니다. 직접 작성하는 대신 기존 구현을 사용해보십시오.
올해 ICFP 2010의 논문 인 Total Parser Combinators 는 파서 조합기 라이브러리를 설명하고이 라이브러리에서 파서가 종료되도록 보장 된 경우 "파서 조합기 를 가능한 한 표현 적"으로 설정합니다. 불행히도 필자는 저자가 "가능한 한 표현력있는"의 의미에 대해 설명한 설명을 기억하지 못하지만 "힘"에 대한 귀하의 질문과 관련이있는 것 같습니다.
프로그래밍 언어를 구문 분석하는 데 컨텍스트가없는 문법을 넘어 가고 여전히 다항식 시간을 구문 분석하려면 표현식 문법 또는 부울 문법 을 구문 분석 할 수 있습니다 . 후자는 LL 및 LR 버전으로도 제공됩니다 ( 여기 참조 ). 공식적인 언어 이론에서, 강력하면서도 선형 적으로 인식 가능한 Church-Rosser 언어 가 연구되었지만, 나는 이것에 대한 구현 된 파서 생성기를 알지 못합니다.
자연어 처리에서, 예를 들어, 모호성 (또한 고유의 모호성)을 다루는 취향이 다르고 자유 단어 순서는 매우 중요한 역할을합니다. 여기서 키워드는 문맥에 민감한 언어를 사용 하고 자동 시작을 다시 시작 하면 읽는 데 도움이 될 수 있습니다.