[JAVA] Faites une langue! (Faire une simple calculatrice ①)

La dernière fois, Make a language! (Construction de l'environnement Java CC) a préparé l'environnement de développement Java CC. Cette fois, créons une calculatrice simple et apprenons à utiliser Java CC.

Comment fonctionne Java CC

image.png

Lorsque vous créez un fichier JJT, Java CC génère un analyseur Java pour vous. Un fichier JJT est un fichier qui définit l'analyse des phrases et l'analyse de la syntaxe.

Flux de traitement de l'interpréteur et du compilateur

  1. Prétraitement (remplacer les fichiers source à la fois, compléter les descriptions omises, etc.)
  2. Analyse des phrases (séparez le code source en phrases appropriées.)
  3. Analyse de syntaxe (générer un arbre de syntaxe basé sur la phrase.)
  4. Analyse sémantique (interpréter la signification de l'arbre de syntaxe. Elle est exécutée telle quelle en fonction de l'interpréteur.)
  5. Génération du langage machine et du code d'octet
  6. La machine ou la machine virtuelle exécute le code

image.png

Cette fois, nous nous concentrerons sur l'analyse des phrases, l'analyse syntaxique et l'analyse sémantique (exécution de l'arbre syntaxique).

Représentation formelle de la langue

Tout d'abord, avant d'utiliser Java CC, nous allons préparer le langage. Pensez à des façons de décrire ce qu'est la langue et de l'analyser correctement.

BNF BNF est un langage pour définir la grammaire d'une langue. Il est décrit dans un format dans lequel le côté gauche est défini par le côté droit. Il existe différentes manières de décrire le BNF, mais cette fois nous décrirons le BNF dans un style d'expression régulière selon Java CC. La commodité de la description semble être autant que le BNF étendu (étend le BNF).

Les principaux symboles utilisés sont les suivants.

symbole sens Exemple
::= Définissez le côté gauche avec le côté droit ::= <加算formule>
() ()Regroupement à l'intérieur. ("+" | "-")
<xxx> Symbole sans terminaison. Les expressions et les phrases abstraites ne sont pas terminales.
"xxx" Symbole de terminaison. Quand il s'agit de lettres et de chiffres spécifiques, cela se termine. "1"
* Répétez immédiatement avant 0 fois ou plus ("1" | "2")*
+ Répétez immédiatement avant une ou plusieurs fois ("1" | "2")+
| Représente ou "1" | "2"

À partir de maintenant, réfléchissons à la formule simple ci-dessous.

BNF avec une formule simple


<formule> ::= <加算formule>
<Formule d'addition> ::= <Formule de multiplication> ( <Opérateur d'addition> <Formule de multiplication> )*
<Formule de multiplication> ::= <Terme unique> ( <Opérateur de multiplication> <Terme unique> )*
<Terme unique> ::= <Support ouvert> <formule> <Support de fermeture> | <Représentation décimale>

<Opérateur d'addition> ::= "+" | "-"
<Opérateur de multiplication> ::= "*" | "/" | "%"
<Support ouvert> ::= "("
<Support de fermeture> ::= ")"
<Représentation décimale> ::= (<Nombres>)+ ("." (<Nombres>)+)?
<Nombres> ::= "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" | "0"

Vérifions ce BNF. Par exemple, la formule «10 * 20 * (30 + 40)»

<formule>
→ <Formule d'addition>
→ <Formule de multiplication> ( <Opérateur d'addition> <Formule de multiplication> )*
→ <Formule de multiplication>
→ <Terme unique> ( <Opérateur de multiplication> <Terme unique> )*
→ <Terme unique> <Opérateur de multiplication> <Terme unique> <Opérateur de multiplication> <Terme unique>
→ <Représentation décimale> <Opérateur de multiplication> <Terme unique> <Opérateur de multiplication> <Terme unique>
→ (<Nombres>)+ ("." (<Nombres>)+)? <Opérateur de multiplication> <Terme unique> <Opérateur de multiplication> <Terme unique>
→ <Nombres> <Nombres> <Opérateur de multiplication> <Terme unique> <Opérateur de multiplication> <Terme unique>
→ 10 <Opérateur de multiplication> <Terme unique> <Opérateur de multiplication> <Terme unique>
→ 10 * <Terme unique> <Opérateur de multiplication> <Terme unique>
→ ...
→ 10 * 20 * <Terme unique>
→ 10 * 20 * <Support ouvert> <formule> <Support de fermeture>
→ 10 * 20 * ( <formule> <Support de fermeture>
→ 10 * 20 * ( <Formule d'addition> <Support de fermeture>
→ 10 * 20 * ( <Formule de multiplication> ( <Opérateur d'addition> <Formule de multiplication> )* <Support de fermeture>
→ 10 * 20 * ( <Formule de multiplication> <Opérateur d'addition> <Formule de multiplication> <Support de fermeture>
→ ...
→ 10 * 20 * ( <Terme unique> <Opérateur d'addition> <Formule de multiplication> <Support de fermeture>
→ ...
→ 10 * 20 * ( 30 <Opérateur d'addition> <Formule de multiplication> <Support de fermeture>
→ ...
→ 10 * 20 * ( 30 + 40 )

Vous pouvez voir qu'il peut être dérivé comme suit.

Analyse de phrase

L'analyse de phrase est le processus de séparation d'une liste de caractères avec des délimiteurs appropriés. En BNF, la pièce la plus proche du symbole de fin sera analysée.

Analyse d'expressions BNF dans une formule simple


<Opérateur d'addition> ::= "+" | "-"
<Opérateur de multiplication> ::= "*" | "/" | "%"
<Support ouvert> ::= "("
<Support de fermeture> ::= ")"
<Représentation décimale> ::= (<Nombres>)+ ("." (<Nombres>)+)?
<Nombres> ::= "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" | "0"

À ce stade, les nombres, les représentations décimales et les opérateurs d'addition sont considérés comme des types de phrases. En tant qu'image, il s'agit de diviser correctement une série de chaînes de caractères.

Analyse

La partie la plus significative de BNF (la partie qui a du sens pour créer un arbre syntaxique) sera traitée dans l'analyse syntaxique.

Analyse de syntaxe BNF dans une formule simple


<formule> ::= <加算formule>
<Formule d'addition> ::= <Formule de multiplication> ( <Opérateur d'addition> <Formule de multiplication> )*
<Formule de multiplication> ::= <Terme unique> ( <Opérateur de multiplication> <Terme unique> )*
<Terme unique> ::= <Support ouvert> <formule> <Support de fermeture> | <Représentation décimale>

C'est une tâche d'assembler un arbre dont les nœuds sont les mots qui sont correctement séparés par l'analyse des mots. Il existe différentes méthodes pour assembler cet arbre, telles que l'analyse syntaxique ascendante et l'analyse syntaxique descendante. Cette fois, Java CC utilise une analyse de syntaxe rétrogressive.

Rôle de l'analyse des phrases et de l'analyse syntaxique

En fait, il est difficile de tracer une ligne claire entre l'analyse syntaxique et l'analyse des phrases. Par exemple, lorsque vous pouvez ajouter «+» ou «-» au début d'une seule expression de terme, Cela dépend de la façon dont vous le faites, que vous utilisiez + 10 pour créer une phrase ou que vous la traitiez comme deux phrases, - et 10. (Cependant, dans ce cas, il est préférable de traiter «+» et «-» comme des phrases différentes et de les laisser juger au stade de l'analyse syntaxique car cela dépend du contexte s'il s'agit d'un opérateur neutre ou d'un opérateur de préfixe. Cela peut être facile à manipuler.)

la prochaine fois

Déposons ce BNF dans un fichier jjt Java CC. Faites une langue! (Faire une simple calculatrice ②).

Article associé

Faites une langue! J'ai essayé d'utiliser bison et flex Faites une langue! (Construction de l'environnement Java CC) Faites une langue! (Faire une simple calculatrice ②)

Recommended Posts

Faites une langue! (Faire une simple calculatrice ②)
Faites une langue! (Faire une simple calculatrice ①)
Essayez de faire un simple rappel
Faites une langue! (Construction de l'environnement Java CC)
[docker] [nginx] Créer un ALB simple avec nginx
Créons une application de calcul avec Java
Faire de Frontale un micro service
Entraînez-vous à créer une application de chat simple avec Docker + Sinatra
[Mémo personnel] Créez une copie complète simple avec Java
Faisons un robot! "Une simple démo de Java AWT Robot"
Créer un utilitaire de réflexion ②
Créer un utilitaire de réflexion ③
Créer un utilitaire de réflexion ①
Faisons une application de calcul avec Java ~ Afficher la fenêtre de l'application
[Débutant] Essayez de créer un jeu RPG simple avec Java ①
Créez un CRUD simple avec SpringBoot + JPA + Thymeleaf ① ~ Hello World ~
Faisons une API simple avec EC2 + RDS + Spring boot ①
Créez un CRUD simple avec SpringBoot + JPA + Thymeleaf ⑤ ~ Modèle commun ~
[Java] Rendez-le constant
[Java] Dessine un motif simple
[Rails] Faites une liste de miettes de pain
Faire un diamant en utilisant Java
Une histoire sur la fabrication d'une calculatrice pour calculer le taux de monticule d'obus