Lexer Pygments
catnip.tools.pygments.CatnipLexer colore le code Catnip dans les outils qui acceptent une instance de lexer Pygments.
Le fichier catnip/tools/pygments.py est généré depuis la grammaire tree-sitter : il ne se modifie pas manuellement.
Utilisation programmatique
from pygments import highlight
from pygments.formatters import HtmlFormatter, TerminalFormatter
from catnip.tools.pygments import CatnipLexer
code = 'numbers = list(1, 2, 3).[if > 1]'
terminal = highlight(code, CatnipLexer(), TerminalFormatter())
html = highlight(code, CatnipLexer(), HtmlFormatter(full=True))
Le package ne déclare actuellement pas d'entry point Pygments global. La commande pygmentize -l catnip n'est donc pas
un contrat d'installation ; les intégrations doivent importer CatnipLexer ou enregistrer explicitement le lexer.
Tokens reconnus
| Catégorie Catnip | Token Pygments |
|---|---|
| commentaires | Comment.Single |
mots-clés de contrôle et pragma |
Keyword |
True, False, None |
Keyword.Constant |
list, dict, set, tuple |
Keyword.Type |
| strings, f-strings et strings triples | String |
entiers, flottants et bases 0b/0o/0x |
types Number.* correspondants |
| opérateurs | Operator |
| délimiteurs et ponctuation | Punctuation |
| autres identifiants | Name |
Le lexer est syntaxique : il ne résout ni les scopes, ni la différence entre fonction et variable. Le linter et le LSP portent les diagnostics qui nécessitent cette information.
Broadcasting
Le lexer possède un état dédié après .[ et revient à l'état racine au premier ] :
data.[{ if x > 10 { [x, y] } else { [0, 0] } }]
Cet état ne compte pas les crochets imbriqués. Une liste ou une f-string complexe dans le broadcast peut donc faire revenir la coloration à l'état racine avant la fin de l'expression, sans modifier le parsing ni l'exécution.
Le lexer change d'état quand le code lui annonce qu'il change de dimension. L'information voyage dans les deux sens, mais uniquement jusqu'au prochain crochet.
Régénération
Après une modification de catnip_grammar/grammar.js :
make grammar-deps
Cette commande régénère le parser et synchronise les artefacts Pygments, VSCode et CodeMirror. Pour ne mettre à jour que le lexer pendant une investigation :
python -m catnip.tools.extract_grammar --update-lexer
Le générateur :
- lit la grammaire tree-sitter générée ;
- extrait mots-clés, opérateurs et terminaux ;
- ordonne les expressions régulières des formes spécifiques vers les formes générales ;
- réécrit
catnip/tools/pygments.py.
Autres éditeurs
Pygments ne fournit pas directement la coloration de GitHub/GitLab, VSCode, Vim, Emacs ou CodeMirror. Ces outils utilisent respectivement leurs propres grammaires ou extensions. Le lexer peut servir de référence, mais les artefacts générés dédiés restent les sources adaptées à chaque intégration.
Un lexer généré depuis la grammaire décrit le langage avec une copie calculée de sa propre source de vérité. La copie est fiable tant que personne ne décide de la corriger à la main.