Sunteți pe pagina 1din 8

S¸ablonul de proiectare Interpretor

Aritoni Ovidiu

Scopul acestui laborator este de a prezenta in am˘anunt ¸sablonul de proiectare Interpretor, respectiv de a integra cuno¸stint¸ele teoretice despre acest pattern in rezolvarea unei probleme simple de parsare a unui num˘ar din formatul arab in format roman si invers.

1 Prezentarea ¸sablonului Interpretor

Acest pattern de proiectare face parte din categoria ¸sabloanelor comporta- mentale. El este utilizat in diverse probleme ce necesit˘a extragerea semnificat¸iei unui obiect sau ansamblu de obiecte. Un anumit obiect poate avea pentru o anumit˘a aplicat¸ie o anumit˘a semantic˘a sau int¸eles, obiectivul acestui ¸sablon de proiectare fiind tocmai acela de a g˘asi care este semnificat¸ia acelui obiect pentru aplicat¸ia respectiv˘a. De exemplu un obiect de tip Student va fi anal- izat de secretariatul unei facult˘at¸i din prisma notelor obt¸inute pe parcursul unui semestru in timp ce acela¸si obiect va fi v˘azut de aplicat¸ia contabil˘a a universit˘at¸ii ca un debit sau aport financiar la bugetul universit˘at¸ii.

1.1

Definit¸ie

S¸ablonul de proiectare Interpretor este utilizat pentru interpretarea seman- tic˘a a unei expresii. Aceast˘a expresie este scris˘a intr-un anumit limbaj. Anal- iza semantic˘a a unei expresii se face ¸inˆt and cont de limbajul in care a fost scris˘a aceea expresie. Pentru aceasta ¸sablonul de proiectare va defini o gra- matic˘a a limbajului ¸si de asemeni un interpretor care va utiliza reprezentarea intern˘a pentru interpretarea expresiei. Orice expresie este format˘a din anumite unit˘ati de limbaj. Gramatica unui limbaj define¸ste regulile de compunere unitat¸ilor de limbaj in propozit¸ii si fraze. De exemplu, fie propozit¸ia ”Ionel ˆınvat¸a C++.”. Unitatile de limbaj,sau unitatile lexicale sunt : Ionel, ˆınvat¸a ¸si C++. Regulile gramaticale spun de exemplu c˘a sintaxa general˘a a unei propozit¸ii este Subiect + Predicat + Complement.

1

Deci acest pattern de proiectare va defini o gramatic˘a (un set de reguli sintactice), si un interpretor.

1.2 Motivat¸ie

In aceast˘a sect¸iune vom prezenta cˆateva cazuri de probleme care vor necesita aplicarea acestui ¸sablon de proiectare. Un prim exemplu este cel legat de evaluarea unei funct¸ii reale. Aceast˘a problem˘a este expus˘a ˆın tema 1 ”Proiectarea si dezvoltarea unui prototip de evaluare a functiilor de o singura variabila reala”. Se cere ˆın aceast˘a aplicat¸ie s˘a se calculeze pentru orice funct¸ie specificat˘a de utilizator derivata simbolic˘a, derivata ˆıntr-un punct x 0 ¸si valoarea funct¸iei ˆın punctul x 0 . Aceste calcule se pot face prin interpretarea nodurilor arborelui funct¸iei in functie de un anumit context. Exista a¸sadar trei contexte : calcul ˆın punct, derivare simbolic˘a si derivare ˆın punct.

2 Cifre romane si cifre arabe

2.1 Cerint¸˘a

Realizat¸i o aplicat¸ie care sa transforme un numar scris cu ajutorul cifrelor

romane ˆın formatul care utilizeaz˘a cifre arabe. utiliza ¸sablonul de proiectare Interpretor.

In realizarea problemei se va

ˆ

2.2 Indicat¸ii de rezolvare

Pentru a rezolva aceasta problem˘a studiat¸i diagrama de clas˘a de mai jos:

1. Se deschide NET Beans. Se creaza un nou proiect CifreRomane.

2. Se creeaza o clasa Java,de tipul JFrame, Main efectuand click dreapta pe package-ul CifreRomane.

3. Scriet¸i clasa de tip frame,numit˘a Main care va integra interfat¸a grafic˘a a aplicat¸iei.Realizati o interfat¸a grafica a¸sa cum este cea prezentat˘a cea din figura urm˘atoare.

4. Scriet¸i o clas˘a abstract˘a ExpresieAbstracta. Rspectat¸i cu strictet¸e nu- mele clasei.Aceasta va cont¸ine doar o singur˘a metod˘a abstract˘a ¸si pub- lic˘a numit˘a interpretor.Observat¸i c˘a ˆın diagrama de clas˘a metoda in- terpretor este scris˘a inclinat,ceea ce indic˘a faptul c˘a este metod˘a ab-

2

Figure 1: Diagrama de clasa pentru aplicatia de parsare cifre romane - cifre arabe 3

Figure 1: Diagrama de clasa pentru aplicatia de parsare cifre romane - cifre arabe

3

stract˘a.Metoda interpretor nu returneaz˘a nimic si prime¸ste ca ¸si argu- ment un obiect de tip Context.

5. Creat¸i o clasa simpl˘a numit˘a Context.

ˆ

6. In clasa Context introducet¸i urm˘atoarele atribute cu acces privat ¸si de tipulˆıntreg: ’val final’, ’ultim parcurs’, ’suma ultim’. Pentru atributele anterior create construit¸i metodele getXXX si setXXX. Atributul val final ret¸ine valoarea final˘a a calcului de transformare,adic˘a rezultatul conver- siei. Atributul ultim parcurs va ret¸ine unitatea ultimului element par- curs din ¸sirul de carcatere al num˘arului in format cifre romane,adic˘a 1-I sau 5-V, 10-X,L-50,100-C,500-D,1000-M. Atributul suma ultim arat˘a de c˘ate ori a ap˘arut ultimul caracter in ¸sirul de caractere pˆan˘a la un anumit moment dat ˆınmult¸it˘a cu valoarea ultimei unit˘at¸i.

7. Scriet¸i un constructor implicit pentru clasa Context. Acest constructor va init¸ializa cele trei atribute cu valoarea 0 (zero).

8. Scriet¸i o metod˘a care va returna rezultatul final al conversiei. Aceasta metod˘a se va numi returneazaFinal() si va returna un ˆıntreg.Metoda va aduna valorii finale suma utim. Valoarea final˘a va fi returnat˘a.

9. Scriet¸i o metod˘a actualizare care nu returneaz˘a nimic si primeste ca parametru un ˆıntreg. La fiecare caracter descifrat din sirul care a fost introdus se reactualizeaza cele 3 valori ale clasei dupa cum urmeza:

Cazul 1 - caracterul descifrat este mai mic decat cel ce a fost citit inainte(ultim parcurs) se adauga suma ultim la val finala se seteaza suma ultim la valoare noua

se seteaza ultim parcurs la valoare noua Cazul 2 - caracterul descifrat este egal cu ultim parcurs se adauga ultim parcurs la suma ultim Cazul 3 - caracterul descifrat este mai mare decat cel ce a fost citit inainte(ultim parcurs) se scade suma ultim din val finala

se seteaza suma ultim la valoare noua

se seteaza ultim parcurs la valoare noua

10. Scriet¸i codul sur˘a al claselor Unu, Cinci, Zece, CinciZeci, Suta, Cin- ciSute, Mie ¸si ExpresieNula. Toate aceste clase sunt derivate din clasa abstract˘a ExpresieAbstracta. Mai jos este prezentat codul surs˘a al cla-

ˆ

In mod analog se va scrie si codul surs˘a al celorlalte clase

sei Unu.

derivate: Cinci, Zece, CinciZeci,Suta,CinciSute,Mie ¸si ExpresieNula.

4

{

public

class

Unu

extends

ExpresieAbstracta

public

{

cont.actualizare(1);

}

}

void

interpretor(Context

cont)

11. Scriet¸i codul surs˘a pentru clasa Main.

Un listing al codului sursa se

poate vedea mai jos. Completati codul sursa a¸sa cum se cere acolo unde este necesar.

package

sursa;

import

 

java.awt.Component;

 

import

java.awt.Container;

import

java.awt.event.ActionEvent;

 

import

java.awt.event.ActionListener;

 

import

javax.swing.BoxLayout;

 

import

javax.swing.JButton;

import

javax.swing.JFrame;

 

import

javax.swing.JLabel;

import

javax.swing.JTextField;

 

public

class

Principal

extends

JFrame

implements

ActionListener{

//cele

3

variabile

determina

cei

3

parametrii

ai

ferestrei.

//

Cele

2

casete

text(parametru

si

rezultat)

si

butonul

//

la

a

carui

apasare

se

face

calculul

JButton

 

submit;

JTextField

parametru;

JTextField

rezultat;

public

void

creareMediuGrafic(){

//

’fereastra’

este

containerul

in

care

vor

fi

asezate

//

butoanele

si

casutele

text

JFrame

fereastra.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

fereastra.setAlwaysOnTop(true);

Container

suprafata=fereastra.getContentPane();

fereastra=new

JFrame();

5

suprafata.setLayout(new

BoxLayout(suprafata,BoxLayout.Y_AXIS));

//obiectele

//

JLabel

info.setAlignmentX(Component.CENTER_ALIGNMENT);

suprafata.add(info);

se

aseaza

pe

rand

cu

in

zona

de

reprezentare

in

cifre

a

ferestrei

info=new

obtinuta

getContentPane()

numarul

JLabel("Introduceti

romane:");

parametru=new

parametru.setAlignmentX(Component.CENTER_ALIGNMENT);

suprafata.add(parametru);

JTextField(12);

submit=new

submit.setAlignmentX(Component.CENTER_ALIGNMENT);

suprafata.add(submit);

submit.addActionListener(this);

JButton("Calculeaza");

rezultat=new

rezultat.setAlignmentX(Component.CENTER_ALIGNMENT);

suprafata.add(rezultat);

rezultat.setEditable(false);

JTextField(12);

//

//si

fereastra.pack();

fereastra.setVisible(true);

se

incarca

se

face

elementele

fereastra

in

fereastra,

vizibila

functia

pack

}

//

functia

care

’asculta’

la

apasarea

butonului

 

public

void

actionPerformed(ActionEvent

event)

{

if

(event.getSource().equals(submit)){

 

rezultat.setText(calculat(parametru.getText()));

}

}

 

//

functia

in

care

se

face

trimiterea

spre

functiile

//

de

interpretare

din

diferitele

clase

de

interpretare

public

String

calculat(String

sirPars){

 

//

de

tip

context

este

rezultatul

care

va

fi

dat

//

ca

parametru

diferitelor

functii

//

interpretor

pentru

a

fi

modificat

 

6

Context

rezultat

=

new

Context();

sirPars

=

sirPars.toUpperCase();

char[]

lista

=

sirPars.toCharArray();

for

(char

c

:

lista)

{

//

ExpresieAbstracta

este

clasa

abstracta

care

tine

//

antetul

functiei

interpretor

 

ExpresieAbstracta

expr=new

switch

(c)

{

case

’I’:

expr

=

new

Unu();

break;

 

case

’V’:

 

expr

=

new

Cinci();

break;

 

case

’X’:

 

expr

=

new

Zece();

break;

 

case

’L’:

 

expr

=

new

Cincizeci();

break;

 

case

’C’:

 

expr

=

new

Suta();

break;

case

’D’:

 

expr

=

new

Cincisute();

break;

 

case

’M’:

 

expr

=

new

Mie();

ExpresieNula();

break;

}

expr.interpretor(rezultat);

}

return

String.valueOf(rezultat.returneazaFinal());

}

//

functia

principala

care

lanseaza

modulul

grafic

public

Principal

p.creareMediuGrafic();

}

static

void

main(String[]args){

p=new

Principal();

7

}