2009-09-17 23 views
6

Soy nuevo en generadores de analizadores sintácticos y me pregunto cómo la gramática antlr de un lenguaje incrustado como JSP/ASP/PHP podría ser similar, pero desafortunadamente el sitio antlr no proporciona ningún tipo de archivos de gramática.¿Cómo escribir un analizador ANTLR para lenguajes JSP/ASP/PHP?

Más precisamente, no sé exactamente cómo definir un token de AnyText que coincida con todo (incluidas las palabras clave que no tienen ningún significado fuera de los bloques de código) y aún así poder reconocerlos correctamente dentro de los bloques.

por ejemplo el siguiente debe ser cortado con tijeras tokenizados como algo parecido a: AnyText, BlockBegin, palabra clave, BlockEnd, AnyText.

lorem ipsum KEYWORD dolor sit <% KEYWORD %> amet 

Tal vez también hay otro generador de analizadores que se adapta mejor a mis necesidades. Sólo he intentado antlr hasta ahora, debido a su enorme popularidad de aquí en stackoverflow :)

Muchas gracias de antemano!

+1

Cualquier suerte conseguir este trabajo – etheros

Respuesta

3

No puedo hablar por ANTLR, ya que utilizo un lexer/analizador diferente (el DMS Software Reengineering Toolkit, para el cual he desarrollado precisamente tales lexers/analizadores JSP y PHP. (ASP no es diferente como lo ha observado en su pregunta).

Pero la idea básica es que el lexer necesita modos léxicos para reconocer cuando está recogiendo "cualquier texto" y cuando está procesando texto de lenguaje de programación "real". Necesita un modo léxico inicial, por ejemplo HTML, cuya tarea es la de absorber el texto HTML , y cuando encuentra una transición en PHP, cambia de modo. también necesita un modo de PHP que recoge todas las fichas de PHP, y vuelve a mod HTML e cuando se encuentran los caracteres de transición. Aquí es un boceto:

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

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

Su generador de analizador léxico es probable que tenga algún tipo de capacidad de cambio de modo que usted tiene que usar en lugar de esto. Y lo más probable es que se encuentre léxico la materia HTML es más complicado de lo que parece (que tiene que preocuparse acerca < etiquetas SCRIPT y muchas otras cosas HTML loco, pero los que son detalles presumo que puede manejar.

+0

Muchas gracias por su respuesta El cambio de modo podría?. ser de hecho una solución , aunque sigue siendo un poco problemático con ANTLR, porque solo se debe cambiar el lexer y el analizador debe permanecer igual. (De lo contrario, sería difícil analizar cosas como "<% for ... %> AnyText <% endfor %>"). La solución más fácil que exploré hasta ahora es el uso de boost :: spirit. Allí, el analizador llama al lector lexer y usted puede escribir tantas reglas incluyendo anychar_p como quiera, sin cambiar el modo. – tux21b

1

me he encontrado con este proyecto http://code.google.com/p/phpparser/ que también contiene un archivo de gramática antlr para analizar PHP:. http://code.google.com/p/phpparser/source/browse/grammar/Php.g

esperanza esto ayuda

+0

Ya he logrado hacerlo en goyacc con un lexer personalizado que alterna su modo de lexing cada vez que encuentra un token de inicio/finalización. Pero muchas gracias por su enlace de todos modos, lo voy a ver también :) – tux21b

Cuestiones relacionadas