Domanda

sto mantenendo / sviluppo di una piattaforma per il test compiti a casa. E 'per lo più automatica. Che cosa ho bisogno di aggiungere ora è l'analisi del codice. Devo controllare il codice per costrutti specifici.

Ad esempio:

  

Il file contiene main.cpp   classe denominata user con un metodo const   get_name()?

C'è qualche strumento là fuori che mi permettesse di fare queste cose (ideale sarebbe qualcosa che può essere script). solo per Linux.

È stato utile?

Soluzione 4

ho scoperto strumento dehydra da Mozilla. Sembra essere in gran parte scritta per scopi interni, ma potrebbe essere solo esattamente quello che stavo cercando.

https://developer.mozilla.org/En/Dehydra/Using_Dehydra

Modifica: Dehydra è grande. Manca alcuni minori caratteristiche come determina i metodi const, ma per il resto ottimo.

Altri suggerimenti

Una possibilità potrebbe essere quella di eseguire il codice attraverso GCC e utilizzare il estensione GCC-XML alle descrizioni prodotti XML della struttura interna del programma. È quindi possibile utilizzare la libreria XML preferito per analizzare il documento, o di applicare un XSLT ad esso se tutto quello che dovete fare è di visualizzazione come HTML o qualsiasi altra cosa.

Si potrebbe probabilmente incidere insieme qualcosa che ha utilizzato il GCC-XML quadro senza troppo troppe difficoltà.

Come si applica a C? :)

  

Il file main.cpp contiene una classe denominata utente con un metodo const get_name ()?

Creare un altro file (test.cpp) con

void test(void) {
  const user x;
  x.get_name();
}

test.cpp compilazione e main.cpp insieme. Se c'è un errore (codice di uscita! = 0) allora NO! , il file main.cpp non definisce una classe (pubblico) di nome utente con il metodo specifico.

Caveat: Lo so no C++, quindi scusa di rilievo (o minori) errori nel sopra

.

Modifica di script aggiunto

#! /bin/sh

cat main.c test.c > 3710532.c
if gcc 3710532.c > /dev/null 2>&1
then echo OK
else echo BZZZT
fi
rm 3710532.c

Non ho un compilatore C++ pronto per l'uso installato su questa macchina sono in, quindi il mio test è stato con un compilatore C e file C. Il mio compilatore non ha fatto "il lavoro con" gcc -combine main.c test.c così ho ottimizzato quella parte.

L'esecuzione di questo script con una combinazione di lavoro di main.c e test.c uscite 'OK', altrimenti emette 'Bzzzt'.


Per le prove ho usato questo main.c

typedef int user;

int get_name(void) {
  return 0;
}

int main(void) {
  return 0;
}

e questo test.c

void test(void) {
  const user x;
  get_name();
}

run Esempio

$ ./3710532.sh
OK

Se si vuole fare l'analisi di codice arbitrario, è necessario arbitrario parsing / corrispondenza / ecc. GCC-XML vi darà informazioni dichiarazione, ma non il contenuto dei metodi.

La nostra DMS Software Reengineering Toolkit fornirà le stesse informazioni astratto come GCC -XML, ma inoltre includere dettaglio completo per il contenuto delle definizioni (ad esempio, il metodo corpo informazioni), sostenuto dal suo C ++ Front End . Questo vi permetterà di accedere delcarations e di contenuti per controllare i programmi per gli studenti.

DMS fornisce general purpose analisi di AST, tabelle di simboli e di corrispondenza fonte-modello. L'estremità C ++ frontale fornisce completa C ++ parsing, costruendo AST C ++ e corrispondenti informazioni simbolo. Quello che fai dopo che per il riconoscimento spetta a voi, ma il tuo esempio sembra essere in cerca di un modello specifico.

La metà del tuo esempio potrebbe essere gestita da 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 denominato e il metodo const desiderato. Le citazioni sono meta-citazioni, con la roba dentro essendo C ++ sintassi con fughe \ P, \ m e \ 's che rappresenta i metavariables P, M e s, che deve essere sintatticamente una lista di parametri, una lista metodo e della lista istruzioni, rispettivamente, al fine di corrispondere il modello. Le definizioni della lista dei parametri, ecc sono derivate automaticamente dalla parte di C ++ grammatica del C ++ Front End.

L'altra metà è implementato da un bit di codice DMS PARLANSE eseguire dopo invocando il parser C ++ e il 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 un controllo più sofisticato, se questo ha un senso.

Mentre DMS non viene eseguito direttamente sotto Linux, sembra per l'esecuzione in vino.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top