2009-09-17 17 views
6

Sono nuovo per i generatori di parser e mi chiedo come potrebbe essere la grammatica ANTLR per un linguaggio incorporato come JSP/ASP/PHP, ma sfortunatamente il sito ANTLR non fornisce alcun file di grammatica.Come scrivere un parser ANTLR per le lingue JSP/ASP/PHP?

Più precisamente non so esattamente come definire un token AnyText che corrisponda a tutto (comprese le parole chiave che non hanno alcun significato al di fuori dei blocchi di codice) e che siano ancora in grado di riconoscerle correttamente all'interno dei blocchi.

Ad esempio, il seguente snippato dovrebbe essere tokenizzato come qualcosa di simile: AnyText, BlockBegin, Keyword, BlockEnd, AnyText.

lorem ipsum KEYWORD dolor sit <% KEYWORD %> amet 

Forse c'è anche un altro generatore di parser che si adatta meglio alle mie esigenze. Ho solo provato ANTLR fino ad ora, a causa della sua enorme popolarità qui allo stackoverflow :)

Molte grazie in anticipo!

+1

Qualsiasi fortuna ottenere questo lavoro – etheros

risposta

3

Non posso parlare per ANTLR, poiché utilizzo un lexer/parser diverso (lo DMS Software Reengineering Toolkit, per il quale ho sviluppato proprio tale JSP e PHP lexer/parser. (L'ASP non è diverso come hai osservato nel tuo domanda).

Ma l'idea di base è che il lexer ha bisogno modalità lessicali di riconoscere quando si sta raccogliendo "anytext" e quando si elaborano "reale" del testo linguaggio di programmazione. Quindi è necessario una modalità lessicale di partenza, dire HTML, il cui compito è di assorbire il testo HTML e quando incontra una transizione in PHP, cambia modalità. Hai anche bisogno di una modalità PHP che raccolga tutti i token PHP, e ritorna al mod HTML e quando si incontrano i caratteri di transizione. Ecco uno schizzo:

%%HTML -- mode 
#token HTMLText "~[]* \< \% " 
    << (GotoPHPMode) >> 

%%PHP -- mode 
#token KEYWORD "KEYWORD" 
... 
#token '%>' "\%\>" 
    << (GotoHTMLMode) >> 

Il generatore lexer è suscettibile di avere un qualche tipo di capacità di switching mode- che dovrete usare al posto di questo. E probabilmente troverete che lexing la roba HTML è più complicato di quello che sembra (si deve preoccupare su < tag SCRIPT e un sacco di altre cose HTML folle, ma questi sono dettagli presumo si può gestire.

+0

Molte grazie per la tua risposta La commutazione modalità potrebbe?. essere davvero una soluzione , anche se è ancora un po 'problematico con ANTLR, perché solo il lexer dovrebbe essere cambiato e il parser deve rimanere lo stesso. (Altrimenti sarebbe difficile analizzare cose come "<% for ... %> AnyText <% endfor %>"). La soluzione più semplice che ho esplorato finora è l'uso di boost :: spirit. Lì, il lexer viene chiamato dal parser e quindi è semplice scrivere tante regole compreso anychar_p come vuoi, senza cambiare modalità. – tux21b