|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Member
Iscritto dal: Jun 2010
Messaggi: 225
|
[java] riconoscitore linguaggio di programmazione
Buongiorno a tutti. Per un progetto devo realizzare un riconoscitore di linguaggi di programmazione (C, Java, Python almeno). Come input ho il codice sorgente...
come posso fare? o meglio, io preso il codice sorgente, analizzo il lessico, ma come faccio a trovare delle peculiarità fra questi 3 linguaggi in modo efficiente così da riconoscerli in maniera abbastanza stabile? |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
Problema interessante, non ci avevo mai pensato.
In pratica hai un problema di pattern-matching: dato un testo, riconoscere se quel testo rispsetta la sinatssi e la grammatica di uno dei linguaggi formali (Python, Java, C). Se si potesse, basterebbe passare il testo alle N implementazioni di parser per i rispettivi N linguaggi e analizzare il risultato (n. errori di sintassi incontrati, porzione di testo valido prima del primo errore: questo nel caso il parsing fallisse in tutti e tre i casi; l'aspettativa è che almeno uno riesca). Purtroppo io non so aiutarti, ma qui nel forum ci sono degli esperti che potrebbero fornirti delle buone idee. Ciao ![]()
__________________
As long as you are basically literate in programming, you should be able to express any logical relationship you understand. If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it. (Chris Crawford) |
![]() |
![]() |
![]() |
#3 | |
Senior Member
Iscritto dal: Nov 2005
Messaggi: 2772
|
Quote:
Se scarichi JavaCC c'è inclusa tra gli esempi la grammatica java da cui generare il parser, per gli altri 2 linguaggi credo si possa trovare. |
|
![]() |
![]() |
![]() |
#4 |
Senior Member
Iscritto dal: Jul 2005
Città: Bologna
Messaggi: 1130
|
Umh... chissà cosa succede poi se gli dai in pasto uno di questi... http://en.wikipedia.org/wiki/Polyglot_(computing)
__________________
-> The Motherfucking Manifesto For Programming, Motherfuckers |
![]() |
![]() |
![]() |
#5 | |
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
Quote:
![]()
__________________
As long as you are basically literate in programming, you should be able to express any logical relationship you understand. If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it. (Chris Crawford) |
|
![]() |
![]() |
![]() |
#6 | |
Member
Iscritto dal: Jun 2010
Messaggi: 225
|
Quote:
vabbè... io pensavo invece di fare 3 mappe, una per ciascun linguaggio di programmazione, contenente tutte le parole dei 3 linguaggi. esamino le prime 100 parole del file sorgente (togliendo commenti, "", () e tutte quelle robe là), e faccio una stima della percentuale corretta... quello con percentuale maggiore è il più probabile... il problema è che sarebbe parecchio pesante, e poco stabile! |
|
![]() |
![]() |
![]() |
#7 | |||
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
Quote:
Se con "stabile" intendi che produce risultati poco accurati/affidabili, sono d'accordo. Quote:
Quote:
![]()
__________________
As long as you are basically literate in programming, you should be able to express any logical relationship you understand. If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it. (Chris Crawford) Ultima modifica di banryu79 : 15-10-2010 alle 14:17. |
|||
![]() |
![]() |
![]() |
#8 | |
Member
Iscritto dal: Jun 2010
Messaggi: 225
|
Quote:
il punto è che non penso di poter scrivere il codice del parser... |
|
![]() |
![]() |
![]() |
#9 | |
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
Quote:
Ti appoggi a un generatore di parser. Un generatore di parser fa quello che il suo nome suggerisce: gli dai una grammatica in pasto, e lui ti sputa il parser ad hoc. Il tuo problema diverrebbe quindi quello di specificare le tre grammatiche dei tre linguaggi nel formato accettato come input dallo specifico generatore di parser a cui ti appoggi. Fai un giro sul web e prova a leggerti qualcosa su JavaCC e Yacc. Poi torna qua, magari qualche esperto si fa vivo (so che qualcuno qui ha avuto esperienze con questi tools) ![]()
__________________
As long as you are basically literate in programming, you should be able to express any logical relationship you understand. If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it. (Chris Crawford) |
|
![]() |
![]() |
![]() |
#10 |
Member
Iscritto dal: Jan 2008
Città: roma
Messaggi: 296
|
c'e una libreria java ( jmimemagic ) che individua il mime type dei file che potrebbe fare al caso tuo, nn so però se sa riconoscere il sorgente oppure il compilato
Auguri ![]()
__________________
Acer 5940G{Intel Core i7 Q720 Quadri motore; 8Gb DDR3; ATI Radeon HD 4650 1024MB; 500Gb hdd} |
![]() |
![]() |
![]() |
#11 |
Member
Iscritto dal: Jun 2010
Messaggi: 225
|
ho avuto un'idea: sto facendo una selezione delle varie keywords dei tre linguaggi:
http://www.lattecafe.net/java/articoli/javakeyword.htm http://it.wikipedia.org/wiki/C_(ling...#Parole_chiave http://docs.python.org/release/2.3.5/ref/keywords.html di modo da eliminare quelle che ci sono in tutti e 3 i linguaggi di programmazione. Sucessivamente pensavo di fare una ricerca nel file sorgente di alcune di queste, procedendo ad eliminare le alternative, determinando quale potrebbe essere il linguaggio di programmazione con il quale è stato scritto il codice sorgente. Questo ovviamente con l'ipotesi che sia stato messo in input almeno uno dei tre linguaggi. Poi devo varare alcune strategie per gestire frammenti di codice tipo: "{}"; " "; etc... è meno pesante che compilarli tutti e 3, un po' impreciso, ma dovrebbe funzionare, che dite?? altre proposte? |
![]() |
![]() |
![]() |
#12 |
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
Guarda che fare il parsing di un sorgente non significa compilarlo.
__________________
As long as you are basically literate in programming, you should be able to express any logical relationship you understand. If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it. (Chris Crawford) |
![]() |
![]() |
![]() |
#13 |
Member
Iscritto dal: Jun 2010
Messaggi: 225
|
|
![]() |
![]() |
![]() |
#14 |
Bannato
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515
|
edit
|
![]() |
![]() |
![]() |
#15 |
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
Immagino dipenda cosa tu intendi per "funzionare".
Procediamo con ordine: lo scopo è implementare un "riconoscitore di linguaggio". Io un "riconoscitore di linguaggio" lo intendo così: Input: uno stream di caratteri (del testo) arbitrario. Output: una stringa che contenga il testo "sconosciuto" se l'input non appartiene a uno degli N linguaggi supportati dal riconoscitore, oppure una stringa che contenga il nome del linguaggio riconosciuto. Già questo implica che bisogna definire i termini secondo i quali un dato testo T viene considerato come codice sorgente valido per il dato linguaggio L(T) e i termini secondo i quali non è considerato come un codice sorgente valido. Ad esempio: il riconoscitore riconoscerà solo sorgenti sintatticamente validi? Oppure riconoscerà anche sorgenti contenenti errori di sintassi? Come valuti se un testo arbitrario T è un codice sorgente valido, scritto in un dato linguaggio L? La risposta ovvia (dato che i linguaggi di programmazione sono linguaggi formali) sarebbe verificare se T è ben formato rispetto la grammatica di L. Però nulla ti vieta di usare un qualsiasi approccio ti permetta di risolvere il tuo problema; solo che risolvere il problema significa soddisfare i requisiti del problema dunque (secondo me) dovresti prima interrogarti su quali siano i requisiti da soddisfare (che o ti sono stati dati, o puoi scegliere tu). Altrimenti è difficile dirti qualcosa di concreto, almeno per me.
__________________
As long as you are basically literate in programming, you should be able to express any logical relationship you understand. If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it. (Chris Crawford) |
![]() |
![]() |
![]() |
#16 |
Senior Member
Iscritto dal: May 2001
Messaggi: 12780
|
Secondo me servono i 3 parser dei 3 linguaggi di programmazione, in particolare una soluzione forse "banale" sarebbe quella di richiamare ed appoggiarti direttamente ai 3 compilatori e farti ritornare il risultato della compilazione.
Comunque pensandoci un po' credo che ognuno di quei 3 linguaggi ha caratteristiche peculiari che possono aiutarti. Ad esempio un file Java ha sicuramente la keyword class e già da questo puoi fare delle ipotesi. Un file C potrebbe avere delle direttive #include e comunque sicuramente ci sono delle parentesi graffe a delimitare i blocchi di codice (cosa che python non ha). In ogni caso il codice C deve essere all'interno di una funzione, non può essere scritto a se stante, specialmente se è costituito da un solo file ci deve essere un main da qualche parte. Questi tuttavia sono metodi "euristici" che possono servire più per andare ad esclusione. Se il tuo obiettivo è dire se un dato testo è un programma Java funzionante, allora non vedo altro modo che darlo in pasto al suo compilatore. Se invece ti concentri solo sulle keyword puoi solamente dire che il file di testo contiene determinate keyword, ma non è detto che poi il contenuto del file di testo sia un programma funzionante. Ultima modifica di WarDuck : 15-10-2010 alle 23:33. |
![]() |
![]() |
![]() |
#17 | |
Member
Iscritto dal: Jun 2010
Messaggi: 225
|
Quote:
1. controllo di estensione del file sorgente. (se mi viene dato un file .java, so che è scritto in java, anche se non compila) 2. riduco il codice così da ottenere una lista di parole "chiave"; 3. inserisco le parole chiave "uniche" (quelle che si usano solo in uno dei 3 linguaggi) in 3 liste (rispettivamente java, c, python); 4. effettuo la ricerca delle parole delle 3 liste nell'elenco ottenuto dall'input; 5. Il programma da comunque una stima di quale sia il linguaggio che con maggior probabilità è stato utilizzato, per aggior completezza bisognerebbe creare anche un analizzatore sintattico. punti deboli: a. non è molto sicuro, ma da un'idea generale; b. se viene messo in input un linguaggio sconosciuto, potrebbe uscire in output uno dei tre linguaggi; c. classifica frammenti di codice non compilabili; |
|
![]() |
![]() |
![]() |
#18 |
Senior Member
Iscritto dal: Oct 2001
Messaggi: 11471
|
Non è tanto diverso dal capire in che lingua è scritto un documento di testo. Usa NGramJ http://ngramj.sourceforge.net/. Cancelli i profili per le lingue e ci metti i tuoi per linguaggi di programmazione ed hai finito. Per capire come creare profili ed aggiungerli alla lista leggi questo: http://blog.afterthedeadline.com/201...g-with-ngramj/
Ho fatto una prova veloce con solo java e php: Codice:
java -jar cngram.jar -lang2 shared.make_timestamp.php speed: php:0.857 java:0.000 --:0.143 .. java:0.000 |0.0E0 |0.0E0 dt=1676 java -jar cngram.jar -lang2 CharTrie.java speed: java:0.970 php:0.000 --:0.030 .. php:0.000 |0.0E0 |0.0E0 dt=3055 |
![]() |
![]() |
![]() |
#19 | |
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
Quote:
![]()
__________________
As long as you are basically literate in programming, you should be able to express any logical relationship you understand. If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it. (Chris Crawford) |
|
![]() |
![]() |
![]() |
#20 |
Member
Iscritto dal: Jun 2010
Messaggi: 225
|
l'idea sarebbe comunque che io trovi un metodo efficiente per risolvere un problema, senza "commissionarlo troppo" a pacchetti o software esterni...
|
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 04:21.