Lark grundlegende Erklärung (machen Sie einen Shell-ähnlichen Kerl mit Python, Lark)

Zuerst

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.

Dinge die zu tun sind

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 einer Grammatikregeldatei

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]

Parser erstellen

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

Transformator erstellen

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.

Schließlich

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

Lark grundlegende Erklärung (machen Sie einen Shell-ähnlichen Kerl mit Python, Lark)
[Python] Wie man eine Klasse iterierbar macht
Ich möchte ein Spiel mit Python machen
Versuchen Sie, in Python einen "Entschlüsselungs" -Code zu erstellen
Versuchen Sie, mit Python eine Diedergruppe zu bilden
Versuchen Sie, ein Python-Modul in C-Sprache zu erstellen
Lassen Sie uns ein Befehls-Standby-Tool mit Python erstellen
So erstellen Sie ein Python-Paket mit VS Code
[Python] Ich möchte aus einer verschachtelten Liste einen Taple machen
Grundlagen von PyTorch (2) - Wie erstelle ich ein neuronales Netzwerk?
Ein Weg zum mittleren Python
Erstellen Sie ein Lesezeichen in Python
Machen Sie eine Lotterie mit Python
[Python] So erstellen Sie eine Liste von Zeichenfolgen Zeichen für Zeichen
Experimentieren Sie mit Python, um ein PDF für Selbstversorger für Kindle zu erstellen
Grundlagen des Python-Lernens ~ Wie wird eine Zeichenkette ausgegeben (angezeigt)? ~
Ich habe eine Stoppuhr mit tkinter mit Python gemacht
Ich möchte eine schöne Ergänzung zu input () in Python hinzufügen
Wie erstelle ich eine japanisch-englische Übersetzung?
Lassen Sie uns eine GUI mit Python erstellen.
Wie man einen lockeren Bot macht
Wie erstelle ich einen Crawler?
So erstellen Sie eine rekursive Funktion
Python / Machen Sie ein Diktat aus einer Liste.
[Python] Machen Sie die Funktion zu einer Lambda-Funktion
Erstellen Sie ein Empfehlungssystem mit Python
[Blender] So erstellen Sie ein Blender-Plug-In
5 Möglichkeiten zum Erstellen eines Python-Chatbots
Wie erstelle ich einen Crawler?
[5.] Ich habe versucht, mit Python ein bestimmtes Authenticator-ähnliches Tool zu erstellen
Rubyist hat versucht, eine einfache API mit Python + Flasche + MySQL zu erstellen
[2nd] Ich habe versucht, mit Python ein bestimmtes Authenticator-ähnliches Tool zu erstellen
So machen Sie einen String in Python zu einem Array oder ein Array zu einem String
Ich habe versucht, mit Python einen regulären Ausdruck für "Betrag" zu erstellen
[Python] Ich habe versucht, eine stabile Sortierung zu implementieren
Ich habe versucht, mit Python einen regulären Ausdruck von "Zeit" zu erstellen
[3.] Ich habe versucht, mit Python ein bestimmtes Authenticator-ähnliches Tool zu erstellen
So erstellen Sie eine Überwachungskamera (Überwachungskamera) mit Opencv und Python
Versuchen Sie, einen Web-Service-ähnlichen Typ mit 3D-Markup-Sprache zu erstellen
Ich habe versucht, mit Selenium und Python einen regelmäßigen Ausführungsprozess durchzuführen
Ich habe versucht, mit Python eine 2-Kanal-Post-Benachrichtigungsanwendung zu erstellen
Stellen Sie eine Anfrage von der Gerätefarm (Appium Python) an das API-Gateway
[Einführung] Ich möchte mit Python einen Mastodon-Bot erstellen! 【Anfänger】
Ich habe versucht, eine ToDo-App mit einer Flasche mit Python zu erstellen
[Python] Wie erstelle ich eine Matrix aus sich wiederholenden Mustern (repmat / tile)
2. Erstellen Sie mit Python einen Entscheidungsbaum von 0 und verstehen Sie ihn (2. Grundlagen des Python-Programms)
Python-Grundlagen ⑤
Lassen Sie uns mit Python ein Shiritori-Spiel machen
Tipps, um das Lesen von Python-Hördokumenten zu vereinfachen
Python-Anfänger haben beschlossen, einen LINE-Bot mit Flask zu erstellen (Flask-Kommentar)
[Python] So konvertieren Sie eine zweidimensionale Liste in eine eindimensionale Liste
Python-Grundlagen ④
Python Bit Arithmetic Super Einführung
Erstellen Sie ein Beziehungsdiagramm von Python-Modulen
Versuchen Sie, mit Python (2) eine Erfassungssoftware zu erstellen, die so genau wie möglich ist.
Fraktal zum Erstellen und Spielen mit Python