2010-07-05 10 views
5

È possibile rilevare un codice sorgente del linguaggio di programmazione (principalmente Java e C#) in un testo?Come rilevare il codice sorgente in un testo?

Ad esempio, desidero sapere se è presente una parte di codice sorgente in questo testo.

.. text text text text text text text text text 
text text text text text text text text text 
text text text text text text text text text 

public static Person createInstance() { return new Person();} 

text text text text text text text text text 
text text text text text text text text text 
text text text text text text text text text .. 

Ho cercato questo per un po 'e non ho trovato nulla.

Una soluzione con Python sarebbe meravigliosa.

Saluti.

+2

Quanto affidabile si desidera che questo sia (quanti falsi positivi o falsi negativi si desidera consentire)? Vuoi davvero sapere * se * c'è qualche codice sorgente da qualche parte nel tuo testo, o vuoi individuarlo e delinearlo dal resto del testo? –

+0

Non penso che ci sia un modo magico per farlo, poiché il codice è intercalato con "testo normale", e probabilmente quasi impossibile essere al 100% giusto. (Ma mai dire mai). –

+0

Ovviamente ci sarà un falso positivo. È impossibile evitarlo. Sì, voglio solo sapere se c'è qualche codice sorgente da qualche parte nel mio testo. Non ho bisogno di localizzarlo. Sapere è abbastanza per il mio caso. – Kerem

risposta

2

Esistono alcuni evidenziatori di sintassi (pygments, google-code-prettify) e hanno risolto il rilevamento e la classificazione del codice. Studiare le loro fonti potrebbe dare un'impressione su come è fatto.

(ora che ho guardato pygments di nuovo - non so se si può rilevare automaticamente il linguaggio di programmazione ma Google-codice-abbellire sicuramente può farlo.)

+0

Ho controllato i frammenti. Riconosce solo i file di codice sorgente completi. – Kerem

+0

@Kerem - pensato così, è quello per cui è stato progettato - ma forse puoi scorrere le righe (o le parole ..) e usare le funzioni di pygments su ogni iterazione (iaw - testare ogni riga se è l'inizio di una sorgente frammento di codice) –

0

si avrebbe bisogno di un database di parole chiave con le caratteristiche di quelle parole chiave (definizione, strutture di controllo, ecc.), nonché un elenco di operatori, caratteri speciali che verrebbero utilizzati nella struttura linguistica (ad esempio (}, *, ||) e un elenco di modelli di espressioni regolari

La soluzione migliore, per ridurre le iterazioni, sarebbe la ricerca su parole chiave/operatori/caratteri. Usando una formula spaziale/frequenza, avviare solo un t testo che può essere essere una lingua, in base al valore della formula restituita. Poi si parte per identificare quale lingua è e dove finisce.

Poiché molte lingue hanno un codice simile, potrebbe essere difficile. Quale lingua è la seguente?

for(i=0;i<10;i++){ 
    // for loop 
} 

Senza il commento potrebbero essere molti diversi tipi di lingue. Con il commento, potresti almeno buttare fuori Perl, poiché usa il carattere di commento #, ma potrebbe comunque essere JavaScript, C/C++, ecc.

Fondamentalmente, dovrai fare molte ricerche ricorsive per identificare il codice corretto, il che significa che se vuoi qualcosa di veloce, avrai bisogno di un mostro di un computer o di un cluster di computer. Inoltre, la formula di ricerca e la formula di identificazione dovranno essere ben rifinite, per ogni lingua.

L'identificazione del codice senza chiamate di libreria appropriate o include può essere impossibile, a meno che non sia elencato che potrebbe appartenere a molte lingue, per cui è necessaria una libreria di sintassi.

+0

con # come tag di commento potrebbe anche essere Python :) – owca

Problemi correlati