[JAVA] Mach eine Sprache! (Einen einfachen Taschenrechner machen ①)

Letztes Mal Mach eine Sprache! (Java CC-Umgebungskonstruktion) hat die Java CC-Entwicklungsumgebung vorbereitet. Dieses Mal erstellen wir einen einfachen Taschenrechner und lernen, wie man Java CC verwendet.

Wie Java CC funktioniert

image.png

Wenn Sie eine JJT-Datei erstellen, generiert Java CC einen Java-Parser für Sie. Eine JJT-Datei ist eine Datei, die die Phrasenanalyse und die Syntaxanalyse definiert.

Verarbeitungsablauf für Interpreter und Compiler

  1. Vorverarbeitung (Quelldateien sofort ersetzen, ausgelassene Beschreibungen vervollständigen usw.)
  2. Phrasenanalyse (trennen Sie den Quellcode in geeignete Phrasen.)
  3. Syntaxanalyse (Generieren Sie einen Syntaxbaum basierend auf der Phrase.)
  4. Semantische Analyse (Interpretieren Sie die Bedeutung des Syntaxbaums. Er wird je nach Interpreter ausgeführt.)
  5. Erzeugung von Maschinensprache und Bytecode
  6. Maschine oder VM führt Code aus

image.png

Dieses Mal konzentrieren wir uns auf die Phrasenanalyse, Syntaxanalyse und semantische Analyse (Ausführung des Syntaxbaums).

Formale Darstellung der Sprache

Bevor wir Java CC verwenden, bereiten wir uns zunächst auf die Sprache vor. Überlegen Sie, wie Sie die Sprache beschreiben und richtig analysieren können.

BNF BNF ist eine Sprache zur Definition der Grammatik einer Sprache. Es wird in einem Format beschrieben, in dem die linke Seite durch die rechte Seite definiert ist. Es gibt verschiedene Möglichkeiten, BNF zu beschreiben, aber dieses Mal werden wir BNF in einem regulären Ausdrucksstil gemäß Java CC beschreiben. Die Bequemlichkeit der Beschreibung scheint genauso groß zu sein wie die erweiterte BNF (extendes BNF).

Die wichtigsten verwendeten Symbole sind wie folgt.

Symbol Bedeutung Beispiel
::= Definieren Sie die linke Seite mit der rechten Seite ::= <加算Formel>
() ()Gruppierung im Inneren. ("+" | "-")
<xxx> Nicht abschließendes Symbol. Abstrakte Ausdrücke und Sätze sind nicht endständig.
"xxx" Kündigungssymbol. Wenn es um bestimmte Buchstaben und Zahlen geht, endet es. "1"
* Wiederholen Sie dies unmittelbar vor 0 Mal oder öfter ("1" | "2")*
+ Wiederholen Sie unmittelbar vor einmal oder mehrmals ("1" | "2")+
| Repräsentiert oder "1" | "2"

Lassen Sie uns von nun an über die folgende einfache Formel nachdenken.

BNF mit einer einfachen Formel


<Formel> ::= <加算Formel>
<Additionsformel> ::= <Multiplikationsformel> ( <Additionsoperator> <Multiplikationsformel> )*
<Multiplikationsformel> ::= <Einzelter Begriff> ( <Operator multiplizieren> <Einzelter Begriff> )*
<Einzelter Begriff> ::= <Halterung öffnen> <Formel> <Verschlusshalterung> | <Dezimaldarstellung>

<Additionsoperator> ::= "+" | "-"
<Operator multiplizieren> ::= "*" | "/" | "%"
<Halterung öffnen> ::= "("
<Verschlusshalterung> ::= ")"
<Dezimaldarstellung> ::= (<Zahlen>)+ ("." (<Zahlen>)+)?
<Zahlen> ::= "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" | "0"

Lassen Sie uns diese BNF überprüfen. Zum Beispiel die Formel "10 * 20 * (30 + 40)"

<Formel>
→ <Additionsformel>
→ <Multiplikationsformel> ( <Additionsoperator> <Multiplikationsformel> )*
→ <Multiplikationsformel>
→ <Einzelter Begriff> ( <Operator multiplizieren> <Einzelter Begriff> )*
→ <Einzelter Begriff> <Operator multiplizieren> <Einzelter Begriff> <Operator multiplizieren> <Einzelter Begriff>
→ <Dezimaldarstellung> <Operator multiplizieren> <Einzelter Begriff> <Operator multiplizieren> <Einzelter Begriff>
→ (<Zahlen>)+ ("." (<Zahlen>)+)? <Operator multiplizieren> <Einzelter Begriff> <Operator multiplizieren> <Einzelter Begriff>
→ <Zahlen> <Zahlen> <Operator multiplizieren> <Einzelter Begriff> <Operator multiplizieren> <Einzelter Begriff>
→ 10 <Operator multiplizieren> <Einzelter Begriff> <Operator multiplizieren> <Einzelter Begriff>
→ 10 * <Einzelter Begriff> <Operator multiplizieren> <Einzelter Begriff>
→ ...
→ 10 * 20 * <Einzelter Begriff>
→ 10 * 20 * <Halterung öffnen> <Formel> <Verschlusshalterung>
→ 10 * 20 * ( <Formel> <Verschlusshalterung>
→ 10 * 20 * ( <Additionsformel> <Verschlusshalterung>
→ 10 * 20 * ( <Multiplikationsformel> ( <Additionsoperator> <Multiplikationsformel> )* <Verschlusshalterung>
→ 10 * 20 * ( <Multiplikationsformel> <Additionsoperator> <Multiplikationsformel> <Verschlusshalterung>
→ ...
→ 10 * 20 * ( <Einzelter Begriff> <Additionsoperator> <Multiplikationsformel> <Verschlusshalterung>
→ ...
→ 10 * 20 * ( 30 <Additionsoperator> <Multiplikationsformel> <Verschlusshalterung>
→ ...
→ 10 * 20 * ( 30 + 40 )

Sie können sehen, dass es wie folgt abgeleitet werden kann.

Phrasenanalyse

Bei der Phrasenanalyse wird eine Liste von Zeichen mit geeigneten Trennzeichen getrennt. In BNF wird der Teil analysiert, der näher am Endsymbol liegt.

BNF-Phrasenanalyse Teil einer einfachen Formel


<Additionsoperator> ::= "+" | "-"
<Operator multiplizieren> ::= "*" | "/" | "%"
<Halterung öffnen> ::= "("
<Verschlusshalterung> ::= ")"
<Dezimaldarstellung> ::= (<Zahlen>)+ ("." (<Zahlen>)+)?
<Zahlen> ::= "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" | "0"

Zu diesem Zeitpunkt werden Zahlen, Dezimalausdrücke und Additionsoperatoren als Phrasentypen betrachtet. Als Bild ist es eine Arbeit, eine Reihe von Zeichenketten entsprechend zu unterteilen.

Parsing

Der aussagekräftigste Teil von BNF (der Teil, der zum Erstellen eines Syntaxbaums sinnvoll ist) wird in der Syntaxanalyse behandelt.

BNF-Syntaxanalyse Teil einer einfachen Formel


<Formel> ::= <加算Formel>
<Additionsformel> ::= <Multiplikationsformel> ( <Additionsoperator> <Multiplikationsformel> )*
<Multiplikationsformel> ::= <Einzelter Begriff> ( <Operator multiplizieren> <Einzelter Begriff> )*
<Einzelter Begriff> ::= <Halterung öffnen> <Formel> <Verschlusshalterung> | <Dezimaldarstellung>

Es ist eine Aufgabe, einen Baum zusammenzustellen, dessen Knoten die Wörter sind, die durch die Wortanalyse angemessen getrennt werden. Es gibt verschiedene Methoden zum Zusammenstellen dieses Baums, z. B. Aufwärtssyntaxanalyse und Abwärtssyntaxanalyse. Dieses Mal verwendet Java CC eine retrogressive Syntaxanalyse.

Rolle der Phrasenanalyse und Syntaxanalyse

Tatsächlich ist es schwierig, eine klare Grenze zwischen Syntaxanalyse und Phrasenanalyse zu ziehen. Wenn Sie beispielsweise am Anfang eines Ausdrucks mit einem einzelnen Begriff "+" oder "-" hinzufügen können, Es hängt davon ab, wie Sie es machen, ob Sie "+ 10" verwenden, um eine Phrase zu machen, oder es als zwei Phrasen behandeln, "-`" und "10". (In diesem Fall ist es jedoch besser, "+" und "-" als unterschiedliche Phrasen zu behandeln und sie in der Phase der syntaktischen Analyse beurteilen zu lassen, da es vom Kontext abhängt, ob es sich um einen neutralen Operator oder einen Präfixoperator handelt. Es kann leicht zu handhaben sein.)

nächstes Mal

Lassen Sie uns diese BNF in eine Java CC-JJT-Datei ablegen. Mach eine Sprache! (Erstellen eines einfachen Taschenrechners ②).

In Verbindung stehender Artikel

Mach eine Sprache! Ich habe versucht, Bison und Flex zu verwenden Mach eine Sprache! (Java CC-Umgebungskonstruktion) Mach eine Sprache! (Erstellen eines einfachen Taschenrechners ②)

Recommended Posts

Mach eine Sprache! (Einen einfachen Taschenrechner machen ②)
Mach eine Sprache! (Einen einfachen Taschenrechner machen ①)
Versuchen Sie, einen einfachen Rückruf zu tätigen
Mach eine Sprache! (Java CC-Umgebungskonstruktion)
[Docker] [Nginx] Erstellen Sie mit Nginx eine einfache ALB
Lassen Sie uns eine Taschenrechner-App mit Java erstellen
Frontale zu einem Mikrodienst machen
Üben Sie das Erstellen einer einfachen Chat-App mit Docker + Sinatra
[Persönliches Memo] Erstellen Sie eine einfache, tiefe Kopie mit Java
Lass uns einen Roboter bauen! "Eine einfache Demo von Java AWT Robot"
Erstellen Sie ein Reflexionsprogramm ②
Erstellen Sie ein Reflexionsprogramm ③
Erstellen Sie ein Reflexionsprogramm ①
Erstellen wir eine Taschenrechner-App mit Java ~ Zeigen Sie das Anwendungsfenster an
[Anfänger] Versuchen Sie, mit Java ein einfaches RPG-Spiel zu erstellen ①
Erstellen Sie mit SpringBoot + JPA + Thymeleaf ein einfaches CRUD ~ ~ Hallo Welt ~
Erstellen wir eine einfache API mit EC2 + RDS + Spring Boot ①
Erstellen Sie eine einfache CRUD mit SpringBoot + JPA + Thymeleaf ⑤ ~ Common template ~
[Java] Mach es konstant
[Java] Zeichnen Sie ein einfaches Muster
[Schienen] Machen Sie eine Brotkrumenliste
Machen Sie einen Diamanten mit Java
Eine Geschichte über die Herstellung eines Taschenrechners zur Berechnung der Muschelhügelrate