2010-04-17 31 views
10

Me estoy embarcando en algo de aprendizaje y quiero escribir mi propio resaltado de sintaxis para archivos en C++.¿Cómo se implementa el resaltado de sintaxis?

¿Alguien me puede dar ideas sobre cómo hacer esto?

Me parece que cuando se abre un archivo: Tendría que ser analizado y decidido qué tipo de fuente de archivo es

  1. . Confiar en la extensión no podría ser a prueba de tontos

  2. Una manera de saber qué/aplican palabras clave comandos de idioma

  3. Una manera de decidir qué color de cada palabra clave/comando obtiene

I quiero hacer esto en OS X, usando C++ u Objective-C.

¿Alguien puede dar consejos sobre cómo podría comenzar con esto?

Respuesta

1

Suponiendo que está utilizando estructuras Cocoa, puede usar las UTI para determinar el tipo de archivo.

Para una visión general de la API:

http://developer.apple.com/mac/library/documentation/FileManagement/Conceptual/understanding_utis/understand_utis_intro/understand_utis_intro.html#//apple_ref/doc/uid/TP40001319-CH201-SW1

Para obtener una lista de las infecciones urinarias conocido:

http://developer.apple.com/mac/library/documentation/Miscellaneous/Reference/UTIRef/Articles/System-DeclaredUniformTypeIdentifiers.html#//apple_ref/doc/uid/TP40009259-SW1

Las dos claves son probablemente los más interesados ​​en que sería kUTTypeObjectiveC PlusPlusSource y kUTTypeCPlusPlusHeader.

Para el resaltando que puede encontrar la información de esta página útil, ya que analiza resaltado de sintaxis con un NSView y atributos temporales:

http://www.cocoadev.com/index.pl?ImplementSyntaxHighlightingUsingTemporaryAttributes

1

Creo que (1) no es posible, ya que la única manera de saber si un archivo es válido C++ es ejecutarlo a través de un analizador de C++ y ver si lo analiza ... pero si lo utilizó como estándar , no podría operar en un código que no compila porque es un trabajo en progreso, que probablemente quiera hacer. Probablemente sea mejor simplemente confiar en la extensión, ya que no creo que ningún otro método funcione mejor que eso.

Usted puede obtener una lista de palabras clave de C++ aquí: http://www.cppreference.com/wiki/keywords/start

Los colores son de usted (o si lo desea, puede hacer que se configurable y dejar la elección para el usuario)

12

resaltado de sintaxis por lo general, no va más allá del análisis léxico, lo que significa que no tiene que analizar todo el lenguaje en declaraciones y declaraciones y expresiones y otras cosas. Solo tiene que escribir un lexer, que es bastante fácil con expresiones regulares. Te recomiendo que comiences aprendiendo expresiones regulares, si es que aún no lo has hecho. Tomará todos los 30 minutos.

Es posible que desee considerar jugar con Flex (el generador de analizador léxico; https://github.com/westes/flex) como ejercicio de aprendizaje. Debería ser bastante fácil implementar un marcador de sintaxis básico en Flex que muestra HTML resaltado o algo así.

En resumen, le daría a Flex un conjunto de expresiones regulares y qué hacer con el texto coincidente, y el generador coincidirá avariciosamente con sus expresiones. Puede hacer su transición de lexer entre estados exclusivos (por ejemplo, dentro y fuera de literales de cadena, comentarios, etc.) como se muestra en the flex FAQ. Aquí hay un ejemplo canónico de un lexer para C escrito en Flex: http://www.lysator.liu.se/c/ANSI-C-grammar-l.html.

Hacer un resaltador de sintaxis extensible sería la siguiente parte de su viaje. Aunque de ninguna manera soy fanático de XML, observe cómo se definen los archivos de resaltado de sintaxis Kate, como this one for C++. Su tarea sería averiguar cómo quiere definir marcadores de sintaxis, luego crear un programa que use esas definiciones para generar HTML o lo que le plazca.

1

Es posible que desee ver cómo GeSHI implementa resaltado, etc. Además, tiene un montón de paquetes de idiomas que contienen todas las palabras clave que siempre desearás.