Pegjs: [Exploit. Req.] Inverser le processus d'analyse

Créé le 17 mai 2018  ·  13Commentaires  ·  Source: pegjs/pegjs

Type de probleme

  • Rapport de bogue : non
  • Demande de fonctionnalité : Oui
  • Question : Oui
  • Pas de problème : Non

Conditions préalables

  • Pouvez-vous reproduire le problème ? : Oui
  • Avez-vous recherché les problèmes de référentiel ? : Oui
  • Avez-vous vérifié les forums ? : Quels forums ?
  • Avez-vous effectué une recherche sur le Web (google, yahoo, etc.) ? : Oui !

La description

Inverser la progression de l'analyse serait génial.

Comportement prévisible:

Remettre un objet au format qui a été analysé.

Comportement réel :

Je ne peux qu'analyser le format, pas remettre l'objet au format analysé.

discussion feature task

Commentaire le plus utile

Salut. Je ne comprends pas le but et le contexte (pourquoi) de votre demande. Un échantillon concret pourrait aider.

L'analyse reconnaît une chaîne comme faisant partie d'un langage et, éventuellement, construit un AST ou évalue (interprète) une expression sous la forme : parse(text) --> result
Cette fonction _parse()_, en général, n'est pas garantie d'être une fonction bijective. Par conséquent, il n'y a aucune garantie que vous puissiez inverser l'analyse, car vous pouvez supprimer des détails pendant l'analyse, par exemple.

Étant donné un AST, vous pouvez générer des expressions en texte correspondant à une langue. Cela se fait dans le cadre de la génération de code et vous pouvez utiliser des moteurs de modèles pour transformer les AST en code source. Mais cette tâche est hors de portée d'une bibliothèque d'analyse.

Tous les 13 commentaires

Salut. Je ne comprends pas le but et le contexte (pourquoi) de votre demande. Un échantillon concret pourrait aider.

L'analyse reconnaît une chaîne comme faisant partie d'un langage et, éventuellement, construit un AST ou évalue (interprète) une expression sous la forme : parse(text) --> result
Cette fonction _parse()_, en général, n'est pas garantie d'être une fonction bijective. Par conséquent, il n'y a aucune garantie que vous puissiez inverser l'analyse, car vous pouvez supprimer des détails pendant l'analyse, par exemple.

Étant donné un AST, vous pouvez générer des expressions en texte correspondant à une langue. Cela se fait dans le cadre de la génération de code et vous pouvez utiliser des moteurs de modèles pour transformer les AST en code source. Mais cette tâche est hors de portée d'une bibliothèque d'analyse.

Bien que personnellement, je comprenne le sentiment de vouloir que le logiciel soit capable de générer ce qu'il peut analyser, comme l' a résumé sort du cadre de cette bibliothèque (générateur d'analyseur), donc je vais fermer ceci.

Je vous suggère de créer votre propre générateur de code, en utilisant un générateur existant pour la langue que vous analysez (vous devrez vous assurer que l'AST est correct).

Ce billet a beaucoup de sens. À quelle autre bibliothèque vous attendriez-vous pour convertir les AST en code source compte tenu de la grammaire de la syntaxe PEG.js ? Oui, actuellement il n'y a aucun moyen de le faire. La plupart des AST sont générés dans les actions, et il est impossible de les annuler. Mais lorsqu'il y a une syntaxe pour la génération AST dont nous avons parlé dans un autre numéro, cela a soudainement non seulement du sens, mais est également possible à implémenter.

StringTemplate , par exemple, est l'un des nombreux outils que vous pouvez utiliser pour une telle tâche : code-gen à partir des AST.

Je ne pense pas que StringTemplate lit les grammaires dans la syntaxe PEG.js.

Le contexte:

Pour revenir au texte d' origine une AST (A bstract S yntax T REE) ne serait pas suffisante. Par exemple, étant donné une grammaire JavaScript, ces deux déclarations
auraient normalement le même AST même si leur syntaxe est légèrement différente,

// statement 1
var x = 5

// statement 2 - with semicolon
var x = 5;

Pour pouvoir revenir au texte d' origine, les actions de l'analyseur doivent être une fonction injective .

Suggestions:

Personnellement, je ne vois pas comment une telle fonctionnalité peut faire partie d'une bibliothèque d'analyse
qui s'appuie sur les actions des utilisateurs intégrés pour créer la structure de sortie.

Peut-être qu'à l'avenir si pegjs aurait une sorte de création automatique d' arbre d'analyse
ce serait faisable.

Construit le tien

En supposant qu'à l'intérieur des actions intégrées de pegjs, les informations de position complètes soient disponibles
vous pouvez insérer vos propres actions intégrées personnalisées pour créer un CST / ParseTree
et ne le transformez en AST que dans une phase de post-analyse.
Une fois que vous avez un CST, recréer l'entrée d'origine est assez trivial...

Évaluer une bibliothèque d'analyse avec la création automatique de CST / Parse Tree

Vous pouvez trouver plusieurs candidats ici :
https://tomassetti.me/parsing-in-javascript/

J'ai décidé de revoir cela, mais cela devra être post-v1 avant de pouvoir être implémenté car ce sera le point où l'API sera stable et je pourrai publier un package qui offre une structure AST commune de base ( par exemple @pegjs/ast ?). Ce package pourrait être utilisé par les développeurs d'analyseurs pour dériver leur propre AST et, si nécessaire, peut être utilisé pour le traduire vers la source par un autre outil (je pense à @pegjs/reverse )

@futagoza comment ça se passe avec ça ?

@Coffee2CodeNL pegjs v1 n'est pas encore sorti.

Prenez cet analyseur de transformation SVG dans PEGJS par exemple : https://github.com/nidu/svg-transform-parser
Ce serait fantastique de pouvoir inverser le processus et transformer l'AST en chaîne,
ainsi les transformations SVG peuvent être facilement modifiées, pas seulement analysées.
Un tel outil qui est similaire est Augeas .

Quelqu'un peut-il recommander des outils pour générer du code à partir d'AST ?

@lzane Quel AST ?

@polkovnikov-ph certains AST personnalisés générés par PEG

Existe-t-il un outil qui lit la grammaire PEG peut faire le travail de génération de code ?

Cette page vous a été utile?
0 / 5 - 0 notes