2013-05-05 10 views
5

Sto cercando un parser di lingua scritto in PHP.Libreria parser lingua scritta in PHP

L'obiettivo è leggere un linguaggio personalizzato, non leggere il codice PHP.

Fondamentalmente, voglio specificare una sintassi della lingua, dare uno snippet di codice e recuperare una struttura che la rappresenta. Quindi posso attraversare quella struttura per eseguire lo snippet di codice. Credo che la struttura sarà un AST, ma non so se questa è l'unica opzione (non sono intimo con i parser e il loro vocabolario).

Ho dato un'occhiata allo Doctrine DQL parser ma non sembra un parser generico.

+0

http://wezfurlong.org/blog/2006/nov/parser-and-lexer-generators-for-php/ - ce n'è anche uno su sourceforge ma troppo pigro per cercare il link per te. puoi iniziare con il limone, normalmente è un buon inizio, ma non cadi quando vedi la dimensione del file della classe PHP generata. – hakre

+0

Le persone che vogliono chiudere la domanda, per favore spiegano –

+0

@hakre Interessante, quindi Lemon genera un parser scritto in PHP? Lo esaminerò. Preferirei avere una libreria generica di analisi PHP invece (evita di andare avanti e indietro con Lemon se il linguaggio si evolve). –

risposta

6

Questo non è un elenco completo, se stai cercando ixer/parser di runtime PHP, un progetto eccezionale è Phlexy di NikiC.

È possibile trovare un caso d'uso all'interno di PHP-Parser come ben scritto da lui. Questo è un parser per il linguaggio PHP con un albero sintattico astratto (AST), parzialmente generato da un file di grammatica.

Non sono mai riuscito ad arrivare così lontano, dalle mie ricerche nel corso degli anni, non ci sono molti progetti di questo tipo nello spazio utente di PHP, e queste due librerie di NikiC sono davvero un ottimo esempio.

Se stai cercando un lexer che segue più le regole flex, ne ho scritto uno in XDOM che gestisce la sintassi CSS del selettore, è anche con un parser ma il parser non è basato su un file di grammatica anche se esiste nelle specifiche CSS. Il lexer si basa su un file .lex.