2010-01-19 10 views
30

Esiste un'implementazione di Lex e Yacc in PHP?Lex e Yacc in PHP

In caso contrario, qualcuno può suggerire un analizzatore lessicale e un generatore di parser (ad esempio, qualsiasi cosa come Lex e Yacc) che creerà il codice PHP. Non sono troppo preoccupato per le prestazioni del parser risultante.

Sono stanco di usare espressioni regolari per analizzare le cose che in realtà non dovrebbe essere verificato con regex ...

+0

@nickf Ben meritato però! – Christian

+0

+1 'preg_split ('# ([{}]) #', ...)' puoi solo farti arrivare così lontano. – Dan

+0

Si consiglia di utilizzare il tokenizer PHP predefinito se la propria lingua utilizza gli stessi token di PHP – niahoo

risposta

1

Sono stato a caccia di questo genere di cose per un po '. Dopo aver trovato questo post, ho provato il runtime di ANTLR PHP. Posso riferire che è lungi dall'essere finito. Ci sono diversi errori nel codice generato, in cui le classi java runtime originali non sono state tradotte correttamente in PHP (dichiarazioni di classi annidate, usando '.' Invece di '.' Quando si prova ad accedere all'operatore dei metodi di classe).

Lo stesso framework ANTLR è piuttosto potente (non può attestare l'efficienza del codice generato). Soprattutto lo strumento grafico ANTLRWorks semplifica la creazione e il debug di grammature. Peccato per la versione di PHP. E 'possibile rotolare il tuo però. La soluzione migliore potrebbe essere quella di analizzare la classe di runtime ANTLR generata, capire come funziona e trovare una versione meno potente della stessa.

0

Un'altra sugestion: evitare approccio Lex/Yacc, utilizzare PHP come un buon string parser,

  • per compiti semplici e traduttori semplice: usa espressioni Perl-regolare (PCRE), con PHP preg_* functions. Il callback ha lo stesso potere delle regole Awk o Yacc, ma con il codice PHP (!).

  • per compiti complessi: tradurre (con una stringa PHP o PCRE traduttore o un altro traduttore) la lingua ad un dialetto XML, process with DOM e/o XSLT. XSLT è "orientato alle regole" (se xsl: template) come Yacc. Con XSLT hai anche access to PHP functions with registerphpfunctions(). Se è necessario tornare a un linguaggio non XML o un formato complesso I/O, processare l'output (a saved XML o un output XSLT) di nuovo con PCRE e le funzioni stringa.

    • PS: per le lingue più ricche e complesse, la "traduzione a XML" compito è possibile (vedere xSugar theory), ma non sempre facile. Puoi utilizzare PHP-PEG per tradurre con PHP, oppure puoi tradurre with a external tool, per memorizzare nella cache l'XML o per utilizzare una versione tradotta xml dei tuoi script di lingua specifica.

Queste due opzioni hanno la stessa (Lex e Yacc) di potenza, e usare solo costruire-in classi PHP e funzioni.

Per i casi complessi, ricordate che XML, XSLT, ecc, sono standard W3C, quindi, XML-dialetti sono "formati standard", XML-tools sono ottimizzate e ancora in evoluzione, e XML-dati sono intercambiabili.

Problemi correlati