¿Cómo escribir un analizador ANTLR para lenguajes similares a JSP / ASP / PHP?

StackOverflow https://stackoverflow.com/questions/1440480

  •  10-07-2019
  •  | 
  •  

Pregunta

Soy nuevo en los generadores de analizadores y me pregunto cómo se vería la gramática ANTLR para un lenguaje incrustado como JSP / ASP / PHP, pero desafortunadamente el sitio ANTLR no proporciona dichos archivos de gramática.

Más precisamente, no sé exactamente cómo definir un token 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 reconocerlas correctamente dentro de los bloques.

Por ejemplo, el siguiente recorte debe ser tokenizado como algo así como: AnyText, BlockBegin, Keyword, BlockEnd, AnyText.

lorem ipsum KEYWORD dolor sit <% KEYWORD %> amet

Quizás también haya otro generador de analizador que se adapte mejor a mis necesidades. Solo he probado ANTLR hasta ahora, debido a su gran popularidad aquí en stackoverflow :)

¡Muchas gracias de antemano!

¿Fue útil?

Solución

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

Pero la idea básica es que el lexer necesita modos léxicos para reconocer cuando está recogiendo " anytext " y cuando está procesando " real " lenguaje de programación de texto. Entonces necesita un modo léxico inicial, digamos HTML, cuyo trabajo es absorber el HTML texto, y cuando encuentra una transición a PHP, cambia de modo. También necesita un modo PHP que recoge todos los tokens PHP, y vuelve al modo HTML cuando se encuentran los caracteres de transición. Aquí hay un boceto:

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

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

Es probable que su generador lexer tenga algún tipo de capacidad de cambio de modo que tendrás que usar en lugar de esto. Y probablemente encontrarás que eliminar el contenido HTML es más complicado de lo que parece (tienes que preocuparte sobre < etiquetas SCRIPT y muchas otras cosas HTML locas, pero esas son Detalles que supongo que puedes manejar.

Otros consejos

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

Espero que esto ayude.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top