Vraag Welke bibliotheken zijn beschikbaar voor het parseren van c ++ om type-informatie te extraheren


Ik ben op zoek naar een manier om c ++ code te ontleden om wat basisinformatie over klassen te achterhalen. Ik heb niet echt veel informatie nodig van de code zelf, maar ik heb het wel nodig om dingen zoals macro's en sjablonen te verwerken. Kortom, ik wil de "structuur" van de code extraheren, wat je zou laten zien in een UML-diagram.

Voor elke klasse / struct / union / enum / typedef in de codebasis, is alles wat ik nodig heb (nadat sjablonen en macro's zijn afgehandeld):

  • Hun naam
  • De naamruimte waarin ze leven
  • De velden binnen (naam van het type, naam van het veld en toegangsbeperkingen, zoals privé / veranderlijk / etc)
  • Functies binnen (retourtype, naam, parameters)
  • Het declarerende bestand
  • Lijn- / kolomnummers (of byte-offset in bestand) waar de definitie van deze gegevens begint

De feitelijke instructies in de code zijn niet relevant voor mijn doeleinden.

Ik verwacht veel mensen die zeggen dat ik hiervoor gewoon een regex moet gebruiken (of zelfs Flex & Bison), maar deze zijn niet echt geldig, omdat ik de preprocessor- en sjabloondelen wel goed moet verwerken.


10
2017-10-05 15:20


oorsprong


antwoorden:


Klinkt als een klus voor gcc-xml in combinatie met de c ++ xml-bibliotheek of xml-vriendelijke scripttaal naar keuze.


5
2017-10-05 15:36



hardlopen Doxygen op de code zou je daar het meeste van krijgen, is het niet?

In welk formaat wilt u de uitvoer?


4
2017-10-05 15:24



Zie ook Ira Baxter hier, waar hij haalt zijn eigen product aan.

Waarschuwing: Let op, alleen Elsa "... ik hoor het redelijk goed ..." bij het construeren van een symbooltafel, die volgens Ira Baxter noodzakelijk is voor OP's oorspronkelijke bedoeling (zie opmerkingen bij dit antwoord - ik citeer hem omdat hij een expert is in het veld).


4
2017-10-21 00:15



Uitbundige Ctags geeft je het meeste van wat je nodig hebt, het wordt meestal door redacteuren gebruikt om codenavigatie te bieden.
Misschien stikt het wel in sommige sjablonen ...


2
2017-10-08 03:58



De DMS Software Reengineering Toolkit is programma voor analyse en transformatie van algemene doeleinden. Haar C ++ Front End bouwt voort op DMS voor het aanbieden van volwaardige C ++ parsen voor verschillende gewone C ++ dialecten, kan een reeks C ++ klassen simultaan verwerken en maakt volledige naam / type / toegangsinformatie die u op elke gewenste manier kunt gebruiken. Informatie is gelabeld als exacte herkomstbestand / regel / kolom. (Het bevat een volledige preprocessor).

Je hebt gelijk; Regex kan hier niet eens in de buurt komen.


2
2017-10-05 15:25



Je kunt macro's eenvoudig uitbreiden door alleen de pre-processor (cpp) op de bron uit te voeren. De sjablonen zijn niet zo eenvoudig, omdat sjabloontoetreding veel later gebeurt.


0
2017-10-06 01:54



Doxygen kan ook een gedetailleerde XML produceren door een optie in het configuratiebestand in te stellen. Het is vrij grondig en zeer gemakkelijk te gebruiken. Van de Doxygen startpagina:

De XML-uitvoer bestaat uit een   gestructureerde "dump" van de informatie   verzameld door doxygen. Elke verbinding   (class / namespace / file / ...) heeft zijn eigen   XML-bestand en er is ook een index   bestand met de naam index.xml.

Een bestand met de naam combine.xslt XSLT-script   wordt ook gegenereerd en kan worden gebruikt om   combineer alle XML-bestanden tot een enkele   het dossier.

Doxygen genereert ook twee XML-schema's   bestanden index.xsd (voor het indexbestand)   en compound.xsd (voor de verbinding   bestanden). Dit schemabestand beschrijft de   mogelijke elementen, hun attributen   en hoe ze gestructureerd zijn, d.w.z. het   de beschrijft de grammatica van de XML   bestanden en kunnen worden gebruikt voor validatie   of om XSLT-scripts te sturen.

In de map addon / doxmlparser u   kan een parser-bibliotheek vinden om te lezen   de XML-uitvoer geproduceerd door doxygen in   een incrementele manier (zie   addon / doxmlparser / include / doxmlintf.h   voor de interface van de bibliotheek)


0