Saltar al contenido

Escribir un resaltador de sintaxis

Solución:

Los marcadores de sintaxis pueden funcionar de dos formas muy generales. El primero implementa un analizador y un léxico completo para los idiomas que se resaltan, identificando exactamente el tipo de cada token (palabra clave, nombre de clase, nombre de instancia, tipo de variable, directiva de preprocesador …). Esto proporciona toda la información necesaria para resaltar exactamente el código de acuerdo con alguna especificación (palabras clave en rojo, nombres de clases en azul, lo que sea).

La segunda forma es algo como el que emplea Google Code Prettify, donde en lugar de implementar un lexer / parser por idioma, se utilizan un par de analizadores muy generales que pueden hacer un trabajo decente en la mayoría de las sintaxis. Este resaltador, por ejemplo, podrá analizar y resaltar razonablemente bien cualquier lenguaje similar a C, porque su lexer / parser puede identificar los componentes generales de ese tipo de lenguajes.

Esto también tiene la ventaja de que, como resultado, no es necesario especificar explícitamente el idioma, ya que el motor determinará por sí mismo cuál de sus analizadores genéricos puede hacer el mejor trabajo. La desventaja, por supuesto, es que el resaltado es menos perfecto que cuando se usa un analizador específico del idioma.

Crear un resaltador de sintaxis consiste en encontrar palabras clave específicas en el código y darles un estilo específico (fuente, estilo de fuente, color, etc.). Para lograr esto, deberá definir una lista de palabras clave específicas para el lenguaje de programación en el que está escrito el código, y luego analizar el texto (por ejemplo, usando expresiones regulares), encontrar los tokens específicos y reemplazarlos con el estilo adecuado. Etiquetas HTML.

Un resaltador muy básico escrito en JavaScript se vería así:

var keywords = [ "public", "class", "private", "static", "return", "void" ];
for (var i = 0; i < keywords.length; i++)
{
        var regex = new RegExp("([^A-z0-9])(" + keywords[i] + ")([^A-z0-9])(?![^<]*>|[^<>]*</)", "g");
        code = code.replace(regex, "$1<span class="rm-code-keyword">$2</span>$3");
}

En el podcast número 50 de StackOverflow, Steve Yegge habla un poco sobre su proyecto para crear un mecanismo de resaltado general. No es un producto terminado y quizás más sofisticado de lo que busca, pero podría haber algo de interés.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *