2009-05-09 13 views
7

Ho bisogno di dividere un file JavaScript in singole istruzioni. Ad esempioParse JavaScript allo strumento codice

a = 2; 
foo() 
function bar() { 
    b = 5; 
    print("spam"); 
} 

deve essere separato in tre istruzioni. (assegnazione, chiamata di funzione e definizione di funzione).

Fondamentalmente ho bisogno di strumentare il codice, inserendo il codice tra queste istruzioni per eseguire i controlli. Divisione di ";" ovviamente non funzionerebbe perché puoi anche terminare le istruzioni con newline e forse non voglio il codice dello strumento all'interno delle definizioni di funzioni e classi (non lo so ancora). Ho fatto un corso di grammatica con flex/Bison ma in questo caso l'azione semantica per questa regola sarebbe "stampare tutti i discendenti nell'albero di analisi e mettere il mio codice alla fine" che non può essere fatto con Bison base credo . Come faccio a fare questo? Devo anche dividere il codice perché devo interfacciarlo con Python con python-spidermonkey. Oppure ... c'è già una libreria là fuori che mi salva dal reinventare la ruota? Non deve essere in Python.

+0

Beh, proverei jQuery AOP – mozillanerd

+0

Non vedo questo suggerimento seguito. Ho strumentato grandi librerie javascript. Io spero che tu faccia un tentativo; è facile da usare. – mozillanerd

risposta

4

Perché non utilizzare un parser JavaScript? Ci sono molti, tra cui un'API Python per ANTLR e un wrapper Python su SpiderMonkey.

+0

Ho guardato su ANTLR ma mi sembra davvero complicato :-( Sto già pensando di usare python-spidermonkey, ma ho bisogno di dividere il codice correttamente prima: execute ("function foo() {") dà un errore I ho pensato che ci sarebbe stato un altro modo ... se nutro oggetti Python nel contesto di js, potrei inserire i callback in codice Python lì, ma sembra piuttosto complicato, sono abbastanza nuovo in questa interfaccia di lingua (e io m nuovo a js) – BruceBerry

+0

Strumenti come ANTLR sono "davvero complicati" perché hanno a che fare con problemi davvero complicati: un sacco di persone cercano un qualche tipo di modifica delle stringhe per manipolare il codice, quasi sempre finisce male, perché l'hacking delle stringhe non può gestire le complicazioni in modo affidabile –

0

Perché non utilizzare un interprete JavaScript esistente come Rhino (Java) o python-spidermonkey (non sono sicuro che questo sia ancora attivo)? Analizzerà il JS e quindi sarà possibile esaminare l'albero di analisi risultante. Non sono sicuro di quanto sarà facile ricreare il codice originale, ma ciò dipende principalmente dalla leggibilità del codice strumentato. Se nessuno lo guarda, genera solo una forma davvero compatta.

pyjamas potrebbe anche essere di interesse; questo è un transpiler da Python a JavaScript.

[EDIT] Anche se questo non risolve il problema a prima vista, è possibile utilizzarlo per un approccio diverso: invece di strumentare JavaScript, scrivi il tuo codice in Python invece (che può essere facilmente strumentato; tutti gli strumenti sono già lì) e quindi convertire il risultato in JavaScript.

Infine, se vuoi risolvere il tuo problema in Python ma non riesci a trovare un parser: usa un motore Java per aggiungere commenti al codice che puoi quindi cercare in Python per strumentare il codice.

+0

tu sei il secondo a dire che potrei analizzare il codice con python-spidermonkey ... ho capito male? Non sembra avere alcuna funzione di analisi nalities. Il codice deve essere analizzato da qualche parte, ovviamente, ma è fatto nel profondo del motore spidermonkey, l'interfaccia python non fornisce hook in esso. Vedo solo "execute", "add_global", "rem_global" e "gc" esposti per i programmatori python. Mi sto perdendo qualcosa? – BruceBerry

+0

Vedere la mia modifica per spiegare il mio pensiero sul treno. –

+0

sfortunatamente fa parte di un progetto per analizzare il reindirizzamento nelle pagine. Non riesco a scrivere il codice javascript :-) E i siti Web dannosi fanno di tutto per offuscare il loro codice. – BruceBerry

2

JavaScript è difficile da analizzare; hai bisogno di un parser JavaScript completo. Il DMS Software Reengineering Toolkit può analizzare il codice JavaScript completo e creare un numero corrispondente AST. Gli operatori AST possono quindi essere utilizzati per camminare sull'albero per "dividerlo". Ancora più semplice, tuttavia, è applicare trasformazioni da sorgente a origine che cercano un modello di sintassi di superficie (JavaScript) e lo sostituiscono con un altro. È possibile utilizzare tali trasformazioni per inserire la strumentazione nel codice, piuttosto che suddividere il codice per creare delle prese in cui effettuare gli inserimenti. Una volta completate le trasformazioni, DMS può rigenerare codice JavaScript valido (completo dei commenti originali se non viene modificato).