Explication de base de Lark (faites un gars comme une coquille avec Python, Lark)

Premier

Je suis un débutant en programmation, et je suis un homme assez ignorant, donc je ne connais pas différents noms, et des expressions ambiguës telles que "*** na guy" sont utilisées, mais pardonnez-moi s'il vous plaît.

Choses à faire

Je veux faire un mec (je ne sais pas quoi dire) qui fonctionne comme une écriture bash! Alors je l'ai fait.

Le programme créé, par exemple, analyse et exécute le script suivant et renvoie le résultat.

rand -s3 a b c + say def | replace e E

(Le résultat sera, par exemple, b a cd Ef)

Dans cet article, je vais omettre le traitement spécifique et expliquer brièvement comment utiliser Lark.


Bibliothèque que vous utilisez Lark - a modern parsing library for Python


Créer un fichier de règles de grammaire

Commencez par créer un fichier texte décrivant les règles de grammaire à transmettre au générateur d'analyseur. Dans ce cas, script est un ou plusieurs blocs connectés par join. Un «morceau» est une ou plusieurs «phrases» reliées par un «tuyau» ... Je vais le décrire comme ça.

Grammar.lark


script : [chunk join] chunk

chunk : [(sentence pipe)+] sentence

sentence : command [space option] [(space arg)+] [/\n+/]

command : chars
        | ([chars] subshell [chars])+
option : "-" (chars|subshell)+
arg : chars
    | "'" allchars "'"
    | ([chars] subshell [chars])+

subshell : "(" script ")" [/\n+/]

chars : /[^\+\|\s\(\)']+/[/\n+/]
allchars : /[^']+/[/\n+/]
space : " "
join : [space] "+" [space]
pipe : [space] "|" [space]

Créer un analyseur

Comment créer un analyseur. Chargez simplement le fichier texte que vous venez de créer et transmettez-le à Lark.

Partie de création d'analyseur


from lark import Lark

with open("Grammar.lark",encoding="utf-8") as grammar:
    LP = Lark(grammar.read(),start="script")

Dans le deuxième argument start = de Lark (), écrivez le composant le plus extérieur (probablement).

Essayons d'analyser rand -s3 a b c + say def | replace e E avec cet analyseur. La méthode pretty () de l'arbre des résultats de l'analyse peut être utilisée pour la rendre plus lisible, alors utilisons-la.

Test analyseur


tree = LP.parse("rand -s3 a b c + say def | replace e E")
print(tree.pretty())

résultat


script
  chunk
    sentence
      command
        chars   ra
      space
      option
        chars   s3
      space
      arg
        chars   a
      space
      arg
        chars   b
      space
      arg
        chars   c
  join
    space
    space
  chunk
    sentence
      command
        chars   sa
      space
      arg
        chars   de
    pipe
      space
      space
    sentence
      command
        chars   re
      space
      arg
        chars   e
      space
      arg
        chars   E

(Cela? "L'espace" est étrange? Je ne l'utilise pas pour le traitement ...)

Créer un transformateur

Maintenant, créons une partie qui exécute le traitement en fonction de l'état de l'arbre analysé.

Partie de création de transformateur


from lark import Transformer

class mytransformer(Transformer):
    def __init__(self): #Initialiser les variables à utiliser selon les besoins
        self.var1 = None
        self.var2 = []

    def sentence(self,tree): #Si vous prenez le deuxième argument, vous pouvez utiliser un arbre plus profond que la phrase!
        print("sentence") # example

    def command(self,tree):
        print("command")

    def option(self,tree):
        print("option")

Un traitement tel que «arg» et «bloc» est omis. «Phrase», «commande», «option», etc. définis dans «mytransformer» sont appelés ** avec priorité sur la profondeur **. Donc dans cet exemple Le traitement est effectué dans l'ordre de «commande» -> «option» -> «phrase».

Comment utiliser le transformateur

Comment utiliser le transformateur


tree = LP.parse("rand -s3 a b c + say def | replace e E")
mytransformer().transform(tree)

Utilisez-le comme ça.

finalement

Jusqu'à présent, j'ai brièvement expliqué à propos de Lark.

Puisque les débutants ont réussi à faire de leur mieux, je pense qu'il y a des erreurs. Si vous trouvez des erreurs, nous vous serions reconnaissants de bien vouloir commenter.

Recommended Posts

Explication de base de Lark (faites un gars comme une coquille avec Python, Lark)
[Python] Comment rendre une classe itérable
Je veux faire un jeu avec Python
Essayez de créer un code de "décryptage" en Python
Essayez de créer un groupe de dièdre avec Python
Essayez de créer un module Python en langage C
Faisons un outil de veille de commande avec python
Comment créer un package Python à l'aide de VS Code
[Python] Je veux faire d'une liste imbriquée un taple
Bases de PyTorch (2) -Comment créer un réseau de neurones-
Une route vers Python intermédiaire
Créer un bookmarklet en Python
Faites une loterie avec Python
[Python] Comment créer une liste de chaînes de caractères caractère par caractère
Expérimentez pour créer un PDF indépendant pour Kindle avec Python
Les bases de l'apprentissage Python ~ Comment générer (afficher) une chaîne de caractères ~
J'ai fait un chronomètre en utilisant tkinter avec python
Je veux ajouter un joli complément à input () en python
Comment faire une traduction japonais-anglais
Faisons une interface graphique avec python.
Comment créer un bot slack
Comment créer un robot - Avancé
Comment créer une fonction récursive
python / Créer un dict à partir d'une liste.
[Python] Faire de la fonction une fonction lambda
Créer un système de recommandation avec python
[Blender] Comment créer un plug-in Blender
5 façons de créer un chatbot Python
Comment créer un robot - Basic
[5e] J'ai essayé de créer un certain outil de type Authenticator avec python
Rubyist a essayé de créer une API simple avec Python + bouteille + MySQL
[2nd] J'ai essayé de créer un certain outil de type Authenticator avec python
Comment transformer une chaîne en tableau ou un tableau en chaîne en Python
J'ai essayé de créer une expression régulière de "montant" en utilisant Python
[Python] J'ai essayé d'implémenter un tri stable, alors notez
J'ai essayé de créer une expression régulière de "temps" en utilisant Python
[3ème] J'ai essayé de créer un certain outil de type Authenticator avec python
Comment créer une caméra de surveillance (caméra de sécurité) avec Opencv et Python
Essayez de créer un type de service Web avec un langage de balisage 3D
J'ai essayé de faire un processus d'exécution périodique avec Selenium et Python
J'ai essayé de créer une application de notification de publication à 2 canaux avec Python
Faire une demande de Device Farm (appium python) à API Gateway
[Introduction] Je veux créer un robot Mastodon avec Python! 【Débutants】
J'ai essayé de créer une application todo en utilisant une bouteille avec python
[Python] Comment créer une matrice de motifs répétitifs (repmat / tile)
2.Faites un arbre de décision à partir de 0 avec Python et comprenez-le (2. Bases du programme Python)
Les bases de Python ⑤
Faisons un jeu de shiritori avec Python
Conseils pour faciliter la lecture des documents d'audition Python
Les débutants en Python ont décidé de créer un bot LINE avec Flask (commentaire approximatif de Flask)
[Python] Comment convertir une liste bidimensionnelle en liste unidimensionnelle
Les bases de Python ④
Super Introduction Arithmétique Bit Python
Créer un diagramme de relations des modules Python
Essayez de créer un logiciel de capture aussi précis que possible avec python (2)
Fractal pour faire et jouer avec Python