가장 강력한 종류의 파서는 무엇입니까?


28

부수적 프로젝트로 파이썬을 사용하여 언어를 작성하고 있습니다. 나는 Ply라는 flex / bison 클론을 사용하여 시작했지만, 그 스타일의 문법으로 표현할 수있는 것의 힘에서 우위에 섰습니다. 도구. 그러므로 나는 내 자신을 쓰는 것을 싫어하지 않습니다.

가장 강력한 파서 유형은 무엇입니까? 논문에 대한 인용 (더 많은 입문 기사)도 환영합니다.

( '강력한'은 정확하게 정의되어 있지는 않지만 조금 느슨하게하고 답이 어디로 가자고 보자)


1
하향식 : 연구 수준이 아닙니다.
Warren Schudy

3
@Warren : 질문하기 전에 FAQ를 확인했습니다. 요구 사항이 아닌 것 같습니다.
Paul Biggar

1
실제로 두 가지 FAQ가 있습니다. 하나는 일반 사이트와 다른 하나는 CStheory입니다. CStheory one은 Wikipedia를 읽음으로써 대답 할 수있는 질문은 주제가 맞지 않음을 나타냅니다. "어떤 종류의 질문이 너무 기본적입니까?"를 참조하십시오. 에 meta.cstheory.stackexchange.com/questions/225/... .
워렌 슈디

1
@Warren : 내가 읽은 FAQ입니다. 나는 위키 백과를 읽었지만 이것이 실제 통찰력이 필요하다고 느꼈습니다.
Paul Biggar

1
생산 또는 이론적 파서, 즉 CFG 이외의 문법 유형을 다루는 파서를 의미합니까?
Raphael

답변:


33

문법은 일반적으로 정의 컨텍스트 무료 문법 정확한 정의는 위키 백과 페이지에 기재되어 있지만,이 기반으로 PLY,에서와 같이 동일한 작동 - 들소 차례로을 기반으로, yacc에 .

여기서 PLY는 LALR 파서를 사용 한다고 말합니다 . 이것은 본질적이고 LR 파서 룩업 테이블이 가능한 (즉, LR 파서는 문맥 자유 문법 구문 분석 할 수 있음), 파싱 충돌을 일으킴 LR 문법의 표현의 일부를 감소 응축된다. 이 특정 파서 분기와 다른 파서의 분기에 대한 제한을 알고 싶다면 모든 종류의 구문 분석 기술 (LL, LR 및 기타)에 대한 개요가 여기 에 제공 됩니다 .

귀하의 질문에 대답하기 위해 : 언어가 모호한 경우에도 (즉, 입력을 해석하는 방법이 두 가지 이상임) 컨텍스트가없는 언어를 구문 분석 할 수있는 구문 분석 알고리즘이 있습니다.

첫 번째 알고리즘은 CYK 알고리즘으로 , 불행히도 의 실행 시간을 갖습니다 . 여기서 은 입력 문자열의 길이이고문법의 크기이므로 언어를 구문 분석하는 데 실용적이지 않습니다.O(n3|G|)n|G|

두 번째 알고리즘은 Earley 알고리즘 입니다. 이 알고리즘은 컨텍스트 프리 문법을 파싱 할 수도 있습니다. 알고리즘 이 모호한 언어를 구문 분석하는 데 시간이 필요 하지만 모호하지 않은 언어를 구문 분석하는 데 시간 만 필요 합니다. 또한 대부분의 LR 문법에서 선형 시간으로 작동하며 특히 왼쪽 재귀 문법에서 잘 작동합니다.O(n3)O(n2)

여기서는 Earley 알고리즘의 실제 구현 (적응)에 대해 설명하는 논문을 찾을 수 있습니다. "LALR (1) 파싱 ((대략 PLY가하는 것))과 비교하여 Earley 파싱의 일반성을 부여했으며, PEP ((Earley 알고리즘의 구현)) 최악의 시간조차도 "이것은 훌륭한 결과입니다."

파서의 마지막 유형은 GLR 파서 입니다. 이것은 문맥이없는 언어를 구문 분석 할 수있는 일반화 된 LR 구문 분석 버전입니다.

GLR의 성숙한 구현은 ASF + SDF 입니다. Bison은 GLR 파서를 생성 할 수도 있지만 구현은 '표준'GLR 알고리즘과 약간 다릅니다. Elkhound 알고리즘 GLR / LALR 하이브리드 알고리즘이다. 문법을 신속하고 구문 분석 할 수 있도록 가능하면 LALR과 필요할 때 GLR을 사용합니다.

문맥 자유 문법 외에도 문맥에 민감한 문법 이 있지만 구문 분석하기가 어렵고 표현력을 많이 추가하지 않습니다. 더 많은 것을 할 수는 있지만 대부분의 응용 프로그램의 경우 추가 용도는 관련이 없습니다. 자연어.

마지막 단계로 무제한 문법이 있습니다. 이 시점에서 문법은 Turing-complete이므로 특정 언어를 구문 분석하는 데 걸리는 시간에 대한 제한이 없으므로 대부분의 구문 분석 응용 프로그램에는 바람직하지 않습니다. 여분의 힘은 거의 필요하지 않습니다. 모든 힘을 사용하고 싶다면 사용 가능한 언어 기계가 있습니다.

마지막으로, 자신의 파서 생성기를 구현하는 것은 특히 빠르기 위해 사소한 일이 아닙니다. 나는 개인적으로 방금 자체 버전의 플렉스 (렉서 생성기)를 완성했으며, 비교적 간단한 알고리즘 문제의 연습처럼 보였지만 특히 유니 코드를 지원하려고 할 때 올바르게 이해하는 것이 상당히 복잡해졌습니다. 직접 작성하는 대신 기존 구현을 사용해보십시오.


1
훌륭한 답변 !! PEG가 어떻게 적용되는지에 대한 생각이 있습니까?
Paul Biggar

2
PEG는 CFG와 '다른'것입니다. PEG가 아닌 CFG가 있으며 그 반대도 마찬가지입니다. 나는 여기를 참조하십시오 : stackoverflow.com/questions/1857022/… .
Alex ten Brink


1
실제로 가장 일반적인 파서 생성기 (yacc, Antlr, bison)는 하나의 규칙을 적용 할 수 있는지 확인하는 조건 자 또는 임의 코드로 비 CF 개념을 허용합니다. 우선 순위 결정. 기본 구문이 본질적으로 컨텍스트가 없기 때문에 정적 의미론을 구현하는 데 사용할 수 있습니다.
Raphael

1
재귀 언어는 Turing Machine을 항상 중단하여 결정할 수있는 언어입니다. 따라서 상황에 맞는 언어도 재귀 적이지만 상황에 맞는 언어는 기하 급수적으로 결정할 수 있으므로 상황에 맞지 않는 재귀 언어가 있습니다. 제한없는 문법은 더욱 강력합니다. 정지 문제는 제한없는 문법으로 설명 할 수 있지만 재귀 언어는 아닙니다.
Alex ten Brink

15

올해 ICFP 2010의 논문 인 Total Parser Combinators파서 조합기 라이브러리를 설명하고이 라이브러리에서 파서가 종료되도록 보장 된 경우 "파서 조합기 를 가능한 한 표현 적"으로 설정합니다. 불행히도 필자는 저자가 "가능한 한 표현력있는"의 의미에 대해 설명한 설명을 기억하지 못하지만 "힘"에 대한 귀하의 질문과 관련이있는 것 같습니다.


1
나는 오염되지 않는 차를 가지고 있습니다. 실제로 움직이지도 않습니다. 그래서 질문은 :이 라이브러리에 의해 어떤 종류의 언어가 파싱됩니까? 물론이 작품이 흥미롭지 않다는 것을 의미하지는 않습니다.
babou

2

프로그래밍 언어를 구문 분석하는 데 컨텍스트가없는 문법을 넘어 가고 여전히 다항식 시간을 구문 분석하려면 표현식 문법 또는 부울 문법구문 분석 할 수 있습니다 . 후자는 LL 및 LR 버전으로도 제공됩니다 ( 여기 참조 ). 공식적인 언어 이론에서, 강력하면서도 선형 적으로 인식 가능한 Church-Rosser 언어 가 연구되었지만, 나는 이것에 대한 구현 된 파서 생성기를 알지 못합니다.

자연어 처리에서, 예를 들어, 모호성 (또한 고유의 모호성)을 다루는 취향이 다르고 자유 단어 순서는 매우 중요한 역할을합니다. 여기서 키워드는 문맥에 민감한 언어를 사용 하고 자동 시작을 다시 시작 하면 읽는 데 도움이 될 수 있습니다.


1
질문이 제기 된 방식과 CF가 너무 제한적이라는 불만을 고려하면 귀하의 답변이 가장 좋습니다. 그래서 그것은 간다
babou

0

파서 생성기 도구 :

ANTLR 은 매우 좋습니다. 또는 JavaCC를 살펴볼 수 있습니다


나는 컴퓨터가 가장 과학적이지 않으며 (내 학위가 말하는 것에도 불구하고), 내 말의 무게가 가벼울 수 있습니다. Sazzad에 동의합니다-ANTLR은 매우 강력한 도구입니다. 매우 완벽하며 파서 생성기 (LL (k)를 올바르게 호출하면 문제가 발생했습니다)에 아직 문제가 없습니다. 반면에, 나는 다소 복잡한 문법의 컴파일러 ... 구현 아직
요르겐 Sigvardsson

5
질문의 요점과 전체 사이트가 누락 된 것 같습니다. 구현과 도구가 아니라 이론 파싱에 관한 것입니다.
Paul Biggar
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.