현대 언어는 여전히 파서 생성기를 사용합니까?


38

나는 위키 피 디아에서 GCC 컴파일러 스위트에 대해 연구했다 여기 이가 왔을 때 :

GCC는 Bison으로 생성 된 LALR 파서를 사용하기 시작했지만 점차 손으로 쓰는 재귀-강하 파서로 전환했다. 2004 년 C ++, 2006 년 C 및 Objective-C 용. 현재 모든 프런트 엔드는 손으로 쓴 재귀-강하 파서를 사용합니다.

마지막 문장으로 (그리고 wikipedia를 신뢰하는 한) "C (gcc), C ++ (g ++), Objective-C, Objective-C ++, Fortran (gfortran), Java (gcj), Ada (GNAT), Go (gccgo), Pascal (gpc), ... Mercury, Modula-2, Modula-3, PL / I, D (gdc) 및 VHDL (ghdl) "은 모두 프런트 엔드가 아닙니다. 더 이상 파서 생성기를 사용하십시오. 즉, 그들은 모두 손으로 쓴 파서를 사용합니다.

내 질문은이 연습이 어디에나 있을까요? 특히, [Python, Swift, Ruby, Java, Scala, ML, Haskell]에서 x에 대한 "x의 표준 / 공식 구현에 손으로 쓴 파서가 있습니까"에 대한 정확한 답변을 찾고 있습니까? (실제로 다른 언어로 된 정보도 환영합니다.) 많은 발굴 후에 스스로 찾을 수 있다고 확신합니다. 그러나 나는 이것이 커뮤니티에 의해 쉽게 대답 할 수 있다고 확신합니다. 감사!


3
데이터 포인트 : CPython에는 자체 추출 LALR 파서 생성기 (pgen)가 있습니다. 나머지는 몰라

8
데이터 포인트 : Ghc (haskell)는 OCaml과 마찬가지로 LALR 파서 생성기 (happy)를 사용합니다.
Twan van Laarhoven

1
해야한다 "현대 높은 성능 컴파일러 ... 있습니까" 그 중 하나가 수행 또는 기계 생성 된 파서를 사용하지 않는 컴파일러는 동안 언어, 사양하지 구현 때문에, 또는 유사한.
dmckee

@ dmckee, 네 맞습니다. 그러나 이름이 점점 길어지기 시작합니다. 나보다 창의적이라면 자유롭게 편집하십시오!
eatonphil

ML과 관련하여 : MLton은 ML에 특화된 파서 생성기를 사용합니다. SML / NJ도 익숙하지는 않지만 90 % 확신합니다. 당신은 "필기"를 고려할 수도 있고 원하지 않을 수도 있습니다.
Patrick Collins

답변:


34

AFAIK, GCC는 특히 손으로 쓴 파서를 사용하여 구문 오류 진단을 개선합니다 (즉, 구문 오류에 대해 사람에게 의미있는 메시지를 제공함).

구문 분석 이론 (및 구문 분석 생성기)은 대부분 올바른 입력 문구를 인식하고 구문 분석하는 데 관한 것 입니다. 그러나 우리는 컴파일러가 잘못된 입력에 대해 의미있는 오류 메시지를 제공하고 구문 오류가 발생한 후 나머지 입력을 의미있게 구문 분석 할 수 있다고 기대합니다.

또한 C11 또는 C ++ 11과 같은 오래된 레거시 언어 (최신 개정판이 3 년이 지난 경우에도 개념적으로 오래된 언어)에는 컨텍스트가 전혀 없습니다. 파서 생성기 (즉, 들소 또는 심지어 menhir )에 대한 문법의 문맥 민감도를 다루는 것은 지루하게 어렵습니다.


2
동의합니다. 구문 분석 오류에서 잘 복구 (오래된 Borland Pascal의 첫 번째 오류에서 구문 분석을 중단하지 않으려는 경우) 및 양질의 오류 메시지 (인간이 원하는 것과 같은 해결 방법에 대한 힌트 및 제안 포함)를 작성하는 것은 본질적으로 맥락입니다. 민감하고 휴리스틱 작업. 재고 파서 생성기 출력 상단에서 수행 할 수는 있지만 슬로 그입니다.
Jonathan Eunice

2
Dealing with that context sensitiveness in grammars for parser generators is boringly difficult. 이러한 도구가 컨텍스트 프리 파서를 생성하기 때문에 다소 불가능합니다. 이와 같은 도구를 사용하는 경우 구문 분석 트리를 생성 한 후 모든 상황에 맞는 제약 조건이 있는지 확인하는 올바른 위치 입니다.
dtech

7

파서 생성기 및 파서 엔진은 매우 일반적입니다. 일반성의 장점은 전체 구문에서 정확한 파서를 신속하게 작성하고 기능을 갖추는 것이 쉽다는 것입니다.

파서 엔진 자체는 일반성으로 인해 성능면에서 어려움을 겪습니다. 직접 작성한 코드는 항상 테이블 기반 파서 엔진보다 훨씬 빠릅니다.

파서 생성기 / 엔진이 어려움을 겪는 두 번째 영역은 모든 실제 프로그래밍 언어가 상황에 따라 다르며 종종 미묘한 방식입니다. LR 언어는 컨텍스트가 없으므로 구문에서 올바르게 전달할 수없는 위치 지정 및 환경에 대한 미묘한 점이 있습니다. 속성이있는 그래머는 "사용하기 전에 선언"등과 같은 기본 언어 규칙을 해결하려고 시도합니다. 이러한 상황 민감도를 직접 작성한 코드에 연결하는 것은 간단합니다.


15
성과 주장에 대한 인용? 테이블 중심의 성능은 상당한 성능 최적화가 될 수 있으며 생성기는 매우 효율적이지만 사실상 손으로 직접 구현하지 않는 알고리즘에 액세스 할 수 있습니다 (정확히 테이블과 마법의 숫자를 엉망으로 만들 수 있기 때문에).

2
그리고 제 2 영역에 대해 : 대부분의 많은 주요 실시간 프로그래밍 언어 (모든 세트를 참조해야 할 것이다 적용 어떤 의미에서 민감한 상황 아니다 유효 하다, 유형 검사 및 후 프로그램 결코 무엇을 손으로 쓰거나 생성 된 파서는 구문 분석을 시도합니다). 손으로 쓴 파서는 더 유연하고 일부 언어에는 유용하지만 대부분 오류 복구 및보고, 증분 등의 영역에서 유용합니다. 파서 생성기는 인식 능력 때문에 거의 피할 수 없습니다. 그런 문법을 쓰고 싶다는 것은 다른 이야기입니다). -1

구문 분석 중에 심볼 테이블 정보를 사용하는 경우 상황에 맞는 이름으로 호출 할 수도 있습니다. 속성 문법은 문맥에 따라 달라지지는 않지만 문맥에 따라 달라지지는 않습니다. 오류 복구 및보고에 대한 다른 요점도 잘 알고 있습니다.
BobDalgleish

1
C 및 C ++는 구문 분석 중에 기호 테이블 정보가 필요합니다 (또는 표현 문과 변수 선언과 같이 구별되지 않는 훨씬 덜 구체적인 구문 분석 트리를 채택하십시오). 그러나 나는 그것들을 생각하지 않았습니다. Java, Lisps, JavaScript, Ruby, Python, Go, Rust, Scala, Swift, Haskell과 같은 언어 (그리고 아마도 C # 및 ML도 가능)는 AST의 종류를 구축하기 위해 그러한 정보가 필요하지 않습니다. 어쨌든. 그들 중 다수는 실제로 LL (1) 문법 또는 심지어 LALR 문법을 가지고 있습니다.

1
모든 실제 언어에 대한 인용은 상황에 맞습니까?
psr
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.