Se si vuole fare l'analisi di codice arbitrario , hai bisogno di parsing/matching arbitrario/etc. GCC-XML fornisce informazioni sulla dichiarazione, ma non il contenuto dei metodi.
nostro DMS Software Reengineering Toolkit fornirà le stesse informazioni di astratto come GCC-XML, ma dispongono in più di dettaglio completo per il contenuto delle definizioni (ad esempio, il metodo corpo informazioni), sostenuto dal suo C++ Front End. Questo ti consentirà di accedere ai contenuti delle consegne e per controllare i tuoi programmi per studenti.
DMS fornisce l'analisi generale di AST, tabelle di simboli e corrispondenza del modello di origine. Il front-end C++ fornisce un parsing completo in C++, costruendo AST C++ e le corrispondenti informazioni sui simboli. Quello che fai dopo per il riconoscimento spetta a te, ma il tuo esempio sembra riguardare la ricerca di un modello specifico.
metà del vostro esempio sarà gestita dal alcuni modelli di sorgente DMS per C++:
pattern is_correct_student_class(m:members):class =
" class user { \m } ".
pattern is_correct_student_method_present(p:parameters,s:statements):method =
" const get_name(\p) { \s } "
(perdoni la mia sintassi C++, non scrivo un sacco di esso), che corrisponde ad ogni AST, rispettivamente, , corrispondente alla classe utente indicata e al metodo const desiderato. Le virgolette sono meta-virgolette, con la roba all'interno essendo la sintassi C++ con gli escape \ p, \ m e \ s che rappresentano i metavariabili p, m ed s, che sintatticamente devono essere un elenco di parametri, un elenco di metodi e una dichiarazione elenca rispettivamente per abbinare il modello. Le definizioni dell'elenco dei parametri, ecc. Vengono derivate automaticamente dalla sezione grammaticale C++ del front-end C++.
L'altra metà è implementato da un bit di codice DMS PARLANSE eseguito dopo richiamando il parser C++ e nome/tipo resolver:
(define has_student_code (lamdba (function boolean [tree AST]))
(AST:IsInTree tree
(lambda (function boolean [tree1 AST]
(&& (Registry:MatchPattern tree1 "is_correct_student_class")
(AST:IsInList (AST:GetNthGrammarChild tree1 4) ; the member list
(lambda (function boolean [tree2 AST])
(Registry:MatchPattern tree2 ; a member
"is_correct_student_method_present")
)lambda
)lambda
)
)define
con qualche libertà adottate per semplificare la presentazione.
Questo è un controllo piuttosto semplice; è possibile accedere alla tabella dei simboli dal codice PARLANSE per effettuare controlli più sofisticati se ciò ha senso.
Mentre DMS non funziona direttamente sotto Linux, sembra funzionare sotto Wine.
Hmmm ... se non vi sono errori, quindi ** SÌ! **: main.cpp definisce la classe e il metodo; altrimenti l'errore potrebbe essere qualsiasi cosa – pmg
Questo si compilerebbe bene con un metodo non-const 'get_name'. Devi rendere 'x' un' const user' nonostante il punto di pmg riguardo ad altri possibili errori. –
Grazie Marco. Codice modificato: 'x' è ora' const'. Non ho nemmeno registrato il 'const' per il metodo. Il solo fatto di 'x' const garantisce che il metodo sia anche' const'? – pmg