A meta proposta nesse trabalho foi alcançada. Foi desenvolvido uma ferramenta onde todos os requisitos propostos foram devidamente implementados. A ferramenta é um protótipo por se tratar da primeira versão e já está disponível para utilização na resolução de problemas de otimização.
A técnica utilizada para alcançar o objetivo proposto é a construção de compiladores e sendo que a meta foi alcançada, fica provada a viabilidade da utilização de tais técnicas para realização de trabalhos semelhantes.
Um requisito importante do desenvolvimento foi alcançar uma interface amigável, por isso foi desenvolvida uma interface gráfica simples, guardando toda a complexidade da ferramenta nos procedimento de análise interpretação e execução do método EGPA-FR. Assim como a ferramenta, a linguagem desenvolvida para efetuar a entrada de dados é intuitiva e foram desenvolvidas de forma a possibilitar uma boa usabilidade da ferramenta por parte do seu público alvo.
O trabalho como um todo é resultado de uma árdua pesquisa buscando entender os conceitos das áreas abordadas na revisão bibliográfica para adquirir um embasamento teórico que permitisse o desenvolvimento de um produto com qualidade, utilidade prática e que proporcionasse novos aprendizados e experiência para a carreira profissional do acadêmico.
Com o desenvolvimento da ferramenta encontra-se disponível uma nova alternativa para ser utilizada na resolução de problemas de otimização, fácil de usar, direcionada para a área de transporte e utilizando um método novo e robusto que é o método EGPA-FR, necessitando apenas adaptar os dados para o padrão estabelecido na ferramenta.
Outra proposta é a adição de um módulo na ferramenta para fazer o cálculo de caminhos mínimos, muito útil na resolução de problemas de transportes com contagens volumétricas. A ferramenta desenvolvida funciona perfeitamente na resolução de problemas com contagens volumétricas, mas na solução atual, a entrada dos dados de uma matriz com o valor das contagens deve conter o contador, o ponto de origem, o ponto de destino e a contagem. Propõem-se, nesse sentido, a criação de um módulo que permita que a ferramenta calcule os caminhos mínimos automaticamente quando os dados não se encontram organizados desta maneira. Essa medida tornará a ferramenta mais flexível no atendimento das necessidades do usuário.
REFERÊNCIAS BIBLIOGRÁFICAS
AHO, A. V.; SETHI, R.; HULLMAN, J. D. Compiladores: Princípios, técnicas e ferramentas.
Rio de Janeiro, Ed Guanabara Kogan S. A., 1995.
AKAMINE, A. Explorando alternativas para construção de modelos neurais de iteração espacial. Dissertação (Mestrado em Engenharia Civil) – Programa de Pós-Graduação de Mestrado em Engenharia Civil da Escola de engenharia de São Carlos da Universidade de São Paulo, 2005.
BARROS, V. T. O. Avaliação da interface de um aplicativo computacional através de teste de usabilidade, questionário ergonômico e análise gráfica do design. Dissertação (Mestrado em Engenharia de Produção) - Programa de Pós-Graduação em Engenharia de Produção, Universidade Federal de Santa Catarina, 2003.
BERTONI, F. C. Uma arquitetura neuro-genética para otimização não linear restrita. Tese (Doutorado em Engenharia Elétrica) - Programa de Pós-Graduação em Engenharia de Elétrica da Escola de engenharia elétrica de São Carlos da Universidade de São Paulo, 2007.
BEZ, E. T.; GONÇALVES, M. B. Um estudo sobre os procedimentos usados para a determinação dos parâmetros de alguns modelos de distribuição de viagens. In: Congreso latinoamericano de transporte público y urbano, Habana, 2001.
BEZ, E. T. Procedimento de representação de soluções em otimização global: aplicação em modelos de interação espacial. Tese (Doutorado em Engenharia de Produção) - Programa de Pós- Graduação em Engenharia de Produção, Universidade Federal de Santa Catarina, 2005.
BOOCK, G.; RUMBAUCH, J.; JACOBSON I. Uml: Guia do usuário. São Paulo, Ed Campus, 2000.
BRUTON, M. J. Introdução ao planejamento dos transportes. Rio de Janeiro, Ed Interciência, 1979.
CARVALHO, F. F. Delphi 6: Programação orientada a objetos. São Paulo, Ed Érica, 2001.
CASTRO, R. E. Otimização de estruturas com multi-objetivos via algoritmos genéticos. Tese (Doutorado em Ciências em Engenharia Civil) - Programa de Pós-Graduação em Ciências em Engenharia Civil, Universidade Federal do Rio de Janeiro, 2001.
DANTAS, A.; YAMAMOTO, K.; LAMAR, M. V.; YAMASHITA Y. Modelo neuro-geo-espacial para previsão da demanda de viagens no contexto do planejamento estratégico. In X congresso da Associação Nacional de Pesquisa e Ensino em Transportes, Gramado, 2000.
DELAMARO, M. E. Como construir um compilador: Utilizando ferramenta Java. Ed Novatec, 2004.
DIAS, L. A. Desenvolvimento de interfaces de ambientes interativos para Usuários Novatos – o caso de trabalhadores rurais. Dissertação (Mestrado em Engenharia de Produção) – Programa de Pós-Graduação de Mestrado em Engenharia de Produção da Universidade Federal de Santa Catarina, 2002.
FERREIRA, D. L.; SILVA, R. M.. O planejamento na Secretaria de trânsito e transportes de Uberlândia (MG) – Instituto de geografia da Universidade Federal de Uberlândia, 2003.
FERREIRA, M. S. Delphi 6: Tópicos avançados. São Paulo, Ed Érica, 2001.
GESSER, C. E. Gals: Gerador de Analisadores Léxicos e Sintáticos. Graduação (Bacharelado em Ciências da Computação) – Programa de Graduação da Universidade Federal de Santa Catarina, 2003.
HUTCHINSON, B. G. Princípios de planejamento dos sistemas de transporte urbano. Rio de Janeiro, Ed Guanabara, 1979.
LOPES, S. B. Efeitos da dependência espacial em modelos de previsão de demanda por transporte. Dissertação (Mestrado em Engenharia Civil) – Programa de Pós-Graduação de Mestrado em Engenharia Civil da Escola de engenharia de São Carlos da Universidade de São Paulo, 2005.
LOUDEN, K. C. Compiladores: princípios e praticas. São Paulo, Ed Thompson, 2004.
MARQUES, F. T. Otimização de carteiras com lotes de compra e custos de transação, uma abordagem por algoritmos genéticos. Dissertação (Mestrado em Engenharia de Produção) – Programa de Pós-Graduação em Engenharia de Produção e Sistemas da Pontifícia. Universidade Católica do Paraná, 2003.
MENEZES, P. B. Linguagens Formais e Autômatos. Porto Alegre, Sagra-Luzzatto, 2002.
NETO, JOSE J. Introdução a compilação. Rio de Janeiro, Ed Livros Técnicos e Científicos, 1987.
OLIVEIRA, H. F. Desenvolvimento de um sistema informatizado para determinar o espaçamento ótimo entre pontos de parada de transporte coletivo. Tese (Doutorado em Engenharia de Produção) - Programa de Pós-Graduação em Engenharia de Produção, Universidade Federal de Santa Catarina, 2008.
PETERS, J. F.; PEDRYCZ, W. Engenharia de software. São Paulo, Ed Campus, 2001.
PRESSMAN, R. S. Engenharia de software. São Paulo, Ed Pearson Makon Books, 1995.
RIBAS, P. C. Análise de uso de têmpera simulada na Otimização do planejamento mestre da produção. Dissertação (Mestrado em Engenharia de Produção e Sistemas) – Programa de Pós- Graduação em Engenharia de Produção da Escola de engenharia de São Carlos da Universidade de São Paulo, 2007.
SOUZA DE CURSI, J. E.; BEZ, E. T.; GONÇALVES, M. B. A hybrid method for continuous global optimization involving the representation of the solution. In 6th World Congress on Structural and Multidisciplinary Optimization, Rio de Janeiro, 2005.
SOUZA DE CURSI, J. E.; BEZ, E. T.; GONÇALVES, M. B. A procedure of global optimization and its application to estimate parameters in interaction spatial models. In International Conference on Engineering Optimization, Rio de Janeiro, 2008.
SOUSA, A. C.; SPECK, H. J.; ROHLEDER, E.; GÓMEZ, L. A. Avaliação comparativa da qualidade ergonômica das interfaces gráficas do Solidworks 2000 e AutoCAD 2000. XXIII Encontro Nacional de Engenharia de Produção – Ouro Preto, Minas Gerais, Brasil, 2003.
TONI, J. Planejamento e Transportes: Possibilidades metodológicas alternativas. In 13°
Congresso da ANTP, Porto Alegre, 2000.
GLOSSÁRIO
Alfabeto Conjunto finito de símbolos. Exemplo: o conjunto {0, 1} é o alfabeto dos dígitos binários.
Fitness É um valor que reflete a qualidade de um indivíduo para solucionar o problema. Na ferramenta desenvolvida o fitness é o resultado do calculo do valor da função objetivo a partir da aplicação dos valores das variáveis do problema e dos parâmetros de um individuo.
Lexema Seqüência de símbolos de entrada que compõem um único token.
Exemplo na linguagem Pascal, nome é um lexema para o token identificador.
Linguagem Conjunto de sentenças formadas a partir de um alfabeto.
Padrão Regra que estabelece que um lexema faz parte do padrão de um token, ou seja, especifica que um determinado conjunto de símbolos esteja associado a um token.
Sentença Seqüência finita de símbolos. Exemplo: palavras da língua portuguesa.
Sentença vazia Sentença (denotada por ε) constituída por nenhum símbolo.
Símbolo Elementos mínimos que compõe uma linguagem. Exemplo: as vogais da língua portuguesa.
Tamanho de uma sentença Denotado por |w|, corresponde ao número de símbolos que compõem a sentença w.
Token Saída resultante do reconhecimento de uma seqüência de símbolos.
Nas linguagens de programação é comum tratar como tokens palavras chave, identificadores, constantes, símbolos especiais, entre outros.
APENDICE
A. ANALISADORES LÉXICO SINTÁTICO E SEMÃNTICO
Devido às características do problema a técnica de compiladores mostrou-se adequada como ferramenta para auxiliar no desenvolvimento e alcançar o objetivo proposto. Para tal foi utilizado a ferramenta GALS onde foram produzidos os analisadores, léxico, sintático e semântico que também possibilitaram a geração do código intermediário. Esses analisadores são de importância fulcral no processo de desenvolvimento da ferramenta. Abaixo segue a exposição dos analisadores desenvolvidos e utilizados no projeto.
ANALISADOR LÉXICO
Abaixo encontra-se descrito o analisador léxico que mostra como são definidos todos os tokens que poderão ser utilizados na entrada de dados na ferramenta.
maiuscula : [A-Z]
minuscula : [a-z]
letra : {maiuscula}|{minuscula}
ifen : "_"
digito : [0-9]
ascii : [\0-\255]
apostrofo : ["'"]
sinal : "+"|"-"
espaco : [\ \t\n\r\b]
comentariodelinha: "/"+"/" ({ascii}).*
comentariodebloco: "/"+"*" [^ "*/"]* "*"+"/"
"projeto" // palavra inicial que deve ser seguida como nome do projeto
"variáveis" // indicar a declaração de variáveis
"fimvariaveis" //fim da declaração de variáveis
"parametros" // indicar a declaração de parâmetros
"fimparametros" //fim da declaração de parâmetros
"função" // indicar a declaração da função objetivo do problema
"fimfunção" //fim da expressão da função objetivo
"saída_em_arquivo" //inicio da seção de saída de variáveis em arquivo
"fimsaída_em_arquivo" //fim das expressões de saída em arquivo
"@cv" // identificar uma matriz que conterá os dados de um contador
"@para" //inicio de uma estrutura de repetição
"real" // tipos de variaveis
"inteiro"
"vetor"
"matriz"
"+" // operadores
"-"
"*"
"/" // operações para serem utilizadas nas funções
"@sqr" // exponencial
"@sqrt" // raiz quadrada
"@sen" // seno
"@cos" // coseno
"@pi" // Pi
"@e" // e
"@soma" // somatório
"@produto" // Produtório
"@arquivo" // carregar dados para uma variável a partir de uma arquivo // ou indicar o arquivo de saída de uma variável
//declaração de um identificador – admite no Maximo 10 caracteres sendo que 9 e 1 digito identificador:
({letra})({letra})?({letra})?({letra})?({letra})?({letra})?({letra})?({letra})?({letra})?({digito})?
//tipos de variaveis - números inteiros com ou sem sinal e com o maximo de 10 dígitos inteiros:
({sinal})?{digito}({digito})?({digito})?({digito})?({digito})?({digito})?({digito})?({digito})?({digito})?({digito})?
// números reais com ou sem sinal e com o maximo de 11 dígitos, e mais 12 dígitos reais:
({sinal})?{digito}({digito})?({digito})?({digito})?({digito})?({digito})?({digito})?({digito})?({digito})?({digito})?({digit o})?","{digito}({digito})?({digito})?({digito})?({digito})?({digito})?({digito})?({digito})?({digito})?({digito})?({digito})
?({digito})?
//declaração de variaveis - variáveis com no maximo 10 caracteres que podem ser letras ou digitos contador:
({letra}|{ifen}|{digito})({letra}|{ifen}|{digito})?({letra}|{ifen}|{digito})?({letra}|{ifen}|{digito})?({letra}|{ifen}|{digito})?
({letra}|{ifen}|{digito})?({letra}|{ifen}|{digito})?({letra}|{ifen}|{digito})?({letra}|{ifen}|{digito})?({letra}|{ifen}|{digito})
?
// literais - inicia com apóstrofo, aceita qualquer caractere e termina com apóstrofo literais:
({apostrofo}) [^ "'"]* ({apostrofo})
"=" // operadores e simbolos
"(" // parenteses
")"
"["
"]"
";"
":"
","
"|"
"||"
//ignorar espaço e comentários : {espaco}*
:!{comentariodelinha}
:!{comentariodebloco}
ANALISADOR SINTÁTICO
Abaixo se encontra exposto a gramática e o posicionamento das ações semânticas (‘#’
seguido de um número) que possibilitam a verificação de erros, a interpretação dos dados e a geração do código intermediário, utilizados no processo de desenvolvimento para auxiliar a alcançar o objetivo proposto no trabalho.
<inicio> ::= "projeto" identificador #1 ";" <corpo>;
<corpo>::= <declaracaoparametros> <declaracaovariaveis> <declaracaofuncao> <saidaemarquivo> #79;
<declaracaoparametros> ::= "parametros" #2 <declaraparametros>;
<declaraparametros> ::= <tipo> ":" <listadeidentificadores> <maisparametros>;
<maisparametros> ::= ";" <maisparametros2>;
<maisparametros2> ::= <declaraparametros> | "fimparametros";
<listadeidentificadores> ::= <identificador> #10 <listadeidentificadores2>;
<listadeidentificadores2> ::= "," <listadeidentificadores> | î;
<identificador> ::= identificador #9;
<tipo> ::= "inteiro" #5 | "real" #6 | "vetor" #7 | "matriz" #8;
<declaracaovariaveis> ::= "variáveis" #3 <declaravariaveis> | î;
<declaravariaveis> ::= #11 <tipo> ":" <listadeidentificadores> ";" <maisvariaveis>
| #12 <identificador> #13 <indice> "=" <valor> ";" <maisvariaveis>;
<maisvariaveis> ::= <declaravariaveis> | "fimvariaveis" #30;
<indice> ::= "(" #14 <inteiroouidentificador> #21 <indice2> ")" #15 | #16 î;
<indice2> ::= "," #17 <inteiroouidentificador> #21 | #18 î;
<inteiroouidentificador> ::= <número> #19 | <identificador> #20 <indice>;
<valor> ::= <número> #22 | <IdentificadorComContador> <dadosdavariavelindexada>;
<IdentificadorComContador> ::= "@cv" #77 | î;
<dadosdavariavelindexada> ::= "(" #23 <valoresdeumvetor> ")" #24 | <carregadearquivo>;
<número> ::= inteiros #25 | reais #26;
<valoresdeumvetor> ::= <número> #27 <maisvalores> | contador #80 <maisvalores> | identificador #80
<maisvalores>;
<maisvalores> ::= <valoresdeumvetor> | ";" #28 <valoresdeumvetor> | î;
<carregadearquivo> ::= "@arquivo" ":" literais #29;
<declaracaofuncao> ::= "função" #4 <identificador> <IndiceIdentiFuncao> #31 "=" <expressao> "fimfunção"
#34 #32;
<IndiceIdentiFuncao> ::= "(" <identificador> ")" | î;
<expressao> ::= <termo> <sqr> #33 <operacao> ;
<operacao> ::= "+" #34 #35<expressao>
| "-" #34 #36 <expressao>
| "*" #37 <expressao>
| "/" #38 <expressao>
| î;
<termo> ::= <número> #39
| <identificador> <indice>
| <sqrt>
| <seno>
| <coseno>
| <somaouproduto>
| <pi>
| <e>
| <ContagemVolumetrica>
| <quadradoDeDiferenca>
| <expressao2>;
<expressao2> ::= #60 "[" <expressao> "]" #61
| #60 "(" <expressao> ")" #61
| #60 "|" <expressao> "|" #61 #63;
<quadradoDeDiferenca> ::= "||" #62 <expressao> "||" #61 #74;
<sqr> ::= "@sqr" <expressao2> #40 | î;
<sqrt> ::= "@sqrt" <expressao2> #41;
<seno> ::= "@sen" <expressao2> #42;
<coseno> ::= "@cos" <expressao2> #43;
<pi> ::= "@pi" #44;
<e> ::= "@e" <expressao2> #45;
<somaouproduto> ::= "@soma" #46 <produto_soma> | "@produto" #47 <produto_soma>;
<produto_soma> ::= "[" #48 <produto_soma2> "]" #49 | "(" #48 <produto_soma2> ")" #49;
<produto_soma2> ::= "(" <indicerepeticao> <expressao>;
<indicerepeticao> ::= <valorindice> #50 <maisumindice>;
<valorindice> ::= <número> #51 | <identificador> #52 <inicializarindice>;
<inicializarindice> ::= "=" <número> #53 | #54 î;
<maisumindice> ::= "," #55 <indicerepeticao> | ")";
<ContagemVolumetrica> ::= "@cv" #75 "(" <identificador> #56 <indice> #57 "," <identificador> #58 <indice>
#59 ")";
<saidaemarquivo> ::= "saída_em_arquivo" #64 <saidadados> "fimsaída_em_arquivo" #65 | î;
<saidadados> ::= #66 <tipo> ":" <listadeidentificadores> ";" <maissaidadedados>
| "@para" #67 "(" "(" <indicerepeticao> "," <matrizesouVetores> ")" ";"
#68 <maissaidadedados>
| #72 <identificador> ":" "@arquivo" ":" literais #73 ";"
<maissaidadedados>;
<matrizesouVetores> ::= #69 <identificador> #78 <indice> "=" #70 <expressao> #61 #71 ";"
<maismatrizesouVetores>;
<maismatrizesouVetores> ::= <matrizesouVetores> | î;
<maissaidadedados> ::= <saidadados> | #76 î;
ANALISADOR SEMÃNTICO E GERADOR DE CÓDIGO INTERMEDIÁRIO
LISTA DAS AÇÕES SEMÂNTICAS E SEU FUNCIONAMENTO1: begin
identificador := token.getLexeme;
simbolos.Insere(identificador, 0, 3, 0, 0);
instrucoesInicializacao.Insere(ponteiro2, 'DNP', identificador, '0');
inc (ponteiro2);
end;
2: begin
contextogeral := 'parâmetros';
contexto := 'decpar';
end;
3: begin
contextogeral := 'variáveis';
contexto := 'decvar';
end;
4: begin
contextogeral := 'função';
contexto := '';
podeindexar := 1;
end;
5: begin tipo := 1;
if contexto = 'decvarsaída' then begin
erro := 'Erro declarando uma variável para saída em arquivo. Só são aceitos variáveis do tipo vetor ou matriz';
Abort;
end;
end;
6: begin tipo := 2;
if contexto = 'decvarsaída' then begin
erro := 'Erro declarando uma variável para saída em arquivo. Só são aceitos variáveis do tipo vetor ou matriz';
Abort;
end;
end;
7: begin tipo := 3;
if contexto = 'decpar' then begin
erro := 'Erro declarando parametro. Os parãmetros devem ser do tipo Inteiro ou real';
Abort;
end;
end;
8: begin tipo := 4;
if contexto = 'decpar' then begin
erro := 'Erro declarando parametro. Os parãmetros devem ser do tipo Inteiro ou real';
Abort;
end;
end;
9: begin
identificador := token.getLexeme;
if contexto <> '' then begin
if simbolos.foiDeclarado(identificador) then begin tipo := simbolos.GetTipo(identificador);
inicializando := simbolos.GetInicializando(identificador);
if (contexto = 'decvar') or (contexto = 'decpar') or (contexto = 'decvarsaída') then begin erro := 'Erro. Identificador"' + identificador + '" redeclarado';
Abort;
end else if inicializando > 3 then begin
if (contexto = 'arquivodesaída') and (inicializando > 5) then begin
erro := 'Erro. Já foi adicionado um arquivo de saída para o identificador "' + identificador + '"';
Abort;
end else if (contexto = 'inivarsaída') and ((inicializando = 5) or (inicializando = 7)) then begin erro := 'Erro. O identificador"' + identificador + '" já foi incializado';
Abort;
end;
end;
end else begin//utilizando o identificador
if (contexto <> 'decvar') and (contexto <> 'decpar') and (contexto <> 'decvarsaída') then begin erro := 'Erro. O identificador "' + identificador + '" não foi declarado';
Abort;
end;
end;
end;
end;
10:begin
if contexto = 'decpar' then begin//declarando um parâmetro inicializando := 2;
instrucoesInicializacao.Insere(ponteiro2, 'DPA', identificador, IntToStr(tipo));
end else begin
if contexto = 'decvar' then//declarando uma variável inicializando := 0
else if contexto = 'decvarsaída' then//declarando uma variável para realizar saída em arquivo inicializando := 4;
instrucoesInicializacao.Insere(ponteiro2, 'DVA', identificador, IntToStr(tipo));
end;
simbolos.Insere(identificador, tipo, inicializando, 0, 0);
inc (ponteiro2);
end;
11:begin
end;
12:begin
contexto := 'inicializando';
end;
13:begin
if inicializando = 1 then begin
erro := 'Erro. O identificador "' + identificador + '" já foi inicializado';
Abort;
end;
podeindexar := 1;// não permite utilização de variáveis indexadas para indexar uma variável contagem := false;
contador := '';
identificadordoindice1 := '';
identificadordoindice2 := '';
end;
14:begin
if tipo < 3 then begin
erro := 'Erro. O identificador "' + identificador + '" não foi declarado como uma variável indexada';
Abort;
end else
if podeindexar = 0 then begin
erro := 'Erro inicializando o índice do identificador "' + identificador + '" com uma variável indexada';
Abort;
end else begin indiceAtual := 1;
indice.Empilha(Tipo, indiceAtual, identificador);
if podeindexar = 1 then podeindexar := 0;
end;
end;
15:begin
if contexto <> 'inivarsaída' then begin indice.Desempilha;
if contexto = 'função' then begin if tipo = 3 then
InstrucoesExecucao.Insere(ponteiro, 'CVV', identificador, '') else
InstrucoesExecucao.Insere(ponteiro, 'CVM', identificador, '');
inc (ponteiro);
end;
end;
end;
16: begin
if Tipo > 2 then begin
if (quadradoDeDiferenca = 0) or (tipo = 4) then begin
erro := 'O identificador "' + identificador + '" deve ser indexado';
Abort;
end else if contexto = 'função' then begin// operação com um vetor
auxiliar := somatorio.InicializouIndice(3); //-1 se não foi inicializado ou valor inicializado atributo := simbolos.GetAtributo1(identificador);
if auxiliar = -1 then begin
auxiliar := somatorio.procuraIdSomatorio(3);
instrucoesInicializacao.Insere(ponteiro2, 'ISF', FloatToStr(auxiliar), FloatToStr(atributo));
inc (ponteiro2);
somatorio.InicializaIndice(3, atributo);
end else begin
if atributo <> auxiliar then begin
erro := 'Erro na declaração de uma expressão de quadrado de diferença.' + #13 + 'O tamanho dos vetores utilizados é diferente';
Abort;
end;
end;
auxiliar := somatorio.procuraIdSomatorio(3);
InstrucoesExecucao.Insere(ponteiro, 'CNI', '', FloatToStr(auxiliar));
inc (ponteiro);
InstrucoesExecucao.Insere(ponteiro, 'CVV', identificador, '');
inc (ponteiro);
end;
end else begin
if contexto = 'função' then begin
auxiliar := somatorio.buscaSomatorio(identificador);
if auxiliar = -1 then
InstrucoesExecucao.Insere(ponteiro, 'CID', identificador, '') else
InstrucoesExecucao.Insere(ponteiro, 'CVI', FloatToStr(auxiliar),
IntToStr(somatorio.buscaindice(StrToInt(FloatToStr(auxiliar)), identificador)));
inc (ponteiro);
end;
end;
end;
17:begin
if tipo = 3 then begin
erro := 'O identificador "' + identificador + '" foi declarado como vetor. O índice deve ser unidimensional';
Abort;
end;
end;
18:begin
if tipo = 4 then begin
erro := 'O identificador "' + identificador + '" foi declarado como uma matriz. O índice deve ser bidimensional';
Abort;
end;
end;
19:begin
if tiponumero = 2 then begin//o número reconhecido é um número real erro := 'Para indexação só podem ser utilizados números inteiros';
Abort;
end else if (contexto = 'inicializando') or (contexto = 'inivarsaída') then begin if indiceAtual = 1 then begin
Simbolos.SetAtributo1(identificador, valor);
if tipo = 3 then begin
instrucoesInicializacao.Insere(ponteiro2, 'INE', identificador, FloatToStr(valor));
inc (ponteiro2);
if contexto ='inivarsaída'then begin
instrucoesInicializacao.Insere(ponteiro2, 'RPM', identificador, '');
inc (ponteiro2);
InstrucoesExecucao.Insere(ponteiro, 'CNU', '', FloatToStr(valor));
inc (ponteiro);
end;
end else if tipo = 4 then begin
instrucoesInicializacao.Insere(ponteiro2, 'INL', identificador, FloatToStr(valor));
inc (ponteiro2);
end;
indiceatual := 2;
end else begin
simbolos.SetAtributo2(identificador, StrToInt(FloatToStr(valor)));
inc (ponteiro2);
if contexto ='inivarsaída'then begin
instrucoesInicializacao.Insere(ponteiro2, 'RPM', identificador, '');
inc (ponteiro2);
InstrucoesExecucao.Insere(ponteiro, 'CNU', '', FloatToStr(valor));
inc (ponteiro);
end;
end;
end else if contexto = 'função' then begin
InstrucoesExecucao.Insere(ponteiro, 'CNU', '', FloatToStr(valor));
inc (ponteiro);
end;
end;
20:begin
if Tipo = 2 then begin//real
erro := 'Os identificadores do tipo real não podem ser utilizados para indexação';
Abort;
end else if (Tipo = 1) and ((contexto = 'inicializando') or (contexto = 'inivarsaída')) then begin if indiceatual = 1 then begin
identificadordoindice1 := identificador;
if (contexto = 'inicializando') then begin if indice.getTipo = 3 then
instrucoesInicializacao.Insere(ponteiro2, 'INE', indice.GetIdentificador, '-1') else
instrucoesInicializacao.Insere(ponteiro2, 'INL', indice.GetIdentificador, '-1');
inc (ponteiro2);
end else if (contexto = 'inivarsaída') then begin
Simbolos.SetAtributo1(indice.GetIdentificador, Simbolos.GetAtributo1(identificador));
auxiliar := somatorio.buscaSomatorio(identificador);
if auxiliar = -1 then
InstrucoesExecucao.Insere(ponteiro, 'CID', identificador, '') else
InstrucoesExecucao.Insere(ponteiro, 'CVI', FloatToStr(auxiliar),
IntToStr(somatorio.buscaindice(StrToInt(FloatToStr(auxiliar)), identificador)));
inc (Ponteiro);
if indice.getTipo = 3 then begin
instrucoesInicializacao.Insere(ponteiro2, 'INE', indice.GetIdentificador, FloatToStr(Simbolos.GetAtributo1(identificador)));
inc (ponteiro2);
instrucoesInicializacao.Insere(ponteiro2, 'RPM', indice.GetIdentificador, '');
inc (ponteiro2);
end else begin
instrucoesInicializacao.Insere(ponteiro2, 'INL', indice.GetIdentificador, FloatToStr(Simbolos.GetAtributo1(identificador)));
inc (ponteiro2);
end;
end;
indiceAtual := 2;
end else begin
identificadordoindice2 := identificador;
if (contexto = 'inicializando') then begin
instrucoesInicializacao.Insere(ponteiro2, 'INE', indice.GetIdentificador, '-1');
inc (ponteiro2);
end else if (contexto = 'inivarsaída') then begin Simbolos.SetAtributo2(indice.GetIdentificador,
strtoint(floattostr(Simbolos.GetAtributo1(identificador))));
instrucoesInicializacao.Insere(ponteiro2, 'INE', indice.GetIdentificador, FloatToStr(Simbolos.GetAtributo1(identificador)));
inc (ponteiro2);