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.
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
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]
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 ...)
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.
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