examples/tools/extract_grammar_demo.py
#!/usr/bin/env python3
"""
Démonstration de l'utilisation de catnip.tools.extract_grammar.
Ce module montre comment utiliser l'extracteur de grammaire pour :
- Extraire les keywords, operators, terminaux et règles
- Exporter en JSON
- Générer un lexer Pygments à jour
"""
from pathlib import Path
from catnip.tools.extract_grammar import GrammarExtractor
def main():
print("=" * 80)
print("DÉMONSTRATION: catnip.tools.extract_grammar")
print("=" * 80)
print()
# Initialisation de l'extracteur
extractor = GrammarExtractor()
print(f"Grammaire chargée depuis: {extractor.grammar_path}")
print()
# Extraction des keywords
print("1. EXTRACTION DES KEYWORDS")
print("-" * 80)
keywords = extractor.extract_keywords()
print(f"Control flow: {', '.join(keywords['control_flow'])}")
print(f"Constants: {', '.join(keywords['constants'])}")
print(f"Types: {', '.join(keywords['types'])}")
print()
# Extraction des operators
print("2. EXTRACTION DES OPERATORS")
print("-" * 80)
operators = extractor.extract_operators()
print(f"Arithmetic: {', '.join(operators['arithmetic'])}")
print(f"Comparison: {', '.join(operators['comparison'])}")
print(f"Bitwise: {', '.join(operators['bitwise'])}")
print(f"Logical: {', '.join(operators['logical'])}")
print(f"Special: {', '.join(operators['special'])}")
print()
# Extraction des terminaux
print("3. EXTRACTION DES TERMINAUX")
print("-" * 80)
terminals = extractor.extract_terminals()
print(f"Total terminaux: {len(terminals)}")
print("Exemples:")
for term in terminals[:5]:
pattern = term['pattern'][:50] + "…" if len(term['pattern']) > 50 else term['pattern']
print(f" {term['name']:20} {pattern}")
print()
# Extraction des règles
print("4. EXTRACTION DES RÈGLES")
print("-" * 80)
rules = extractor.extract_rules()
print(f"Total règles: {len(rules)}")
print("Exemples:")
for rule in rules[:5]:
expansion = ' '.join(rule['expansion'][:5])
if len(rule['expansion']) > 5:
expansion += " …"
print(f" {rule['name']:20} → {expansion}")
print()
# Export JSON
print("5. EXPORT JSON")
print("-" * 80)
output_json = Path("/tmp/catnip_grammar_demo.json")
extractor.to_json(output_json)
print(f"JSON exporté vers: {output_json}")
print(f"Taille: {output_json.stat().st_size} bytes")
print()
# Génération lexer Pygments
print("6. GÉNÉRATION LEXER PYGMENTS")
print("-" * 80)
output_lexer = Path("/tmp/catnip_lexer_demo.py")
extractor.generate_pygments_lexer(output_lexer)
print(f"Lexer Pygments généré: {output_lexer}")
print(f"Taille: {output_lexer.stat().st_size} bytes")
print()
# Extraction complète
print("7. EXTRACTION COMPLÈTE")
print("-" * 80)
all_data = extractor.extract_all()
print("Structure complète:")
print(f" - keywords: {len(all_data['keywords']['all'])} entrées")
print(f" - operators: {len(all_data['operators']['all'])} entrées")
print(f" - terminals: {len(all_data['terminals'])} entrées")
print(f" - rules: {len(all_data['rules'])} entrées")
print(f" - metadata: {all_data['metadata']}")
print()
print("=" * 80)
print("Démonstration terminée!")
print("=" * 80)
if __name__ == "__main__":
main()