	Se considera un limbaj  in care exista doar instructiuni de  declarare  a 
procedurilor sau de apel al procedurilor, separate prin caracterul ";". 
	Numele unei proceduri este o litera a alfabetului latin. 
	Procedurile nu au parametri.

	O instructiune de declarare  are forma: #p{I1;...;In}
unde p este numele procedurii, parntezele { si } delimiteaza corpul procedurii 
iar I1, ...,In sunt instructiuni. 
Nu exista doua instructiuni diferite Ik,Ij care sa  declarare  aceeasi 
procedura. Este posibil ca in corp sa nu existe nici o instructiune, caz in 
care declararea este #p{}.

	O instructiune apel de procedura  are forma ?p
	Programul principal este o declarare de procedura  ce contine doua 
instructiuni: una de declarare a unei proceduri cu numele p si cealalta este 
apelul ?p. 
Iata un exemplu:
	#m{#p{#x{};#q{?x;?p};#r{#x{};?q;?x};?r};?p}
	Orice instructiune de declarare #p{I1;...;In} poate fi reprezentata 
prin arborele
			      #p
			/    /  ...  \
			I1  I2       In
unde p este tatal fratilor I1,...,In. 
	La randul ei, o instructiune  Ik ,unde 1kn., se reprezinta fie 
printr-un nod cu eticheta ?q in cazul cand este o instructiune de apel ?q, 
fie printr-un arbore cu radacina #q in cazul cand este  o instructiune de 
declarare  #q{...}. Se observa ca in cazul #p{} arborele are doar nodul #p.
De pilda, programul dat ca exemplu mai inainte se reprezinta prin arborele: 
		

	Un apel de procedura ?p este corect daca in arborele programului 
principal exista pe ramura  care porneste din radacina si se termina cu nodul  
?p  un nod care se afla intr-una din situatiile urmatoare:
 - este #p 
 - are un frate care este  #p
	Se observa ca  situatia cand chiar ?p are un frate  #p corespunde 
descrierii de mai sus. In exemplul de mai sus, toate apelurile  sunt corecte.

I) Se considera fisierul text input.pro in care prima sa linie este  un program 
principal #m in acest limbaj. Sa se scrie in Pascal sau C un program care sa verifice  daca :
	a)	#m este corect din punct de vedere sintactic;
	b)	apelurile de proceduri sunt  corecte, in sensul  definitiei de mai sus.
Rezultatul va fi scris in fisierul text  input.lst care are trei linii:
pe prima linie este programul citit din input.pro
pe adoua linie mesajul "sintactic corect " sau "sintactic incorect"
pe linia a treia mesajul "toate apelurile corecte" sau " exista apeluri incorecte"

II) Fie #m un program sintactic corect si cu apeluri corecte. Daca  
#p1,#p2,...,?pn este ramura de la radacina arborelui programului principal la 
apelul ?pn, , se numeste executare a lui ?pn arborele construit prin urmatorul 
procedeu iterativ: pe  ramura  #p1,#p2, ...,?pn se ia ultimul nod care este el 
insusi #pn sau are un frate #pn; fie pi numele acestui nod. In locul nodului 
?pn se pune un arbore  cu radacina #p1#p2#...#pi; fii acestei radacinii sunt 
executarile fiilor ?f ai nodului  #pi.
Se observa ca  eventualii fii #g ai nodului  #pi sunt eliminati. Executarea lui 
?pn corespunde tuturor apelurilor de procedura  declansate prin executarea lui 
pn. Ramurile ce corespund apelurilor recursive  vor fi "retezate" imediat 
dupa prima repetare a unui apel. 
In cazul considerat de noi,  executarea este urmatoarea:


Ramura #m#p,#m#p#r,#m#p#q,#m#p este "retezata".

a)	Fie #m{#p{...};?p} programul corect din fisierul input.pro. Sa se scrie  un program Pascal sau C care sa  determine executarea apelului p? si sa o scrie in  fisierul text input.exc. Se va utiliza  o scriere similara cu cea din input.pro, adica nodul tata va fi scris in fata parantezei "{", fratii sunt separati prin ";" iar dupa ultimul frate se pune paranteza "}". 
In cazul considerat, fisierul input.exc are urmatorul continut:
#m#p{#m#p#r{#m#p#q{#m#p#x;#m#p};#m#p#r#x}}

