문제

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 ++ 문법이 상황에 맞는 것을 보여줍니다.

다른 팁

당신은 볼 수 있습니다 그 소리 구문 분석에 LLVM을 사용합니다.

이제 C ++를 완전히 지원합니다 링크

그만큼 antlr Parser Generator는 다음과 같습니다 문법 C/C ++ 및 사전 처리기의 경우. 나는 그것을 사용한 적이 없어서 C ++의 구문 분석이 얼마나 완전한 지 말할 수 없습니다. Antlr 자체는 훨씬 더 간단한 언어를 구문 분석하는 데 몇 번이나 유용한 도구였습니다.

문제에 따라 GCCXML 당신의 대답 일 수 있습니다. 기본적으로 GCC를 사용하여 소스를 구문 분석 한 다음 구문 분석 트리의 소화 가능한 XML을 쉽게 제공합니다. GCCXML을 사용하면 한 번에 끝납니다.

pycparser Python으로 작성된 C (C99)에 대한 완전한 파서입니다. 완전히 구성 가능한 AST 백엔드가 있으므로 필요한 모든 종류의 언어 처리의 기초로 사용되고 있습니다.

그러나 C ++를 지원하지 않습니다. 당연합니다 많이 C보다 힘들다


업데이트 (2012):이 시점에서 의심 할 여지없이 답은 그 소리 - 모듈 식이며 전체 C ++ (많은 C ++ -11 기능)를 지원하며 비교적 친숙한 코드베이스가 있습니다. 또한 고급 언어에 대한 바인딩을위한 C API가 있습니다 (즉 파이썬의 경우).

방법을 살펴보십시오 독사 작업, 전체 소스 코드를 사용할 수 있으며 Flex 기반입니다.

오해의 소지가있는 후보입니다 번역기를 만들기위한 무료 Windows 기반 Parser Toolkit입니다. 그들의 목록 지원되는 언어 지원되는 구문 분석 문법 목록이 아니라 구문 분석을 구현할 수있는 언어를 나타냅니다.

그들은 C와 C#에 대한 문법이 있으며 C ++는 없습니다.

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

우리를 참조하십시오 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 앱을 작성했습니다. 짧은 시간 안에 인재 할 수 없었고 버려졌습니다.

GNU와 같은 도구를 사용하는 것은 어떻습니까? cflow, 코드를 분석하고 콜 그라프의 차트를 생성 할 수 있습니다. 오픈 그룹(Man Page)는 cflow에 대해 말해야합니다. CFLOW의 GNU 버전에는 소스와 오픈 소스도 함께 제공됩니다 ...

이것이 도움이되기를 바랍니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top