2016-03-18 3 views
2

voir le titre. Pour un petit outil que j'écris, je voulais introduire un langage de filtre booléen simple et j'ai décidé de le faire "correctement" et d'utiliser un générateur d'analyseur syntaxique. Après avoir joué avec un peu de grako, j'ai trouvé que je l'aimais et que le langage de filtrage était assez rapide (ce qui est aussi agréable :))Est-il possible d'utiliser un parser généré avec grako sans grako?

Le problème est maintenant, si je veux utiliser l'outil sur d'autres ordinateurs ou donner Pour d'autres personnes, je dois d'abord rendre disponible grako, ce qui est un peu ennuyeux, car tout le reste est du matériel python3 standard. Je suppose que c'est possible en co-empaquetant les classes de grako nécessaires, mais cela semble un peu brouillon (l'autorisation serait mentionnée de quelque façon que ce soit). Peut-être que j'ai oublié une méthode intégrée.

+0

Parfois, les générateurs d'analyseurs syntaxiques sont trop puissants. Si vous voulez écrire un simple langage d'expression booléen, vous pouvez le faire très efficacement avec un analyseur de descente récursif écrit à la main et aucune dépendance de paquetage externe. Voir http://stackoverflow.com/questions/2245962/is-there-an-alternative-for-flex-bison-that-is-usus-on-8-bit-embedded-systems/2336769#2336769 –

+0

Thx pour le allusion. Je suis d'accord, utiliser un générateur pour cela était peut-être un peu exagéré, mais c'est juste un "pour le fun" et tout ce que j'ai fait, c'est parce que je n'en ai pas joué depuis longtemps ;-) – mageta

Répondre

1

La réponse courte est No.

Les analyseurs générés par Grako nécessitent la bibliothèque grako.

Par exemple:

with self._group(): 
    with self._choice(): 
     with self._option(): 
      self._token('nameguard') 
     with self._option(): 
      self._token('ignorecase') 
     with self._option(): 
      self._token('left_recursion') 
     self._error('expecting one of: ignorecase left_recursion nameguard') 

Tous les self._xyz() proviennent soit grako.contexts.ParseContext ou grako.parsing.Parser. Le backtracking, la mise en cache et la tenue de livres sont cachés derrière les gestionnaires de contexte et les décorateurs. Avoir généré des analyseurs dépendait de grako était un choix de conception visant à rendre les analyseurs plus petits et plus faciles à comprendre, ce qui était l'un des principaux objectifs du projet (comme il existe de nombreux autres générateurs d'analyseurs syntaxiques qui produisent du code obfusqué) .

L'autre option consistait à copier le code sur lequel les analyseurs générés pouvaient dépendre de chaque analyseur, mais cela semblait un peu paradoxal.

+1

Clarification: Il n'est pas nécessaire d'apprendre la bibliothèque Grako pour construire des parsers ou des traducteurs: Le README est suffisant. MAIS ... pour traiter des langages sources ou cibles complexes, il est préférable que les utilitaires étudient ce que la bibliothèque Grako fournit à cet égard, ou trouvent d'autres sources pour l'équivalent ou mieux. – Apalala