From 7f8dde59a9b8548f4e29fce3ab02488acb59296c Mon Sep 17 00:00:00 2001
From: hm19 <hm19@inf.ufpr.br>
Date: Tue, 3 Dec 2024 15:39:48 -0300
Subject: [PATCH] nivel lexico arrumado

---
 MEPA             |   8 +--
 compilador       | Bin 54640 -> 54640 bytes
 compilador.tab.c | 173 ++++++++++++++++++++++++++---------------------
 compilador.y     |  41 ++++++++---
 teste10.pas      |   1 +
 teste11.pas      |  22 ++++++
 teste5.pas       |   2 +-
 7 files changed, 154 insertions(+), 93 deletions(-)
 create mode 100644 teste11.pas

diff --git a/MEPA b/MEPA
index a4aa486..a8c5494 100644
--- a/MEPA
+++ b/MEPA
@@ -10,14 +10,14 @@ R02: NADA
      CRCT 1
      ARMI 1,-5
      DMEM 1
+     RTPR 1,2
 R00: NADA 
-     AMEM 1
+     CRCT 8
+     ARMZ 0,0
      CREN 0,0
      CRCT 2
      CRCT 3
      SOMA
-     CHPR R01,1
-     CRVL 1,-6
-     ARMZ 0,0
+     CHPR R01,0
      DMEM 1
      PARA
diff --git a/compilador b/compilador
index ea2bab45adb9f6e6ebb169ff830776d45c59415a..4dbcf1715206b3c6730c7da8132228ccd1f1e9f4 100755
GIT binary patch
delta 8245
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

delta 7993
zcmeyciuuDT<_#Q-TvwABz~E}~WFba9P6ZV(k3nIwC*yv>m{|}WoSrPnv|A)4c*}>o
zrYas+|3}=uoN9PXUCry_<`+zU`~q!>3=AH<y!>Fwc8c3(Hz7MgrVjtjZOXhnOqI@?
zr|JvxF)~hGZX3t6RB|)Boj)U=qXYv(^WGi5{{Ls@Z&BWyV&Bckv|VKKM+g6qAYlfE
z?$!gp{{Q#r6=?-I#iN(iID~<rn}x|^hDWccdI$r92jd01{|`KRP3r?081{n{y~vkf
zV0bAh404NU9$YjMB+5K_ilZe{rvBvfj=t8X#Tgi0mI^U2cyx>2sRJo*J@D`Ue~-><
z9-YTu^y(u-dQG<mFff2br-Sr33QZ1o(i7K|Wnk!JEd}Z9X0-xQoyTANl%71tNy5%p
zoPhx%*m|Ijznj&dj)9^10AnYsI!IkN>yKK9c~Z&@3@^6|GB6xx<*fs`o`K=zGQr88
zoQ&BIi7_y|%n_Wd<E+Q@S#ENSvw_M%IR=K;JRZHa{r(ILFPcCu>}J)58s)3R!0_^g
zz~l|iF-%XzCiA(7F%=0+R&$Aw$`@l`@Mu1w(9K#>19e7r4Fki=Km3#DxU6GZE;`xA
zRf6e~_T)5I3w=)!P=K(iS3?}=sldSS@(CYEOjH^q){7iSf3zo`brom&EI#>}Yl~Jb
zD9pQAqpKiVr6fS%(+J{qv$}z(&f_mK<QW)VGEbi3wv%az@MM2?38wR!lQZ2d>fOK*
z!KzXT(d;J2!0_@R4=7+PD;XFV85kH|Ug7}-s#YZfL-Py9PFBTA28NgWz)BufK*Mf5
z57?#8DiDzeiO%DiV2Ps@3=G}8+Y!>8=RnaaAU#>ZLtN~?21pTWA4t0M_=^p)3=A*5
zc_#aMh%*`SOiuGqG~owZmkzb=IBOx4_3|4x14Fl{9LRW9p9%&B#tWUS0u>AlFYj_s
z-tCd5dqEHq2QPED!FJ3p2l?}uN3ZS2at4MM(?Ox$$-1<hf#IbW_hdg$F}59=3=A)I
zCueyE)QfboGJ|BUaDf6qrksJH`3GaEW;gHKGLWqxIS**O^qL;@1ett%2Pi~d+&KRK
z|7-Pb-Xmazx5^N~(rdaHS>gKQplk+>+hdT7w2hyE;bj6BLp_5>H|u(k-qr)9d>*~F
zrJf87FV1N&Fub<%=w_V?GTVWp`3GYOzehJ~8;r|bD&x^D8V}Of%~}Aa7@(PJjT$%*
zq7h03J$g;8JYiYbmLC-H0%agSFfi1=yvqqzuLD!hSR(Av%_<AyGV{0Yf~a^^3ikX9
z9%+yU(Z?WeZ)*c0TOR@2EP4n-VmB!Lb+VoWNp!P<<huhzx>+ZdGBDIz9^!AA!T>Un
zbyX<?LpRv7r8eEXB@oq9L4pAyh&ZV606PN`2jRz%g7)}}8R`rSuRT4wS>r*vKt?f_
zT6ObkLX7eP2_hS1=m84<PH24cpqk~Y4vK$yh*kj*)mtFo0r7C>MUT!;9=)cf$Zk1v
z6zmpAfIy@9GA{$e%Nh=l_e8gpAW{e<<4jcr+21WX8AGNAl%zXZXMrTTS;6w%4iep>
zi6DXGOCARwF?%px@aSgfc3|m*%8Q18B%x^)V!;v>28Nga*+D5=y#!i3$(4ZOKc)m0
z{}0*0u9Lvf{8I%i@x2(`*&hTzF~Ir{B+<<ZmIpiTC`bUqaS(aY9Uw^*$8mrhSDy@a
zU3W3mbxp+}*BvN^xbCGZ$Z@@<x7}c=w-sCnu_l8|>jY)-oy80cFXACC$_0sbv!)d@
zFm!u}cyzPIfLH-Mh{Pl0268$y!sU+q|6dQ2>x9ObDh~t0%kyj?KbvO3tp$}$FLy#j
zL*Sx6xfvK<E{2FY!$lv1M0+8kMsU%yAklJ&s3Kf+dp$@v5h5%A7hVVw^@fQ4cZK=A
z8zgE95q$?2Ed`0nvw`BczX(!#33~L}UUp?*c+m$6VrGbr-*6qyARTX6K{{gVk+duX
zX^8=8xyTCk|2eo8L6DZ+5YfGG(cfGQ3@?{LMAyJYpMpgDL89HP`wBtf4T>j`A_j&R
zyFis)C+i82XgBN1LI#F<4{$7gFJxeN@kfz?;bk~jqi7#U2}*LwR{|%;Tnvdch@mAQ
ziEdV~eCvTyP#DO8Jk$ef1~7tsTUZDVAO6-(NP**6$WRX|aas?Qns{`x8W+OSjV6eN
zoNnH^fcybXH?I%=|Nl~$5#$`!{{_%8i<!R_RFisiv%Ucdd8l}Fvpxc`kd0Z6Y|Ijn
zG4*F4PT2uc3M#OeN*z49SyzI&5}>Nc(4(7m7KjT@(Gx%{WFr%hjSM>Y|NrY+k8ajX
zkTM63)&r#=?a?3}SbHFdg{-|^2U))`NWYy&H>(y%9mqM%rTQM-tkNJZ*h_*S7P0|v
zoRLE2@&RxW2x;m;Gt?~(28Nd{%%IfvC7*$z^+2f#EYJ0dGSwG=Q`#nEQ~D14{||18
zEp=vKcyU1yqyn|}YzLWX2r^T2X+A=_*R;+N$u({u*K~`PBdLHCi__&nuF1}4U}(++
zH5`+WRP>rULd<xf46@`b6Q~w&geU+P?Y*W_5CxDL=+XZF|2?`zg^^T1EHMUK!Va<o
zWXHeB4}-LQ>p-eu$r>6!Q`s39UfMH(l9TANJg{%T7D0>&mj_GqLL_PswXL1}<a>@1
zlRZO(>e;cFDhDn(A=PuQshR^gTwZX1?AioQx}uU0BO#FmZkL~u1KSQ3={5ai57Bdl
zje+519U~|lKIMWHfL+mRdK#i&hd!vVeld9;I3SK7DS`Oli7Y6zcjQ7#`1QGy4MVi*
z^+C$fLc$GHiiu`IOaO;Luc;H%60jXyAWhw()<`NKc0_~i(1+Qfmdn8Kayd9>iSj`d
zgWU{KykC}q!N8+i^lJ{-H(-k(GRtJafqe%efu!Y+3@otq!uDdO@mx@$1!)?1^qQ91
zK>`j`lub?zjbh@noqRA<mht`M`=QQEr>!QdglRH0SWfm2lkhlZ!N9=3orP&eXDg_q
z_Hy>~|Nkd^=9l}`&8nXbDy{yNn02$NWP>tJg=#meR5k;HttKM_L%l>dD{nRf1Gu-A
zU^;nym`2pLENB?7%>wz%mf4<x;RT~Cs28{g)C(-N>t+S1X+2QS-_5!v3uI`i*2_3h
z+_s(ocLqf_Wic>-i{#683=A)np8fxSoV6}%vSGLa<Dbbv;V$ywmJk=GfeI&eXeV-p
zN3RHjM=z_C#pJEwrgF+w3=I6+SOoa@9q{O$`s3IC|6n6IKt{Sgog5G;Iax76hG|0P
zWcvsSrrl2`M@DElO|@lUc#$g2z;L|v$gltZnHWIHMlur;2%+7qe3>Bkf&zgh6DbhB
zXFvnN%Xsq92zjBG8Bh<{fXs`0^8f$j>`;x#a*-mkw?To8>8yV?3=A*+PWF$qV=CA_
zxj#~Z@!8}Rkvcr8b_@)VOum2n<Oh*b_0rIYt=<9Z%DVpWXs-RiP%7rpYs(DsnacM6
z|9AZV|NsBX$qWn(`vn*n7+xrVm9l20gAx{N5{T+N{vwJI)XJ$y2PJ9{s|w13=y|gp
zWISswNO3o78i?vV{vunv9;7q@Md=}kQelvqZdM);)p`7dqd3Sm*B>68tc7U|3@;8n
z`u`v7k&}l(Nh{Q&^QlMk8v&2b+8-XBr5`-HSr?@-FnF{cD3$W)H4U%@CmwH5@J)i4
z-wcv&P6heaz@wYB6vXWg{ov7Sstr;MYe9eA1}Xwr!$8uV$6uIj|NsBBkw-VHD@dT*
z_k%}w=ns!xQwC%`2O)ZtKuS7~zhK%vIW}5cJ2w^N1J+4k$`_>RkPSFffxYpfYTN(+
z`#~Z7LSXyk`O(30(I8VgU0--~yWRkGI;*$-|L@U!fDy#D-!@qwMvn3SWc`=`rgd8;
zH^xXZZQeS0PK+s2&DP16V-7LSnA{K}#WZ)z<V~@rOley-zl>#KWD?pu`E8sr<K4-M
z@msVtHva$rTH2%A^#{0v!c@u+VtaIh2QIibg1ik1?&B~1Z<xF>QEswa!Zjw&4U@km
zs53s8ESD(HbYT5t`$TD`#p@@>B&zFGt^fbO+4Tz}$dGOa5lh!EH5Wi^k8TGEkdvd<
zBTV#LKY3%~Tc-GRlNTg8^0b)3(&VOfo8KnwWn@~scJi8(cqXT{lX+9OF?LN}ouV}P
zS*jho<{D5cVxH`iCOO$9?L_@SLk5NyI;;Nwf4Pkd9Kp{(0@ABMrJ3y)5St&wZhphz
z(aYLv#J~{X)61)G#K7Rw%L<}AdU<t?KpI7Lz?7*rn6foAg1JZ^tpA9BN3ZP?ka_!8
zf_%{`0jjgQCwHd{2$+Dhbha9RM0#0uj5e=McVlFFW-$3ej*{Y015gaNTKxO}|FyhF
zFY8_;KEFpV>(<F;nTmQd3>X;pae<0<SgLbb@&EtJ`{3%1wHBfWYC({}=GIJZMv+u~
z28Mmpko9mcpS&b1PWZbX1H)?pk6zaMAO^cfFYBwxqS>ZgJ7C<+lS8sKl=}1-81~5_
z>z7{!3bxh>Adhq&fAL`Qyle#~`DK$2WGl(fUi$z4uBjl^nuk1kA!>R}rSw3)JO1MC
zWX2qAg+Q!oF6lzlOkO(KCr3qOnJxpvz7rsWU|!W;I=LlBN4^w8;`NgM|6jJTfTD*r
zZSwgXWu+H7AhQsm`2dLz3e6ijlg%>~Vt4DH2WR>caI9(k`~Sb&L8A3QDW^v->m3~i
zhS#9*xd}3+cdx;JP~tl1(JOidWB|yKkesOra>x;8utSbbo|vnwqz2N_iExM<5+CFc
zF`dcRauq~=YNI=3>Eg{?c`S?~&$ZBFuXoX8rTjSIN-b#YC4v|r*X2x}oNvl)1>>4(
zO}?D3t}FmD044esE<}mGq=l2`XUj7!TsYaTKuJM%A-4FN0~+M&JpLkn;pBz_Eyl}}
z6AMJSLZE`83qcVkp`nQ$VQUxs|Nq*1a(9lZ%r6ae$pVlhpGPli=VbRnZ=TZ{u#CjG
zVDh{|P5Cf&28I`f^Fh(!`Xj}|m_=2Cfq|if^~Kux|NoynJb7WX?&Me_j>&6^xKxWF
zRfpmNP`tSQ@aT4Z0V+rwLAs&kAnSt3UPW?DN9Rq>Dw-yvI}c(mv<!PU7s~BC{^HSO
znPR<qZ;<UE;g`*zB-m@41QNIlQrBx62V!3YvrU((gJRouu{zB8k|3jdZLL6R)`HZ4
z90MvUU4Oh*hZJ)RkZxZ-T+dU8x*s0h4jdkxu0K4)!FB5;k6zo)Y77i7(&mD^%rEaS
z`F^oXh@dY6!;3v&EvBr#3=I201;UHlbN~N0JmArMgyS&3yaNNMs&fqY>9sBPWMFU%
z^X$Cl80y*i)iK1e^G~QpuWpJb14FQn=3kHIHykhO=WO;b*~mTl0ndd^4QqraUz=<-
znQzML$#zraCnrpuQ_r>k|9=p^zxx0GudDz6=U(&w|I9W2|DRn05eLcP!jWtL|Ib(p
zQMYLA|Nm<1{{Nq|4#G#*Beeeif2|D=IZ(Z#yXpUbn@#`g!IlSX`u{(E6GReO<Ka#J
z|KHj4|Ns9@|Nl#DM#vi?v60o|V=qF}b7b@X|5jV-|NmdN<^O-ftq8*>Zu|eAfBXOc
zy4(N%U%ee64l?{ClyAS||Nqb(|Nm$2`2W9g$N&G+cl`gqcE|t!hj;w{e{%;!&-)$!
z|10i<u!DF0|DOqE*YEuQfBVk=|GReo|Iekc|NsBHyZ`@p-1Gnc`91&t$Lxh@09iI+
z@Bjbln`ch9XRbd|`v1QQ69dDR^8f#Rm>3w2l>h(F!^FU_w&MT)6eb1+&949dJD3<4
z$|wB)zlMo{VcEq0|IdKvN&o-9VPaq?nezWX4>JS9fvNxh>o7Ag6i@sAKY*EmA#3{o
z{{_qp3_qv;|3875fnmao|Nl2IGcYL3{Qv&~GXulZng9QPU}mUiXq)x_zW@sZL*MNG
z{|#6e7z*e7{~y4@z_4QO|NjLbdfxy46Id7+uFd=Ze*+5x!<za3|6gEXV0b$J|Nl2E
z3=CiA|Nqa!%D}+3;QxOeRt5&~1^@s1ure^HFZlmIhn0cBV!{9aJ**52{tN#9U&G44
zkh$Rh|1+!%49yGv|9`_;&%iKw!T<j}Yzz#mKnAceFz_$@|KEp=fnm?W|NnE?7#MCX
z{Qtj)je&uA(f|Kz*ccd;7XAN!hK+&2YtjGzZ`c?Z8utDF&%@5Z(7*rxe;sxP2Gaxo
z|NF2rFq9nl|38PFfnnx>|Nnc~85rsh|Np;%oq<8($p8Nr*clkCkNp4tA%&fRA?)b?
z{{kEg3>?S*|2N=ZVEB6c|Nj6E28L@V{{JuFU|^Vc`v3na91ILQul@hOg@b|N-nIY#
zuW&Fh<X`{){|g5L!}sg||BG-kFl@Q;|Gx<*1H+LU|Nr}NGBA9(@&A7cCj&#u<ehWW
z88=LRI7ggu#^j%K)TI(i|NrNJw4}kL0;rH=U|?`8n`|{#iE-xS*tyD#hbK4Am1n#(
zdEs1n#!ZtC&Xre8nE3y{4`}Ygl~16J$(fgp*_n}tor3|S-G-5Yp=UDVJY^>7$&=OQ
z$uWMK>^e`LDRIi=w0UxjHzv2vlV|dnI(gYVImWk>kIs{4%9}R%**rO>u<4W8=F2fj
z&X}w=UyjLO=47||a!dlVCa2ApW0IRSxoy6j?3G#n|679G3A2`gfkB3Wf#DAm1H;G3
z2j|N(KAik;KFFzz3*;FOPgYzY&$xNA;{ticC6f~u$TQBK+_*rVaq8rS3*;I5Cm&oO
z&sabC;R1QavdN4K<r#NRR$M4w?=k!Te^7nL0J9?$<S~dnb66M{+-Cp(uZir21cdw^
z76u0Y+5i8`Bg=;&<nORBF!;^>51P(lfSVtWkpIKNpu`Y1`~QD4kgs44VAhoZDFF$|
zure^@On$gfo-ukd<05&*hdciNw@0=N#D)e+4J!i!!(_)r@{FvL6Bj8n9p62<ZIK+K
z!{nul<QbhOA6+ERXgB%kB6+3@`zEt3mSdbdS#_~IW87rd#mbCKlQS2~GyOd~xofc;
zBh%!Si{%-MC!bs_&vg6T<X4O3BrDGU|IY@s3q*-9FfhchGcXiPR$L;^*fH61i973t
z^Z);|Zr)h3hhy@^HRenwiZ^quUB|+7qImMIje3%>xm%EK7-nV=VhGsGxM@2plgyII
z0WBhv&uvd)jG1h>BVH0VstxiKNWBd+1A`C)AA{)Tl{?rOnI=X}-n3JX$*OSjqn&z8
zDT$MXcIh#lE}ZPNtBmP&<m6qu+?axkCNu4JV^o;zxm%veOlES{ZZ(jjChgwF#B@7$
zve&+AOkblWEA8)N3QU^3X}=y*K=I^9`>!z>B~RXUz)k8-1jt$j27XYoXJBAB#SU@6
zg{a9=2lb>j#Y3b)<3k|U8>sZJ)X7N)%cM%;K!OYm$`FddkOQK7dfetu2iX`I1vdXY
zbe)fBY2xHd7xlPKK!@;86i?>5<i;31Iq;G`CoIHbCU;&k=M0zwF)3j4$xF+b0G`QA
AYXATM

diff --git a/compilador.tab.c b/compilador.tab.c
index fe1feac..3499d0d 100644
--- a/compilador.tab.c
+++ b/compilador.tab.c
@@ -567,11 +567,11 @@ static const yytype_int16 yyrline[] =
      234,   238,   210,   246,   247,   245,   255,   258,   259,   263,
      262,   272,   272,   280,   281,   284,   294,   297,   298,   299,
      302,   303,   306,   307,   308,   309,   310,   311,   314,   314,
-     318,   319,   322,   322,   345,   345,   388,   391,   395,   394,
-     407,   407,   421,   424,   425,   428,   437,   440,   443,   448,
-     451,   454,   457,   460,   463,   466,   469,   475,   481,   484,
-     487,   490,   493,   493,   524,   535,   537,   544,   537,   570,
-     577,   579,   582,   582
+     318,   319,   322,   322,   353,   353,   396,   399,   403,   402,
+     415,   415,   429,   432,   433,   436,   445,   448,   451,   456,
+     459,   462,   465,   468,   471,   474,   477,   483,   489,   492,
+     495,   498,   501,   501,   543,   554,   556,   563,   556,   589,
+     596,   598,   601,   601
 };
 #endif
 
@@ -1536,7 +1536,7 @@ yyreduce:
             desloc = retira_vs_pf(ts);
             geraCodigo(NULL,buffer);
             if (nivel_lexico > 0)
-               nivel_lexico += 1;
+               nivel_lexico -= 1;
             mostra_ts(ts);
          }
 #line 1543 "compilador.tab.c"
@@ -1773,18 +1773,26 @@ yyreduce:
     if (l_elem == NULL) {
         yyerror("Variável de destino não declarada");
     } else {
-        if (l_elem->categ == PF && l_elem->info.pf.passagem == REF)
+         if (l_elem->categ == PF && l_elem->info.pf.passagem == REF)
             atr_indireto = REF;
          else atr_indireto = VLR; 
-        destino_nivel = l_elem->nivel;
-        destino_desloc = l_elem->info.vs.desloc;
+         destino_nivel = l_elem->nivel;
+         if(l_elem->categ == VS)
+            destino_desloc = l_elem->info.vs.desloc;
+         else if(l_elem->categ == PF)
+            destino_desloc = l_elem->info.pf.desloc;
+         else if(l_elem->categ == FUN)
+            destino_desloc = l_elem->info.fun.desloc;
+         else
+            yyerror("Tentativa de atribuir em procedimento");
+
     }
 }
-#line 1784 "compilador.tab.c"
+#line 1792 "compilador.tab.c"
     break;
 
   case 63:
-#line 332 "compilador.y"
+#line 340 "compilador.y"
                                {
     // Gera código ARMZ para armazenar valor
     char buffer[50];
@@ -1795,11 +1803,11 @@ yyreduce:
     }
     geraCodigo(NULL, buffer);
 }
-#line 1799 "compilador.tab.c"
+#line 1807 "compilador.tab.c"
     break;
 
   case 64:
-#line 345 "compilador.y"
+#line 353 "compilador.y"
             {
                if (l_elem == NULL){
                   yyerror("Procedimento não declarado");
@@ -1811,11 +1819,11 @@ yyreduce:
                   geraCodigo(NULL, "AMEM 1");
                num_param = 0; // Reinicia a contagem de parâmetros reais   
             }
-#line 1815 "compilador.tab.c"
+#line 1823 "compilador.tab.c"
     break;
 
   case 65:
-#line 359 "compilador.y"
+#line 367 "compilador.y"
             { 
                if (l_elem->categ == PR || l_elem->categ ==FUN) {
                   char buffer[50];
@@ -1843,11 +1851,11 @@ yyreduce:
                   geraCodigo(NULL, buffer);
                }
             }
-#line 1847 "compilador.tab.c"
+#line 1855 "compilador.tab.c"
     break;
 
   case 68:
-#line 395 "compilador.y"
+#line 403 "compilador.y"
                {
                   char buffer[50];
                   desempilha(buffer,proc);
@@ -1855,20 +1863,20 @@ yyreduce:
                   val_ou_ref = l_elem->info.pr.param[num_param][1];
                   empilha(buffer,proc);
                }
-#line 1859 "compilador.tab.c"
+#line 1867 "compilador.tab.c"
     break;
 
   case 69:
-#line 403 "compilador.y"
+#line 411 "compilador.y"
                {
                   num_param++; // Incrementa para cada parâmetro real
                   val_ou_ref = VLR;
                }
-#line 1868 "compilador.tab.c"
+#line 1876 "compilador.tab.c"
     break;
 
   case 70:
-#line 407 "compilador.y"
+#line 415 "compilador.y"
                  {
                   char buffer[50];
                   desempilha(buffer,proc);
@@ -1876,20 +1884,20 @@ yyreduce:
                   val_ou_ref = l_elem->info.pr.param[num_param][1];
                   empilha(buffer,proc);
                }
-#line 1880 "compilador.tab.c"
+#line 1888 "compilador.tab.c"
     break;
 
   case 71:
-#line 415 "compilador.y"
+#line 423 "compilador.y"
                {
                   num_param++; // Conta o primeiro parâmetro real
                   val_ou_ref = VLR;
                }
-#line 1889 "compilador.tab.c"
+#line 1897 "compilador.tab.c"
     break;
 
   case 75:
-#line 428 "compilador.y"
+#line 436 "compilador.y"
                     {
                geraCodigo(NULL, "LEIT");
                l_elem = busca(token,ts);
@@ -1897,123 +1905,123 @@ yyreduce:
                sprintf(buffer,"ARMZ %d,%d",l_elem->nivel,l_elem->info.vs.desloc);
                geraCodigo(NULL,buffer);
             }
-#line 1901 "compilador.tab.c"
+#line 1909 "compilador.tab.c"
     break;
 
   case 77:
-#line 440 "compilador.y"
+#line 448 "compilador.y"
                                                          {
                geraCodigo(NULL,"IMPR");
             }
-#line 1909 "compilador.tab.c"
+#line 1917 "compilador.tab.c"
     break;
 
   case 78:
-#line 443 "compilador.y"
+#line 451 "compilador.y"
                                 {
                geraCodigo(NULL,"IMPR");
             }
-#line 1917 "compilador.tab.c"
+#line 1925 "compilador.tab.c"
     break;
 
   case 79:
-#line 448 "compilador.y"
+#line 456 "compilador.y"
                                              {
             geraCodigo(NULL, "CMIG"); // Adiciona operação de cmig
          }
-#line 1925 "compilador.tab.c"
+#line 1933 "compilador.tab.c"
     break;
 
   case 80:
-#line 451 "compilador.y"
+#line 459 "compilador.y"
                                                 {
             geraCodigo(NULL, "CMDG"); // Adiciona operação de cmdg
          }
-#line 1933 "compilador.tab.c"
+#line 1941 "compilador.tab.c"
     break;
 
   case 81:
-#line 454 "compilador.y"
+#line 462 "compilador.y"
                                              {
             geraCodigo(NULL, "CMME"); // Adiciona operação de cmme
          }
-#line 1941 "compilador.tab.c"
+#line 1949 "compilador.tab.c"
     break;
 
   case 82:
-#line 457 "compilador.y"
+#line 465 "compilador.y"
                                                    {
             geraCodigo(NULL, "CMEG"); // Adiciona operação de cmeg
          }
-#line 1949 "compilador.tab.c"
+#line 1957 "compilador.tab.c"
     break;
 
   case 83:
-#line 460 "compilador.y"
+#line 468 "compilador.y"
                                              {
             geraCodigo(NULL, "CMMA"); // Adiciona operação de cmma
          }
-#line 1957 "compilador.tab.c"
+#line 1965 "compilador.tab.c"
     break;
 
   case 84:
-#line 463 "compilador.y"
+#line 471 "compilador.y"
                                                    {
             geraCodigo(NULL, "CMAG"); // Adiciona operação de cmag
          }
-#line 1965 "compilador.tab.c"
+#line 1973 "compilador.tab.c"
     break;
 
   case 86:
-#line 469 "compilador.y"
+#line 477 "compilador.y"
                                                 {
                if (val_ou_ref == REF)
                   yyerror("Erro: tentativa de EXPRESSAO em passagem por REFERENCIA\n");
                else
                   geraCodigo(NULL, "SOMA"); // Adiciona operação de soma
             }
-#line 1976 "compilador.tab.c"
+#line 1984 "compilador.tab.c"
     break;
 
   case 87:
-#line 475 "compilador.y"
+#line 483 "compilador.y"
                                             {
                if (val_ou_ref == REF)
                   yyerror("Erro: tentativa de EXPRESSAO em passagem por REFERENCIA\n");
                else
                   geraCodigo(NULL, "SUBT"); // Adiciona operação de subt
             }
-#line 1987 "compilador.tab.c"
+#line 1995 "compilador.tab.c"
     break;
 
   case 89:
-#line 484 "compilador.y"
+#line 492 "compilador.y"
                              {
                geraCodigo(NULL, "MULT"); // Adiciona operação de mult
             }
-#line 1995 "compilador.tab.c"
+#line 2003 "compilador.tab.c"
     break;
 
   case 90:
-#line 487 "compilador.y"
+#line 495 "compilador.y"
                               {
                geraCodigo(NULL, "DIVI"); // Adiciona operação de divi
             }
-#line 2003 "compilador.tab.c"
+#line 2011 "compilador.tab.c"
     break;
 
   case 92:
-#line 493 "compilador.y"
+#line 501 "compilador.y"
              {
     // Carrega variável
     l_elem = busca(token, ts);
     empilha(token, proc);
    }
-#line 2013 "compilador.tab.c"
+#line 2021 "compilador.tab.c"
     break;
 
   case 93:
-#line 499 "compilador.y"
+#line 507 "compilador.y"
    {
       char buffer[50];
       desempilha(buffer, proc);
@@ -2022,28 +2030,39 @@ yyreduce:
          yyerror("Variável não declarada");
       } else {
          if (val_ou_ref == REF) {
-               if (l_elem->categ == VS) 
+               if (l_elem->categ == VS){
                   sprintf(buffer, "CREN %d,%d", l_elem->nivel, l_elem->info.vs.desloc);
-               else if (l_elem->categ == FUN)
-                  sprintf(buffer, "CREN %d,%d", l_elem->nivel, l_elem->info.fun.desloc);
+                  geraCodigo(NULL, buffer);
+               }
+               else if (l_elem->categ == PF){
+                  sprintf(buffer, "CREN %d,%d", l_elem->nivel, l_elem->info.pf.desloc);
+                  geraCodigo(NULL, buffer);
+               }
+               else
+                  yyerror("Tentativa de passagem de referencia de procedimento ou funcao");
+               
          } 
          else if (l_elem->categ == PF && l_elem->info.pf.passagem == REF) {
                sprintf(buffer, "CRVI %d,%d", l_elem->nivel, l_elem->info.pf.desloc);
+               geraCodigo(NULL, buffer);
          }        
          else {
-               if (l_elem->categ == VS) 
+               if (l_elem->categ == VS) {
                   sprintf(buffer, "CRVL %d,%d", l_elem->nivel, l_elem->info.vs.desloc);
-               else if (l_elem->categ == FUN)
-                  sprintf(buffer, "CRVL %d,%d", l_elem->nivel, l_elem->info.fun.desloc);
+                  geraCodigo(NULL, buffer);
+               }
+               else if (l_elem->categ == PF){
+                  sprintf(buffer, "CRVL %d,%d", l_elem->nivel, l_elem->info.pf.desloc);
+                  geraCodigo(NULL, buffer);
+               }
          }
-         geraCodigo(NULL, buffer);
       }
    }
-#line 2043 "compilador.tab.c"
+#line 2062 "compilador.tab.c"
     break;
 
   case 94:
-#line 524 "compilador.y"
+#line 543 "compilador.y"
          {
     // Empilha constante
     char buffer[50];
@@ -2054,11 +2073,11 @@ yyreduce:
     }
     geraCodigo(NULL, buffer);
 }
-#line 2058 "compilador.tab.c"
+#line 2077 "compilador.tab.c"
     break;
 
   case 96:
-#line 537 "compilador.y"
+#line 556 "compilador.y"
                     {
                char r_ini[4];
                sprintf(r_ini, "R%02d", rot_id);
@@ -2066,11 +2085,11 @@ yyreduce:
                rot_id += 1;
                geraCodigo(r_ini,"NADA");
             }
-#line 2070 "compilador.tab.c"
+#line 2089 "compilador.tab.c"
     break;
 
   case 97:
-#line 544 "compilador.y"
+#line 563 "compilador.y"
                                {
                char r_fim[4];
                sprintf(r_fim, "R%02d", rot_id);
@@ -2081,11 +2100,11 @@ yyreduce:
                strcat(buffer,r_fim);
                geraCodigo(NULL,buffer);
             }
-#line 2085 "compilador.tab.c"
+#line 2104 "compilador.tab.c"
     break;
 
   case 98:
-#line 554 "compilador.y"
+#line 573 "compilador.y"
                                {
                char r_ini[4];
                char r_fim[4];
@@ -2100,21 +2119,21 @@ yyreduce:
 
                geraCodigo(r_fim,"NADA");
             }
-#line 2104 "compilador.tab.c"
+#line 2123 "compilador.tab.c"
     break;
 
   case 99:
-#line 570 "compilador.y"
+#line 589 "compilador.y"
                                        {
                char r_fim[4];
                desempilha(r_fim,rot);
                geraCodigo(r_fim,"NADA");
             }
-#line 2114 "compilador.tab.c"
+#line 2133 "compilador.tab.c"
     break;
 
   case 102:
-#line 582 "compilador.y"
+#line 601 "compilador.y"
                       {
                char r_else[4];
                sprintf(r_else,"R%02d",rot_id);
@@ -2130,11 +2149,11 @@ yyreduce:
                empilha(r_fim, rot);
                rot_id += 1;
             }
-#line 2134 "compilador.tab.c"
+#line 2153 "compilador.tab.c"
     break;
 
   case 103:
-#line 597 "compilador.y"
+#line 616 "compilador.y"
                                     {
                char r_fim[4];
                desempilha(r_fim,rot);
@@ -2149,11 +2168,11 @@ yyreduce:
 
                geraCodigo(r_else,"NADA");
             }
-#line 2153 "compilador.tab.c"
+#line 2172 "compilador.tab.c"
     break;
 
 
-#line 2157 "compilador.tab.c"
+#line 2176 "compilador.tab.c"
 
       default: break;
     }
@@ -2385,7 +2404,7 @@ yyreturn:
 #endif
   return yyresult;
 }
-#line 614 "compilador.y"
+#line 633 "compilador.y"
 
 
 int main (int argc, char** argv) {
diff --git a/compilador.y b/compilador.y
index 50d3bdd..1821ddd 100644
--- a/compilador.y
+++ b/compilador.y
@@ -84,7 +84,7 @@ bloco       :
             desloc = retira_vs_pf(ts);
             geraCodigo(NULL,buffer);
             if (nivel_lexico > 0)
-               nivel_lexico += 1;
+               nivel_lexico -= 1;
             mostra_ts(ts);
          }
 ;
@@ -323,11 +323,19 @@ atribuicao: {
     if (l_elem == NULL) {
         yyerror("Variável de destino não declarada");
     } else {
-        if (l_elem->categ == PF && l_elem->info.pf.passagem == REF)
+         if (l_elem->categ == PF && l_elem->info.pf.passagem == REF)
             atr_indireto = REF;
          else atr_indireto = VLR; 
-        destino_nivel = l_elem->nivel;
-        destino_desloc = l_elem->info.vs.desloc;
+         destino_nivel = l_elem->nivel;
+         if(l_elem->categ == VS)
+            destino_desloc = l_elem->info.vs.desloc;
+         else if(l_elem->categ == PF)
+            destino_desloc = l_elem->info.pf.desloc;
+         else if(l_elem->categ == FUN)
+            destino_desloc = l_elem->info.fun.desloc;
+         else
+            yyerror("Tentativa de atribuir em procedimento");
+
     }
 } ATRIBUICAO expressao_simples {
     // Gera código ARMZ para armazenar valor
@@ -504,21 +512,32 @@ fator: IDENT {
          yyerror("Variável não declarada");
       } else {
          if (val_ou_ref == REF) {
-               if (l_elem->categ == VS) 
+               if (l_elem->categ == VS){
                   sprintf(buffer, "CREN %d,%d", l_elem->nivel, l_elem->info.vs.desloc);
-               else if (l_elem->categ == FUN)
-                  sprintf(buffer, "CREN %d,%d", l_elem->nivel, l_elem->info.fun.desloc);
+                  geraCodigo(NULL, buffer);
+               }
+               else if (l_elem->categ == PF){
+                  sprintf(buffer, "CREN %d,%d", l_elem->nivel, l_elem->info.pf.desloc);
+                  geraCodigo(NULL, buffer);
+               }
+               else
+                  yyerror("Tentativa de passagem de referencia de procedimento ou funcao");
+               
          } 
          else if (l_elem->categ == PF && l_elem->info.pf.passagem == REF) {
                sprintf(buffer, "CRVI %d,%d", l_elem->nivel, l_elem->info.pf.desloc);
+               geraCodigo(NULL, buffer);
          }        
          else {
-               if (l_elem->categ == VS) 
+               if (l_elem->categ == VS) {
                   sprintf(buffer, "CRVL %d,%d", l_elem->nivel, l_elem->info.vs.desloc);
-               else if (l_elem->categ == FUN)
-                  sprintf(buffer, "CRVL %d,%d", l_elem->nivel, l_elem->info.fun.desloc);
+                  geraCodigo(NULL, buffer);
+               }
+               else if (l_elem->categ == PF){
+                  sprintf(buffer, "CRVL %d,%d", l_elem->nivel, l_elem->info.pf.desloc);
+                  geraCodigo(NULL, buffer);
+               }
          }
-         geraCodigo(NULL, buffer);
       }
    }
 | NUMERO {
diff --git a/teste10.pas b/teste10.pas
index 339526f..3c1b11b 100644
--- a/teste10.pas
+++ b/teste10.pas
@@ -5,6 +5,7 @@ program proc1 (input, output);
     begin
         z := a;
         a := 1;
+        f := a;
     end;
 begin
     x := f(x, 2+3);
diff --git a/teste11.pas b/teste11.pas
new file mode 100644
index 0000000..a0e801c
--- /dev/null
+++ b/teste11.pas
@@ -0,0 +1,22 @@
+program funcao (input, output); 
+var  m: integer;      
+function f(n: integer; var k: integer): integer; 
+var p, q: integer;           
+begin                    
+   if n<2 then
+      begin          
+         f:=n; k:=0;     
+      end              
+   else                
+      begin            
+         f:=f(n-1,p) + f(n-2,q);   
+         k:=p+q+1;      
+      end;             
+   write(n,k);        
+end;                      
+begin                          
+   write(f(3,m),m); 
+end. 
+
+
+
diff --git a/teste5.pas b/teste5.pas
index 940451a..358a19d 100644
--- a/teste5.pas
+++ b/teste5.pas
@@ -12,7 +12,7 @@ begin
           if i = 0
             then write(2)
             else write(3);
-         end
+         end;
         else  write(i,1);
       i := i+1;             
    end;                    
-- 
GitLab