2010-04-17 7 views
10

Je commence un peu d'apprentissage et je veux écrire ma propre coloration syntaxique pour les fichiers en C++.Comment implémentez-vous la coloration syntaxique?

Quelqu'un peut-il me donner des idées sur la façon de s'y prendre?

Pour moi, il semble que lorsqu'un fichier est ouvert:

  1. Il devrait être analysé et décidé quel type de fichier de source, il est. Faire confiance à l'extension pourrait ne pas être infaillible

  2. Une façon de savoir quels mots-clés/commandes appliquent à ce que la langue

  3. Une façon de décider quelle couleur chaque mot clé/commande obtient

I vouloir faire cela sur OS X, en utilisant C++ ou Objective-C.

Quelqu'un peut-il fournir des pointeurs sur la façon dont je pourrais commencer avec cela?

Répondre

1

En supposant que vous utilisez des frameworks Cocoa, vous pouvez utiliser UTIs pour déterminer le type de fichier.

Pour un aperçu de l'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

Pour une liste de problèmes connus IVU:

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

Les deux clés sont probablement vous plus intéressé serait kUTTypeObjectiveC PlusPlusSource et kUTTypeCPlusPlusHeader.

Pour vous trouverez peut-être mettre en évidence les informations sur cette page utile car il traite de la coloration syntaxique avec un NSView et attributs temporaires:

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

1

Je pense (1) n'est pas possible, puisque la seule façon de dire si un fichier est valide C++ est de le faire passer par un analyseur C++ et de voir s'il analyse ... mais si vous l'utilisiez comme standard , vous ne pouvez pas utiliser de code qui ne compile pas parce que c'est un travail en cours, ce que vous voulez probablement faire. Il est probablement préférable de simplement faire confiance à l'extension, car je ne pense pas que toute autre méthode fonctionnera mieux que cela.

Vous pouvez obtenir une liste des mots-clés C ici: http://www.cppreference.com/wiki/keywords/start

Les couleurs sont à vous (ou si vous voulez, vous pouvez les faire configurable et laisser le choix à l'utilisateur)

12

Syntaxe surligneurs typiquement, ne va pas au-delà de l'analyse lexicale, ce qui signifie que vous n'avez pas à analyser toute la langue en déclarations, déclarations et expressions, et ainsi de suite. Il suffit d'écrire un lexer, ce qui est assez facile avec les expressions régulières. Je vous recommande de commencer par apprendre des expressions régulières, si ce n'est déjà fait. Ça va prendre 30 minutes.

Vous pouvez envisager de jouer avec Flex (le générateur d'analyseur lexical: https://github.com/westes/flex) en tant qu'exercice d'apprentissage. Il devrait être assez facile d'implémenter un surligneur de syntaxe de base dans Flex qui affiche du HTML en surbrillance ou quelque chose. En bref, vous donneriez à Flex un ensemble d'expressions régulières et que faire avec le texte correspondant, et le générateur se mettrait en correspondance avec vos expressions. Vous pouvez effectuer votre transition lexer entre des états exclusifs (par exemple, dans et hors des littéraux de chaîne, des commentaires, etc.) comme indiqué dans the flex FAQ. Voici un exemple canonique d'un lexer pour C écrit en Flex: http://www.lysator.liu.se/c/ANSI-C-grammar-l.html. Faire un surligneur syntaxique extensible serait la prochaine étape de votre voyage.

Bien que je ne suis en aucun cas un fan de XML, jetez un oeil à la façon dont les fichiers de mise en évidence de la syntaxe de Kate sont définis, tels que this one for C++. Votre tâche consistera à comprendre comment vous voulez définir les surligneurs de syntaxe, puis créez un programme qui utilise ces définitions pour générer du HTML ou ce que vous voulez.

1

Vous voudrez peut-être regarder comment GeSHI implémente la mise en surbrillance, etc. En outre, il a tout un tas de packs de langue qui contiennent tous les mots-clés que vous voulez.