2009-04-30 30 views
19

Tenía la esperanza de escribir mi propio resaltador de sintaxis para un proyecto de verano en el que estoy pensando, pero no estoy seguro de cómo escribir mi propio resaltador de sintaxis.Escribiendo un marcador de sintaxis

Sé que hay un montón de implementaciones, pero me gustaría aprender sobre las expresiones regulares y cómo funciona el resaltado de sintaxis.

¿Cómo funciona el resaltado de sintaxis y cuáles son algunas buenas referencias para desarrollar uno? ¿El resaltador de sintaxis escanea cada carácter a medida que se escribe o explora el área de documento/texto como un todo después de que se escribe cada carácter?

Cualquier observación sería muy apreciada.

Gracias.

PS: Yo estaba pensando en escribirlo en ActionScript

Respuesta

17

Los resaltadores de sintaxis pueden funcionar de dos maneras muy generales. El primero implementa un lector y analizador 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 clase en azul, lo que tiene).

La segunda forma es algo así como el que Google Code Prettify emplea, donde en lugar de implementar un lexer/analizador 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, será capaz de analizar y resaltar razonablemente bien cualquier lenguaje tipo C, ya que su lector/analizador puede identificar los componentes generales de ese tipo de idiomas.

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

+3

Comenzaste a decir que los resaltadores funcionaban de dos maneras generales, pero a menos que no entendiera bien, no explicabas la segunda forma. – Marplesoft

+6

@Marplesoft, tal como lo entendí, escribir un lexer y un analizador sintáctico por idioma es la primera forma, y ​​la escritura genérica de Lexer y analizador es la segunda. – yasar

2

Usted debe tratar a todo el documento como un todo al principio. Creo que (sin ser un experto) quieres desglosar cada ficha y hacer un árbol de análisis sintáctico.

Entonces, si tiene toda esa configuración, podría ejecutar primero el analizador cada vez que escriba un nuevo carácter. Eso podría ser lo suficientemente bueno para su uso, pero si desea mantener las cosas rápido, tendrá que hacer modificaciones en su árbol de análisis para obtener más información.

+0

Lo que básicamente está construyendo, se llama lexer (creo) – Evert

+0

estoy de acuerdo en que el documento debe ser tratado como un todo en el primero, pero es difícil decir si esto cumple con las especificaciones basadas en la vaga descripción del proyecto – Tony

3

Podría ser útil si explicas para qué sirve este marcador de sintaxis. Si lo está escribiendo en actionscript, ¿su idea es tener un cuadro de texto en una película flash y resaltar la sintaxis después de presionar un botón de enviar? ¿O desea leer el texto de algún servicio web y luego mostrar la sintaxis resaltada? ... es difícil para mí ayudar, porque es difícil para mí imaginar lo que estás haciendo

Sin embargo, un marcador de sintaxis lee en el texto, luego compara las líneas de códigos con algunas expresiones regulares que ayudan a la sintaxis a resaltar la figura qué significan las palabras Por ejemplo, puede leer la palabra "función" o "int" como palabras reservadas, y reemplazarlos con el texto html:

<span class="reserved">function</span>, <span class="reserved"></span> 

suponiendo que tiene el css y desea que las palabras reservadas en rojo,

.reserved{ 
    color: #ff0000; 
} 

Este es el concepto básico y es posible que desee tomar ideas del geshi ya que puede ver la fuente.

+0

Lo siento, no aclare más. Estoy planeando implementar un editor de texto colaborativo en Adobe Flex. Lo que quiero es tener un TextArea o un componente de entrada de texto similar ... luego, a medida que el usuario escribe, por ejemplo, el código Java, el código que estaban escribiendo se volvería sintaxis resaltada. Al igual que cualquier IDE con resaltado de sintaxis. –

4

En StackOverflow podcast number 50 Steve Yegge habla un poco acerca de su proyecto para crear un mecanismo de resaltado general. No es un producto terminado y tal vez más sofisticado de lo que está buscando, pero podría haber algo de interés.

2

Desafortunadamente, nunca usé ActionScript, así que no puedo ayudar con esa parte.

Pero aparte de eso, un buen comienzo para escribir un resaltador de sintaxis sería observar los existentes. Por ejemplo, vim tiene archivos de sintaxis en forma de archivos de texto normales, por lo que puede verlos para empezar. Hay un montón de expresiones regulares allí (las expresiones regulares vienen en varios sabores, pero no son tan diferentes ...), por lo que para esa parte puede echar un vistazo a algún libro.

Personalmente, he encontrado que Beginning regular expressions es bueno. Mastering regular expressions también es bueno para temas más avanzados. Regular expressions pocket reference es bueno para determinar las diferencias en los sabores antes mencionados, ya que incluye un capítulo sobre la expresión regular de vim también.

2

Un buen comienzo para un enfoque para esto es la Udacity course CS262. El título es construir un navegador web, pero realmente la clase se enfoca exactamente en los problemas que está buscando: cómo analizar y leer un conjunto de texto. En tu caso, usarías esa información para resaltar. Lo tomé y fue muy bueno. El curso está "terminado" ahora, pero los videos y los problemas de práctica/tareas aún están disponibles para su visualización.

+0

gran curso, ty! – nimrod

2

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

Un highligher 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"); 
} 
Cuestiones relacionadas