기존 libclang API를 사용하여 clang과 함께 불완전한 선언을 가진 C++을 구문 분석 할 수 있습니까? 나는. 모든 머리글을 포함하지 않고 .cpp 파일을 구문 분석하여 즉시 선언을 추론 할 수 있습니다. 그래서. 다음 텍스트 :퍼지 구문 분석을위한 Clang
A B::Foo(){return stuff();}
이 알 수없는 기호 A를 감지 A가 내 마법 휴리스틱을 사용하여 클래스 공제 내 콜백을 호출 할 것인가는 다음이 B와 푸와 물건과 같은 방법으로 콜백 호출합니다. 결국 나는 A 클래스를 리턴 한 멤버 인 Foo가 A를 반환하는 것을 보았을 것이라고 추론 할 수 있기를 원합니다. 그리고 물건은 함수입니다. 컨텍스트 : 나는 현명한 구문 강조와 모든 헤더를 매우 빠르게 구문 분석하지 않고도 코드 분석을 할 수 있는지보고 싶습니다.
[편집] 명확히하기 위해 제한된 C++ 구문 분석을 사용하고 일부 제한 사항을 해제하기위한 휴리스틱을 사용합니다.
문법은 문맥 의존성으로 가득합니다. Foo()는 함수 호출이거나 Foo 클래스의 임시 구조입니까? Foo입니까 < 막대기 > 물건; 템플릿 Foo < 바 > 변수의 인스턴스화 및 선언, 또는 과부하가 걸린 연산자 < 및 연산자> 2가 이상하게 보입니까? 컨텍스트 내에서만 말할 수 있으며, 컨텍스트는 종종 헤더를 파싱 할 때 발생합니다.
내가 찾고있는 것은 내 사용자 규칙 규칙을 연결하는 방법입니다. 예 : Win32 심볼이 오버로드되지 않는다는 것을 알고 있으므로, CreateFile은 항상 이고, 함수는이고, 서명을 알고 있습니다. 또한 모든 수업은 대문자로 시작하고 명사이며 함수는 대개 동사이므로 Foo와 Bar가 클래스 이름이라고 합리적으로 추측 할 수 있습니다. 더 복잡한 시나리오에서, 나는 < b> c와 같은 부작용없는 표현을 작성하지 않는다는 것을 알고 있습니다. 그래서 나는 항상 템플릿 인스턴스화라고 가정 할 수 있습니다. 등등.
그래서 Clang API를 사용하여 알 수없는 기호를 만날 때마다 콜백 할 수 있는지, 그리고 내 자신의 비 C++ 추론을 사용하여 대답을 줄 수 있는지 여부는 질문입니다. 내 경험에 실패하면 구문 분석이 실패합니다. 그리고 나는 부스트 라이브러리를 파싱하는 것에 대해 이야기하지 않고있다. 나는 매우 단순한 C++에 대해서 말하고있다. 아마도 템플릿이 없으며, clang이이 경우에 처리 할 수있는 최소한으로 제한된다.
언제든지 CLang을 직접 수정할 수 있습니다. 조회가 합법적으로 아무 것도 발견되지 않을 때가 여러 번 있기 때문에 (예 : 종속 컨텍스트, ADL) 얼마나 쉬운 일인지 확신 할 수 없습니다. –
분명히 clang이 필요합니까? 그렇지 않다면 아마도 다른 솔루션을 시도해 보는 것이 합리적일까요? 그들이 더 잘 수행 할 수도 있습니다. –
그래, 난 antlr 보았다, 그리고 그것이 더 어렵고 덜 performant있을 용의자지만, 가능합니다 .. 사실 난 제한된 일부 C + +를 구문 분석하는 antlr 사용하고 있으므로 나에게 친숙한 것입니다. 다른 대안이 있습니까? –