PLP – Extensão da LI2
Implementação de ARRAY
Emanuella Aleixo ( [email protected])
José Antônio ([email protected])
Juliana Mafra ([email protected])
Marcela Balbino ([email protected])
Prof.: Augusto Sampaio
Nova BNF
Programa ::= Comando
Comando ::=
Atribuicao
| ComandoDeclaracao
| While
| IfThenElse
| IO
| Comando ";" Comando
| Skip
| ChamadaProcedimento
Skip ::=
Atribuicao ::= IdAbstrato “:=” Expressao
IdAbstrato ::= Id | Indexacao
Expressao ::= Valor | ExpUnaria | ExpBinaria | IdAbstrato
Valor ::= ValorConcreto
ValorConcreto ::= ValorInteiro | ValorBooleano | ValorString | ValorArray
ValorArray ::= “{” ListaExpressao “}”
2/11
Nova BNF (cont.)
ExpUnaria ::= "-" Expressao | "not" Expressao | "length" Expressao
ExpBinaria ::= Expressao "+" Expressao
| Expressao "-" Expressao
| Expressao "and" Expressao
| Expressao "or" Expressao
| Expressao "==" Expressao
| Expressao "++" Expressao
Indexacao ::= Id “[“ Expressao “]”
ComandoDeclaracao :: = "{" Declaracao ";" Comando "}"
Declaracao ::= DeclaracaoVariavel
| DeclaracaoProcedimento
| DeclaracaoComposta
DeclaracaoVariavel ::= "var" Id "=" Expressao
| "array" Id "=" Expressao
DeclaracaoComposta ::= Declaracao "," Declaracao
3/11
Nova BNF (cont.)
DeclaracaoProcedimento ::= "proc" Id "(" [ ListaDeclaracaoParametro ] ")"
"{" Comando "}"
ListaDeclaracaoParametro ::= Tipo Id | Tipo Id "," ListaDeclaracaoParametro
Tipo ::= "string" | "int" | "boolean" | "TipoArray"
While ::= "while" Expressao "do" Comando
IfThenElse ::= "if" Expressao "then" Comando "else" Comando
IO ::= "write" "(" Expressao ")" | "read" "(" IdAbstrato ")"
ChamadaProcedimento ::= "call" Id "(" [ ListaExpressao ] ")"
ListaExpressao ::= Expressao | Expressao, ListaExpressao
4/11
Classes Alteradas
• Tipo (plp.expressions1.util)
- private Tipo tipoInterno;
- Novo tipo -> TIPO_ARRAY
- public boolean eArray()
5/11
Classes Alteradas
• Lista (plp.imperative1.util)
Foi alterada da forma funcional (head, tail) para
forma indexada, para melhor representação de array.
6/11
Classes Alteradas
• Atribuicao (plp.imperative1.command)
- Método executar :
a[2+3]:= Expressao
Checa se o IdAbstrato é uma Indexação
* Recupera, em uma lista, os elementos do array
* Seta o índice
* Valida o índice
* lista.set(indice, expressao.avaliar(ambiente));
* ambiente.changeValor(indexacao.getId(), lista);
7/11
Classes Alteradas
• DeclaracaoVariavel (plp.imperative1.declaration)
- private boolean isArray; (no const. isArray = false)
- Método checaTipo
if (isArray) {
Tipo tipoInterno =
((ValorArray)parametro2).getTipoInterno(ambiente);
ambiente.map(parametro1,
parametro2.getTipo(ambiente));
parametro1.getTipo(ambiente).setTipoInterno(tipoInterno);
}
8/11
Classes Criadas
• IdAbstrato (plp.expressions2.expressions)
• ValorArray (plp.imperative3)
- extends ValorConcreto
- Método checaTipo
Checa se os elementos da ListaExpressao são
todos do mesmo tipo.
Ex.: {1, 2+3, 5, true}
- Método getTipoInterno
Retorna o tipo do primeiro elemento da lista.
9/11
Classes Criadas
• ValorArray (plp.imperative3) (cont.)
- Método get (int indice)
Retorna o elemento correspondente.
- Método size
Retorna o tamanho da lista, ou seja, o número de
elementos do array.
- Método set(int indice, Expressao exp)
Armazena o valor da expressão na posição
indicada pelo índice.
10/11
Classes Criadas
• Indexacao (plp.imperative3)
- implements IdAbstrato
- Método avaliar
ValorArray lista = (ValorArray) amb.get(id);
indice = getIndice(amb);
Valida o índice
return (Valor) lista.get(indice);
- Método checaTipo
id.checaTipo(amb) &&
exp.checaTipo(amb) &&
exp.getTipo(amb).eInteiro()
11/11
Dúvidas
?
12
Download

Expressao