2011-03-15 19 views
21

Cmake ve visual studio 10 ile pencereler için başarılı bir clang derledim. Bir XML dosyasını kaynak kodunun AST temsili olarak almak istiyorum.Derleyici kullanmadan clang ile bir C/C++ kodu XML AST dökümü alabilir miyim?

clang -cc1 -ast-print-xml source.c 

Ancak bu derleme aşamasını (ı önlemek için istediğiniz) başlatıyordur: linux altında gcc (ubuntu) ile clang sonuç sağlayan ancak pencereler kutuyu çalışmaz bir seçenek daha var . Kaynak kodun içine kazmak, clang için oldukça yeni olduğum sürece bana yardımcı olmadı. Ben kullanarak AST ikili sürümünü oluşturacak şekilde yönetmek olabilir:

clang -emit-ast source.c 

Maalesef bu biçim ayrıştırma için doğrudan kullanılamaz. Clang içinde bir ikili dosya yerine XML ağacını doğrudan oluşturmak için varolan bir yöntem var mı?

Amaç, XML ortamında .NET temsilcisindeki diğer araçlarda kullanmaktır; bu nedenle ikili AST'ye erişmek için yerel clang lib'in etrafına sarmak zorunda kalmam gerekir. Belki birisi zaten .NET için bir ikili argo AST ayrıştırıcısı yazdıysanız üçüncü bir seçenek var mı?

Clang ön sonu tarafından oluşturulan AST, derleme aşamasında oluşturulan ile eşdeğer değilse, bir şey eksik olabilir miyim.

+2

Şirketim, C++ ön uçları oluşturur ve biz * AST'lerin eksiksiz XML dökümlerini gönderebiliriz. Bunu bir onay kutusu öğesi olarak kullanıyoruz, çünkü insanlar bunu soruyor. Kimse bunu gerçekten kullanmaz, çünkü gerçek C++ programının (tüm başlık dosyalarını içerir) çıktı miktarı basitçe * büyüktür *, bu da bunu yavaş ve beceriksiz kılar. Asıl soru şu, bunu neden yapmak istiyorsun?Clang muhtemelen C++ AST'yi doğrudan işlemek için çok sayıda makine sunmaktadır (ilgili aracımızın yaptığı gibi); Neden tüm bu çalışmayı çoğaltmak istersiniz? Neden sadece amacın için Clang kullanmıyorsun? –

+0

http://stackoverflow.com/a/17393852/120163 adresinde bir C++ ağaç dökümine bakın. Bu XML değildir, ancak araç aynı içeriğe sahip XML de üretebilir. –

cevap

20

Size bilgi için, XML yazıcı, 2.9 sürümünden Douglas Gregor (CLang FrontEnd'in sorumlusu) tarafından kaldırılmıştır.

Sorun, XML yazıcısının eksik olduğuydu. Yazıcıda bir dizi AST düğümü kullanılmamış, ayrıca bazı düğümlerin özelliklerinin bir kısmı kaynak kodun yanlış bir şekilde temsil edilmesine yol açmıştır.

Douglas tarafından ortaya atılan bir başka nokta da, çıkışın CLang'ın (-emit-ast'un neyle ilgili olduğu) değil, harici araçlar tarafından tüketilmesi için uygun olması gerektiğiydi. Bu, çıktının bir versiyondan diğerine sabit olmasını gerektirir. Özellikle, CLang'ın dahili olarak 1'e 1 eşlemesi olmamalı, daha çok kaynak kodunu standardında diline çevirmelidir.

yazıcıda önemli işi (gönüllüler gerektiren) Ben clang en AST XML çıkarma başıma sürümü üzerinde çalışıyoruz

+3

Komik kısım, yapılarını temsil etmek yerine "-emit-ast" güzel baskılar türüdür ve bu nedenle kesinlikle işe yaramaz. Bildirimlerde hata ayıklama ve otomatik olarak doğrulamak için bir xml yazıcı ile mümkün oldu. –

+0

@ SK-mantık: xml artık bir seçenek olmadığından, '-emit-ast' davranışında bir iyileşme görebiliyoruz. –

+0

Tüm bu ilginç bilgiler için teşekkürler. Eski xml yazıcıya bir göz atacağım ve kendi kullanımım için yararlı bir şey yapıp yapamayacağımı görmeye çalışacağım. Kaynak kodunu temsil etmek için evrensel/standartlaştırılmış bir yolun olması gerçekten iyi bir şey olurdu, ama ortak bir payda, özelliklerin fırlatılmasını ve her tür dil için belirli şeylerin saklanmasını çok karmaşık kılıyor ... Bazı genişletilebilir yaklaşımlar güzel olurdu ... Şimdilik bu cevap için çok teşekkürler. – jdehaan

3

o ... geri entegre olmayacak olmadığı sürece. Kodum, AST'yi geçmek için libytlang'ın Python bağlantılarını kullanır.

Kodum https://github.com/BentleyJOakes/PCX

Edit bulunur: Ben her AST düğümü için doğru kaynak kod belirteçleri üretme açısından oldukça eksik olduğunu eklemek gerekir. Bu ne yazık ki her AST düğüm tipi için kodlanmalıdır. Ancak, kod bunu daha fazla takip etmek isteyen herkes için bir temel oluşturmalıdır.

1

Özel bir ASTDumper kullanmak, herhangi bir kaynak dosyayı derlemeden işi yapardı. (ön kısımda clang'i durdurun). ancak bunu başarmak için tüm C ve C++ kod kaynakları ile ilgilenmeniz gerekiyor.

İlgili konular