1+ package li1 .plp .expressions2 .expression ;
2+
3+ import li1 .plp .expressions2 .memory .AmbienteCompilacao ;
4+ import li1 .plp .expressions2 .memory .AmbienteExecucao ;
5+ import li1 .plp .expressions2 .memory .VariavelJaDeclaradaException ;
6+ import li1 .plp .expressions2 .memory .VariavelNaoDeclaradaException ;
7+
8+ /**
9+ * Uma expressao ternaria contem tres expressoes e dois operadores. Ha uma ordem
10+ * definida entre estas sub-expressoes
11+ */
12+ public abstract class ExpTernaria implements Expressao {
13+
14+ /**
15+ * Expressao da esquerda
16+ */
17+ protected Expressao esq ;
18+
19+ /**
20+ * Expressao do meio
21+ */
22+ protected Expressao mei ;
23+
24+ /**
25+ * Expressao da direita
26+ */
27+ protected Expressao dir ;
28+
29+ /**
30+ * Operador 1 desta expressao ternaria
31+ */
32+ private String operador1 ;
33+
34+ /**
35+ * Operador 2 desta expressao ternaria
36+ */
37+ private String operador2 ;
38+
39+ /**
40+ * Construtor da classe.
41+ *
42+ * @param esq
43+ * a expressao da esquerda.
44+ * @param mei
45+ * a expressao do meio.
46+ * @param dir
47+ * a expressao da direita.
48+ * @param operador1
49+ * o operador1 desta expressao ternaria.
50+ * @param operador2
51+ * o operador2 desta expressao ternaria.
52+ */
53+ public ExpTernaria (Expressao esq , Expressao mei , Expressao dir , String operador1 , String operador2 ) {
54+ this .esq = esq ;
55+ this .mei = mei ;
56+ this .dir = dir ;
57+ this .operador1 = operador1 ;
58+ this .operador2 = operador2 ;
59+ }
60+
61+ /**
62+ * Retorna a expressao da esquerda
63+ *
64+ * @return a expressao da esquerda
65+ */
66+ public Expressao getEsq () {
67+ return esq ;
68+ }
69+
70+ /**
71+ * Retorna a expressao do meio
72+ *
73+ * @return a expressao do meio
74+ */
75+ public Expressao getMei () {
76+ return mei ;
77+ }
78+
79+ /**
80+ * Retorna a expressao da direita
81+ *
82+ * @return a expressao da direita
83+ */
84+ public Expressao getDir () {
85+ return dir ;
86+ }
87+
88+ /**
89+ * Retorna o operador desta expressao ternaria
90+ *
91+ * @return o operador desta expressao ternaria
92+ */
93+ public String getOperador1 () {
94+ return operador1 ;
95+ }
96+
97+ /**
98+ * Retorna o operador desta expressao ternaria
99+ *
100+ * @return o operador desta expressao ternaria
101+ */
102+ public String getOperador2 () {
103+ return operador2 ;
104+ }
105+
106+ /**
107+ * Retorna uma representacao String desta expressao. Util para depuracao.
108+ *
109+ * @return uma representacao String desta expressao.
110+ */
111+ @ Override
112+ public String toString () {
113+ return String .format ("%s %s %s %s %s" , esq , operador1 , mei , operador2 , dir );
114+ }
115+
116+ /**
117+ * Realiza a verificacao de tipos desta expressao.
118+ *
119+ * @param amb
120+ * o ambiente de compila��o.
121+ * @return <code>true</code> se os tipos das subexpressoes sao validos;
122+ * <code>false</code> caso contrario.
123+ * @exception VariavelJaDeclaradaException
124+ * se a vari�vel j� est� declarada no ambiente
125+ * @exception VariavelNaoDeclaradaException
126+ * se a vari�vel ainda n�o foi declarada no ambiente.
127+ */
128+ public boolean checaTipo (AmbienteCompilacao amb )
129+ throws VariavelNaoDeclaradaException , VariavelJaDeclaradaException {
130+ boolean result = true ;
131+ if (!getEsq ().checaTipo (amb ) || !getMei ().checaTipo (amb ) || !getDir ().checaTipo (amb )) {
132+ result = false ;
133+ } else {
134+ result = this .checaTipoElementoTerminal (amb );
135+ }
136+ return result ;
137+ }
138+
139+ /**
140+ * M�todo 'template' que ser� implementado nas subclasses para checar o tipo
141+ * do head terminal
142+ */
143+ protected abstract boolean checaTipoElementoTerminal (AmbienteCompilacao amb )
144+ throws VariavelNaoDeclaradaException , VariavelJaDeclaradaException ;
145+
146+
147+ public Expressao reduzir (AmbienteExecucao ambiente ) {
148+ this .esq = this .esq .reduzir (ambiente );
149+ this .mei = this .mei .reduzir (ambiente );
150+ this .dir = this .dir .reduzir (ambiente );
151+
152+ return this ;
153+ }
154+
155+ public abstract ExpTernaria clone ();
156+ }
0 commit comments