C/C ++ 파서/분석기 생성을위한 좋은 도구 [폐쇄
문제
C/C ++ 코드를 구문 분석하고 분석하기위한 좋은 도구는 무엇입니까?
특히 C/C ++ 전처리 업체 및 언어를 처리하는 오픈 소스 도구를 찾고 있습니다. 바람직하게는,이 도구는 문법에 Lex/YACC (또는 Flex/Bison)를 사용하며 너무 복잡하지 않습니다. 최신 ANSI C/C ++ 정의를 처리해야합니다.
지금까지 내가 찾은 내용은 다음과 같지만 자세히 보지 못했습니다 (생각?).
- CSCOPE - 구식 C 분석기. 그래도 전체 구문 분석을하지 않는 것 같습니다. C 함수를 찾기위한 영광스러운 'grep'으로 묘사됩니다.
- GCC - 모두가 좋아하는 오픈 소스 컴파일러. 매우 복잡하지만 모든 것을하는 것 같습니다. GCC 확장을 만들기위한 관련 프로젝트가 있습니다. 보석, GCC 4.1 (2006) 이후 업데이트되지 않았습니다.
- 퓨마 - 순수한 조작기. (페이지에서 : "이 프로젝트의 의도는 C/C ++ 소스의 분석 및 조작을위한 클래스 라이브러리를 제공하는 것입니다.이 목적의 경우 Puma는 스캔, 구문 분석 및 물론 C/C ++ 소스 조작을위한 클래스를 제공합니다." . 이것은 유망한 것처럼 보이지만 2001 년부터 업데이트되지 않았습니다. 분명히 Puma는 SAGONC ++, 그러나이 프로젝트조차도 2006 년부터 업데이트되지 않았습니다.
- 다양한 C/C ++ 생 문법. 당신은 얻을 수 있습니다 C-C ++ -Grammars-1.2.tar.gz, 그러나 이것은 1997 년부터 입증되지 않았습니다. Google 검색은 시작 장소 역할을 할 수있는 다른 기본 LEX/YACC 문법을 끌어 올립니다.
- 다른 사람?
나는 이것을 C/C ++ 소스를 새로운 장난감 언어로 번역하기위한 시작점으로 사용하기를 희망합니다.
감사! -매트
(2/9 추가) : 설명 : C/C ++ 코드 자체 외에 전처리에서 시맨틱 정보를 추출하고 싶습니다. 나는 "#define foo 42"가 정수 "42"로 사라지는 것을 원하지 않지만 "foo"라는 이름에 붙어 있습니다. 불행히도 이것은 사전 처리기를 먼저 실행하는 몇 가지 솔루션을 제외하고 C/C ++ 구문 분석 트리 만 전달합니다).
해결책
문법이 결정되지 않기 때문에 C ++를 구문 분석하는 것은 매우 어렵습니다. 인용합니다 요시 크레인:
탁월한 복잡한 문법
"뛰어나게"는 문자 그대로 해석되어야합니다 모든 인기있는 언어 가지다 상황에 맞지 않습니다 (또는 "거의"컨텍스트가없는) 문법, C ++는 명확하지 않습니다 문법. 컴파일러와 파서를 좋아한다면 아마도 이것이 무엇을 의미하는지 알 수 있습니다. 이런 종류의 일이 아니라면 간단한 예 C ++를 구문 분석하는 데 문제가 표시됩니다. IS
AA BB(CC);
객체 정의 또는 함수 선언? 답은 코드에 크게 의존한다는 것이 밝혀졌습니다. ~ 전에 진술 - "컨텍스트". 이것은 (직관적 인 수준에서) C ++ 문법이 상황에 맞는 것을 보여줍니다.
다른 팁
문제에 따라 GCCXML 당신의 대답 일 수 있습니다. 기본적으로 GCC를 사용하여 소스를 구문 분석 한 다음 구문 분석 트리의 소화 가능한 XML을 쉽게 제공합니다. GCCXML을 사용하면 한 번에 끝납니다.
C ++를 구문 분석하는 것은 매우 복잡한 도전입니다.
부스트/정신 프레임 워크가 있으며 몇 년 전에 그들은 C ++ 파서 구현 아이디어로 플레이, 그러나 그것은입니다 완전한 것과는 거리가 멀다.
ISO C ++가 완전히 적절하고 적절하게 구문 분석하는 것은 사소한 일이 아니며 실제로 많은 관련 노력이있었습니다. 그러나 모든 C ++를 이해하는 전체 컴파일러 프론트 엔드를 다시 작성하지 않고 쉽게 달성되지 않는 본질적으로 복잡한 작업입니다. 그리고 사전 처리기. "Wave"라는 사전 프로세서 구현은 Spirit Polks에서 제공됩니다.
즉, 당신은 돼지 고기/Oink (ELSA 기반)는 소스 코드 변환 목적으로 특히 사용되는 C ++ 파서 툴킷 인 (ELSA 기반) 인 Mozilla 프로젝트에서 대규모 정적 소스 코드 분석 및 자동화 된 코드 재 작성을 수행하는 데 사용됩니다. 그것은 대부분의 C ++뿐만 아니라 사전 처리기 자체를 지원한다는 것입니다!
반면에 실제로 하나의 독점 솔루션이 있습니다 : EDG Frontend는 거의 모든 C ++ 관련 노력에 사용할 수 있습니다.
개인적으로, 나는 Mozilla에서 사용되는 ELSA 기반 Pork/Oink Suite를 확인할 것입니다. 그 외에도 FSF는 이제 작업을 승인했습니다. GCC 플러그인 따라서 런타임 라이브러리 라이센스를 사용하여 사람들이 이진 플러그인을 사용하여 이러한 목적으로 GCC 기반 C ++ 파서를 쉽게 활용할 수 있으면 상황이 빠르게 변경 될 것으로 가정합니다.
따라서 간단히 말해서 : 벅스 : EDG, 무료/오픈 소스가 필요한 경우 지금: else/oink는 상당히 유망합니다. 시간이 있다면 프로젝트에 GCC를 사용하고 싶을 수도 있습니다.
C 코드의 또 다른 옵션은 다음과 같습니다 CSCOUT.
C ++의 문법은 일종의 악명 높은 털입니다. 거기 있습니다 그것에 대해 Lambda의 좋은 실, 그러나 요점은 C ++ 문법이 임의로 많은 모습을 필요로 할 수 있다는 것입니다.
내가 당신이 할 수 있다고 생각하는 종류의 경우, 나는 GNU CC를 해킹하는 것에 대해 생각합니다. 부목. GNU CC는 특히 언어 생성 부분을 매우 철저히 분리하므로 새로운 G ++ 백엔드를 구축하는 것이 가장 좋습니다.
실제로, Puma와 Saperc ++는 여전히 적극적으로 유지되고 업데이트됩니다. 나는 Speciorc ++를 사용하고 있었고 업데이트가 부족한 것에 대해 궁금해하고있었습니다. 나는 Sagec ++와 Puma가 여전히 개발되고 있다고 말한 저자에게 이메일을 보냈다. SVN을 통해 소스 코드를받을 수 있습니다 https://svn.aspectc.org/repos/ 또는 정기적 인 바이너리 빌드를 얻을 수 있습니다 http://akut.aspectc.org. 요즘 많은 우수한 C ++ 프로젝트와 마찬가지로 저자는 웹 페이지 유지 관리를 수행 할 시간이 없습니다. 풀 타임 직업과 삶을 가지고 있다면 의미가 있습니다.
엘사 100% 준수하지는 않지만 C ++ 구문 분석을 위해 내가 아는 다른 모든 것을 능가합니다. 나는 팬이다. C ++를 인쇄하는 모듈이 있으므로 장난감 프로젝트에 좋은 출발점이 될 수 있습니다.
우리를 참조하십시오 C ++ 프론트 엔드완전한 기능을 갖춘 C ++ 파서의 경우 : ASTS, Symbol Tables, 이름 및 유형 해상도를 만듭니다. 사전 처리기 지시문을 구문 분석하고 유지할 수도 있습니다. C ++ 프론트 엔드는 DMS 소프트웨어 리엔지니어링 툴킷, 이를 통해 해당 정보를 사용하여 소스 간 소스 변환을 사용하여 임의의 소스 코드 변경을 수행 할 수 있습니다.
DMS는 이러한 번역기를 구현하기에 이상적인 엔진입니다.
그렇게 말하면서, 나는 당신의 상상의 과제에서 많은 요점을 보지 못합니다. C ++를 대체하려고 할 때는별로 가치가 없으며, 특히 대상이 "장난감"언어 인 경우 완전한 번역기를 거대한 작업으로 구축 할 수 있습니다. 그리고 강력한 파서를 사용하여 C ++를 구문 분석 할 때는 거의 포인트가 없을 것입니다. 만약 유일한 목적이 구문 분석하기 쉬운 C ++의 동형 버전을 생성하는 것이라면 (잠깐만, 우리는 이미 강력한 C ++를 가정했습니다!).
2012 년 5 월 편집 : DMS의 C ++ 프론트 엔드는 이제 GCC3/GCC4/C ++ 11, Microsoft Visualc 2005/2010을 처리합니다. 견고하게.
2015 년 2 월 편집 : 이제 GCC 및 MS 방언에서 C ++ 14를 처리합니다.
2015 년 8 월 편집 : 이제 통합 트리에서 코드와 사전 처리기 지시문을 모두 구문 분석하고 캡처합니다.
얼마 전 C 파일에 대한 단위 테스트를 자동으로 생성하는 도구를 작성하려고 시도했습니다.
사전 분비를 위해 GCC를 통해 파일을 넣습니다. 출력은 추악하지만 전처리 파일의 원본 코드에서 쉽게 추적 할 수 있습니다. 그러나 당신의 필요에 따라 다른 것이 필요할 수 있습니다.
나는 사용했다 미터 C 파서의 기반으로. 오픈 소스이며 Lex와 YACC를 사용합니다. 이로 인해 Lex & YACC를 완전히 이해하지 않고 짧은 시간에 쉽게 일어나고 달리기가 쉽습니다.
또한 LEX & YACC 솔루션이 함수에서 기능을 추적하고 전체 기능의 구조를 한 패스로 구문 분석하는 데 도움이 될 수 없었기 때문에 C 앱을 작성했습니다. 짧은 시간 안에 인재 할 수 없었고 버려졌습니다.