Una regex sarebbe la più semplice, ma non necessariamente la migliore. Una regex potrebbe essere ingannata dal codice C che risiede in un commento di un'altra lingua. Potrebbe anche mancare un C-code perfettamente valido che non segue la convenzione degli spazi bianchi che ci si aspetta.
Un parser C, come suggerito, è probabilmente il meglio che puoi fare. Esistono strumenti come ANTLR che possono rendere questo lavoro più facile per te (ANTLR può generare lexer / parser Python per C e altri linguaggi). Dopo aver eseguito il codice C tramite il parser, è possibile confrontare il numero di errori di sintassi con il numero di token validi e la dimensione del file C. Sulla base di queste statistiche, puoi fare un'ipotesi.
Come altri hanno notato - non sarai ancora in grado di distinguere tra un file C ++ valido e un file C con alcuni errori di sintassi (a meno che tu non esegua il tuo C-code tramite un parser C ++ e un Obiettivo) -C parser, e ...).
Se stai già facendo un auto-compilatore, la soluzione migliore potrebbe essere quella di compilare il codice in tutte le lingue supportate e scegliere quello che effettivamente compila. Se il file di input potrebbe effettivamente avere errori di sintassi, scegli la lingua che compila con il minor numero di errori di sintassi. Continuerai a incontrare il problema in cui un determinato file di input viene compilato correttamente in più lingue (come menzionato, C e C ++ ne sono un esempio). Finirai con più compilatori che funzionano bene per il dato file di input - l'unico modo in cui sarai in grado di dire quale usare è ... ... guardando l'estensione del file.