문법은 일반적으로 정의 컨텍스트 무료 문법 정확한 정의는 위키 백과 페이지에 기재되어 있지만,이 기반으로 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이므로 특정 언어를 구문 분석하는 데 걸리는 시간에 대한 제한이 없으므로 대부분의 구문 분석 응용 프로그램에는 바람직하지 않습니다. 여분의 힘은 거의 필요하지 않습니다. 모든 힘을 사용하고 싶다면 사용 가능한 언어 기계가 있습니다.
마지막으로, 자신의 파서 생성기를 구현하는 것은 특히 빠르기 위해 사소한 일이 아닙니다. 나는 개인적으로 방금 자체 버전의 플렉스 (렉서 생성기)를 완성했으며, 비교적 간단한 알고리즘 문제의 연습처럼 보였지만 특히 유니 코드를 지원하려고 할 때 올바르게 이해하는 것이 상당히 복잡해졌습니다. 직접 작성하는 대신 기존 구현을 사용해보십시오.