1:   /* Created by SharpDevelop.
2:    * User: Eduardo Rocha Monteiro ([email protected])
3:    * Date: 25/2/2005
4:    * Time: 13:24
5:   */
6:  
7:   using System;
8:   using Compilador.AnalisadorLexicoN;
9:   using Compilador.Util;
10:  
11:   namespace Compilador.AnalisadorSintaticoN
12:   {
13:       /// <summary>
14:       /// Classe responsvel pela anlise sinttica do Compilador
15:       /// </summary>
16:       public class AnalisadorSintatico
17:       {
18:           private ItemLexico _itemLexico;
19:             private AnalisadorLexico _analisadorLexico;
20:             private GrafoSintatico _grafoSintatico;
21:             private Pilha _pilhaPosicao new Pilha(100);
22:             private Pilha _pilhaAridade new Pilha(100);
23:             private int _ler;        
24:  
25:           public AnalisadorSintatico(string automatoTxt,string fprimTxt,string grafoTxt,string progFonte)
26:           {
27:               _analisadorLexico new AnalisadorLexico(automatoTxt,fprimTxt,progFonte);
28:               _grafoSintatico new GrafoSintatico(grafoTxt);
29:               _grafoSintatico=_grafoSintatico.Posiciona(1);                                    
30:           }
31:           
32:           // Analisa todos itens lexico do programa fonte num contexto sintatico.        
33:           public void Analisa()
34:           {
35:               int posicao;
36:               while((_itemLexico _analisadorLexico.ProximoItemLexico())!=null)
37:               {
38:                   Console.WriteLine("Analising " _itemLexico._nome " " _itemLexico._classe);                
39:                   Console.WriteLine(AnaliseIndividual(_itemLexico));
40:               }
41:           }
42:           
43:           // Analisa um item lexico num contexto sintatico
44:           public string AnaliseIndividual(ItemLexico itemLexico)
45:           {
46:               if(_grafoSintatico.Tipo=='n')
47:               {
48:                   ExecutaAcao(_grafoSintatico.AcaoSemantica);
49:                   _grafoSintatico=_grafoSintatico.Posiciona(_grafoSintatico.ClasseLexica);                                            
50:               }
51:               if(_grafoSintatico.Tipo=='c')    
52:                   _grafoSintatico=_grafoSintatico.Next;                                                
53:               if(_grafoSintatico.ClasseLexica==_itemLexico._classe.ToString())
54:               {
55:                   if(!ExecutaAcao(_grafoSintatico.AcaoSemantica))
56:                       _grafoSintatico=_grafoSintatico.Posiciona(_grafoSintatico.Sucessor);                                
57:                   return "OK";
58:               }
59:               else
60:               {
61:                   while(_grafoSintatico.Alternativa!=0)
62:                   {            
63:                       _grafoSintatico=_grafoSintatico.Posiciona(_grafoSintatico.Alternativa);                    
64:                       if(_grafoSintatico.Tipo=='n')                                
65:                       {
66:                           ExecutaAcao(_grafoSintatico.AcaoSemantica);                
67:                           _grafoSintatico=_grafoSintatico.Posiciona(_grafoSintatico.ClasseLexica);                                            
68:                       }
69:                       if(_grafoSintatico.Tipo=='c')                    
70:                           _grafoSintatico=_grafoSintatico.Next;                                            
71:                       if(_grafoSintatico.ClasseLexica==_itemLexico._classe.ToString())
72:                       {                                                
73:                           if(!ExecutaAcao(_grafoSintatico.AcaoSemantica))
74:                               _grafoSintatico=_grafoSintatico.Posiciona(_grafoSintatico.Sucessor);                                
75:                           return "OK";
76:                       }                                                            
77:                   }
78:                   return "ERRO";
79:               }                        
80:           }
81:           
82:           public bool ExecutaAcao(int acao_id)
83:           {            
84:               switch(acao_id)
85:               {
86:                   case 16:
87:                       _pilhaPosicao=_pilhaPosicao.Push(_grafoSintatico.Sucessor);
88:                       break;
89:                   case 15:
90:                       _pilhaAridade=_pilhaAridade.Push(_analisadorLexico._FPrimHash.GetFPrim(_itemLexico._nome)._aridade);
91:                       break;                    
92:                   case 13:
93:                       _grafoSintatico=_grafoSintatico.Posiciona(_pilhaPosicao.Item);
94:                       _pilhaPosicao=_pilhaPosicao.Pop();
95:                       _pilhaAridade.DecItem();                    
96:                       if(_pilhaAridade.Item!=0)
97:                       {
98:                           Console.WriteLine("Erro de aridade");
99:                       }
100:                       _pilhaAridade=_pilhaAridade.Pop();
101:                       return true;
102:                   case 12:
103:                       _pilhaPosicao=_pilhaPosicao.Push(_grafoSintatico.Sucessor);
104:                       break;
105:                   case 21:
106:                       _grafoSintatico=_grafoSintatico.Posiciona(_pilhaPosicao.Item);
107:                       _pilhaPosicao=_pilhaPosicao.Pop();                    
108:                       return true;
109:                   case 14:
110:                       if(_pilhaAridade.Item==0)
111:                       {
112:                           Console.WriteLine("Erro de aridade");
113:                       }
114:                       _pilhaAridade.DecItem();                    
115:                       break;
116:                   default:
117:                       break;                                                        
118:               }
119:           return false;            
120:           }
121:       }
122:   }

This page was automatically generated by SharpDevelop.

1