srcML
Utvecklare | Michael L. Collard Jonathan I. Maletic |
---|---|
Skrivet i | C, C++, Java |
Licens | GPL |
Hemsida |
srcML (source ML) är en dokumentorienterad XML-representation av källkod. Den skapades i ett samarbete mellan Michael L. Collard och Jonathan I. Maletic . Förkortningen, srcML, är en förkortning för Source Markup Language. srcML lindar källkod (text) med information från abstrakt syntaxträd eller AST (taggar) i ett enda XML-dokument. All originaltext bevaras så att det ursprungliga källkodsdokumentet kan återskapas från srcML-markeringen. Det enda undantaget är möjligheten till nylinjenormalisering.
Syftet med srcML är att ge full tillgång till källkoden på lexikal, dokumentär, strukturell och syntaktisk nivå. Formatet ger också enkelt stöd för faktaextraktion och transformation. Det stöds av srcML-verktygslådan som underhålls på srcML- webbplatsen och har visat sig utföra skalbar, lättviktsextraktion och transformation.
srcML verktygslåda
srcML-verktygssatsen består av kommandoradsprogrammet srcml, som översätter från källkod till srcML när en kodfil tillhandahålls på kommandoraden eller översätter från srcML till källkod när ett srcml-arkiv tillhandahålls på kommandoraden. Programmet stöder också direkta frågor och transformationer av srcML-arkiv med hjälp av verktyg som XPath, XSLT och RELAXNG. srcML-verktygssatsen underhålls aktivt och stöder för närvarande C, C++, C# och Java.
srcML-format
srcML-formatet består av all text från den ursprungliga källkodsfilen plus XML-taggar. Specifikt är texten insvept med srcML-element som indikerar kodens syntaktiska struktur. Kort sagt, detta identifierar explicit alla syntaktiska strukturer i koden.
Taggarna som används i srcML listas nedan tillsammans med vilken kategori de faller inom.
Kategori | srcML-element | |
---|---|---|
Fil/projekt | enhet | |
Påstående | asm, block, break, case, comment, condition, constraint, continue, decl, decl_stmt, default, do else empty_stmt, enum, expr, expr_stmt, extern, for, goto, if, incr, index, init, label, macro, name, namespace, range, requires, switch, template, then, type, typedef, using, while | |
Funktion/metod | argument, argument_list, call, function, function_decl, param, parameter_list, return, specificator | |
Klass | class, class_decl, constructor, constructor_decl, destructor, destructor_decl, friend, member_list, private, protected, public, super | |
Struktur och Union | struct, struct_decl, union, union_decl | |
Undantag | fånga, kasta, kasta, prova | |
C-förprocessor | cpp:define, cpp:direktiv, cpp:elif, cpp:endif, cpp:error, cpp:file, cpp:if, cpp:ifdef, cpp:ifndef, cpp:include, cpp:line, cpp:pragma, cpp: undef | |
K&R C | krparam, krparameter_list | |
Java | utökar, slutligen, implementerar, importerar, paketerar | |
Extra uppmärkning | lit:literal, typ:modifierare, op:operator | |
Felsök | markör, läge, tolka | |
Övrigt | fly |
srcML använder XML-namnrymder. Nedan finns en lista över prefixet som används för att beteckna varje namnområde och själva namnområdena.
Prefix | Namnutrymme |
---|---|
src | http://www.srcml.org/srcML/src |
cpp | http://www.srcml.org/srcML/cpp |
pos | http://www.srcml.org/srcML/position |
belyst | http://www.srcml.org/srcML/literal |
fela | http://www.srcml.org/srcML/srcerr |
Obs: för ett srcML-arkiv kommer hela projektet att finnas i ett enda rotenhetselement, och varje enskild fil kommer att finnas som ett enhetselement i rotenhetselementet.
Konvertering av en enda fil
Följande visar hur srcml kan användas på enstaka filer.
Följande exempel konverterar C++-filen main.cpp till srcML-filen main.cpp.xml:
srcml main.cpp -o main.cpp.xml
Följande kommando extraherar källkoden från filen main.cpp.xml och placerar den i C++-filen main.cpp:
srcml main.cpp.xml -o main.cpp
Projektkonvertering
Följande visar hur src2srcml och srcml2src kan användas med ett helt projekt:
Följande exempel konverterar projektet 'project' till srcML-filen project.xml
srcml project -o project.xml
Följande kommando extraherar källkodsfilerna från filen project.xml och placerar den i katalogprojektet:
srcml —to-dir project project.xml
Programtransformation med srcML
srcML tillåter användning av de flesta om inte alla nuvarande XML API:er och verktyg för att skriva transformationer. Det tillåter också användning av XSLT direkt med argumentet—xslt={name}.xls på kommandot srcml2src. Genom att använda srcMLs uppmärkning med XSLT kan användaren tillämpa programtransformationer på en XML-liknande struktur (srcML) för att få transformerad xml som sedan kan skrivas tillbaka sin källkodsrepresentation med hjälp av verktyget srcml2src. Tillämpningen av srcML på programtransformation förklaras i detalj av Collard et al.
Följande kommando kommer att köra XSLT-programmet program.xsl på srcML archive project.xml
srcml —xslt program.xsl project.xml
Faktaextraktion med srcML
I sin enklaste form utnyttjar Faktaextraktion med srcML XPath för att adressera delar av srcML-dokumentet och hämta information om olika enheter eller egenskaper hos källkoden. Naturligtvis är det inte begränsat till detta. Alla standard XML API kan användas. Tillämpningen av srcML på faktaextraktion förklaras i detalj av Kagdi et al.
cpp:direktiv, cpp:fil, cpp:inkludera, cpp:define, cpp:undef, cpp:linje, cpp:if, cpp:ifdef, cpp:ifndef, cpp:else, cpp:elif, cpp:endif, cpp: sedan, cpp:pragma, cpp:errorliteral, operator, modifier Ett exempel för att skapa ett srcML-arkiv från ett helt programvaruprojekt.
Följande kommando kör XPath-sökvägen på ett srcML-arkivprojekt.xml
srcml —xpath "xpath" project.xml
Arbete pågår med att tillhandahålla bekväma förlängningsfunktioner.
Analys av källkodsskillnad med srcML
srcML ger många fördelar med att göra skillnadsanalys på källkod. En av dessa fördelar är möjligheten att fråga efter skillnader mellan specifika sektioner av en kodbas såväl som mellan versioner av samma kodbas. Tillämpningen av srcML för skillnadsanalys förklaras i detalj av Maletic et al.
Exempel
Som ett exempel på hur srcML används, här är ett XPath-uttryck som kan användas för att hitta alla klasser i ett källdokument:
//src:klass
Ett annat exempel kan vara att hitta alla kommentarer inom funktioner:
/src:function//src:comment
På grund av att srcML är baserat på xml kan alla XML-verktyg användas med srcML, vilket ger rik funktionalitet.
Se även
-
Maletic, Jonathan I., Collard, Michael L., Kagdi, Huzefa (2004). Utnyttja XML-teknik för att utveckla programanalysverktyg . Proceedings of the 4th International Workshop on Adoption-Cenric Software Engineering (ACSE'04). s. 6 sidor.
{{ citera bok }}
: CS1 underhåll: flera namn: lista över författare ( länk ) -
Collard, Michael L., Maletic, Jonathan I., Marcus, Andrian (2002). Stöddokument och datavyer av källkod . Proceedings of the 2nd ACM Symposium on Document Engineering (DocEng'02). s. 8 sidor.
{{ citera bok }}
: CS1 underhåll: flera namn: lista över författare ( länk ) -
Maletic, Jonathan I., Collard, Michael L., Marcus, Andrian (2002). Källkodsfiler som strukturerade dokument . Proceedings of the 10th IEEE International Workshop on Program Comprehension (IWPC'02). s. 4 sidor.
{{ citera bok }}
: CS1 underhåll: flera namn: lista över författare ( länk )