2010-02-17 13 views
11

Czy istnieje sposób użycia parsera llvm-clang w sposób przyrostowy/online?llvm-clang: inkrementalny lub online parser?

Powiedz, że piszę edytor i chcę móc przetworzyć kod C++, który mam przed sobą.

Nie chcę pisać własnego zhackowanego parsera.

Chciałbym użyć czegoś w pełni funkcjonalnego, takiego jak llvm-clang.

Czy istnieje prosty sposób na przejęcie parsera llvm-clang? (A czy jest wystarczająco szybki, aby uruchamiać go ciągle w tle)?

Dzięki!

+0

Ktoś chce zrobić klon Visual Studio [do wykrywania błędów przed kompilacją] :) – Earlz

+0

Interesujący projekt. Od jakiegoś czasu czekałem na kogoś, kto napisze IDE oparte na Clang. Jeśli skończysz budować pełne IDE, rozważ użycie CMake jako jego plików systemowych/projektowych. – Tronic

+3

Być może libclang ['clang_reparseTranslationUnit()'] (http://clang.llvm.org/doxygen/group__CINDEX__TRANSLATION__UNIT.html#ga524e76bf2a809d037934d4be51ea448a) może zaspokoić twoje potrzeby? – bames53

Odpowiedz

3

Nie sądzę, dzyń może stopniowo analizować plików C++, ale jest to jeden z tych celów projektu: http://clang.llvm.org/features.html

pisałem coś podobnego do mojego projektu końcowego roku. Nie był to edytor C++, ale wtyczka Visual Studio, której głównym zadaniem była poprawa intellisense C++ (jak Visual Assist X).

Kiedy pisałem ten projekt, myślałem również o inkrementującym parserze C++, ale nie znalazłem żadnego odpowiedniego rozwiązania. Aby rozwiązać problem intellisense C++ użyłem normalnego parsera C++ z GCC. Jednak było wolno, aby parsować plik po każdym żądaniu zakończenia kodu (ctrl + spacja), po prostu spróbuj dodać boost :: spirit. Aby ten projekt działał poprawnie, analizowałem pliki w tle i po każdej prośbie o uzupełnienie kodu porównałem bieżący plik z jego poprzednią wersją (poprzez diff), aby wykryć zmiany dokonane podczas ostatniego parsowania. Po tych zmianach zaktualizowałem drzewo składniowe, głównie dodając lub usuwając zmienne.

Poza inkrementalnym analizowaniem, istnieje również inny problem z projektami takimi jak ta. Przeważnie będziesz analizować kod C++, który jest edytowany, więc jest to nieprawidłowy kod. Biorąc pod uwagę złożoną gramatykę C++, czasami parser nie będzie w stanie odzyskać danych po błędach składniowych, więc nie będzie poprawnie wykrywał niektórych symboli w kodzie.

Inną kwestią są różnice między parserami/kompilatorami w C++. Powiedzmy, że używam pracy w Visual Studio i użyłem pewnej kompilacji kompilatora VC++ w moim kodzie. Analizator składniowy nie będzie w stanie poprawnie go przeanalizować.

0

Aby napisać coś podobnego do IntelliSense, radziłbym napisać własny parser za pomocą algorytmu parsowania LALR. Ponieważ możesz zapisać jego stan w każdym wierszu, więc nie musisz ponawiać całego pliku, gdy plik został edytowany, co jest bardzo szybkie!
Należy zauważyć, że C++ nie może być w pełni wyrażona w BNF, ale myślę, że można uzyskać dość daleko z niektórymi korektami. Jest dużo więcej pracy niż przy użyciu interfejsu Clanga, ale możesz nadal używać Clanga do analizowania plików nagłówkowych we współpracy z własnym pisemnym parserem.

+0

Problem polega na tym, że naprawdę trudno jest uzyskać poprawny parser C++. Cokolwiek napiszesz, prawdopodobnie nie będzie miało dokładnego zachowania rzeczywistego kompilatora. Idealnie, i jest to jeden z celów projektu clang, ta sama biblioteka używana do budowania kompilatora może być ponownie wykorzystana przez IDE, aby uzyskać spójne wyniki. – bames53