Ich bin ein Anfänger in der Programmierung und ein ziemlich ignoranter Mann, daher kenne ich verschiedene Namen nicht und es werden mehrdeutige Ausdrücke wie "*** na guy" verwendet, aber bitte verzeihen Sie mir.
Ich möchte einen Typen machen (ich weiß nicht, was ich sagen soll), der auf eine bashartige Art zu schreiben funktioniert! Also habe ich es geschafft.
Das erstellte Programm analysiert und führt beispielsweise das folgende Skript aus und gibt das Ergebnis zurück.
rand -s3 a b c + say def | replace e E
(Das Ergebnis ist beispielsweise "b a cd Ef")
In diesem Artikel werde ich die spezifische Verarbeitung weglassen und kurz erklären, wie Lark verwendet wird.
Bibliothek, die Sie verwenden Lark - a modern parsing library for Python
Erstellen Sie zunächst eine Textdatei, die die Grammatikregeln beschreibt, die an den Parsergenerator übergeben werden sollen.
In diesem Fall,
script
ist ein oder mehrere Chunks, die durch
join` verbunden sind.
Ein "Chunk" ist ein oder mehrere "Sätze", die durch eine "Pipe" verbunden sind ...
Ich werde es so beschreiben.
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]
So erstellen Sie einen Parser. Laden Sie einfach die gerade erstellte Textdatei und übergeben Sie sie an Lark.
Parser-Erstellungsteil
from lark import Lark
with open("Grammar.lark",encoding="utf-8") as grammar:
LP = Lark(grammar.read(),start="script")
Schreiben Sie im zweiten Argument start =
von Lark ()
die äußerste Komponente (wahrscheinlich).
Versuchen wir, rand -s3 a b c + say def | ersetze e E
durch diesen Parser zu analysieren.
Sie können es mit hoher Lesbarkeit anzeigen, indem Sie die Methode "pretty ()" des Analyseergebnisbaums verwenden. Verwenden Sie es also.
Parser-Test
tree = LP.parse("rand -s3 a b c + say def | replace e E")
print(tree.pretty())
Ergebnis
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
(Das? Space
ist seltsam? Ich benutze es nicht für die Verarbeitung ...)
Erstellen wir nun ein Teil, das die Verarbeitung gemäß dem Status des analysierten Baums ausführt.
Transformatorerstellungsteil
from lark import Transformer
class mytransformer(Transformer):
def __init__(self): #Initialisieren Sie die zu verwendenden Variablen entsprechend
self.var1 = None
self.var2 = []
def sentence(self,tree): #Wenn Sie das zweite Argument verwenden, können Sie einen Baum verwenden, der tiefer als der Satz ist!
print("sentence") # example
def command(self,tree):
print("command")
def option(self,tree):
print("option")
Verarbeitung wie "arg" und "chunk" entfällt. "Satz", "Befehl", "Option" usw., die in "mytransformer" definiert sind, werden ** mit Priorität auf Tiefe ** genannt. Also in diesem Beispiel Die Verarbeitung erfolgt in der Reihenfolge "Befehl" -> "Option" -> "Satz".
Verwendung des Transformators
Verwendung des Transformators
tree = LP.parse("rand -s3 a b c + say def | replace e E")
mytransformer().transform(tree)
Verwenden Sie es so.
Bisher habe ich kurz über Lark erklärt.
Da die Anfänger ihr Bestes gegeben haben, gibt es meiner Meinung nach einige Fehler. Wenn Sie Fehler finden, würden wir uns freuen, wenn Sie einen Kommentar abgeben könnten.
Recommended Posts