2 points par GN⁺ 2024-11-09 | 1 commentaires | Partager sur WhatsApp

Macros

  • Les macros de Rust sont utilisées pour éliminer la duplication de code et réduire les répétitions.
  • Les nœuds de phrase de sqleibniz doivent implémenter le trait Node, ce qui entraîne beaucoup de duplication de code.
  • Les macros permettent d’automatiser la définition des structures et l’implémentation du trait Node.

Macro pour éliminer la duplication de code

  • La macro définit des structures, ajoute des commentaires de documentation et implémente les fonctions nécessaires pour satisfaire le trait Node.
  • La macro peut ajouter divers champs grâce à des définitions répétitives de métavariables.

Tests

  • En Rust, il est possible de mettre en place une approche similaire aux tests tabulaires de Go.
  • Les macros test_group_pass_assert! et test_group_fail! permettent de tester différents couples d’entrées et de sorties attendues.

Tests du parseur

  • Le module du parseur utilise lui aussi des macros similaires pour tester les résultats des instructions SQL.
  • La fonction sql_stmt_prefix est utilisée pour tester l’instruction SQL EXPLAIN.

Inconvénients des macros

  • rust-analyzer fonctionne mal à l’intérieur des macros et la documentation est insuffisante.

Correspondance de caractères

  • La macro matches! de Rust permet de comparer facilement des caractères.
  • Un exemple montre comment vérifier si un caractère donné est un chiffre SQLite.

Correspondance de tokens

  • Une fois que le lexer a converti un flux de caractères en flux de tokens, le parseur l’utilise pour générer un arbre syntaxique.
  • Une instruction match est utilisée pour reconnaître les types de tokens.

Affichage des erreurs

  • La gestion des erreurs permet de fournir à l’utilisateur des messages d’erreur clairs.

Fonctionnalités optionnelles

  • Le type Option de Rust permet de vérifier si une valeur existe, de tester des conditions ou de fournir une valeur par défaut.
  • Des méthodes comme is_some_and, map et map_or améliorent la lisibilité du code.

Itérateurs

  • Les itérateurs de Rust servent à filtrer les caractères et à les traiter conformément aux règles d’analyse des nombres de SQLite.

1 commentaires

 
GN⁺ 2024-11-09
Commentaire Hacker News
  • À cause du borrow checker de Rust et des difficultés liées à la gestion mémoire, certains ont eu du mal à utiliser Rust. Ils appréciaient ses aspects de programmation fonctionnelle (FP), mais ont finalement décidé de chercher un autre langage. Ils ont découvert OCaml et s’en sont dits satisfaits

  • L’auteur semble manquer d’expérience avec Rust et les idées de PL. Il serait probablement plus simple de définir l’AST avec des types de données algébriques. Les macros fonctionnent différemment dans la plupart des langages, mais servent surtout à éliminer la duplication de code et à réduire les répétitions

  • Un parseur écrit en Haskell se distingue par sa simplicité et sa lisibilité. Il se lit presque comme du BNF, avec très peu de procédure technique, ce qui permet de se concentrer sur la grammaire elle-même

  • Certains ont écrit des parseurs avec Ragel, Go, Java, C++, et C. Écrire un parseur JSON en C peut être plus simple que du code Rust. L’infrastructure des parseurs a évolué jusqu’à un point où l’on peut construire des parseurs en eBNF

  • Certains ont écrit un désassembleur et un émulateur eBPF en Rust, et estiment que Rust convient bien aux tâches de parsing. En revanche, l’usage des macros donne une impression différente du travail habituel dans le langage

  • Certains apprécient la conférence de Rob Pike sur le lexical scanning en Go. L’approche est pédagogique et élégante

  • En utilisant une bibliothèque de parser combinators, on peut déployer des parseurs de protocole hautes performances dans des environnements embarqués. La même bibliothèque peut aussi servir à écrire des parseurs de protocole embarqués

  • En Rust, il a été difficile d’exprimer la hiérarchie de types AST concrète lors de l’écriture d’un parseur AST complet. Il a fallu recourir à des astuces de typage étranges et à des macros

  • Parser la syntaxe de sqlite est une tâche difficile. sqlite est une source d’inspiration. Les diagrammes railroad sont très utiles, et le générateur de parseur Lemon n’est pas assez reconnu

  • Les langages avec des types de données algébriques sont bien adaptés au parsing de la syntaxe de sqlite. TypeScript peut aussi être un bon choix. Certains ont rédigé une brève introduction à la manière d’écrire un parseur en Rust