L’analyse syntaxique est une technique séculaire utilisée pour analyser et extraire le sens des langages (à la fois naturels et de programmation). L’analyseur est un type de compilateur qui convertit le flux de texte en syntaxe ou en arbre d’analyse conforme à certaines règles de grammaire prédéfinies.
Il existe différentes classifications pour catégoriser ces techniques, et de nombreux contenus sont disponibles pour les expliquer. Donc, pour l’instant, je me concentre sur Grammaire des expressions de l’analyseur (qui est la recherche la plus récente sur la grammaire syntaxique). Aussi, je vais essayer d’expliquer les façons d’implémenter un analyseur PEG.
Qu’est-ce que la PEG (grammaire d’expression de l’analyseur syntaxique) ?
Parser Expression Grammar (PEG) est la grammaire formelle qui définit un ensemble de règles récursives dans la famille des langages d’analyse descendante. Ses analyseurs génèrent un arbre d’analyse explicitement unique pour toute entrée. Il est plus puissant que les expressions régulières mais peut avoir des inconvénients de performances liés à la mémoire et au temps dans quelques scénarios.
Avantages de l’utilisation des analyseurs PEG
Les analyseurs PEG présentent certains avantages par rapport aux autres types d’analyseurs. Plus particulièrement, ils sont sans ambiguïté car ils choisissent la première option parmi les choix. De plus, il est sans scanner, ce qui signifie qu’il ne nécessite pas de phase de lexification séparée. Cela facilite la mise en œuvre pour les besoins d’analyse dont la convivialité est inférieure à celle requise pour analyser une variété d’entrées dans un cas d’utilisation d’entreprise.
Comprendre la structure du PEG
Essayons de comprendre la structure PEG avec l’exemple de base suivant qui peut être utilisé pour analyser des expressions arithmétiques.
start
= additive
additive
= left:multiplicative "+" right:additive
/ multiplicative
multiplicative
= left:primary "*" right:multiplicative
/ primary
primary
= integer
/ "(" additive:additive ")"
integer "integer"
= digits:[0-9]+
Ici, toutes les règles sont récursives et descendent jusqu’aux littéraux ou aux classes de caractères avec des expressions régulières. Comme nous pouvons le voir, une expression « additive » est une extension d’une expression « multiplicative », et une expression « multiplicative » se développe en un littéral entier ou une expression additive imbriquée. Le littéral entier est une ou plusieurs occurrences de chiffres.
Démarrage rapide
Le moyen le plus rapide d’écrire ou de générer un analyseur PEG en javascript est d’utiliser pegjs. C’est la bibliothèque la plus populaire (selon GitHub) pour implémenter des analyseurs PEG. Vous pouvez vous référer à la documentation officielle pour les instructions d’installation. Il prend en charge les modes CLI et API pour générer l’analyseur.
Ligne de commande
pegjs -o arithmetics-parser.js arithmetics.pegjs
API JavaScript
var peg = require("pegjs");
var parser = peg.generate("start = ('a"https://dzone.com/"b')+");
Outil en ligne
En dehors de ces modes, un mode en ligne est disponible qui vous permet non seulement de valider votre grammaire, mais également de tester rapidement avec des exemples d’entrées. Une fois que vous avez terminé les tests, vous pouvez générer votre analyseur à la volée avec une vitesse ou une version optimisée pour le code.
Utilisation de l’analyseur
L’analyseur généré peut être utilisé dans les environnements de nœud et de navigateur. Vous pouvez appeler la méthode `parse` avec une entrée de test, et elle renverra soit un arbre d’analyse, soit une erreur (pour les entrées non valides).
parser.parse("abba"); // returns ["a", "b", "b", "a"]
parser.parse("abcd"); // throws an exception
Exemple de mise en œuvre
Il existe de nombreux outils et services qui l’utilisent d’une manière ou d’une autre. L’implémentation la plus avancée à ce jour est node-sql-parser (construite par Zhi Tao). Il s’agit d’un pool d’analyseurs pour divers langages de requête modernes pour des bases de données telles que BigQuery, Hive et Flink.