왜 GCC가 Bison에서 C ++ 및 C에 대한 재귀 강하 파서로 전환 했습니까?


10

언어 변경이 필요했거나 Bison이 더 이상 적합하지 않거나 최적의 이유가 아닌 실질적인 이유가 있습니까?

GCC 3.4GCC 4.1 릴리스 정보를 참조하여 wikipedia 에서 전환 한 것을 보았습니다 .

이 릴리스 노트는 다음과 같습니다.

손으로 쓴 재귀 적하 C ++ 파서는 이전 GCC 릴리스의 YACC 파생 C ++ 파서를 대체했습니다. 새로운 구문 분석기에는 C ++ 소스 코드의 구문 분석, 확장 처리 및 적절한 의미 분석 및 구문 분석 사이의 명확한 분리 (가능한 경우)에 필요한 향상된 인프라가 포함되어 있습니다. 새로운 파서는 이전 파서에서 발견 된 많은 버그를 수정합니다.

과:

기존 Bison 기반 C 및 Objective-C 파서는 새로운 손으로 쓴 재귀 강하 파서로 대체되었습니다.

내가 알고 싶은 것은 실제 문제가 무엇이며 Bison을 사용하여 해결하는 것이 불가능하고 비현실적 인 이유입니다.


1
결국 파서 생성기가 요구 사항을 처리 할 수 ​​없을 때 충분한 수정을 한 후에 모든 파서가자가 양조됩니다.
ratchet freak

1
귀하의 연구를 공유하면 모든 사람을 도울 수 있습니다. 당신이 무엇을 시도했고 왜 그것이 당신의 요구를 충족시키지 못했는지 알려주십시오. 이것은 당신이 시간을내어 자신을 돕기 위해 노력했고, 명백한 답변을 반복하지 못하게하며, 무엇보다도보다 구체적이고 관련성있는 답변을 얻는 데 도움이됩니다. 또한 묻는 방법
gnat

1
@gnat 난 내 질문을 확장
neelsg

1
C ++은 대부분의 다른 프로그래밍 언어와 비교할 때 매우 복잡한 언어입니다. 내 직감은 범용 파서가 아마도 집에서 만든 파서가 사용할 수있는 특정 최적화를 지원하지 못할 수 있습니다.

답변:


16

여기에 설명 된 것처럼 재귀 하강 기술을 사용할 때 오류 메시지가 더 의미가 있기 때문에 GCC는 손으로 쓴 파싱으로 전환했습니다 .

또한 C ++은 파서 생성기를 사용하는 것이 그다지 가치가 없다는 것을 구문 분석하는 (구문 적으로) 복잡한 언어가되었습니다.

마침내 실제 컴파일러의 많은 작업이 구문 분석되지 않고 최적화되고 있습니다. GCC 미들 엔드 최적화 패스는 파싱보다 훨씬 복잡합니다.

(BTW를 사용하면 플러그인이나 MELT 등을 사용하여 GCC를 사용자 정의 할 수 있지만 속성과 pragma를 추가하지 않는 한 허용되는 언어의 구문을 실제로 확장 할 수는 없습니다).

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.