PRELIMINARS:
En aquest exercici assumim que heu resolt alguns exercicis anteriors relacionats amb un llenguatge de programació molt bàsic, que queda exemplificat com segueix:
x=3 y=3+x z=2*(x+y) Print(z-y+x)
L’execució del programa anterior escriuria 15 per la sortida estandard. Amb anterioritat, heu creat els següents fitxers:
Ara us oferim dos fitxers més, anomenats parser.hpp i parser.cpp, que declaren i defineixen una funció parser, la qual rep una llista d’elements atòmics del llenguatge que representen una instrucció, i retorna un arbre binari que representa la mateixa instrucció.
EXERCICI:
Usant les funcions dels fitxers anteriors, haureu de crear un fitxer program.cpp, amb una funció main, que implementa un interpret del llenguatge.
Fixeu-vos que l’enunciat d’aquest exercici ja ofereix uns fitxers que haureu d’utilitzar per a compilar: Makefile, program.cpp, BinaryTree.hpp, evaluate.hpp, execute.hpp, scanner.hpp, parser.hpp, parser.cpp, utils.hpp, utils.cpp. Us falta afegir els fitxers evaluate.cpp, execute.cpp i scanner.cpp que teniu fets d’un exercici anterior, i crear el fitxer program.cpp i implementar-hi el programa principal. Quan pugeu la vostra solució al jutge, només cal que pugeu un tar construït així:
tar cf solution.tar program.cpp execute.cpp evaluate.cpp scanner.cpp
Entrada
L’entrada té una seqüència linies, on cadascuna és una instrucció del llenguatge.
Sortida
El programa dona com a sortida el que seria la sortida resultant d’executar la seqüència d’instruccions donada d’entrada.
Input
a=3*2+1 Print(a-(7-a)-(2*a)) a=a+6-3 Print(a-(3*a)) b=a*a-(a*2) Print(4*a) Print(b-(2-4)) Print(3*b) b=7-4-(a*4) Print(a+3-b+(7-3))
Output
-7 -20 40 82 240 54
Input
a=8*2+ 7 b=a+9-2 Print (b- 5-(b-2) ) Print((a- a)*(7-a)) Print(2*( a+3+(7-2))) a=(b+a)*5+(7-3- 9) c=(4+9)*(b* 3) c=c- c a=8*c c=(9+7) *(6+c) -c Print(8*8) Print(3*(b*1)) b=c+a Print( 9*b-5-( c- 1)) Print( 9*c+2) Print(b*(3*4)) c=4*b b=(1+c)* (a-4)-( 2+6) Print (5+c) Print((a-4) *(1* a-a*c))
Output
-3 0 62 64 90 764 866 1152 389 0
Input
a=36*87+ 50 Print((63+68)* 3-(a+12) ) Print (6-(47-a-(65+a- a)*85)) a=a-2 a=a-7-72*30+ (16- (a-46) ) -(42-(35+ 25)-(60-33-29))- (36-19+( a+5))+29* (a- a)*(45-a-(a+a)) b=77+a-(13* 73-(43-( a+ 20-( 12-68))) ) Print(b- 43+(22+5)+(a-85*43)-9- (34*91-47-( a-(64+ 54-97*89))) ) a=a- a-a+(b-b+(b+a)) - ( a+87)+(53-(71-a+58) )+ (a-42+b+ (18-(38-b)+(b-79-(a+ 19) + (58-(a+ 18)) ))-48) Print(94-b-(b-63)-( b-74- (19-37)-(a+(b-74))-(96-50- (b- 61+ ( b+a))) ) +( a+15+ (a-55-87)+( 49+25+ ( b-(b+70)) )-(98-(a-(a- 53))+25* 40)- (48-88-(76-(55-b))-(a- 83))) ) Print( 73-b+98- (35-b-a-(17-a)) ) a=(62-52)* 7-(5+ b-(37+57)) Print(87-a-(24-1+a)-(77*20-(82-a) -(3-32))-(58-26-(b-27)- (99+63- 81+a)) +(91*92-(b- 81)+(b+b-(64-80)) -40+(b-a-23- (40+ b-6*34+(b+88+ (11-61)))))-(80-a- a) ) b=a-12+( 43+ 40)+( 95-(61- 93)) Print(52+40- (b-8-(a+44-(b-a)-87*53)) ) a=62*35+(b+34) -(98-30-(a-86) ) Print( 45+21-b+(87-a+(83-b-44+ (82- 89) -(9-97*67- 88))-( a- 76+( 66-82+ 100)+ ( 47+a)+24) )) a=22- (83*12+b)- (77- 74- 55) -( 13-56+(b- 43)- b)+((72+ (43- 13+( b-b)) )*27+ ( a+5-(11-b) +(11-b-(33-b))-(62-b))) Print( 6-a) Print(a+59- (11*91-(b-40))) Print(61-71)
Output
-2801 8666 -9699 5791 153 5082 -4863 -8968 -7460 7746 -10