You are on page 1of 5

Documentatie LFTC Lab 2

Limbaj de programare: perl

Mod de implementare:

O functie recursiva care primeste un string cu codul sursa si returneaza true daca stringul indeplineste
conditiile definite pentru codul sursa.

Functia verifica_instructiune functioneaza astfel:

- returneaza 1 daca stringul dat este o succesiuni de instructiuni simple


(atribuiri|declaratii|apeluri_functie) separate de ; si, eventual, whitespaces .
- daca stringul este de forma
o <begin_block> (if|while) (<conditie>){ <middle_block> } <end_block>,
se returneaza 1 daca <begin_block>, <middle_block>, <end_block> indeplinesc toate
conditiile de a fi instructiuni valide
- analog ca in cazu anterior daca stringul este de forma
o <begin_block> <instructiune_simpla> (if|while) (<conditie>); <end_block>

Tabela de simboluri a fost implementata conform cerintelor sub forma de hash table.

S-a utilizat o lista de chei (0-9) si functia de hashing suma_codurilor_ascii(string) mod 10.

Rezolvarea coliziunilor: fiecare valoare corespunzatoare unei chei este o lista, iar coliziunea se rezolva
prin adaugarea elementului nou in lista de la valoarea data de functia de hashing.

Regexuri:

CIFRA = /[0-9]/;

LITERA = /[A-Za-z]/;

OPERATORI = /==|>=|<=|&&|\|\||[-\+\*\/>=<]/;

SEPARATORI = /\{|\}|;| +|\(|\)/;

IDENTIFICATORI = /[A-Za-z0-9_]{1,250}/;

# CONSTANTE:

# NUMERE:

NUMAR = /^[1-9][0-9]*|^0$/;

CONST_INT = /(\+|-)?<NUMAR>/;
# STRING-URI:

CARACTER = /'(<LITERA>|<CIFRA>)?'/;

STRING = /<CARACTER>+/;

CONST_CHAR = /\"(<LITERA>|<CIFRA>)*\"/;

CONST = /<CONST_CHAR>|<CONST_INT>/;

#EXPRESIE SIMPLA:

OPERATOR_EXPRESIE = /[-\+*\/]/;

OPERAND_EXPRESIE_SIMPLA = /<CONST>|<IDENTIFICATORI>/;

EXPRESIE_SIMPLA = /<OPERAND_EXPRESIE_SIMPLA>

\(? <OPERAND_EXPRESIE_SIMPLA> \s*< $OPERATOR_EXPRESIE> \s*


<$OPERAND_EXPRESIE_SIMPLA> \)?

/x;

# FUNCTII PREDEFINITE:

FUNC_PREDEF = /read|write/;

APEL_FCT_PREDEF = / <FUNC_PREDEF> \s* \(

<EXPRESIE_SIMPLA>( \s*, \s* <EXPRESIE_SIMPLA>)* \)

/x;

# EXPRESIE COMPLEXA:

OPERAND_EXPRESIE = /<EXPRESIE_SIMPLA>|<APEL_FCT_PREDEF>/;

EXPRESIE = /

<EXPRESIE_SIMPLA >

|
<OPERAND_EXPRESIE>(\s*<OPERATOR_EXPRESIE>\s*<OPERAND_EXPRESIE>)*

/x;

# OPERATII LOGICE:

RELATIE = />=|<=|>|<|==|\|\||&&/;

CONDITIE = /<EXPRESIE>\s*<RELATIE>\s*<EXPRESIE>/;

# INSTRUCTIUNE SIMPLA:

ATRIBUIRE = /<IDENTIFICATORI>\s*=\s*<EXPRESIE>/;

TIP_DATE = /char|int|array/;

DECLARATIE = /<TIP_DATE>\s*<IDENTIFICATORI>/;

INSTRUCTIUNE_SIMPLA = /<DECLARATIE>|<ATRIBUIRE>|<APEL_FCT_PREDEF>/;

*instructiunea este data de functia descrisa la inceput.

Cazuri de test:

1.

__FILE__

int x;

char a;

array my_array1;

__END__

Se printeaza corect FIP si TS.


2.

__FILE__

int;

char a;

array my_array1;

__END__

Se printeaza eroare de sintaxa la linia int;.

1.

__FILE__

int x;

char a;

array my_array1;

int e = 'asd';

while ( 1 == 1 ) {

x = x + 1;

x = x + 2;

if ( a == "a" ) {

a = 1;

write(1) if ( e > 2 );

__END__

Se printeaza corect FIP si TS.


Diagrama de activitati

Citeste tot fisierul


Verifica sintaxa
intr-un string

[sintaxa ok] [sintaxa nu e ok]

Sparge stringul in
componente sintactice, dupa Printeaza
separatori eroarea de
sintaxa

Adauga codul fiecarei


componente in FIP, respectiv
TS

Printeaza FIP, respectiv TS

You might also like