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 :

  1. lit la grammaire tree-sitter générée ;
  2. extrait mots-clés, opérateurs et terminaux ;
  3. ordonne les expressions régulières des formes spécifiques vers les formes générales ;
  4. 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.