estudo e desenvolvimento de um protótipo de análise de nomes

159
UNIVERSIDADE FEDERAL DE GOI ´ AS – UFG CAMPUS CATAL ˜ AO – CAC DEPARTAMENTO DE CI ˆ ENCIA DA COMPUTAC ¸ ˜ AO – DCC Bacharelado em Ciˆ encia da Computa¸c˜ ao Projeto Final de Curso Estudo e Desenvolvimento de um Prot´otipo de An´ alise de Nomes da Qu´ ımica Orgˆ anica Autor: Rosˆ angela Alves de Brito Orientador: Ms. M´ arcio de Souza Dias Catal˜ ao - 2009

Upload: vuongdung

Post on 07-Jan-2017

268 views

Category:

Documents


6 download

TRANSCRIPT

Page 1: Estudo e Desenvolvimento de um Protótipo de Análise de Nomes

UNIVERSIDADE FEDERAL DE GOIAS – UFG

CAMPUS CATALAO – CAC

DEPARTAMENTO DE CIENCIA DA COMPUTACAO – DCC

Bacharelado em Ciencia da Computacao

Projeto Final de Curso

Estudo e Desenvolvimento de um Prototipo deAnalise de Nomes da Quımica Organica

Autor: Rosangela Alves de Brito

Orientador: Ms. Marcio de Souza Dias

Catalao - 2009

Page 2: Estudo e Desenvolvimento de um Protótipo de Análise de Nomes

Rosangela Alves de Brito

Estudo e Desenvolvimento de um Prototipo de Analise de Nomes da

Quımica Organica

Monografia apresentada ao Curso de

Bacharelado em Ciencia da Computacao da

Universidade Federal de Goias Campus Catalao

como requisito parcial para obtencao do tıtulo de

Bacharel em Ciencia da Computacao

Area de Concentracao: Inteligencia Artificial

Sub-Area: Processamento de Linguagem Natural

Orientador: Ms. Marcio de Souza Dias

Catalao - 2009

Page 3: Estudo e Desenvolvimento de um Protótipo de Análise de Nomes

Brito, Rosangela Alves

Estudo e Desenvolvimento de um Prototipo de Analise de Nomes da

Quımica Organica /Ms. Marcio de Souza Dias- Catalao - 2009

Numero de paginas: 146

Projeto Final de Curso (Bacharelado) Universidade Federal de Goias, Campus

Catalao, Curso de Bacharelado em Ciencia da Computacao, 2009.

Palavras-Chave: 1. Quımica Organica. 2. IUPAC. 3. Nomenclatura

Page 4: Estudo e Desenvolvimento de um Protótipo de Análise de Nomes

Rosangela Alves de Brito

Estudo e Desenvolvimento de um Prototipo de Analise de Nomes da

Quımica Organica

Monografia apresentada e aprovada em de

Pela Banca Examinadora constituıda pelos professores.

Ms. Marcio de Souza Dias – Presidente da Banca

Dra. Selma Terezinha Milagre

Dr. Vaston Goncalves da Costa

Page 5: Estudo e Desenvolvimento de um Protótipo de Análise de Nomes

Dedico este trabalho a minha Mae Catarina, ao meu Pai

Romeu, aos meus avos e a minha Irma Rosemeire.

Page 6: Estudo e Desenvolvimento de um Protótipo de Análise de Nomes

AGRADECIMENTOS

Agradeco aos meus pais, Romeu e Catarina por todo amor, atencao, compreensao e

carinho durante toda a minha vida. Foram os meus grandes incentivadores para nunca

desistir. Tambem agradeco a minha irma Rosemeire, pelo companheirismo, apoio e mo-

mentos divertidos.

Agradeco aos colegas da graduacao, que sempre me ajudaram, compartilhando mo-

mentos difıceis e alegres que serao guardados com carinho. Em especial aos amigos Rayner

Pires, Salviano Ludgerio, Gabriela Pereira, Cesar Evangelista, Fernando Asevedo, Fabio

Assuncao, Adair Borba, Jose Augusto Cabral e pelo sincero companheirismo a Rafael

Ulhoa.

Tambem um agradecimento aos professores de graduacao, e em especial ao meu orien-

tador professor Ms. Marcio de Souza Dias, por acreditar em mim, ser atencioso em todas

as minhas duvidas e tornar possıvel a realizacao deste trabalho.

Por fim, agradeco a DEUS por me dar forcas para viver e todos aqueles que conviveram

comigo durante esses quatro anos, contribuindo para minha formacao tanto pessoal como

academica.

A todos, meus sinceros agradecimentos. Obrigada.

Page 7: Estudo e Desenvolvimento de um Protótipo de Análise de Nomes

“Fez cessar a tormenta, e acalmam-se as ondas.”

Salmo 107:29

Page 8: Estudo e Desenvolvimento de um Protótipo de Análise de Nomes

RESUMO

Brito, Rosangela Alves Estudo e Desenvolvimento de um Prototipo de

Analise de Nomes da Quımica Organica . Curso de Ciencia da Computacao, Campus

Catalao, UFG, Catalao, Brasil, 2009, 146p.

A capacidade de escrever e entender uma estrutura quımica para compostos da quımica

organica, a partir do seu nome, e essencial tanto para a teoria quanto para a pratica. O

entendimento da estrutura quımica e indispensavel para os varios tipos de industrias,

pesquisas entre outros, para melhor compreender componentes que envolvem este mundo

moderno em transformacao.

Softwares sao desenvolvidos para que possam ser uma ferramenta de auxılio e apoio.

Unindo a evolucao tecnologica com a importancia quımica, softwares quımicos educa-

tivos sao construıdos para ajudar na obtencao de conhecimento e melhorar o aprendizado

de alunos auxiliando professores e pesquisadores. Sendo assim, este projeto consiste em

desenvolver um prototipo de analise de nomes de compostos da Quımica Organica denomi-

nado PROF QUIM que tratara dos Hidrocarbonetos (Alcano, Alceno, Alcino e Alcadieno)

e Funcoes Oxigenadas (Alcool, Aldeıdo, Cetona e Eter) de acordo com a especificacao e

regras estabelecidas pela IUPAC, visando a formacao da representacao de suas estruturas

quımicas em string SMILE. Diferente de outros trabalhos que aqui serao apresentados,

o PROF QUIM proporciona explicacoes de erros obtidos de forma legıvel para qualquer

tipo de usuario, possui uma interface amigavel, uma representacao da estrutura do nome

quımico bem intuitiva conhecida como string SMILE e a explicacao do que significa cada

parte do nome do composto quımico organico correto. Sendo assim, este trabalho vem

para auxiliar e apoiar usuarios interessados em aplicativos voltados para a nomenclatura

e estrutura da quımica organica.

Palavras-Chaves: Quımica Organica, IUPAC, Nomenclatura

i

Page 9: Estudo e Desenvolvimento de um Protótipo de Análise de Nomes

Sumario

Lista de Abreviacoes 1

Introducao 2

1 Estado da Arte 4

1.1 Quımica Computacional . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4

1.2 A Nomenclatura-IUPAC . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6

2 Fundamentacao Teorica 22

2.1 Quımica Organica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22

2.1.1 Encadeamento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23

2.1.2 Tipos de Carbono . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23

2.1.3 Ligacao entre Carbono . . . . . . . . . . . . . . . . . . . . . . . . . 24

2.1.4 Cadeias Carbonicas . . . . . . . . . . . . . . . . . . . . . . . . . . . 25

2.2 Funcoes Quımicas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26

2.2.1 Hidrocarbonetos . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27

2.2.2 Funcoes Oxigenadas . . . . . . . . . . . . . . . . . . . . . . . . . . 30

2.3 Nomenclatura dos Compostos Organicos . . . . . . . . . . . . . . . . . . . 33

2.3.1 Regras de Nomenclatura . . . . . . . . . . . . . . . . . . . . . . . . 34

2.3.2 Nomenclatura dos Hidrocarbonetos de Cadeia Normal . . . . . . . . 36

2.3.3 Nomenclatura dos Hidrocarbonetos Ramificados . . . . . . . . . . . 38

2.3.4 Nomenclatura das Funcoes Oxigenadas . . . . . . . . . . . . . . . . 41

2.4 Linguagem de Programacao Java . . . . . . . . . . . . . . . . . . . . . . . 44

2.4.1 Introducao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44

2.4.2 Caracterısticas Importantes . . . . . . . . . . . . . . . . . . . . . . 45

2.5 Ferramenta JFlex . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46

2.6 Ferramenta Java CUP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51

2.7 SMILES . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54

3 A Construcao do Prototipo PROF QUIM 56

3.1 O PROF QUIM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56

ii

Page 10: Estudo e Desenvolvimento de um Protótipo de Análise de Nomes

3.2 Linguagem de Programacao . . . . . . . . . . . . . . . . . . . . . . . . . . 57

3.3 Fases da Construcao do Prototipo . . . . . . . . . . . . . . . . . . . . . . . 57

3.3.1 Analise Lexica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58

3.3.2 Analise Sintatica e Semantica . . . . . . . . . . . . . . . . . . . . . 61

3.4 Interface . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64

3.5 Testes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68

3.5.1 Teste Funcional . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68

3.5.2 Teste de Aceitacao . . . . . . . . . . . . . . . . . . . . . . . . . . . 70

3.5.3 Teste de Instalacao . . . . . . . . . . . . . . . . . . . . . . . . . . . 70

Consideracoes Finais 72

Referencias 74

Apendices 76

A Codigo Fonte 77

A.1 Arquivo JFlex . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77

A.2 Arquivo Java CUP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79

A.3 Arquivo Interface - Tela Principal . . . . . . . . . . . . . . . . . . . . . . . 132

A.4 Arquivo Interface - Tela Nomenclatura . . . . . . . . . . . . . . . . . . . . 134

A.5 Arquivo Interface - Tela Instrucoes . . . . . . . . . . . . . . . . . . . . . . 137

A.6 Arquivo Interface - Tela Informacoes . . . . . . . . . . . . . . . . . . . . . 139

A.7 Arquivo Interface - Tela Alcano . . . . . . . . . . . . . . . . . . . . . . . . 145

iii

Page 11: Estudo e Desenvolvimento de um Protótipo de Análise de Nomes

Lista de Figuras

1.1 IUPAC NameIt [Rodrigues, 2001]. . . . . . . . . . . . . . . . . . . . . . . . 7

1.2 IUPAC DrawIt [Rodrigues, 2001]. . . . . . . . . . . . . . . . . . . . . . . . 8

1.3 SPINUS-WEB. Tela de entrada com uma estrutura 2D [Stefani et al., 2007]. 9

1.4 Software Hot Potatoes [Neto e Junior, 2000]. . . . . . . . . . . . . . . . . . 12

1.5 JCross: Palavras Cruzadas [Neto e Junior, 2000]. . . . . . . . . . . . . . . 12

1.6 Ferramenta ACD/Chemsketch Freeware 5.12 [Neto e Junior, 2000]. . . . . 13

1.7 ChemDraw [Zielesny, 2005]. . . . . . . . . . . . . . . . . . . . . . . . . . . 14

1.8 ChemFinder [Zielesny, 2005]. . . . . . . . . . . . . . . . . . . . . . . . . . . 15

1.9 Chem3D [Zielesny, 2005]. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15

1.10 ARGUSLAB [Raupp et al., 2008]. . . . . . . . . . . . . . . . . . . . . . . . 16

1.11 ChemSite Pro [Raupp et al., 2008]. . . . . . . . . . . . . . . . . . . . . . . 17

2.1 Cadeias Carbonicas. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23

2.2 Tipos de Carbono. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24

2.3 Cadeia fechada. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27

2.4 Radicais [Usberco e Usberco, 2001]. . . . . . . . . . . . . . . . . . . . . . . 38

2.5 Os numeros em vermelho correspondem a cadeia principal e o traco significa

a localizacao da ramificacao. . . . . . . . . . . . . . . . . . . . . . . . . . . 39

2.6 Arquivo de definicao JFlex. . . . . . . . . . . . . . . . . . . . . . . . . . . 47

2.7 Macros no JFlex. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49

2.8 Forma geral de uma regra lexica. . . . . . . . . . . . . . . . . . . . . . . . 49

2.9 Intercace do Gerador Lexico JFlex. . . . . . . . . . . . . . . . . . . . . . . 50

3.1 Diagrama de Atividades do PROF QUIM. . . . . . . . . . . . . . . . . . . 58

3.2 Secao Codigo do Usuario. . . . . . . . . . . . . . . . . . . . . . . . . . . . 59

3.3 Secao de Opcoes e Declaracoes. . . . . . . . . . . . . . . . . . . . . . . . . 60

3.4 Secao de Regras Lexicas. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60

3.5 Declaracao de Package e Import. . . . . . . . . . . . . . . . . . . . . . . . 61

3.6 Componentes de Codigo do Usuario. . . . . . . . . . . . . . . . . . . . . . 62

3.7 Listas de Sımbolos. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62

3.8 Declaracoes de Precedencia e Associativismo. . . . . . . . . . . . . . . . . . 63

iv

Page 12: Estudo e Desenvolvimento de um Protótipo de Análise de Nomes

3.9 Gramatica. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63

3.10 Tela Principal do Prototipo. . . . . . . . . . . . . . . . . . . . . . . . . . . 65

3.11 Tela Nomenclatura. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66

3.12 Tela Instrucoes. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66

3.13 Tela Informacoes. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67

3.14 Tela Alcano. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67

v

Page 13: Estudo e Desenvolvimento de um Protótipo de Análise de Nomes

Lista de Tabelas

2.1 Formacao do nome quımico organico [Usberco e Usberco, 2001]. . . . . . . 35

vi

Page 14: Estudo e Desenvolvimento de um Protótipo de Análise de Nomes

Lista de Abreviacoes

IUPAC - International Union of Pure and Applied Chemistry - Uniao Internacional

da Quımica Pura e Aplicada

SMILES - Simplified Molecular Input Line Entry System - Sistema de Entrada Linear

de Simplificacao Molecular

1

Page 15: Estudo e Desenvolvimento de um Protótipo de Análise de Nomes

Introducao

A quımica sempre se revelou essencial para o entendimento e evolucao do ser hu-

mano. Ela estuda a estrutura das substancias, correlacionando-a com as propriedades

macroscopicas, e investigando as transformacoes dessas substancias. Por isso, o entendi-

mento da estrutura quımica e indispensavel para melhor entendimento dos componentes

que envolvem os varios tipos de pesquisas, industrias e outros ramos como a quımica

biologica, inorganica, organica entre outros. Alem de entender a sua formacao, tambem

e importante ter a capacidade de construir uma estrutura quımica a partir do seu nome,

pois a capacidade de escrever e entender uma estrutura quımica sao fundamentais tanto

para a teoria quanto para a pratica.

Atualmente neste mundo globalizado e informatizado o crescente uso de computadores

por quımicos (entre outras ciencias em geral) e de vital importancia para a propagacao

e disseminacao do conhecimento. Com isso, aumenta o interesse no desenvolvimento de

softwares que possam ser uma ferramenta de auxılio e apoio, sendo que alguns destes

softwares possuem uma grande capacidade de manipular nomes e estruturas quımicas.

Unindo a quımica e a tecnologia, softwares sao criados para dar assistencia aqueles que

ja tem um bom conhecimento e tambem para melhor aprendizado daqueles que serao os

futuros profissionais.

Pensando na importancia de facilitar o entendimento e aprendizado da relacao entre

estruturas e nomenclaturas, e que este trabalho propoe a construcao de um prototipo

de analise de nomes de compostos da Quımica Organica, visando a formacao correta da

representacao de suas respectivas estruturas quımicas.

O prototipo proposto (PROF QUIM) funcionara da seguinte maneira: primeiramente

tera uma interface grafica onde a comunicacao visual com o usuario sera de facil com-

preensao. O usuario entrara com o nome, especificamente do idioma portugues do Brasil,

do composto organico das seguintes funcoes quımicas: Hidrocarboneto (alcanos, alcenos,

alcinos e alcadienos) e algumas funcoes Oxigenadas (alcool, eter, aldeıdo e cetona) e o

mesmo analisara este nome retornando uma saıda visual da estrutura quımica em repre-

sentacao de string SMILE (utilizada principalmente por ser mais inteligıvel para leitura

humana [?]) do nome fornecido. O prototipo ira gerar a saıda dos nomes dos compos-

tos que se enquadram nos padroes das nomenclaturas oficiais da IUPAC (International

2

Page 16: Estudo e Desenvolvimento de um Protótipo de Análise de Nomes

Union of Pure and Applied Chemistry), alem de fornecer explicacoes de cada parte do

nome. Caso o nome utilizado na entrada for considerado pelo prototipo incorreto, o

sistema apresentara a explicacao do que for considerado errado no nome dado, assim

possibilitando o usuario a fazer uma simples correcao para a obtencao do nome correto.

Neste prototipo nao foi utilizada todas as funcoes da quımica organica. Esta limitacao

esta relacionada a falta de tempo para implementar mais funcoes e tambem pelo fato que

o PROF QUIM analisara as funcoes consideradas basicas para o aprendizado da quımica

organica.

Para a realizacao deste prototipo sera utilizado: a ferramenta JFlex1, um gerador de

analisadores lexicos; a ferramenta Java CUP2, para analise sintatica; representacao de

estruturas quımicas SMILE e a linguagem de programacao Java.

Espera-se que este prototipo seja uma boa fonte de conhecimento, abordando tecnicas

utilizadas em trabalhos dos pesquisadores Dias [Dias, 2006] e Eggert [Eggert et al., 1993].

Sendo assim, este trabalho vem para esclarecer as duvidas presentes em usuarios interes-

sados em aplicativos voltados para a quımica organica. O trabalho descrito neste texto

esta dividido em 3 capıtulos.

No capıtulo 1 ha um levantamento sobre o estado da arte da area de pesquisa deste

trabalho, com foco principal em resolucoes de nomenclatura e estrutura quımica, obtendo

ao final semelhancas e diferencas dos trabalhos apresentados em relacao ao prototipo

proposto, que podem ajudar na constucao deste sistema.

No capıtulo 2 sao apresentados os conceitos e funcionamento de cada ferramenta e

tecnicas utilizadas para a implementacao do prototipo.

No capıtulo 3 e abordada a construcao do PROF QUIM, desde sua gramatica, analise

lexica, analise sintatica e semantica, linguagem de programacao, representacao da estru-

tura quımica SMILE, interface grafica, testes e dificuldades encontradas. Por fim, ha

as consideracoes finais do trabalho realizado, levantando os objetivos alcancados, pontos

positivos, pontos negativos e trabalhos futuros.

Encontram-se os codigos da analise lexica, analise sintatica, semantica e de interface

do prototipo no apendice desta monografia.

1http://jflex.de/2http://www.cs.princeton.edu/ appel/modern/java/CUP

3

Page 17: Estudo e Desenvolvimento de um Protótipo de Análise de Nomes

Capıtulo 1

Estado da Arte

Neste capıtulo, serao apresentados alguns sistemas que se concentram na tarefa de

processar os nomes dos compostos quımicos. Dando um enfoque maior nos programas

que tratam sobre estrutura e nomenclatura quımica, e mostrando a importancia que os

mesmos trazem ao campo da ”Quımica Computacional”ou Chemoinformatics.

1.1 Quımica Computacional

Nesta subsecao serao apresentados trabalhos relacionados a pesquisa da quımica com-

putacional.

Um dos principais objetivos dos pesquisadores em ensino de quımica durante as ultimas

decadas tem sido para melhorar a compreensao dos novos pesquisadores, quımicos, indus-

triais e alunos sobre assuntos referentes a conceitos de Quımica (bem como de Ciencias em

geral). Um dos recursos que vem sendo utilizado desde a decada de 60 como instrumento

para a aprendizagem e o computador, que com o passar dos anos vem sendo evoluıdo e

modificado [Chen, 2006].

Tem-se observado um extraordinario incremento do poder computacional e uma notavel

sofisticacao das tecnicas de computacao no contexto da Quımica. Um exemplo e a mode-

lacao molecular que se tornou classica, ganhou honras de premio Nobel e tantos outros

ramos que obteve reconhecimento do trabalho realizado. Os frutos obtidos em todas estas

frentes estao acessıveis ao quımico experimental comum por meio de softwares de facil

utilizacao para os sistemas operativos que lhe sao familiares atraves de interfaces WWW.

Sao ferramentas que invadiram gradualmente os laboratorios e que se impoe aos quımicos

que nao gostam da modernidade eletronica [Sousa, 2002].

Esta nova area e uma ”fronteira”entre a Quımica e a Informatica, que aplica e desen-

volve sistemas de informacao, algoritmos, tecnicas computacionais e metodos estatısticos

para problemas de Quımica. O nome desta ”fronteira”e ”Cheminformatics”, que pode

ser traduzido para ”Quimio-informatica”que e a designacao que vai sendo mais consen-

4

Page 18: Estudo e Desenvolvimento de um Protótipo de Análise de Nomes

sualmente aceita, mais existe tambem o termo ”Quımica Computacional”que pode ser

utilizado como sinonimo [Chen, 2006].

Uma pesquisa realizada por Raupp [Raupp et al., 2008] em seu artigo, revela algu-

mas fases da historia da quımica computacional. No seu estudo Raupp e seus parceiros

mostram que no inıcio da decada de 70, na University of Lancaster, Inglaterra, um curso

de Quımica Quantica foi cuidadosamente organizado pelo quımico B. Duke. Este curso

tinha a finalidade de recuperar a motivacao perdida devido as tentativas frustradas de ci-

entistas da computacao que, ao introduzir tecnicas computacionais no ensino de quımica,

nao utilizavam assuntos relevantes para a Quımica (hoje existem cientistas da computacao

especialistas nesta area). O uso de computadores nesta epoca ja era um foco de pesquisas,

mas os alunos nao eram incentivados de maneira que despertasse interesse. Em seu curso,

Duke utilizou um programa para calcular as propriedades de compostos aromaticos pelo

”metodo de orbitais moleculares”1. De acordo com o quımico Duke, o interesse dos alunos

aumentou com a experiencia pratica. Aspectos do uso de computadores de fato, nao subs-

tituem e sim auxiliam o aprendizado de conceitos quımicos. Todos comecaram a gostar da

nova modalidade e anos mais tarde o mesmo topico foi abordado na University Chemical

Laboratory de Cambridge, no Reino Unido, onde microcomputadores eram usados como

ferramenta de ensino para a Teoria do Orbital Molecular. Acreditando desta forma, que

programas sao de grande ajuda para o ensino.

Dez anos depois, a Real Academia de Ciencias da Suecia outorgou o Premio Nobel

de Quımica de 1998 aos pesquisadores: Walter Kohn (Universidade da California) e John

A. Pople (Universidade North Western, Evanston, Illinois, EUA). O primeiro por sua

contribuicao ao desenvolvimento da Teoria do Funcional de Densidade e a de Pople por sua

contribuicao ao desenvolvimento de metodos computacionais em quımica quantica. Com

as pesquisas e programas que foram iniciados desde a decada de 1960, a quımica reafirma-

se como uma ciencia exata computavel [Freitas, 1998]. O progresso no desenvolvimento

de softwares e hardwares aliado a uma reducao constante de custo dos materiais, torna a

quımica computacional uma das areas de pesquisa mais promissoras.

Raupp mostra que o desenvolvimento de softwares para quımica computacional seguiu

dois caminhos distintos. Inicialmente, trabalhou-se com o desenvolvimento de codigos

capazes de resolver as equacoes da mecanica quantica. O segundo caminho seguiu a partir

de aproximacoes e resultados de calculos parametrizados por grupos atomicos, a fim de

economizar etapas de calculo computacional. Finalmente, nas ultimas decadas, uma nova

escala de calculo foi introduzida, com os metodos de simulacao que, basicamente, nao

tratam o sistema quımico como obedecendo a regras da mecanica quantica, mas como

sistemas atomicos classicos. [Raupp et al., 2008].

1Considera que os eletrons de valencia estao em orbitais espalhados pela molecula inteira.

[Raupp et al., 2008]

5

Page 19: Estudo e Desenvolvimento de um Protótipo de Análise de Nomes

A conclusao de Raupp neste estudo de levantamento de informacoes da quımica com-

putacional foi que o desenvolvimento e o posterior uso de softwares em sala de aula

auxiliam a resolucao de problemas quımicos, e a versatilidade da quımica computacional

permite nao so sua aplicacao no ensino de quımica como tambem nas areas de pesquisa

e desenvolvimento de laboratorios e industrias. Pode-se salientar que estas ferramentas,

quando devidamente aplicadas, alem de motivar aprendizagem, comprovada pelo profes-

sor quımico B. Duke na decada de 70 [Raupp et al., 2008], colaboram com a adaptacao

do aluno a uma sociedade cada vez mais tecnologica.

Na secao seguinte serao apresentados trabalhos de Quımica Computacional voltados

para nomenclatura e estrutura quımica.

1.2 A Nomenclatura-IUPAC

Herold [Herold, 2000] realizou um levantamento de informacoes sobre a nomenclatura

de compostos quımicos. De acordo com o autor a nomenclatura quımica estabelece re-

gras que permitem construir de uma forma sistematica nomes para quaisquer substancias

quımicas a partir do conhecimento da sua estrutura molecular. Como ja se conhece perto

de vinte milhoes de substancias, essas regras tem vastas consequencias sobre a introducao

de novas palavras nas lınguas de todo o mundo.

Herold volta um pouco na historia e mostra que as primeiras regras de nomenclatura

quımica sistematica foram criadas por Guyton de Morveau, Lavoisier, Fourcroy e Berthol-

let no idioma frances, em 1787, e foram quase imediatamente traduzidas para ingles e

alemao em 1788, para italiano em 1790 e para dinamarques em 1794. Em 1801, Vicente

Coelho de Seabra Silva Telles, Universidade de Coimbra e Socio da Real Academia das

Ciencias de Lisboa, publica uma traducao para o portugues.

Apos um longo intervalo na publicacao de trabalhos sobre nomenclatura quımica por-

tuguesa, em 1905, Silva [Herold, 2000], inicia a publicacao de uma serie de notas na

Revista de ”Chimica Pura e Applicada”sobre nomenclatura quımica portuguesa. Depois

deste estudo, outros pesquisadores se interessaram neste tipo de estudo, como por exem-

plo: Adolpho Coelho e Romulo de Carvalho [Herold, 2000]. Observou-se muitos conflitos

no estudo da nomenclatura quımica sem uma determinada lıngua e regra para a construcao

do nome quımico.

A partir da decada de 1950, o predomınio da lıngua inglesa como veıculo internacional

da comunicacao em Ciencia e a sua adocao como lıngua oficial unica pela IUPAC (In-

ternational Union of Pure and Applied Chemistry), teve como resultado que a grande

maioria das traducoes portuguesas de textos cientıficos, normas de terminologia e nomen-

clatura quımicas se fizesse a partir do ingles. E sempre seguindo as regras determinadas

pela IUPAC. A estabilizacao daı resultante foi reforcada pelo carater mais definitivo das

6

Page 20: Estudo e Desenvolvimento de um Protótipo de Análise de Nomes

normas de terminologia e das regras de nomenclatura internacionais [Herold, 2000].

Conforme Herold foi complicado a formulacao, construcao e traducao de nomes quımicos

sem uma regra universal. Hoje a ”Uniao Internacional de Quımica Pura e Aplicada”2 con-

tribui para o avanco de aspectos mundiais das ciencias quımicas e para a aplicacao da

quımica a servico da humanidade. Formada em 1919, tem sido bem sucedida em incen-

tivar a comunicacao internacional na area da quımica e em unir a quımica academica,

industrial e publica em uma linguagem comum.

Muitos estudos seguem as determinacoes da IUPAC para a realizacao de um trabalho

universal. Logo abaixo serao mostrados os principais trabalhos que fazem uso das normas

estabelecidas pela IUPAC.

Nas Figuras 1.1 e 1.2 sao mostradas interface de softwares que utilizam as regras de

formacao de nomes de compostos quımicos estabelecida pela IUPAC, para geracao de

estrutura a partir da nomenclatura e vice-versa.

Figura 1.1: IUPAC NameIt [Rodrigues, 2001].

O software IUPAC NameIt possui a funcao de gerar o nome a partir da estrutura

quımica. Este software foi desenvolvido pela propria IUPAC.

O software IUPAC DrawIt possui a funcao de gerar a estrutura a partir do nome. Este

software tambem foi desenvolvido pela propria IUPAC.

2www.iupac.org

7

Page 21: Estudo e Desenvolvimento de um Protótipo de Análise de Nomes

Figura 1.2: IUPAC DrawIt [Rodrigues, 2001].

Um dos projetos pioneiros no ramo de estruturas quımicas e o mais classico de todos foi

o DENDRAL [Stefani et al., 2007]. Desenvolvido em 1965, na Universidade de Stanford,

o programa funcionava com a estrategia denominada ”planejar-montar-testar”. Na fase

”planejar”, os dados disponıveis eram confrontados com dados de uma biblioteca e sub-

estruturas obtidas a partir destes dados, depois na fase ”montar”, as estruturas quımicas

eram geradas e finalmente na fase ”testar”, havia uma verificacao se as estruturas geradas

eram compatıveis com os dados apresentados. Durante a realizacao do projeto, foram

desenvolvidos diversos algoritmos e tecnicas que se tornaram classicas em sua utilizacao.

O DENDRAL possuıa um banco de dados contendo varios fragmentos de estruturas

quımicas com seus respectivos deslocamentos quımicos. Todos esses fragmentos eram

pequenos, com no maximo quatro ou cinco atomos, incluindo heteroatomos. Este pro-

grama nao era totalmente automatizado, pois o quımico deveria informar ao programa

quais grupamentos funcionais ou subestruturas deveriam estar presentes na solucao final

do problema (”goodlist”) e quais deveriam estar ausentes (”badlist”). Apos esta etapa o

programa elaborava as propostas estruturais [Stefani et al., 2007].

Tres programas desenvolvidos por Munk [Stefani et al., 2007] e colaboradores, segundo

o autor da pesquisa Stefani tambem foram importantes para apresentacao de estruturas

quımicas: ASSEMBLE, o SESAMI e o HOUDINI, criados em 1967 [Lipkowitz et al., 2000].

Todos realizam quase a mesma funcao, com poucas diferencas, mais o ASSEMBLE

8

Page 22: Estudo e Desenvolvimento de um Protótipo de Análise de Nomes

diferencia-se dos outros sistemas por nao possuir banco de dados. Tal sistema lida apenas

com a formula molecular e todos os isomeros3 possıveis sao gerados a partir desta formula

molecular. Os projetistas do ASSEMBLE adicionaram opcoes para o usuario poder in-

dicar ao programa fragmentos que deveriam estar presentes ou ausentes na solucao final.

Este programa evoluiu e hoje esta na versao 2.0.

Um outro sistema CHEMICS, desenvolvido por um grupo de pesquisadores japoneses

na decada de 60. Utiliza algoritmos semelhantes aos usados pelo DENDRAL e realiza

funcoes parecidas para geracao estrutural.[Stefani et al., 2007]

Com a realizacao destes trabalhos foi possıvel a criacao de varios sistemas, onde boa

parte trata de estruturas organicas. Um exemplo de um destes sistemas e o SPINUS-WEB.

E uma ferramenta on-line, como mostrado na Figura 1.3, destinada a verificacao e val-

idacao de estruturas organicas. Executado na plataforma Java, foi desenvolvido por Sousa

A. J., pesquisador da Universidade Nova de Lisboa4, Portugal. Possui em sua interface

o editor de estruturas Marvin Applet a fim de que o usuario possa desenhar a estrutura

desejada (2D) antes do calculo de seus deslocamentos quımicos [Stefani et al., 2007].

Figura 1.3: SPINUS-WEB. Tela de entrada com uma estrutura 2D [Stefani et al., 2007].

3fenomeno relacionado a existencia de dois ou mais compostos quımicos com formulas e pesos molec-

ulares identicos, mas propriedades diferentes[Usberco e Usberco, 2001].4http:// www.dq.fct.unl.pt/spinus

9

Page 23: Estudo e Desenvolvimento de um Protótipo de Análise de Nomes

Apos os resultados bem sucedidos de alguns destes projetos e com o rapido desenvolvi-

mento de diferentes tecnicas computacionais, foram criadas condicoes para a evolucao e o

aperfeicoamento das tecnicas que pudessem auxiliar o quımico no reconhecimento estrutu-

ral de substancias organicas. Stefani conclui que as tecnicas de Inteligencia Artificial (IA)

no seu sentido mais amplo passaram a ser empregadas e forneceram excelentes resultados.

No exemplo do sistema SPINUS-WEB foi utilizado redes neurais para sua construcao

[Stefani et al., 2007]. Busca-se aumentar a produtividade, pois se torna evidente que a

etapa limitante do processo de reconhecimento de uma substancia nao e mais a geracao

de dados, mas sim como interpreta-los. Rapidez tambem e essencial, sendo que ja existem

programas que realizam tarefas complexas de reconhecimento em apenas alguns segun-

dos. Logo, e evidente a necessidade do emprego de tecnicas computacionais que possam

auxiliar o quımico neste processo. Desta forma, tanto a academia quanto as empresas de

pesquisa e desenvolvimento de softwares dedicados a quımica investiram macicamente no

setor, gerando bons resultados. Tal fato pode ser constatado observando-se o aumento da

quantidade de publicacoes de artigos cientıficos inerentes ao tema e nos produtos ofereci-

dos pelas empresas [Stefani et al., 2007].

Como os computadores comecaram a ser cada vez mais utilizados pelos quımicos,

softwares estao evoluindo gradativamente nesta area, tornando-se mais sofisticados a cada

dia em termos de tratamento de nomenclatura quımica e terminologia. Desta forma

espera-se que programas devam ir alem das capacidades de planilhas e bancos de dados, e

tambem de serem mais versateis do que somente os pedacos de codigo que fazem calculos

especıficos, que mesmo contendo a sua importancia, hoje se torna insuficiente. Em suma,

o software deve ”pensar”em termos quımicos.

Os computadores podem muito bem armazenar e associar ambos, os nomes e formulas

quımicas, mas tambem podem atraves de uma formula quımica (ou nome), serem capazes

de processar e determinar automaticamente o nome quımico (ou formula), por meio da

”quebra”e reconhecimento de partes para entao diferenciar e disponibilizar o resultado.

Abaixo estao relacionados e explicados alguns dos trabalhos voltados para nomenclatura

e estrutura quımica.

Um dos sistemas que sera apresentado primeiramente nesta secao voltado para a

quımica organica e o sistema ”RALQ”. Desenvolvido por Dias [Dias, 2006], o sistema

RALQ (Resolvedor de Ambiguidades Linguısticas da Quımica Organica) possui como

principais objetivos: analisar sintatica e semanticamente nomes de compostos quımicos

e resolver possıveis ambiguidades dos nomes de alguns compostos da quımica organica.

E por fim, desenhar as estruturas quımicas correspondentes aos mesmos. Para tanto, o

sistema recebe um nome de um composto organico, analisa-o sintatica e semanticamente

e, caso ele represente um composto quimicamente correto, gera uma saıda visual para a

estrutura quımica que lhe corresponda.

10

Page 24: Estudo e Desenvolvimento de um Protótipo de Análise de Nomes

Uma caracterıstica importante apresentada por Dias que o sistema possui, e o fato de

conseguir analisar tanto nomes de compostos que se enquadram nos padroes das nomen-

claturas oficiais vigentes (IUPAC), quanto aqueles que, apesar de nao se enquadrarem nos

mesmos, representam compostos organicos verdadeiros. Este sistema utiliza a tecnica da

Teoria do Lexico Gerativo 5, a motivacao de se usar esta tecnica foi a analise sintatica e

semantica que sao guiadas pelos tipos dos componentes dos nomes quımicos. Alem desta

tecnica, que possibilitou cumprir os objetivos do sistema, destacam-se as ferramentas que

foram utilizadas de forma eficaz: os Parsers (Combinadores de Parsers), a Linguagem

de Programacao Funcional CLEAN 2.2.1 e um pacote em Latex6 denominado Xymtex,

utilizado para montar formas estruturais [Dias, 2006].

A ferramenta alema ”ACD/Name”7 fornecida pelo ScienceServe/Scientific Software

Solutions apresenta a geracao de estruturas a partir de nomes de composto quımico e

vice-versa. Sendo uma ferramenta comercial, nenhuma documentacao detalhada esta

disponıvel aos interessados [Dias, 2006].

O software ”Hot Potatoes”que se concentra na nomenclatura de hidrocarbonetos, de

acordo com a nomenclatura IUPAC, e uma ferramenta que auxilia os ensinamentos da

quımica organica. Hot Potatoes e um software criado pelo Humanities Computing and

Media Center da University of Victoria/Canada, como software de autoria8, veja Figura

1.4. Este software e um conjunto de seis ferramentas de autoria (JQuiz 9 , JMix 10, JCross,

JMatch11, JCloze12 e The Master 13), que possibilitam a elaboracao de seis tipos basicos de

exercıcios interativos utilizando programacao em HTML. Com a ferramenta do JCross, o

usuario informa a ferramenta os nomes dos compostos que estarao no exercıcio e depois ela

produz atividades de palavras cruzadas com os nomes fornecidos. A Figura 1.5 mostra

o execıcio feito nesta ferramenta, onde o usuario vai observar a formula estrutural do

composto e digitar o seu nome [Neto e Junior, 2000].

Uma outra ferramenta e a ACD/Chemsketch Freeware 5.12, Figura 1.6. E um software

de desenvolvimento da Quımica Avancada. Utilizado para desenhar estruturas quımicas,

reacoes e diagramas esquematicos e tambem pode ser usado para projecoes em 3D. Tra-

5Utiliza os tipos dos itens lexicos como fatores de organizacao da composicao dos mesmos. Tal es-

trategia auxilia na resolucao de ambiguidades, pois, essa teoria da todas as condicoes para que o tipo de

um item lexico seja encontrado de acordo com os seus possıveis complementos [Dias, 2006].6http://www.latex-project.org/7http://www.scienceserve.com/software/acd8E um programa computacional para a realizacao de obras hipertextuais ou hiperdidaticas sem utilizar

codigos e linguagens de programacao. [Rodrigues, 2001]9produz atividades de resposta curta, multipla escolha ou atividades hıbridas

10produz atividades para ordenar frases ou palavras11produz atividades de correspondencia12produz atividades com preenchimento de lacunas13produz uma unidade didatica com varios exercıcios

11

Page 25: Estudo e Desenvolvimento de um Protótipo de Análise de Nomes

Figura 1.4: Software Hot Potatoes [Neto e Junior, 2000].

Figura 1.5: JCross: Palavras Cruzadas [Neto e Junior, 2000].

balha com barramento 32 bits e e aplicavel aos sistemas operacionais Microsoft Win-

dows95/98/ NT/ME/2000/XP [Neto e Junior, 2000].

Uma ferramenta divulgada pelo autor Zielesny [Zielesny, 2005] e o pacote do software

da quımica ChemOffice Ultra 2005. Voltado para Microsoft Windows e PCs. Este pro-

grama foi revisto e atualizado varias vezes para uma boa qualidade. Seu publico alvo

12

Page 26: Estudo e Desenvolvimento de um Protótipo de Análise de Nomes

Figura 1.6: Ferramenta ACD/Chemsketch Freeware 5.12 [Neto e Junior, 2000].

sao cientistas quımicos, e universitarios. Ele consiste em tres aplicacoes fundamentais: o

editor ChemDraw (desenho da estrutura quımica), o ChemFinder (banco de dados das

estruturas quımicas) e o Chem3D (aplicacao da modelagem molecular).

O ChemDraw fornece todas as funcoes basicas de apoio para o desenho de estru-

turas quımica, bem como para compostos organicos e bioquımicos (aneis, aromaticos,

DNA/RNA, etc.). A interface bem elaborada e de facil manipulacao, Figura 1.7, possi-

bilita a conversao de nome para estrutura e estrutura para nome [Zielesny, 2005].

O ChemFinder e um banco de dados do sistema em apoio a quımica. Possui a possibili-

dade de realizar consultas SQL em suas tabelas. Uteis para armazenar e investigar dados

quımicos individuais. E produz tambem o desenho da estrutura quımica molecular para

um nome quımico, isto e, por meio de um nome de consulta o sistema gerara o desenho da

estrutura molecular correspondente a consulta de entrada, alem de fornecer informacoes

detalhadas sobre o composto. Esse sistema inclui uma lista de sinonimos entre os nomes

usuais e oficiais. E baseada em uma analise linguıstica do nome do composto quımico

13

Page 27: Estudo e Desenvolvimento de um Protótipo de Análise de Nomes

Figura 1.7: ChemDraw [Zielesny, 2005].

de entrada, aceita mais de uma variante de nomenclatura e compostos que nao fazem

parte das nomenclaturas oficiais nao sao tratados por essa ferramenta. Nao faz parte do

pacote a recuperacao de dados, mas outras linhas do ChemOffice CambridgeSoft Oracle

disponibilizam esta comodidade [Zielesny, 2005]. A interface do ChemFinder e mostrada

na Figura 1.8.

O Chem3D possibilita a construcao e analise de modelos de estruturas quımicas em

3D, como pode ser visto na Figura 1.9, junto com calculos computacionais da quımica.

A aplicacao e constituıda pela utilizacao de OpenGL 3D e um ”motor”para renderizacao.

Existem dialogos e guias para que os usuarios nao se percam no momento da utilizacao

[Zielesny, 2005].

Um trabalho mais recente na area da linguıstica computacional voltada para a quımica

organica foi desenvolvido por Stefanie Anstein e Gerhard Kremer. Esse trabalho consiste

no desenvolvimento de um sistema de processamento de linguagem natural construıdo na

linguagem de programacao logica Prolog. Esse sistema gera uma representacao semantica

intermediaria para um nome de composto quımico-organico. O processamento dessa es-

trutura semantica gerara cadeias de caracteres SMILES14 que descreverao a estrutura

14Uma cadeia de caracteres SMILES e uma notacao estrutural de uma molecula que consecutivamente

lista os elementos de cadeia principal com suas propriedades e ramificacoes [Dias, 2006].

14

Page 28: Estudo e Desenvolvimento de um Protótipo de Análise de Nomes

Figura 1.8: ChemFinder [Zielesny, 2005].

Figura 1.9: Chem3D [Zielesny, 2005].

15

Page 29: Estudo e Desenvolvimento de um Protótipo de Análise de Nomes

molecular do composto e que permitirao a classificacao do mesmo. O sistema e apto para

analisar, inclusive, nomes usuais dos compostos quımicos [Dias, 2006].

O CHEMSKETCH [Raupp et al., 2008] e uma ferramenta avancada de desenho quımico

que fornece as propriedades moleculares, otimizacao, visualizacao 3D, capacidade de

nomear as moleculas, conforme as regras IUPAC, e ainda possui um grande banco de

dados com estruturas quımicas e materiais de laboratorio. O software calcula automati-

camente a valencia de cada atomo e restringe a construcao da molecula com base na regra

do octeto, a nao ser que seja instruıdo a nao fazer esta limitacao. Em seguida, e possıvel

solicitar a construcao da forma espacial 3D da especie estudada, o que aciona outra janela

onde o estudante pode, agora, rotacionar tridimensionalmente a especie estudada, alem de

observar estas especies em diferentes visualizacoes (Ball and sticks, sticks only, spacefill,

wireframe, dots only e disks) com possibilidade de visualizar ligacoes e arranjo espacial

das especies de forma realcada em cada uma destas representacoes [Raupp et al., 2008].

Um outro programa e o ARGUSLAB. Uma ferramenta em 3D especializada em estru-

turas moleculares de interesse para a medicina, industria farmaceutica e quımica organica.

O programa permite desenhar complicadas configuracoes de proteınas obtendo cadeias he-

licoidais de aminoacidos, de helice alfa, etc [Raupp et al., 2008]. A Figura 1.10 mostra a

interface do programa.

Figura 1.10: ARGUSLAB [Raupp et al., 2008].

16

Page 30: Estudo e Desenvolvimento de um Protótipo de Análise de Nomes

O programa ACD/StrucEluc (Structure Elucidator) que esta na versao 8.0, foi desen-

volvido para o conhecimento estrutural automatizada de estruturas quımicas. O programa

possui uma moderna interface com o usuario. Os algoritmos do sistema baseiam-se na

formula molecular. O sistema tambem e capaz de determinar a estereoquımica15 relativa

automaticamente. Cria uma lista de fragmentos compatıveis com as correlacoes apresen-

tadas. Tais fragmentos sao enviados ao gerador para combinacao e geracao das solucoes,

que sao validadas pelo ACD/NMR Predictor [Stefani et al., 2007].

O ChemSite Pro e um programa interativo de modelagem de estruturas quımicas

3D. Permite a manipulacao de moleculas para a construcao da visualizacao da estrutura

quımica. Possui uma interface intuitiva, interativa e modelagem 3D com animacao em

tempo real. Pode facilmente modelar proteınas, DNA, moleculas organicas e inorganicas

convertendo para 3D com texturas. Veja na Figura 1.11 o tipo de imagem que o ChemSite

Pro constroi [Raupp et al., 2008].

Figura 1.11: ChemSite Pro [Raupp et al., 2008].

No trabalho de Arthur A. Eggert e de seus parceiros (Anthony T. Jacob e Catherine

H. Middlecamp) [Eggert et al., 1993], desenvolveram a capacidade de escrever formulas

quımicas inorganicas a partir dos nomes quımicos. O estudo gerou um modelo baseado

em um sistema pericial que mapeia nomes em formulas quımicas. Este modelo utiliza

um banco de dados e dois sistemas de controle para detectar erros ortograficos que sao

esclarecidos.

Eggert mostra que ao trabalhar com nomes quımicos, o computador tem de lidar com

dois tipos de problemas. O primeiro, e que o computador nao sabe que nome o usuario

esta fornecendo como entrada. O problema e ter uma sequencia de caracteres e converte-

los em uma formula quımica reconhecıvel para um quımico. Dificuldades podem surgir

como: ortografia incorreta, nomes de formulas que nao existem, produtos que nao sejam

15Parte da quımica que investiga a disposicao espacial dos atomos nas moleculas. [Ferreira, 1999]

17

Page 31: Estudo e Desenvolvimento de um Protótipo de Análise de Nomes

da quımica, entre outros. O segundo, e que o computador ”sabe”como a entrada deve

ser. Entao o problema e determinar o que esta errado na entrada do usuario e enviar um

relatorio sobre o erro.

Reconhecimento de sintaxe em computadores nao e uma tarefa difıcil, porque pode

facilmente ser especificada por padroes. No entanto, reconhecimento da semantica, exige

complexas relacoes entre as palavras e ate mesmo um conhecimento cultural. Para o re-

conhecimento de nomes podemos restringir um padrao fornecendo assim um modelo quase

completo de compostos inorganicos, com o nome da maioria das substancias encontradas

na quımica inorganica para certo grupo de quımicos (deixando de fora nomes de interesse

para grupos de quımicos especializados).

Os autores mostram que a verificacao do nome de entrada e importante para a geracao

da formula, pois o programa sabera que e um nome quımico e retornara a formula que o

usuario solicitou com o respectivo nome. O processo de converter nomes inorganicos em

formulas parece ser um processo simples, mas e gravemente afetado pelos erros ortograficos

e de espacamento. Eggert enumera os possıveis fatores de erros na entrada pela ortografia

ou digitacao.

O primeiro erro seria o usuario pensar que a palavra e escrita de forma diferente,

exemplo: o elemento fluorine digitado como ”flourine”. O segundo erro, tido por eles o

mais frequente, seria a omissao de letras. O usuario pode digitar a palavra faltando letras,

exemplo: ”carbnate”para carbonate. O terceiro erro, a adicao extra de caracter, exemplo:

”broimide”para bromide. O quarto tipo de erro resulta da transposicao de letras, por

exemplo, entrar com ”cholrine”em vez de chlorine.

Tem-se tambem erros relacionados ao espaco. O primeiro tipo e quando o usuario

intencionalmente digita a palavra com um determinado espaco, exemplo: ”copper (II)”em

vez de copper(II). O segundo tipo e a adicao extra de espaco, enquanto que o primeiro

tipo e intencional o segundo nao e. O terceiro tipo e a omissao de espaco. E o quarto

tipo e a combinacao do terceiro com o segundo tipo de erro.

Pode-se ter erros relacionados aos parenteses. Os erros sao: nao ter fechado o parentese

aberto, ter omitido os parenteses e a colocacao inapropriada de caracteres entre parenteses.

Observam-se tambem erros na utilizacao do estado de oxidacao, sao de tres tipos: quando

a necessidade de um estado de oxidacao e omitida, exemplo: ”copper sulfate”em vez de

copper(II) sulfate; o segundo caso e o fornecimento do estado de oxidacao quando nao

era para ser fornecido, exemplo: ”magnesium(II)”em vez de magnesium; e o terceiro

caso, quando o proprio estado de oxidacao pode ser incorreto. Podem acontecer erros

aos ”nomes com partes”ou fragmentos, por exemplo, ”Bicarbonato de sodio”, pode gerar

erros. Tem-se: erros de nomes duplicados, exemplo: ”sodium sodium carbonate”; falta de

fragmentos (partes do nome).

Existem erros com prefixos, os mais comuns sao: os prefixos desnecessarios, os nomes

18

Page 32: Estudo e Desenvolvimento de um Protótipo de Análise de Nomes

que estejam faltando prefixo e os prefixos incorretos. Os sufixos podem tambem apre-

sentar erros, como confusoes com letras, os sufixos desnecessarios e sufixos incorretos.

Alguns erros sao aplicaveis a todo o nome. Estes incluem dando o nome errado, um nome

irreconhecıvel, ou o usuario da um nome alternativo para um composto quımico. Eggert

descreve alguns erros complicados de resolver, mais o principal seria: a combinacao de

um erro no espacamento com um erro de ortografia, exemplo: ”calciusulfate”em vez de

calcium sulfate.

Toda esta parte esta relacionado com parser, pois quando o usuario entrar com o

nome a palavra devera ser ”quebrada”para a verificacao, e neste momento a atencao na

implementacao e essencial para a correta saıda do programa. Os autores tambem mostram

alguns processos do parser como: alem de corrigir o nome inscrito com a melhor corres-

pondencia e detectar os erros de ortografia e espacamento tambem precisa ter cuidado com

os prefixos porque o mesmo prefixo pode ter significados diferentes em diferentes contextos

da quımica, ter uma atencao no momento que o analisador identificara quando um nome

comeca, termina e sequencialmente comeca o proximo. Depois da analise da palavra sera o

momento de cada nome, ou fragmento, ter sua formula para serem combinadas formando

uma formula (estrutura) geral ou a formula que o usuario solicitou.

Para ajudar o usuario quando o programa nao puder compreender a entrada ou nao

puder completar a formula, os erros devem ser detectados, identificados e informados para

que os usuarios obtenham assim uma melhor compreensao dos erros.

Um outro estudo importante que tambem e de autoria de Arthur A. Eggert, An-

thony T. Jacob, e Catherine H. Middlecamp [Eggert et al., 1992] foi a capacidade de obter

nomes de produtos quımicos inorganicos, dadas as suas formulas quımicas. Mostrando

que e essencial o conhecimento da conversao nao so aos quımicos e aos estudantes de

quımica, mas tambem para os computadores se eles vao assumir o papel de assistentes

inteligentes no laboratorio quımico. Para estudar os problemas da conversao de formula

para nome, desenvolveram um modelo em forma de um PC baseado em um sistema que

mapeia formulas em nomes quımicos. Durante 5 anos houve um trabalho para desenvolver

um tutor inteligente para resolver problemas de quımica geral chamado CHEMPROF

[Eggert et al., 1993]. Uma das principais tarefas que deve ser cumprida pelo software, e

a codificacao de conhecimento da quımica de uma forma aplicavel a automatizacao da

solucao de problemas. Essa resolucao e feita por programas que contem as informacoes

necessarias para permitir orientar o aluno na resolucao de um determinado problema es-

pecıfico. Um exemplo de resolucao apresentado e a conversao de formula para nome.

Este problema e composto de duas partes. Primeiro, deve ser determinado se a formula

fornecida pelo usuario e quimicamente viavel. Em segundo lugar, a formula deve ser

decomposta em subpartes, e os fragmentos devem ser recompostos em um nome quimica-

mente correto. Cada um tem uma formula quımica viavel ou mais nomes para o qual ele

19

Page 33: Estudo e Desenvolvimento de um Protótipo de Análise de Nomes

pode ser convertido segundo as regras IUPAC.

Para sistematizar o processo de conversao de uma formula para um nome, a formula

deve ser separada em componentes quımicos que fazem sentido. No momento da analise

da formula, observa-se a variedade de possibilidades para a elaboracao das primeiras

operacoes que irao afetar diretamente a partir do nome, para desenhar o arranjo estru-

tural e descobrir a relacao entre os diversos componentes. Esta operacao aparenta ser

improvavel, mas Eggert usou um procedimento utilizando uma estrutura chamada ”parse

tree”. Depois da construcao da arvore, ela e avaliada, seus nodos sao reordenados, os esta-

dos de oxidacao sao recursivamente atribuıdos aos nos, e finalmente, apos o retorno para

o no raiz, os nomes sao atribuıdos a cada um dos nodos. Esta arvore e utilizada porque

e uma forma de organizar as informacoes em que cada item e um componente do item

acima. O item inicial a ser analisado e colocado no topo da arvore, que e chamado de no

”raiz”, e cada fragmento quebrado sao colocados em um no ”filho”. Cada no ”filho”pode

tambem ter filhos. Caso isso nao ocorra, e chamado de no ”folha”.

As informacoes armazenadas na arvore sao uteis para a verificacao da classificacao,

dos dados armazenados em cada nodo, o armazenamento dos atributos de cada grupo e a

ocorrencia de atributos armazenados de cada elemento. Embora este tipo de fragmentacao

possa ser considerado lento, e essencial para prevenir combinacoes falsas entre os elementos

para a formacao do grupo.

Apos completar a arvore as informacoes recolhidas sao utilizadas para iniciar a tomada

de decisoes. As informacoes sao passadas por uma avaliacao, dos dados recolhidos na

arvore, para entao a formacao do nome ser concluıda.

O reconhecimento da entrada tambem e tratado com cuidado, pois os usuarios podem

usar espacos inapropriados, posicionamento inadequado da carga, o uso de ”1”ou ”0”como

um expoente, a correspondencia inadequada entre parenteses sao detectados, formulas

escritas incorretamente, formulas que nao estao nas regras IUPAC, entre outras citadas.

O projeto CHEMPROF reconhece formulas (estruturas) e converte formulas para

nomes (analise). Ao dar o resultado explica cada componente da formula para o usuario,

sendo que o CHEMPROF foi escrito na linguagem Turbo Pascal.

Para evoluir o CHEMPROF Eggert e sua equipe concentrariam em converter nomes

quımicos em formulas quımicas e, em seguida, integrar esses dois tipos de metodos em

rotinas resolvendo assim, problemas quımicos de nıvel superior. Como ja foi explicado

acima, Eggert e sua equipe conseguiram concluir seu trabalho integrando no CHEMPROF

a conversao de nomes para estruturas (formula).

Este projeto estara seguindo os passos e as observacoes levantadas nos trabalhos apre-

sentados nestas subsecoes, principalmente os trabalhos de Eggert e Dias. Estes dois

trabalhos apresentam algumas diferencas e semelhancas com o prototipo PROF QUIM

deste projeto, como: Eggert trabalhou com reconhecimento de compostos inorganicos,

20

Page 34: Estudo e Desenvolvimento de um Protótipo de Análise de Nomes

utilizou a linguagem de programacao Turbo Pascal, possui uma interface, informa um

erro (mas nao o esclarece) e explica cada parte da estrutura quımica. Ja Dias, trabalhou

com quımica organica abordando somente a funcao hidrocarboneto (alcano, alceno, alcino

e alcadieno), utilizou a linguagem de programacao CLEAN, faz o reconhecimento de nomes

”comuns”(nomes que os pesquisadores nao conseguiram impor uma regra por serem popu-

lares) e nomes que seguem as regras da IUPAC, resolve questoes de ambiguidades do nome,

nao possui uma interface grafica (apenas linha de comando), nao informa se aconteceu um

erro no reconhecimento do nome e nao ha uma explicacao do nome quımico. Neste projeto,

o PROF QUIM ira trabalhar com quımica organica abordando a funcao hidrocarboneto

(alcano, alceno, alcino e alcadieno) e a funcao oxigenada (alcool, eter, aldeıdo e cetona),

utilizou a linguagem de programacao Java, reconhecendo somente nomes que seguem as

regras da IUPAC, possui uma interface grafica para entrada e saıda de dados, informa ao

usuario onde aconteceu um erro, explica o tipo do erro dando uma sugestao, a estrutura

quımica e dada em representacao string SMILES e explica o significado de cada parte

do nome quımico fornecido. Observa-se que o PROF QUIM possui algumas semelhancas

entre os dois trabalhos, mas tambem possui algumas inovacoes para o seu diferencial.

Comparando os trabalhos do passado, aqui explicados, com os de hoje observa-se que

obter a habilidade de trabalhar com inteligencia e processamento de linguagem quımica

sao fundamentais para o avanco de solucoes de problemas complexos e desafiadores da

quımica.

No capıtulo 2 sera exposto toda a teoria (algumas abordadas pelos autores Dias e

Eggert como analise sintatica) utilizada para a construcao do prototipo PROF QUIM,

deste projeto.

21

Page 35: Estudo e Desenvolvimento de um Protótipo de Análise de Nomes

Capıtulo 2

Fundamentacao Teorica

Neste capıtulo serao apresentadas as tecnicas e ferramentas que serao o alicerce teorico

para a construcao do prototipo de analise de nomes da quımica organica.

2.1 Quımica Organica

A vida e baseada na agua e nos compostos de carbono. A agua fornece o fluido da vida,

e o carbono, se combinado com outros atomos de carbono, hidrogenio, oxigenio, nitrogenio,

enxofre e fosforo, constitui as moleculas da vida. Os compostos de carbono ocorrem em

todos os organismos vivos e sem eles a vida nao existiria [Rissato e Gerenutti, 2005].

A Quımica Organica e o estudo dos compostos que contem carbono, cuja principal

propriedade e a formacao de cadeias carbonicas1. Sua denominacao foi baseada nas con-

clusoes de Lavoisier que, em 1784, provou que os compostos obtidos de seres vivos ou

fosseis continham carbono[Rissato e Gerenutti, 2005].

Atualmente a Quımica Organica e definida como a area que estuda uma gama de

substancias compostas com a participacao do carbono. Inclui tambem os hidrocarbonetos

(petroleo, gas natural), produtos de fermentacoes (como o alcool comum e o acido acetico

do vinagre), esteres (usados como solventes e aromatizantes), medicamentos (penicilinas,

sulfas), corantes (anilinas), polımeros (fibras sinteticas e plasticos), alem de substancias de

origem organica, como acucares, gorduras e proteınas. A denominacao Quımica Organica

foi mantida, entretanto, para indicar o estudo dos compostos cujas moleculas possuem

em sua cadeia o elemento quımico carbono [Usberco e Usberco, 2001].

1E o conjunto de todos os atomos de carbono e de todos os heteroatomos que constituem a molecula

de qualquer composto organico[Usberco e Usberco, 2001]

22

Page 36: Estudo e Desenvolvimento de um Protótipo de Análise de Nomes

2.1.1 Encadeamento

Os atomos de carbono tem a propriedade de se unir, formando estruturas denominadas

cadeias carbonicas. Essa propriedade e a principal responsavel pela existencia de milhoes

de compostos organicos. Vejamos algumas cadeias na Figura 2.1.

Figura 2.1: Cadeias Carbonicas.

Uma cadeia carbonica pode apresentar, alem de atomos de carbono, atomos de outros

elementos quımicos, desde que estes estejam entre os atomos de carbono. Os elementos

diferentes do carbono que frequentemente podem fazer parte da cadeia carbonica sao: O

(oxigenio), N (nitrogenio), S (enxofre), P (fosforo) e H (hidrogenio). Nesta situacao, tais

atomos sao denominados heteroatomos [Dias, 2006].

2.1.2 Tipos de Carbono

Em uma cadeia, cada carbono e classificado de acordo com o numero de outros atomos

de carbono a ele ligados. Desta forma tem-se [Campos e Mourato, 1999]:

• Carbono Primario - quando um atomo de carbono esta ligado somente a outro atomo

de carbono.

C1o − C

• Carbono Secundario - quando um atomo de carbono esta ligado a dois outros atomos

de carbono.

C −C2o − C

• Carbono Terciario - quando um atomo de carbono esta ligado a tres atomos de

carbono.

• Carbono Quaternario - quando um atomo de carbono esta ligado a quatro atomos

de carbono.

23

Page 37: Estudo e Desenvolvimento de um Protótipo de Análise de Nomes

Com a presenca de dupla ou tripla ligacao nao ha interferencia na classificacao do

carbono. A cadeia carbonica da Figura 2.2, representa esta classificacao sem influencia

[Dias, 2006].

Figura 2.2: Tipos de Carbono.

Onde temos (Figura 2.2):

• 1a → carbono primario;

• 2a → carbono secundario;

• 3a → carbono terciario.

2.1.3 Ligacao entre Carbono

Os tipos de ligacoes entre carbonos sao:

• Ligacao Simples - quando dois atomos de carbono se ligam por apenas uma unidade

de valencia 2.

C − C

• Ligacao Dupla - quando dois atomos de carbono se ligam por duas unidades de

valencia.

C = C

2O numero de ligacoes estaveis que um atomo ou um grupo de atomos pode efetuar com outros atomos,

ou outros grupos.[Ferreira, 1999]

24

Page 38: Estudo e Desenvolvimento de um Protótipo de Análise de Nomes

• Ligacao Tripla - quando dois atomos de carbono se ligam por tres unidades de

valencia.

C ≡ C

2.1.4 Cadeias Carbonicas

Cadeia carbonica ou estrutura quımica e o conjunto de todos os atomos de carbono

e de todos os heteroatomos que constituem a molecula de qualquer composto organico

[Usberco e Usberco, 2001].

As Cadeias Carbonicas sao classificadas de acordo com a forma pela qual os atomos

de carbono se associam. Tem-se:

Cadeia aberta, acıclica ou alifatica - os atomos de carbono ligam-se, sem formar

anel ou ciclo.

Exemplo:

C C O C C

A sequencia que apresenta maior numero de atomos de carbono e chamada cadeia

principal. Estas cadeias principais, de classificacao aberta, podem ser:

• Normal - possuem apenas carbono primario e secundario na cadeia principal.

Exemplo:

C C C

O

O C C

• Ramificada - possuem carbono terciario e ou quaternario na cadeia principal.

C C C

O

C

C

C

• Saturada - possuem apenas ligacoes simples entre carbono.

C C

C

C N

25

Page 39: Estudo e Desenvolvimento de um Protótipo de Análise de Nomes

• Insaturada - quando ha pelo menos uma dupla e/ou tripla ligacao entre carbono.

C C

C

C

O

O C C

• Homogenea - apresentam apenas atomos de carbono na cadeia principal.

C C C@@OH

����O

• Heterogenea - apresentam pelo menos um heteroatomo3 na cadeia.

C C N

C

C

Cadeia cıclica ou fechada - os atomos de carbono ligam-se formando um ciclo ou

anel. Podem ser simples, quando todos os atomos de carbono pertencem ao anel ou

mistas, quando ha ramificacoes no anel. Tem tambem:

• Saturada - possuem apenas ligacoes simples entre carbono.

• Insaturada - possuem pelo menos uma dupla e/ou tripla ligacao entre carbono.

• Homocıclica - apresentam apenas atomos de carbono no anel.

• Heterocıclica - possuem pelo menos um heteroatomo no anel.

A Figura 2.3 mostra alguns tipos de cadeia fechada:

No prototipo proposto neste trabalho sera abordado apenas a classificacao das cadeias

abertas. As cadeias fechadas nao serao reconhecidas pelo prototipo por falta de tempo

para sua implementacao.

2.2 Funcoes Quımicas

A Quımica Organica agrupa as substancias quımicas com base em criterios de seme-

lhancas estruturais. Desse modo, cada funcao organica e caracterizada por um grupo

funcional e apresenta uma nomenclatura caracterıstica [Usberco e Usberco, 2001]. Os

principais tipos sao: Hidrocarbonetos (alcanos, alcenos, alcinos e alcadienos) e Funcoes

Oxigenadas (alcool, eter, cetona e aldeıdo).

3Atomo diferente do elemento carbono na cadeia.

26

Page 40: Estudo e Desenvolvimento de um Protótipo de Análise de Nomes

Figura 2.3: Cadeia fechada.

2.2.1 Hidrocarbonetos

Os hidrocarbonetos sao compostos cujas moleculas sao formadas apenas por carbono

(C) e hidrogenio (H), a partir dele e possıvel produzir uma grande variedade de produ-

tos que utiliza-se no dia-a-dia, como: velas (parafina), plasticos, borracha, combustıveis

(gasolina, diesel, etc) e muitos outros. As fontes de hidrocarbonetos sao os chamados com-

bustıveis fosseis, aqueles que levaram milhoes de anos para se formar, como o petroleo, gas

natural, carvao, etc. Os hidrocarbonetos podem ser oxidados com uma grande facilidade,

liberando muita energia e calor, por isso sao utilizados como combustıveis [Rossum, 2005].

Os hidrocarbonetos correspondem a mais simples classe de compostos estudados na

quımica organica. Uma vez que os hidrocarbonetos estao presentes no nosso cotidiano, e

importante estuda-los e classifica-los.

Podemos classificar os hidrocarbonetos em algumas classes, onde cada uma possui al-

gumas caracterısticas especıficas. Serao apresentados os Hidrocarbonetos (alcano, alceno,

alcino e alcadieno).

Alcanos ou Parafinas

Sao hidrocarbonetos alifaticos saturados, ou seja, apresentam formulas moleculares for-

madas somente por Carbono (C) e Hidrogenio (H) e possuem cadeia aberta constituıda

apenas por ligacoes simples [Dias, 2006]. Sao encontrados em animais, plantas, no gas

natural e no petroleo [Rissato e Gerenutti, 2005].

Metano:

C

H

H

H

H

27

Page 41: Estudo e Desenvolvimento de um Protótipo de Análise de Nomes

Etano:

C

H

H

H

C

H

H

H

Propano:

C

H

H

H

C

H

H

C

H

H

H

Butano:

C

H

H

H

C

H

H

C

H

H

C

H

H

H

Alcenos, Alquenos ou Olefinas

Sao hidrocarbonetos alifaticos insaturados que apresentam uma dupla ligacao. Os al-

cenos ocorrem abundantemente na natureza e muitos desempenham papel fundamental

na biologia e tambem na bioquımica. O etileno, por exemplo, e um hormonio vegetal, na

forma gasosa, formado durante o metabolismo das frutas que induz seu amadurecimento

[Campos e Mourato, 1999].

Eteno:

C

H

H C

H

H

Propeno:

C

H

H

H

C

H

C

H

H

28

Page 42: Estudo e Desenvolvimento de um Protótipo de Análise de Nomes

1-Buteno:

C

H

H

H

C

H

C

C

H

C

H

H

1-Metilpropeno:

C

H

H

H

C

CH3

C

H

H

Alcinos ou Alquinos

Os hidrocarbonetos que possuem uma cadeia carbonada com, pelo menos, uma ligacao

tripla constituem a famılia dos alcinos. Tem sido empregado em diversas sınteses de com-

postos de interesse farmaceutico e tambem em sınteses de produtos naturais. Constituem

uma das classes mais interessantes de novas drogas anticancer, os quais penetram nas

moleculas de DNA [Campos e Mourato, 1999].

Etino:

CH C H

Propino:

CH C C

H

H

H

1-Butino:

CH C C

H

H

C

H

H

H

2-Pentino:

C

H

H

H

C

H

H

C C C

H

H

H

29

Page 43: Estudo e Desenvolvimento de um Protótipo de Análise de Nomes

Alcadienos ou Dienos

Sao hidrocarbonetos alifaticos insaturados por duas duplas ligacoes.

1,2-Butadieno:

CH

H

C C

H

C

H

H

H

2.2.2 Funcoes Oxigenadas

As funcoes oxigenadas possuem carbono, hidrogenio e oxigenio.

Alcoois

Alcoois sao compostos que apresentam grupo hidroxila (-OH) ligado a carbono satu-

rado.

grupofuncional : H3C − CH2- OH

Todos os alcoois tem grande importancia comercial como solventes ou como inter-

mediarios de reacao. O principal deles e o etanol, o qual possui muitas aplicacoes como

solvente industrial e tambem na area farmaceutica, sendo ainda muito usado na fabri-

cacao de bebidas. O uso mais popular e como combustıvel, sendo misturado a gasolina

[Rossum, 2005].

Propanol:

C

H

H

H

C

H

H

C

H

H

OH

2-Butanol:

C

H

H

H

C

H

H

C

OH

C

H

H

H

2-Metil-2-propanol:

C

H

H

H

C

OH

CH3

C

H

H

H

30

Page 44: Estudo e Desenvolvimento de um Protótipo de Análise de Nomes

Eteres

Os eteres apresentam um atomo de oxigenio (O) ligado a dois radicais organicos: R –

O – R’, em que R e R’ nao sao necessariamente iguais.

H3C −O− CH3

O mais importante da serie e o eter etılico, muito utilizado na medicina desde 1842

como anestesico em cirurgias prolongadas. Possui atividade fisiologica por inalacao,

agindo por solubilizacao dos lipoides4 dos tecidos nervosos, ou seja, nao existe reacao

quımica [Rissato e Gerenutti, 2005].

Atualmente o eter etılico e evitado devido aos danos hepaticos e por suas propriedades

inflamaveis.

Metoxi-metano:

C

H

H

H

O C

H

H

H

Metoxi-etano:

C

H

H

H

O C

H

H

C

H

H

H

Etoxi-etano:

C

H

H

H

C

H

H

O C

H

H

C

H

H

H

Aldeıdos

Os aldeıdos apresentam o grupo carbonila na extremidade da cadeia.

grupofuncional :

C@@H

����O

4tecidos gordurosos

31

Page 45: Estudo e Desenvolvimento de um Protótipo de Análise de Nomes

Um dos mais importantes aldeıdos e de uso mais comum e o metanal. Este gas com

odor irritante e comercializado dissolvido em agua, em uma concentracao maxima de 40%

em massa, com o nome formol. O formol e muito usado como germicida, desinfetante, flu-

ido de embalsamamento e como conservante de pecas anatomicas [Usberco e Usberco, 2001].

Metanal:

CH@@H

����O

Etanal:

C

H

H

H

C@@H

����O

Propanal:

C

H

H

H

C

H

H

C@@H

����O

Butanal:

C

H

H

H

C

H

H

C

H

H

C@@H

����O

Cetonas

As cetonas apresentam o grupo carbonila sendo este carbono secundario.

grupofuncional :

C

O

A principal cetona e o lıquido acetona. E um excelente solvente e por esse motivo e

usado na fabricacao de tintas, vernizes e esmaltes [Usberco e Usberco, 2001].

32

Page 46: Estudo e Desenvolvimento de um Protótipo de Análise de Nomes

Butanona:

C

H

H

H

C

O

C

H

H

C

H

H

H

2-Pentanona:

C

H

H

H

C

O

C

H

H

C

H

H

C

H

H

H

3-Pentanona:

C

H

H

H

C

H

H

C

O

C

H

H

C

H

H

H

Propanona:

C

H

H

H

C

O

C

H

H

H

Conhecendo os Hidrocarbonetos e Funcoes Oxigenadas que serao reconhecidos pelo

prototipo PROF QUIM, a secao 2.3 explicara como construir a nomenclatura de cada

funcao.

2.3 Nomenclatura dos Compostos Organicos

Em 1892, em Genebra, havia a necessidade do estabelecimento de regras interna-

cionais, para eliminar os conflitos de nomes quımicos. Vieram as primeiras regras, que

constitui boa parte de toda a nomenclatura, a serem sancionadas apenas nas reunioes de

Liege (1930), mas so finalmente fixadas com carater definitivo, apos muitas reunioes e

adiantamentos, em 1957[Rodrigues, 2001].

Em 1965, publicam as regras definitivas referentes a chamada ”Seccao C”(Grupos ca-

racterısticos que contem os elementos C, H, O, N, Halogenios, S, Se e Te). Juntamente

com as normas constantes das Seccoes (A e B (1958)) anteriores, ficam entao estabeleci-

dos os nomes de centenas de milhares de estruturas que vao desde os hidrocarbonetos aos

33

Page 47: Estudo e Desenvolvimento de um Protótipo de Análise de Nomes

sistemas heterocıclicos, nomes esses que sao utilizados na designacao de todos os outros

grupos de compostos. Depois em 1973, sao publicadas as regras respeitantes a Seccao D e

Seccao E (Nomenclatura Estereoquımica) e, finalmente, em 1978, as Seccoes F (Produtos

Naturais e Compostos Relacionados) e H (Compostos Modificados Isotopicamente). So

entao pode, enfim, ser editada (em 1979) a publicacao IUPAC ”Nomenclature of Organie

Chemistry”(popularmente conhecida como ”Livro Azul”). No entanto, muitas situacoes

estao ainda por serem esclarecidas, e muitas das regras que foram ensaiadas continuam

a nao ser aceitas pela generalidade dos quımicos. A prova e que a primeira grande re-

visao apenas saiu em 1994, com o tıtulo ”A Guide to IUPAC Nomenclature of Organic

Chemistry. Recommendations 1993 ”[Campos e Mourato, 1999].

O objetivo da nomenclatura quımica e o estabelecimento de nomes que correspondam

inequivocamente as estruturas a que se referem. A aplicacao das regras necessarias a

esse objetivo deu origem a nomenclatura sistematica. Nota-se, no entanto, que as regras

da nomenclatura sistematica podem nao conduzir a um unico nome para cada composto

- devem e originar sempre um nome que nao seja ambıguo, isto e, a esse nome devera

corresponder um unico composto. De fato, um conjunto de regras que origina nomes

claros e logicos para uma serie de compostos pode gerar designacoes desnecessariamente

complicadas [Campos e Mourato, 1999].

Por outro lado, a preocupacao com a maior clareza tem levado a IUPAC a aceitar, em

muitos casos, nomes semi-sistematicos e nomes ”triviais”(ou populares) consagrados pelo

uso.

Portanto, as regras fundamentais da Nomenclatura de Quımica Organica com um con-

junto de normas, procura regular o entendimento da unica linguagem capaz de identificar

milhares de estruturas.

2.3.1 Regras de Nomenclatura

O princıpio fundamental do sistema IUPAC de nomenclatura para compostos organicos

diz que cada composto diferente deve ter um nome nao-ambıguo5. Assim, por meio de um

conjunto sistematico de regras a IUPAC fornece diferentes nomes para mais de milhoes

de compostos organicos conhecidos e tambem utilizando suas regras, os nomes podem ser

deduzidos. Da mesma maneira, alguem pode tambem ser capaz de deduzir a estrutura

quımica de um determinado composto a partir de seu nome IUPAC.

De acordo com a IUPAC, o nome de uma substancia e formado pela uniao de tres com-

ponentes, cada um deles indicando uma caracterıstica do composto. Os tres componentes

sao:

5Termo que nao traduz a ocorrencia de mais do que um sentido em palavras[Ferreira, 1999]

34

Page 48: Estudo e Desenvolvimento de um Protótipo de Análise de Nomes

Prefixo - indica o numero de atomos de carbono na cadeia;

Intermediario - indica o tipo de ligacao entre os carbonos;

Sufixo - indica a funcao a que pertence o composto organico.

Os nomes em geral, estao relacionados com o numero de atomos de carbono presentes,

como os tipos de ligacoes entre os carbonos e com a funcao a que pertence o composto.

Essas caracterısticas sao indicadas por meio de um prefixo, da parte central e do sufixo.

Ha prefixos proprios para indicar a presenca de um a quatro atomos de carbono nas

substancias. Acima de quatro atomos os prefixos empregados sao de origem grega ou

latina [Usberco e Usberco, 2001].

A parte central do nome indica se a cadeia e saturada6 ou insaturada7 e o numero e

tipo de insaturacoes.

O sufixo, geralmente, indica a funcao organica a que pertence a substancia. Veja com

mais detalhes na Tabela 2.1.

Prefixo Intermediario Sufixo

Numero de Carbonos Saturacao da Cadeia Funcao

1C → MET Saturadas → AN

2C → ET Hidrocarbonetos → O

3C → PROP Insaturadas:

4C → BUT 1 dupla → EN Alcool → OL

5C → PENT 2 duplas → DIEN

6C → HEX 3 duplas → TRIEN Eter → ANO

7C → HEPT

8C → OCT 1 tripla → IN Aldeıdo → AL

9C → NON 2 triplas → DIIN

10C → DEC 3 triplas → TRIIN Cetona → ONA

11C → UNDEC 1 dupla e 1 tripla → ENIN

Tabela 2.1: Formacao do nome quımico organico [Usberco e Usberco, 2001].

6Apresenta somente ligacoes simples entre os atomos da cadeia [Usberco e Usberco, 2001].7Apresenta pelo menos uma dupla ou tripla ligacao entre os atomos da cadeia

[Usberco e Usberco, 2001].

35

Page 49: Estudo e Desenvolvimento de um Protótipo de Análise de Nomes

Compostos de Cadeia Normal e Ramificada

Os compostos organicos podem ser divididos em dois grupos: os de cadeia normal e

os de cadeia ramificada.

• Compostos de Cadeia Normal → Os nomes em geral, estao relacionados com o

numero de atomos de carbono presentes, como os tipos de ligacoes entre os carbonos

e com a funcao a que pertence o composto.

• Compostos de Cadeia Ramificada → Nesses compostos, deve-se inicialmente

identificar a cadeia carbonica principal (maior cadeia que contem o maior numero

de ramificacoes, a insaturacao e o grupo funcional).

A localizacao das ramificacoes resulta da numeracao da cadeia carbonica principal,

iniciando-se pela extremidade mais proxima da insaturacao ou do grupo funcional.

2.3.2 Nomenclatura dos Hidrocarbonetos de Cadeia Normal

Nomenclatura dos Alcanos

Os nomes dos alcanos formam-se juntando o sufixo -ano, pois possuem cadeia aberta

constituıda apenas por ligacoes simples (an), ao prefixo grego indicativo do numero de

atomos da cadeia.

A partir do nome, pode-se determinar as estruturas:

C

H

H

H

C

H

H

C

H

H

H

Nomenclatura dos Alcenos

As regras da IUPAC para a nomenclatura dos alcenos sao semelhantes, em muitos

aspectos, as dos alcanos. Mas quando um alceno apresenta quatro ou mais atomos de

carbono, torna-se necessario indicar a localizacao da dupla ligacao atraves de um numero.

Esse numero e obtido numerando-se a cadeia a partir da extremidade mais proxima da

insaturacao (dupla ligacao). O numero que indica a posicao da dupla ligacao deve ser o

menor possıvel e deve anteceder o nome do composto, precedido por um hıfen.

A partir do nome, pode-se determinar as estruturas:

36

Page 50: Estudo e Desenvolvimento de um Protótipo de Análise de Nomes

Nomenclatura dos Alcinos

As regras para estabelecer a nomenclatura dos alcinos sao as mesmas utilizadas para

os alcenos. Como e apresentado abaixo:

Nomenclatura dos Alcadienos

Na nomenclatura dos alcadienos, como existem duas duplas ligacoes na cadeia, quando

necessario, seu nome e precedido de dois numeros, separados por vırgula indicando em

qual carbono se encontra tais ligacoes. A nomeclatura dos nomes dos compostos desse

hidrocarboneto e dada abaixo.

37

Page 51: Estudo e Desenvolvimento de um Protótipo de Análise de Nomes

2.3.3 Nomenclatura dos Hidrocarbonetos Ramificados

Radicais

Radicais sao atomos ou agrupamentos de atomos eletricamente neutros que apresentam

pelo menos um eletron nao-compartilhado (valencia livre). Podem ser representados,

genericamente, por R- [Campos e Mourato, 1999].

Os principais radicais ou grupos organicos monovalentes sao obtidos, a partir de hidro-

carbonetos, pela retirada de um atomo de hidrogenio (H). Veja Figura 2.4.

Figura 2.4: Radicais [Usberco e Usberco, 2001].

Os principais radicais sao: metil, etil, propil, isopropril, butil, entre outros.

Alcanos

Para nomenclatura de alcanos ramificados, sao usadas as seguintes regras da IUPAC:

1. Regra → Determinar a cadeia principal e seu nome. Onde, a cadeia principal e a

maior sequencia contınua de atomos de carbono, nao necessariamente dispostos em

linha reta;

2. Regra → Verificar a quantidade de ramificacoes e dar nome a elas;

3. Regra→ Numerar a cadeia principal de modo a obter os menores numeros possıveis

para indicar as posicoes dos radicais. Para tal, numera-se a cadeia principal nos

dois sentidos;

4. Regra → Quando houver mais de um radical do mesmo tipo, seus nomes devem ser

precedidos de radicais que indicam suas quantidades: di, tri, tetra etc;

5. Regra→ Quando houver dois ou mais radicais de tipos diferentes, seus nomes devem

ser escritos em ordem alfabetica. Nao se devem considerar, para efeito de ordem

alfabetica, os prefixos di, tri, sec, terc, etc.

A Figura 2.5 ilustra a aplicacao das regras:

38

Page 52: Estudo e Desenvolvimento de um Protótipo de Análise de Nomes

2-Metilpentano:

Figura 2.5: Os numeros em vermelho correspondem a cadeia principal e o traco significa

a localizacao da ramificacao.

Com a aplicacao da regra 1 (conhecida como regra da cadeia), acha-se a cadeia prin-

cipal da estrutura quımica. Quando em uma estrutura, duas ou mais cadeias carbonicas

apresentarem o mesmo numero maximo de carbonos, sera considerada principal a cadeia

que tiver o maior numero de ramificacoes.

De acordo com a regra 2, a estrutura possui uma ramificacao do tipo metil. Em

seguida vem a aplicacao da regra 3, em que a numeracao da cadeia principal e realizada.

A regra 3 e executada da seguinte forma:

1. Verificacao da esquerda para direita: numero da posicao da ramificacao e 4.

2. Verificacao da direita para esquerda: numero da posicao da ramificacao e 2.

A orientacao para a nomenclatura, portanto, e dada pela segunda verificacao com o

resultado de numero 2. Se por acaso, houvesse duas ou mais ramificacoes soma-se todas,

primeiramente da esquerda para direita e depois todas da direita para esquerda e utiliza-se

o menor numero.

Por meio da regra 4, o nome do composto tera como prefixo 2-metil, pois existe apenas

uma ramificacao na posicao 2. Havendo duas ramificacoes do tipo metil, entao tem-se o

numero das localizacoes das ramificacoes seguido do radical dimetil.

Assim, o nome do composto, utilizado neste exemplo,cuja estrutura quımica e dada

pela figura 4, e 2-metilpentano, uma vez que nao houve a necessidade da aplicacao da

regra 5 devido ao fato de nao haver ocorrencia de outro radical.

No caso dos Alcenos, Alcinos e Alcadienos, a unica diferenca em relacao aos Alcanos

e que as insaturacoes devem obrigatoriamente fazer parte da cadeia principal e devem

receber sempre os menores numeros possıveis das localizacoes [Dias, 2006].

39

Page 53: Estudo e Desenvolvimento de um Protótipo de Análise de Nomes

Alcenos

A cadeia principal deve conter a dupla ligacao, caracterıstica dos alcenos, e apresentar

o maior numero possıvel de carbonos. Veja o exemplo abaixo.

2-Metil-3-penteno:

Alcinos

A cadeia principal deve conter a tripla ligacao e apresentar o maior numero de atomos

de carbono. Veja o exemplo:

2-Metil-3-pentino:

Alcadienos

A cadeia principal deve conter as duas duplas ligacoes e apresentar o maior numero

possıvel de atomos de carbono. Veja exemplo abaixo:

40

Page 54: Estudo e Desenvolvimento de um Protótipo de Análise de Nomes

2-Metil-1,3-pentadieno:

2.3.4 Nomenclatura das Funcoes Oxigenadas

Nomenclatura dos Alcoois

A nomenclatura oficial (IUPAC) dos alcoois segue as mesmas regras estabelecidas para

os hidrocarbonetos, a unica diferenca esta na terminacao (ol). Exemplos: H3C − OH

(metanol); H3C − CH2 −OH (etanol), etc.

Tem-se:

Monoalcool → Quando um alcool apresentar mais do que dois atomos de carbono, a

posicao do OH e indicada numerando a cadeia a partir da extremidade mais proxima

do carbono que contem a hidroxila -OH [Usberco e Usberco, 2001].

2-Butanol:

Polialcoois → Nesses alcoois as posicoes dos grupos OH sao fornecidos pelos menores

numeros possıveis. Essas quantidades sao indicadas pelos sufixos diol, triol, etc.

41

Page 55: Estudo e Desenvolvimento de um Protótipo de Análise de Nomes

1,3-Butanodiol:

Nomenclatura dos Eteres

A nomenclatura oficial para os eteres e descrita, abaixo:

• Identificar se existe um heteroatomo de Oxigenio na cadeia carbonica. Se existir

identificar o prefixo (antes ou depois do atomo de oxigenio) que indica o numero de

carbonos do menor radical e colocar a terminacao oxi.

• Depois o nome do hidrocarboneto correspondente ao maior radical. Veja exemplo

abaixo.

Metoxi-etano:

Nomenclatura dos Aldeıdos

As regras fundamentais do sistema de nomenclatura da IUPAC para a designacao dos

aldeıdos sao as seguintes: [Campos e Mourato, 1999]

1. A cadeia principal e a cadeia mais longa que contem o grupo aldeıdo.

grupofuncional :

C@@H

����O

2. Os nomes dos aldeıdos derivam dos nomes dos hidrocarbonetos com igual numero

de carbonos, substituindo o ”o”final pela terminacao -al;

42

Page 56: Estudo e Desenvolvimento de um Protótipo de Análise de Nomes

metanal:

CH@@H

����O

3. Os aldeıdos ramificados seguem as regras ja vistas para os hidrocarbonetos insatu-

rados e ramificados. Como o grupo funcional esta sempre na extremidade, esse

carbono sempre sera o numero 1; portanto, sua posicao nao precisa ser indicada;

4. Quando existem dois grupos funcional de aldeıdo na cadeia, basta acrescentar o

prefixo di-.

Nomenclatura das Cetonas

De acordo com as regras IUPAC, o sufixo utilizado para indicar a funcao e ona. Seu

grupo funcional e:

grupofuncional :

C

O

A numeracao da cadeia deve ser iniciada a partir da extremidade mais proxima do

grupo funcional, quando necessario. A nomenclatura da cetonas e parecida com a dos

aldeıdos.

Butanona:

Esta teoria foi aplicada nas ferramentas apresentadas nas secoes seguintes.

43

Page 57: Estudo e Desenvolvimento de um Protótipo de Análise de Nomes

2.4 Linguagem de Programacao Java

2.4.1 Introducao

Em 1991, um pequeno grupo de projetistas da Sun Microsystems fazia parte de

um projeto denominado Green, que pretendia criar uma nova geracao de computadores

portateis, inteligentes e capazes de se comunicar de muitas formas. Ampliando suas

potencialidades de uso, decidiram criar tambem uma nova plataforma para o desenvolvi-

mento destes equipamentos de forma que seu software pudesse ser executado nos mais

diferentes tipos de equipamentos [Deitel, 2005]. A primeira escolha de uma linguagem

de programacao para tal desenvolvimento foi C++, aproveitando suas caracterısticas e

a experiencia dos integrantes do grupo no desenvolvimento de produtos. Mas, mesmo o

C++ nao permitia realizar com facilidade tudo aquilo que o grupo visionava.

James Gosling, coordenador do projeto, decidiu entao pela criacao de uma nova lin-

guagem de programacao que pudesse conter tudo aquilo que era considerado importante

e que ainda sim fosse simples, portatil e facil de programar. Surgiu assim a linguagem in-

terpretada oak. Para dar suporte a linguagem, surgiu o Green OS e uma interface grafica

padronizada [Junior, 2000].

Apos dois anos de trabalho o grupo finaliza o Star7 8, um avancado PDA (Personal

Digital Assistant) e em 1993 surge a primeira oportunidade de aplicacao desta solucao da

Sun em uma concorrencia publica da Time-Warner para desenvolvimento de uma tec-

nologia para TV a cabo interativa, vencida pela SGI (Silicon Graphics Inc.)[Junior, 2000].

O Oak, entao rebatizado Java, devido a problemas de copyright, continua sem uso

definido ate 1994, quando estimulados pelo grande crescimento da Internet, Jonathan

Payne e Patrick Naughton desenvolveram o programa navegador WebRunner, capaz de

efetuar o download e a execucao de codigo Java via Internet. Apresentado formalmente

pela Sun como o navegador HotJava e a linguagem Java no SunWorld’95. Poucos meses

depois a Netscape Corp. lanca uma nova versao de seu navegador Navigator tambem

capaz de efetuar o download e a execucao de pequenas aplicacoes Java entao chamadas

applets. Iniciando o sucesso do Java [Junior, 2000].

A Sun decidiu disponibilizar o Java gratuitamente para a comunidade de desenvolvi-

mento de software. Surge assim o Java Developer’s Kit 1.0 (JDK 1.0). As plataformas

inicialmente atendidas foram: Sun Solaris e Microsoft Windows 95/NT. Progressivamente

foram disponibilizados kits para outras plataformas tais como IBM OS/2, Linux e Applet

Macintosh [Cesta, 2004].

8Star7 ou * 7 e o nome do dispositivo PDA (Assistente Pessoal Digital) inteligente desenvolvido pela

Sun, como parte do Projeto Green. O nome vem do fato de que apertando as teclas * 7 abre o menu do

dispositivo em tela.[Junior, 2000]

44

Page 58: Estudo e Desenvolvimento de um Protótipo de Análise de Nomes

Atualmente a Sun vem liberando novas versoes ou correcoes, bem como novas API

(Application Program Interface) para desenvolvimento de aplicacoes especıficas.

2.4.2 Caracterısticas Importantes

A linguagem Java exibe importantes caracterısticas que, em conjunto, diferenciam-na

de outras linguagens de programacao:

• Orientacao a Objetos: Java e uma linguagem orientada a objetos, pois com excecao

de seus tipos primitivos de dados, tudo em Java sao classes ou instancias de uma

classe. Atendendo todos os requisitos necessarios para a linguagem ser considerada

orientada a objetos.

• Independente de Plataforma: Java e uma linguagem independente de plataforma

pois os programas Java sao compilados para uma forma intermediaria de codigo de-

nominado bytecodes. Os bytecodes sao como uma linguagem de maquina destinada a

uma unica plataforma, a maquina virtual Java (JVM - Java Virtual Machine, um in-

terpretador de bytecodes. Pode-se implementar uma JVM para qualquer plataforma

assim tem-se que um mesmo programa Java pode ser executado em qualquer ar-

quitetura que disponha de uma JVM [Cesta, 2004].

• Sem Ponteiros: Java nao permite a manipulacao direta de enderecos de memoria

nem exige que os objetos criados seja distribuıdos, livrando os programadores de

uma tarefa complexa. A JVM possui um mecanismo automatico de gerenciamento

de memoria conhecido como garbage colletor, que recupera a memoria alocada para

objetos nao mais referenciados pelo programa [Deitel, 2005].

• Performance: Java foi projetada para ser compacta, independente de plataforma

e para utilizacao em rede o que levou a decisao de ser interpretada atraves do

esquema bytecodes. Como uma linguagem interpretada a performance e razoavel,

nao podendo ser comparada a velocidade de execucao de codigo nativo. Para superar

esta limitacao, varias JVM dispoe de compiladores just in time (JIT) que compilam

os bytecodes para codigo nativo durante a execucao otimizando-a. Nestes casos

melhora a performance de programas Java [Junior, 2000].

• Seguranca: Considerando a possibilidade de aplicacoes obtidas atraves de uma rede,

a linguagem Java possui mecanismos de seguranca que podem, no caso de applets,

evitar qualquer operacao no sistema de arquivos da maquina-alvo, minimizando

problemas de seguranca. Tal mecanismo e flexıvel o suficiente para determinar se

uma applet e considerada segura, especificando nesta situacao diferentes nıveis de

acesso ao sistema-alvo [Junior, 2000].

45

Page 59: Estudo e Desenvolvimento de um Protótipo de Análise de Nomes

• Permite Multithreading : Java oferece recursos para o desenvolvimento de aplicacoes

capazes de executar multiplas rotinas concorrentemente e dispoe de elementos para

a sincronizacao destas varias rotinas. Cada um destes fluxos de execucao e o que se

denomina thread [Deitel, 2005].

O Java e uma linguagem bastante robusta, oferece tipos inteiros e ponto flutuante

compatıveis com as especificacoes IEEE, suporte para caracteres UNICODE, e extensıvel

dinamicamente, alem de ser naturalmente voltada para o desenvolvimento de aplicacoes

em rede ou aplicacoes distribuıdas. Tudo isso torna o Java uma linguagem de programacao

unica.

Alem disso, a realizacao de uma analise lexica e uma analise sintatica de uma deter-

minada gramatica torna-se menos complicada utilizando a linguagem Java, pois existem

programas para Java que auxiliam o programador nesta tarefa, como por exemplo: para

analise lexica temos JFlex, JLex e analise sintatica temos BYacc/J, CUP, JavaCC, etc.

Nas proximas secoes serao mostradas as ferramentas JFlex e CUP utilizadas neste tra-

balho.

2.5 Ferramenta JFlex

O JFlex e um gerador de Analisadores Lexicos para Java e implementado em Java

[Hornung e Matos, 2000]. O seu objetivo e gerar uma rotina em Java, ou seja, uma classe

que contenha as especificacoes lexicas validas para a linguagem. Essa classe e gerada a

partir de um arquivo, criado pelo usuario, que contem as especificacoes lexicas validas

para a linguagem que se deseja criar.

O tipo de analisador lexico gerado pelo JFlex realiza um conjunto de tarefas mais

avancadas do que simplesmente retornar uma serie de sımbolos validos ou nao. Ele e

capaz de interagir com o analisador sintatico, realizando as seguintes tarefas:

• reconhecer um token lexico e retornar ao analisador sintatico um codigo que identi-

fica o tipo de token;

• repassar ao analisador lexico informacoes relacionadas ao token, como o texto da

palavra reconhecida;

• ativar codigo pre-definido pelo programador do analisador lexico.

A definicao dos tokens validos que serao reconhecidos pelo analisador lexico e por

meio de uma linguagem regular. No caso do JFlex, sera utilizado expressoes regulares.

O arquivo que contem as definicoes das expressoes regulares e um arquivo texto com a

extensao ”.flex”.

46

Page 60: Estudo e Desenvolvimento de um Protótipo de Análise de Nomes

O arquivo de definicao do JFlex possui basicamente tres grandes secoes (codigo do

usuario, opcoes e declaracoes, regras lexicas) separadas por ”%%”. A Figura 2.6, mostra

o esquema de um arquivo de definicao de JFlex.

Figura 2.6: Arquivo de definicao JFlex.

A secao de codigo do usuario contem codigo que sera copiado sem alteracoes

para a classe gerada pelo JFlex. Comandos package e import sao colocados nesta secao

[Machado, 2000].

A secao de opcoes e declaracoes contem opcoes de configuracao do JFlex, declaracoes

de codigo utilitario para o analisador lexico e macros para expressoes regulares. Cada

opcao de configuracao deve comecar em uma nova linha e iniciar com o sımbolo ”%”.

Algumas configuracoes basicas [Machado, 2000]:

• ”%class (nome da classe)”permite configurar o nome da classe para o analisador

lexico; se o usuario nao desejar colocar um nome, sera gerada a classe ”Yylex”.

• ”%line”ativa a contagem de linhas; o valor atual pode ser obtido atraves da variavel

yyline.

• ”%column”ativa a contagem de colunas; o valor atual pode ser obtido atraves da

variavel yycolumn.

• ”%char”ativa a contagem de caracteres; o valor atual pode ser obtido atraves da

variavel yychar.

• ”%full”entrada de dados em caracteres de 8bits.

• ”%unicode”entrada de dados em caracteres de 16bits Unicode.

• ”%debug”cria um metodo main para o teste do analisador lexico via arquivos texto

passados como parametros via linha de comando, retornando informacoes sobre o

processamento na tela.

47

Page 61: Estudo e Desenvolvimento de um Protótipo de Análise de Nomes

• ”%cup”ativa o modo de compatibilidade com o gerador de analisadores sintaticos

CUP.

• ”%byacc”ativa o modo de compatibilidade com o gerador de analisadores sintaticos

BYACC.

• ”%state (nome do estado)”permite a definicao de estados lexicos, os quais sao uti-

lizados para controlar com mais detalhe o funcionamento do analisador lexico. Um

estado lexico age como uma condicao inicial, de tal maneira que somente expressoes

regulares pertencentes ao estado atual serao reconhecidas. O estado ”YYINITIAL”e

pre-definido e ja esta incluso.

Codigo em Java pode ser incluıdo nessa secao atraves dos marcadores ”%”e ”%”, cada

um em uma nova linha. Usualmente sao declarados novos atributos e metodos utilitarios.

A segunda parte desta secao (opcoes e declaracoes) termina com a declaracao de

macros para as expressoes regulares. Macros sao sinonimos utilizados para substituir

uma expressao regular por um identificador mais simples. Para construir uma macro,

utiliza-se ”identificador = expressao regular”.

Sao elementos validos para expressoes regulares:

• Um caracter qualquer;

– ”a”e a letra a;

– ”\n”e nova linha;

– ”\001”e um caractere ascii;

– ”\u0001”e um caractere unicode.

• Um conjunto de caracteres pre-definidos;

– ”[:digit:]”dıgitos;

– ”[:letter:]”letras;

– ”[:uppercase:]”caracteres maiusculos;

– ”[:lowercase:]”caracteres minusculos.

• Um conjunto de caracteres definidos pelo usuario ”[ ]”;

– ”[0123456789]”e o conjunto de sımbolos 0,1,2,3,4,5,6,7,8,9;

– ”[0-9]”e o conjunto de sımbolos 0,1,2,3,4,5,6,7,8,9;

– ”[ ]”um espaco em branco.

48

Page 62: Estudo e Desenvolvimento de um Protótipo de Análise de Nomes

• Complemento de um conjunto de caracteres definidos pelo usuario ”[ˆ]”.

– ”[ˆ]”qualquer caracter menos os dıgitos de 0 a 9.

• Uma palavra entre aspas duplas ”.

– ”projeto”e a palavra projeto. Sera alguma parte da gramatica entre aspas

duplas que deseje que o programa reconheca com uma entrada do usuario.

• Uma macro de expressao regular ”{nome da macro}”.

Na Figura 2.7, tem-se as macros que definem um identificador valido na linguagem

como uma sequencia de sımbolos que inicia por uma letra e segue com varias letras

e dıgitos.

Figura 2.7: Macros no JFlex.

A secao de regras lexicas contem um conjunto de expressoes regulares juntamente

com codigo Java a ser executado toda vez que o analisador lexico reconhecer o token

lexico definido pela expressao. A forma geral de uma regra lexica e apresentada na Figura

2.8, e deve ser interpretada de tal maneira que ”expressao”e uma expressao regular que e

reconhecida quando o analisador se encontra no estado lexico ”estado condicao”e, quando

reconhecida, dispara a execucao do ”codigo”associado. Se nao e apresentado um estado

na regra, entao e pre-definido o estado como ”YYINITIAL”[Machado, 2000].

Figura 2.8: Forma geral de uma regra lexica.

Depois de especificar a gramatica no arquivo ”.flex”, este arquivo e carregado na inter-

face grafica do JFlex, como e mostrado na Figura 2.9. Clicando na opcao ”Generate”da

interface grafica, sera criado um arquivo com a extensao ”.java”que e o arquivo que contem

o analisador lexico. Esse arquivo ”.java”pode ser compilado atraves da linha de comando,

49

Page 63: Estudo e Desenvolvimento de um Protótipo de Análise de Nomes

e entao pode-se executar o analisador lexico sobre um arquivo de entrada com a extensao

”.txt”e verificar na tela a saıda gerada.

Figura 2.9: Intercace do Gerador Lexico JFlex.

Alem de ser considerado uma evolucao do JLex (um gerador de analise lexical), man-

tendo alguma compatibilidade, apresenta a possibilidade de ligacao com as ferramentas

de analise sintatica CUP e BYacc/J [Santos, 2006].

Um analisador sintatico pode processar qualquer linguagem regular, embora um anali-

sador lexical nao tenha capacidade de processar uma linguagem independente do contexto.

Assim, uma linguagem nao regular so pode ser parcialmente processada por um analisador

lexical. Nomeadamente, aquelas partes da linguagem que conseguem ser expressas sob a

forma de expressoes regulares.

Nestes casos usa-se um analisador lexical em conjuncao com um analisador sintatico

porque permite [Machado, 2000]:

modularidade: permite separar a sintaxe em duas fases distintas: analise lexical e

sintatica. Diversas alteracoes podem ser efetuadas em um analisador sem im-

plicacoes no outro;

legibilidade: expressoes regulares sao, em geral, mais legıveis que regras gramaticais;

50

Page 64: Estudo e Desenvolvimento de um Protótipo de Análise de Nomes

simplicidade: a separacao em analise lexical e sintatica permite que o analisador sintatico

seja significativamente mais simples;

portabilidade: variacoes entre ambientes, dispositivos ou sistemas operativos podem

ficar contidos no analisador lexical.

Quando um analisador lexical e utilizado como pre-processador de um analidor sintatico

as suas tarefas sao essencialmente:

• Identificacao de elementos lexicais (tokens): literais, palavras reservadas, identifi-

cadores, operadores, separadores e delimitadores;

• Tratamento de caracteres brancos e comentarios;

• Manipulacao dos atributos de alguns dos elementos lexicais;

• Utilizacao da tabela de sımbolos para classificar e guardar informacao auxiliar de

alguns elementos lexicais;

• Analise do grafismo (posicionamento dos elementos em linha e coluna) do programa;

• Processamento de macros;

• Tratamento de erros, em geral ignorando os caracteres, embora este tipo de erros

seja raro.

O analisador sintatico que sera utilizado e que permite a ligacao com o analisador

lexico, JFlex, sera o Java CUP, apresentado na secao 2.6.

2.6 Ferramenta Java CUP

A ferramenta JFlex foi utilizada na primeira fase da construcao do codigo deste

prototipo. Esta fase e conhecida como Analise Lexica, e tem como objetivo reconhecer as

palavras contidas em um documento de entrada. Estas palavras sao denominadas tokens

e sao passadas para o analisador sintatico (segunda fase da construcao do prototipo). Ou

seja, o analisador lexico tem como objetivo identificar o grupo de uma determinada palavra

e passar o token que representa a palavra para o analisador sintatico. Caso algum erro

lexical seja detectado, o erro e informado ao usuario. Estes erros podem ser, por exemplo,

caracteres invalidos, construcoes erradas de Strings e expressoes incorretas. Para auxiliar

na geracao do analisador lexico, o programa JFLEX foi empregado.

Analise sintatica (parsing) e o processo de analisar uma sequencia de entrada para

determinar sua estrutura gramatical segundo uma determinada gramatica formal.

51

Page 65: Estudo e Desenvolvimento de um Protótipo de Análise de Nomes

A analise sintatica transforma um texto de entrada em uma estrutura de dados, em

geral uma arvore, o que e conveniente para o processamento posterior e a captura da

hierarquia implıcita desta entrada. Por meio da analise lexica e obtido um grupo de

tokens, para que o analisador sintatico use um conjunto de regras para construir uma

arvore sintatica da estrutura.

O CUP (Constructor of Useful Parsers) e um gerador de analise sintatica do tipo

LALR(1)(LookAhead Left-Right) para Java. O seu objetivo, assim como o JFlex, e gerar

uma rotina em Java a partir de um arquivo que contenha a gramatica para o qual o

analisador sintatico sera utilizado [Hornung e Matos, 2000].

Parsers LR foi inventado por Donald Knuth em 1965 no artigo ”On the Translation

of Languages from Left to Right”. Parsers LR tem o potencial de fornecer a velocidade

mais rapida na analise sintatica. No entanto, sao consideradas impraticaveis devido ao

seu enorme tamanho. Ja a analise LALR foi inventada por Frank DeRemer em 1969

no artigo, ”Practical LR (k) Tradutores”. A tabela LALR e frequentemente usada na

pratica, pois as tabelas obtidas sao consideravelmente menores do que as tabelas LR(1).

Alem disso, a maioria das construcoes sintaticas comuns das linguagens de programacao

podem ser expressas convenientemente por gramaticas LALR, onde ha analise de sımbolos

posteriores.

O CUP analisa sintaticamente uma sequencia de tokens, esses sao gerados pelo anali-

sador lexico e como o CUP nao possui um analisador lexico, entao os analisadores lexicos

usados frenquentemente com o CUP sao os gerados pelo JFlex. Para o Jflex fazer ligacao

com o CUP , basta declarar a diretiva %cup.

Uma especificacao do CUP apresenta as seguintes secoes [Santos, 2006]:

• Especificacao do package e import : contera declaracoes opcionais de packa-

ge e import. A declaracao package indica qual o nome do pacote que contera as

classes sym e parser geradas pelo sistema. Qualquer declaracao import que aparecer

na especificacao tambem aparecera no arquivo gerado para a classe parser. Essas

declaracoes contem a mesma sintaxe e o mesmo papel como em qualquer pacote de

medidas e declaracoes de importacao normal encontrado em um programa Java.;

• Componentes de Codigo do Usuario: pode inserir codigo do usuario por meio

de declaracoes, como:

– action code {: ... :}; : permite adicionar o codigo do usuario diretamente

dentro da declaracao do tipo de uma classe privada de nome ”action”;

– parser code {: ... :}; : permite que sejam adicionados metodos e variaveis

na classe parser ;

52

Page 66: Estudo e Desenvolvimento de um Protótipo de Análise de Nomes

– init with {: ... :}; : permite inserir codigo a ser executado pelo analisador

sintatico antes que ele inicie o processamento do primeiro token;

– scan with {: ... :}; : indica como o parser pedira o proximo token para o

analisador lexico.

• Listas de Sımbolos: declara todos os sımbolos terminais (contem os tokens que

serao retornados pelo scanner que foi gerado pelo JFlex.) e nao-terminais (contem

os sımbolos que serao usados como auxiliares na construcao da gramatica), que

aparecem na gramatica e o tipo desses sımbolos, podendo ter valores associados ou

nao. Alem disso, declara qual e o sımbolo inicial da gramatica, entao o sistema gera

uma classe de nome sym que contera todos os sımbolos declarados e as definicoes

dos sımbolos terminais e nao-terminais como constantes inteiras;

• Declaracoes de Precedencia e Associativismo: e opcional, porem e bastante

util para analise de gramaticas ambıguas, pois especifica as precedencias e o asso-

ciativismo de terminais, podendo assim reduzir problemas e conflitos. A ordem de

precedencia para terminais na mesma linha e igual e ira aumentando de cima para

baixo. Existem tres tipos de declaracoes, que sao:

– precedence left terminal[, terminal...] → o terminal associa com a esquerda.

– precedence right terminal[, terminal...] → o terminal associa com a direita.

– precedence nonassoc terminal[, terminal...] → erro de sintaxe que acontece

quando uma arvore de derivacao contem duas derivacoes consecutivas na ocorrencia

do terminal de comando.

• Gramatica: a parte final de uma declaracao CUP preve a gramatica juntamente

com as acoes semanticas a serem realizadas quando ocorrer uma reducao. Caso a

analise sintatica seja bem sucedida, no fim do processo CUP um objeto do tipo java

cup.runtime.Symbol que contem o resultado da reducao final sera retornado.

Para utilizar o CUP, basta passar o arquivo de especificacao como parametro:

java java_cup.Main < nome_arquivo.cup

Ou tambem pode utilizar este comando:

java -jar java-cup-11a-jar -parser nome_classe_execuc~ao

nome_arquivo.cup

O sistema ira produzir dois arquivos Java contendo partes do analisador: na primeira

forma de utilizacao sera obtido uma classe sym.java e outra parser.java. Ja na segunda

53

Page 67: Estudo e Desenvolvimento de um Protótipo de Análise de Nomes

maneira de utilizacao obteremos as classes sym.java e nome classe execucao.java (um

nome dado a classe que seria denominada parser.java). O arquivo sym possui uma serie

de declaracoes de constantes, uma para cada sımbolo terminal usado pelo scanner, e o

nome classe execucao.java, possui o codigo de execucao.

Com todas as regras de nomenclatura montadas no CUP e realizando a especificacao

correta, a proxima tecnica utilizada na construcao do prototipo proposto e o SMILES,

que sera exposto na secao 2.7.

2.7 SMILES

SMILES (Simplified Molecular Input Line Entry System), e uma notacao linear de

organizacao de componentes que representa cadeias moleculares por meio de uma String.

Permite que o usuario atraves de uma notacao quımica represente uma estrutura quımica

de forma a ser usada pelo computador [Sousa, 2002].

A especificacao SMILES foi desenvolvido por David Weininger, no final de 1980. Alter-

ada em 2007, foi desenvolvido um padrao aberto OpenSMILES chamado pela comunidade

de Obelisk Blue [Sousa, 2002].

Em agosto de 2006, a IUPAC introduziu esta notacao como um padrao para a re-

presentacao de estruturas moleculares. SMILES e considerado ser mais inteligıvel para a

leitura humana de estruturas quımicas, tambem tem uma ampla base de apoio de softwares

baseada na teoria dos grafos [Sousa, 2002].

Em sua forma mais concisa, atomos de hidrogenio nao sao representados, os demais

atomos sao representados por seu sımbolo quımico, atomos vizinhos ficam um a seguir ao

outro, ligacoes duplas sao representadas por =, ligacoes triplas por #, ramificacoes sao

representadas por parenteses, aneis sao representados atribuindo dıgitos aos dois atomos

que fecham o anel e aneis aromaticos sao representados com os atomos em minusculas

[Salvador, 2003]. Por exemplo: A agua e representada por O (fica implıcito que tem 2

hidrogenios). Analogamente, metano, amonia, acido sulfıdrico e acido clorıdrico sao re-

presentados, respectivamente, por C, N, S e Cl. Veja mais exemplos:

Etano:

C

H

H

H

C

H

H

H

SMILES: CC

54

Page 68: Estudo e Desenvolvimento de um Protótipo de Análise de Nomes

Eteno:

C

H

H C

H

H

SMILES: C=C

2-Propanol:

C

H

H

H

C

OH

C

H

H

H

SMILES: CC(O)C

2-Propanona:

C

H

H

H

C

O

C

H

H

H

SMILES: CC(=O)C

2-Metilbutanol:

C

H

H

H

C

H

CH3

C

OH

H

H

SMILES: CC(C)CC(O)

Propino:

CH C C

H

H

H

SMILES: C#CC

No capıtulo 3 sera abordado a construcao do prototipo PROF QUIM, utilizando todas

essas ferramentas e tecnicas aqui explicadas.

55

Page 69: Estudo e Desenvolvimento de um Protótipo de Análise de Nomes

Capıtulo 3

A Construcao do Prototipo PROF

QUIM

Neste capıtulo serao apresentadas a construcao de todas as fases do prototipo de analise

de nomes da quımica organica (PROF QUIM) em detalhes, como por exemplo, a analise

lexica, a analise sintatica, a analise semantica (significado do nome em representacao

SMILE), interface e testes.

3.1 O PROF QUIM

O principal objetivo que o prototipo Analisador de Nomes da Quımica Organica PROF

QUIM deve realizar, e a funcao de facilitar o aprendizado dos alunos de ensino funda-

mental, ensino medio e universitarios, alem de auxiliar professores, pesquisadores e todos

aqueles interessados em nomenclatura e estrutura da quımica organica.

O prototipo funcionara da seguinte maneira: o usuario entrara com o nome, especi-

ficamente do idioma portugues do Brasil, do composto organico aceitando somente as

substancias Alcano, Alceno, Alcino, Alcadieno, Alcool, Aldeıdo, Eter, e Cetona, se o

usuario digitar um nome diferente destas funcoes, o prototipo apontara um erro e a ex-

plicacao do motivo do erro, senao o sistema ira analisar este nome retornando uma saıda

visual de sua estrutura quımica (em representacao SMILE). Caso o nome utilizado na

entrada for considerado pelo prototipo incorreto (por questoes de ortografia, posicoes in-

corretas de ramificacoes, digitacao incorreta da formacao do nome, posicoes de ligacoes

e nomes inrreconhecıveis de compostos da quımica), o sistema apresentara a explicacao

do que foi considerado errado e o usuario tera a possibilidade de corrigir seu erro para a

obtencao do nome correto. O prototipo ira gerar somente a saıda dos nomes dos compos-

tos que se enquadram nos padroes das nomenclaturas oficiais da IUPAC1 (International

1http://www.iupac.org

56

Page 70: Estudo e Desenvolvimento de um Protótipo de Análise de Nomes

Union of Pure and Applied Chemistry).

Este prototipo foi implementado na linguagem de programacao Java, utilizando as

ferramentas de analise JFlex e Java CUP. Para a representacao das estruturas quımicas

foi utilizada a tecnica de representacao SMILE.

Serao abordadas nas secoes 3.2, 3.3, 3.4, 3.5, um detalhamento de cada parte do

processo de construcao do prototipo PROF QUIM.

3.2 Linguagem de Programacao

A linguagem de programacao escolhida para a implementacao do prototipo foi a lin-

guagem Java no ambiente de desenolvimento NetBeans 6.1. O motivo principal para o

uso desta linguagem se deve ao fato de sua portabilidade, robustez, padronizacao forte,

por possuir uma biblioteca de interface grafica consistente e por ter ferramentas que

geram codigos de analise tanto lexica como sintatica (JFlex e Java CUP), facilitando a

implementacao deste prototipo.

Uma das caracterısticas principais de Java e a simplicidade da linguagem. Acom-

panhada de um grande numero de bibliotecas de classes ja testadas e que proporcionam

varias funcionalidades (E/S, interface grafica, multimıdia, etc.). Foi projetada para criar

software altamente confiavel. Alem de prover verificacoes durante a compilacao, Java

possui um segundo nıvel de verificacoes (em tempo de execucao). Possui caracterısticas

de seguranca e a propria plataforma realiza verificacoes em tempo de execucao. Assim,

aplicacoes escritas em Java estao ”seguras”contra codigos nao autorizados que tentam

criar vırus ou invadir sistemas de arquivos [Pinto, 2003].

Esses motivos apresentados foram relevantes para o emprego desta linguagem e nao

de outras como por exemplo, a linguagem Python(nao existem muitos recursos para criar

uma interface grafica bem elaborada e e uma linguagem em desenvolvimento constante e

ainda sem uma padronizacao forte [Rossum, 2005]).

Portanto, desenvolver aplicacoes em Java resulta em um software que e portavel em

multiplas plataformas de hardware e software (sistemas operacionais, interfaces graficas),

seguro e de alto desempenho.

Na secao seguinte sera mostrado como foi feita a geracao de codigo Java para a analise

lexica e sintatica utilizando as ferramentas JFlex e Java CUP.

3.3 Fases da Construcao do Prototipo

A construcao do prototipo pode ser dividida em 3 fases: analise lexica, analise sintatica

e analise semantica. A Figura 3.1 mostra a ligacao entre as fases para o correto funciona-

57

Page 71: Estudo e Desenvolvimento de um Protótipo de Análise de Nomes

mento do prototipo PROF QUIM.

Figura 3.1: Diagrama de Atividades do PROF QUIM.

Temos em primeiro lugar, depois da entrada do usuario, a etapa da analise lexica (que-

bra a entrada em palavras conhecidas como tokens para o reconhecimento da gramatica),

com as informacoes obtidas da analise lexica temos entao a analise sintatica (recebe uma

sequencia de tokens do analisador lexico e determina se a string pode ser gerada atraves

da gramatica fornecida) e por fim a analise semantica (fornece o significado do nome).

Nas subsecoes 3.3.1 e 3.3.2 serao apresentadas cada etapa.

3.3.1 Analise Lexica

Para a realizacao da especificacao lexica valida gerada pelo analisador lexico, foi uti-

lizada a gramatica que segue as regras de nomenclatura oficial da IUPAC voltada para

formacao de nomes da quımica organica.

Neste prototipo nao foi utilizada toda a gramatica de todas as funcoes da quımica

organica, pois o objetivo do mesmo era prover ao estudante interessado na quımica

organica uma ferramenta de apoio ao aprendizado para algumas funcoes quımicas a

princıpio.

58

Page 72: Estudo e Desenvolvimento de um Protótipo de Análise de Nomes

Para este prototipo trabalhou-se somente ate 5 carbonos na cadeia principal, com

ligacoes simples, duplas, triplas e duas duplas, ramificacoes de radical do tipo metil,

dimetil, trimetil e etil, posicoes de 1 a 5 (incluindo os caracteres ”,”(vırgula) e -”(traco)),

funcoes como os Hidrocarbonetos (Alcano, Alceno, Alcino e Alcadieno) e funcoes Oxige-

nadas (Alcool, Aldeıdo, Cetonas e Eter). Os elementos que farao parte da gramatica a

ser analisada nos nomes de compostos da quımica organica sao:

• Numero: 1, 2, 3, 4 e 5;

• Prefixo: met, et, prop, but e pent;

• Ligacao: an, en, in e dien;

• Ramificacao: metil, dimetil, trimetil e etil;

• Hidrocarboneto: o;

• Funcoes Oxigenadas: ol, al, ona e oxi.

Com a gramatica estabelecida, o arquivo .flex (extensao utilizada no JFlex) para o

analisador lexico, e feito com:

• Secao de Codigo do Usuario, Figura 3.2 (utilizando import e package);

Figura 3.2: Secao Codigo do Usuario.

O package sintatico e o pacote que contera todas as classes para serem compiladas.

Os imports sao necessarios para o funcionamento do programa.

• Secao Opcoes e Declaracoes, Figura 3.3 (contendo opcoes de configuracao do JFlex,

declaracoes de codigo utilitario para o analisador lexico e macros para expressoes

regulares);

O comando %public e utilizado para que as classes sejam publicas, %class qui-

mica estabelece que o nome da classe gerada pelo JFlex se chamara ”quimica.java”e

o comando %cup possibilita a ligacao com o analisador sintatico CUP.

59

Page 73: Estudo e Desenvolvimento de um Protótipo de Análise de Nomes

Figura 3.3: Secao de Opcoes e Declaracoes.

Figura 3.4: Secao de Regras Lexicas.

• Secao de Regras Lexicas, Figura 3.4 (gramatica).

As regras da gramatica serao listadas nesta secao da seguinte forma: ”met”{return

symbolsym.MET ;}, onde a palavra ”met”(entre aspas) e a gramatica e {return

symbolsym.MET ;} sera o sımbolo reconhecido no CUP que corresponde a palavra

met.

Este arquivo e carregado na interface grafica do JFlex e optando pela opcao Generator,

da interface, e gerado um arquivo .java (no caso quimica.java, pois o nome foi escolhido

no comando %class quimica). Este arquivo contem o analisador lexico. Observe que toda

a gramatica especificado no JFlex (esta entre (aspas) e letras minusculas), portanto o

prototipo apenas reconhecera nomes digitados em minusculo.

Se um usuario digitar o nome propano, nao sera encontrado nenhum erro lexico, pois

na secao de regras lexicas sera encontrado os comandos:

"prop" {return symbol(sym.PROP);}

"an" {return symbol(sym.AN);}

"o" {return symbol(sym.O);}

Reconhecendo, desta forma, todos os tokens do nome para entao, mandar ao analisador

sintatico o nome informado pelo usuario. Mas se o usuario tivesse entrado com um

nome que nao correspondesse a gramatica especificada no JFlex, entao retornaria uma

mensagem de erro informando qual token nao faz parte da gramatica. Por exemplo:

60

Page 74: Estudo e Desenvolvimento de um Protótipo de Análise de Nomes

usuario informa propanu. Este nome esta incorreto por apresentar o token u, pois este

token nao esta especificado na gramatica informada.

O codigo de erro e executado:

. {frame2.saida.setText("Erro Lexico: o sımbolo "+ yytext()+" n~ao

faz parte da gramatica");}

Onde o .(ponto) refere-se a um erro e a mensagem e enviada ao usuario com o token

invalido.

Terminada esta fase a proxima e a analise sintatica, recebendo o nome reconhecido

pelo analisador lexico gerado pelo JFlex.

3.3.2 Analise Sintatica e Semantica

A segunda fase deste prototipo, analisa a entrada do programa, recebendo uma sequencia

de tokens do analisador lexico e determinando se a string pode ser gerada atraves da

gramatica de nomes da quımica organica reconhecida pela IUPAC. E esperado que ele

reporte os erros, continuando a processar a entrada.

Uma lista de regras e feita utilizando a especificacao do CUP, como:

• Declaracao de Package e Import, Figura 3.5 (contera declaracoes opcionais de packa-

ge e import);

Figura 3.5: Declaracao de Package e Import.

O package sintatico e o pacote que contera todas as classes para serem compiladas.

Os imports sao necessarios para o funcionamento do programa.

• Componentes de Codigo do Usuario, Figura 3.6 (pode inserir codigo do usuario por

meio de declaracoes);

Este metodo ira informar que existe um erro e qual o token que esta causando o

erro da sintaxe, ou seja, que o token nao se encontra em nenhuma regra construıda.

61

Page 75: Estudo e Desenvolvimento de um Protótipo de Análise de Nomes

Figura 3.6: Componentes de Codigo do Usuario.

Figura 3.7: Listas de Sımbolos.

• Listas de Sımbolos, Figura 3.7 (declara todos os sımbolos terminais (contem os

tokens que serao retornados pelo scanner que foi gerado pelo JFlex.) e nao-terminais

(contem os sımbolos que serao usados como auxiliares na construcao da gramatica));

Temos os terminais O, OL, AL, entre outros, que sao sımbolos que identificam a

gramatica realizada no JFlex, por exemplo, o Terminal OL corresponde ao token

”ol”declarado no analisador lexico. Ja os nao terminais (non terminal) sao sımbolos

auxiliares na construcao da gramatica. Exemplo:

non terminal String alcano;

Este nao terminal recebera as regras referentes aos alcanos. Entao quando o nome

informado for um alcano, este sımbolo nao terminal sera acessado com as regras do

hidrocarboneto alcano.

• Declaracoes de Precedencia e Associativismo, Figura 3.8 (e opcional, porem e bas-

tante util para analise de gramaticas ambıguas);

Com esta especificacao, os tipos de ligacoes (an, en, in, dien) tem mais precedencia

do que os sufixos (o, ol, al, ona, oxi). Portanto, os que estao mais embaixo possuem

mais precedencia daqueles que estao em cima. Esta declaracao e feita para evitar

conflitos e ambiguidades na gramatica aplicada as regras.

62

Page 76: Estudo e Desenvolvimento de um Protótipo de Análise de Nomes

Figura 3.8: Declaracoes de Precedencia e Associativismo.

• Gramatica, Figura 3.9 (preve a gramatica juntamente com as acoes semanticas a

serem realizadas).

Figura 3.9: Gramatica.

Esta e a regra do metano, pois temos o prefixo MET correspondente ao token

”met”do analisador lexico, o nao terminal simples que corresponde a ligacao simples

(an) e o nao terminal hidrocarboneto que corresponde ao token (o), reconhecendo

desta maneira o nome metano.

A formacao destas regras sao para a geracao correta dos nomes quımicos organicos

seguindo as regras da IUPAC, especificados em um arquivo .cup (extensao do Java CUP).

Se o usuario entrar com o nome etano, nenhum erro sera encontrado, pois na analise

lexica acontecera o reconhecimento de todos os tokens que serao mandados para a analise

sintatica que tera a tarefa de encaixar este nome com alguma regra estabelecida, no caso

seria ”ET simples:en hidrocarboneto:hi”. Retornando a parte semantica, ou seja, a ex-

plicacao do nome junto com a representacao SMILE da estrutura quımica, por exemplo: o

nome etano produzira a representacao SMILE ”CC”, por apresentar 2 carbonos (represen-

tado pelo prefixo et) na cadeia principal, possuir ligacao simples e ser um hidrocarboneto.

A entrada e saıda de dados (realizada pelas fases apresentadas) serao por meio de uma

interface, apresentada na proxima secao.

63

Page 77: Estudo e Desenvolvimento de um Protótipo de Análise de Nomes

3.4 Interface

Nesta secao serao apresentadas algumas telas do prototipo para o melhor entendimento

de sua funcionalidade.

Caracterısticas Gerais

As caracterısticas gerais da interface sao:

• A interface de usuario sera simples, para facilitar o aprendizado da utilizacao do

produto por parte dos usuarios;

• Nao sera disponibilizada ajuda on-line para o usuario. O proprio prototipo disponi-

biliza explicacoes detalhadas sobre o seu funcionamento e sobre as substancias que

reconhece;

• Exibicao de mensagens de erro e mensagens explicativas;

• O mecanismo de navegacao e feito por meio do clique com o botao esquerdo do

mouse;

• Todo o visual da interface sera baseado nas cores azul (com alguns tons diferencia-

dos), branco e detalhes vermelho e preto, para realcar mais a visibilidade junto ao

usuario;

• Para sair do prototipo, o usuario devera fechar a interface que estiver usando e voltar

a tela principal. Para sair do sistema, o usuario devera fechar a tela principal.

Interface da Tela Principal

A Tela Principal do prototipo, Figura 3.10, contem algumas funcionalidades, atraves

da qual as demais interfaces sao acessıveis. Esta tela possui 4 botoes (Nomenclatura,

Instrucoes, Informacoes, Sair). O botao Nomenclatura ira acessar a interface que e

reponsavel pela analise de nomes da quımica organica, ja o botao Instrucoes ira aces-

sar a interface que contera as explicacoes detalhadas do funcionamento do prototipo, o

botao Informacoes ira acessar a interface que possibilita ao usuario pesquisar sobre cada

substancia que o prototipo reconhece e o botao Sair fecha o programa.

Interface da Tela Nomenclatura

Nesta interface, Figura 3.11, o usuario ira realizar as tarefas que o prototipo disponi-

biliza, ou seja, o usuario informa um nome quımico, e apresentada uma explicacao e

64

Page 78: Estudo e Desenvolvimento de um Protótipo de Análise de Nomes

Figura 3.10: Tela Principal do Prototipo.

por fim, a geracao da estrutura quımica em SMILE e mostrada. Quando fechada volta

automaticamente a Tela Principal.

Temos um campo para informar o nome quımico e o botao Verificar, que envia o nome

para analise. O resultado e mostrado nos dois campos abaixo, um informa a explicacao do

nome e o outro a representacao da estrutura quımica em SMILE. Se o usuario desejar fazer

uma nova consulta, basta clicar no botao Limpar e fazer o mesmo processo explicado. Se

o usuario desejar sair, clica no botao Sair retornando a Tela Principal.

Interface da Tela Instrucoes

Nesta interface, Figura 3.12, o usuario ira realizar uma consulta sobre o funcionamento

do prototipo. O que o usuario deve fazer para obter o funcionamento correto do prototipo.

Quando fechada volta automaticamente a Tela Principal.

Interface da Tela Informacoes

Nesta interface , Figura 3.13, o usuario ira realizar uma consulta sobre as substancias

que o prototipo reconhece e sobre a representacao SMILE. Os assuntos funcionam como

um link, basta clicar em cima da palavra e a interface referente aquele assunto e acessada.

Quando fechada volta automaticamente a Tela Principal.

65

Page 79: Estudo e Desenvolvimento de um Protótipo de Análise de Nomes

Figura 3.11: Tela Nomenclatura.

Figura 3.12: Tela Instrucoes.

66

Page 80: Estudo e Desenvolvimento de um Protótipo de Análise de Nomes

Figura 3.13: Tela Informacoes.

Interface da Tela Alcano

Nesta interface, Figura 3.14, o usuario ira obter informacoes sobre o hidrocarnoneto

Alcano. Quando fechada volta automaticamente a Tela Informacoes.

Figura 3.14: Tela Alcano.

Todas as outras interfaces (tela alceno, tela alcino, tela alcadieno, tela alcool, tela

67

Page 81: Estudo e Desenvolvimento de um Protótipo de Análise de Nomes

aldeıdo, tela cetona, tela eter e tela SMILE) que fazem parte da Tela Informacoes possuem

o mesmo estilo da interface alcano, mudando apenas o conteudo e o nome.

Todas as interfaces possuem uma aparencia amigavel, com mensagens explicativas.

Testes foram feitos para verificar o funcionamento do prototipo junto com a interface

grafica, secao 3.5.

3.5 Testes

O desenvolvimento de um software envolve varias atividades nas quais a possibilidade

de ocorrerem falhas humanas e enorme. E sao por estas razoes que o desenvolvimento de

um software deve ser sempre acompanhado por atividades de testes que visam garantir a

qualidade do software. Os testes sao indispensaveis para remover defeitos e para avaliar

o grau de qualidade do software[Almeida, 2009].

Muitos tipos de testes sao feitos antes da liberacao do sistema ou prototipo, confiando

que ele funcione apropriadamente. Alguns testes dependem do que esta sendo testado:

componentes, grupos de componentes, subsistemas, ou todo o sistema. Outros testes

dependem do que queremos saber: o sistema esta funcionando de acordo com o projeto?

De acordo com os requisitos? E com as expectativas iniciais? [Pfleeger, 2004].

Os testes realizados no prototipo PROF QUIM serao: teste funcional, teste de aceitacao

e teste de Instalacao. Os chamados testes de caixa branca nao serao realizados neste

prototipo, pois cada ferramenta das etapas da construcao do prototipo (JFlex e Java

CUP), apontam erros na construcao da especificacao do codigo, por exemplo: No Java

CUP, sera detectado se alguma regra especificada no arquivo e ambıgua e ira mostrar qual

e esta regra para ser modificada. Tambem sera detectado e informado se existe alguma

variavel que nao foi declarada e esta sendo utilizada, e se existe algum erro na especi-

ficacao do codigo. No JFlex, sera detectado erros de variaveis duplicadas, de pontuacoes,

entre outros. O que nos resta verificar e testar, e se o dado fornecido na entrada sera o

resultado esperado obtido na saıda. Nas subsecoes 3.5.1, 3.5.2 e 3.5.3 serao apresentados

os testes realizados no prototipo PROF QUIM.

3.5.1 Teste Funcional

O Teste Funcional e uma tecnica utilizada para se projetarem casos de testes na qual

o programa ou sistema e considerado uma caixa preta e para testa-lo, sao fornecidas

entradas e avaliadas as saıdas geradas para verificar se estao em conformidade com os

objetivos especificados. Nessa tecnica os detalhes de implementacao nao sao considerados

e o software e avaliado segundo o ponto de vista do usuario [Delamaro e Jino, 2007].

Para a realizacao deste teste, os principais recursos utilizados foram: um microcom-

68

Page 82: Estudo e Desenvolvimento de um Protótipo de Análise de Nomes

putador com sistema operacional Windows XP, Java (TM) SE Development Kit 6 Update

16 instalado, 512MB de memoria RAM, Disco rıgido com capacidade de 40GB e um pro-

cessador AMD Sempron 2.1GHz 32Bits.

Foram utilizados 15 usuarios para a realizacao do teste, sendo uma quantia razoavel,

pois este numero representa em media a metade de alunos de uma sala de aula de um

curso superior [Alves, 2009]. Os usuarios tinham entre 16 e 35 anos de idade, incluindo

alunos (ensino medio e superior) e professores (ensino superior).

A observacao da utilizacao do prototipo pelos usuarios era avaliado individualmente

(para que um usuario nao influenciasse o outro na utilizacao do prototipo, e assim pudesse

realmente indentificar alguma dificuldade encontrada pela usuario) em uma sala pelo

responsavel pela construcao do prototipo.

Observou-se com este teste que:

• somente um usuario conhecia e utilizava um software voltado para quımica organica

chamado Organic Chemistry, onde o usuario informava um nome quımico (tanto

alcano, alceno, alcadieno, alcool, amina, amida, cetona, eter e acido carboxılico)

e se correto devolvia a formula quımica. Os outros usuarios nao conheciam e nao

utilizavam softwares semelhantes ou com as funcionalidades do PROF QUIM. Mas

mesmo com esta falta de experiencia em utilizar softwares com a finalidade de obter

estruturas quımicas organicas, nao houve nenhum problema e dificuldade em sua

utilizacao, pois os usuarios acessavam as instrucoes de como utilizar o prototipo

PROF QUIM;

• apenas um usuario conhecia a notacao SMILES, os outros usuarios precisaram aces-

sar as informacoes do PROF QUIM para compreender como faria a leitura da repre-

sentacao SMILE. Por esta representacao ser simples os usuarios nao tinham dificul-

dades, depois das informacoes obtidas no PROF QUIM, em entender a representacao

do nome quımico;

• os dados de entrada fornecidos pelos usuarios correspondiam com os dados de saıda

fornecido pelo prototipo. Ou seja, quando o usuario fornecia um dado incorreto o

prototipo informava um erro e explicava o que era aquele erro e quando o usuario

fornecia um dado correto o prototipo apresentava a estrutura quımica em SMILES

e a explicacao do nome quımico;

• observou-se tambem que houve uma satisfacao em relacao ao uso do prototipo, o

layout das telas foram uteis para a locomocao dentro do software, as quantidades de

informacoes nas telas foram suficientes para o bom entendimento da utilizacao do

prototipo, as informacoes estavam bem organizadas, as mensagens que apareceram

nas telas foram relevantes para o momento da utilizacao, todas as funcoes do PROF

69

Page 83: Estudo e Desenvolvimento de um Protótipo de Análise de Nomes

QUIM estavam corretas, o tempo para aprender a usar o sistema foi rapido entre 3

a 5 minutos, tambem houve a lembranca de nomes e uso de comandos pela interface

ser simples, poucos passos para executar uma tarefa e nao ocorreram falhas no

prototipo em sua utilizacao.

Constatou-se que todas as funcoes do prototipo interagem e funcionam adequada-

mente, nao causando danos ou erros em sua utilizacao. Depois deste teste foi realizado o

teste de aceitacao, secao 3.5.2.

3.5.2 Teste de Aceitacao

O Teste de Aceitacao assegura aos usuarios que o prototipo implementado e o que foi

planejado durante o projeto. Verifica se o prototipo atinge as expectativas dos usuarios,

caso atinja as expectativas o prototipo e aceito [Pfleeger, 2004].

Um teste de aceitacao foi realizado com o prototipo PROF QUIM utilizando os mesmos

usuarios que realizaram o teste funcional (secao 3.5.1), pois ja estavam familiarizados

com o prototipo e tambem foram informados pelo realizador dos testes as funcoes que o

prototipo deveria desempenhar de acordo com o projeto.

Depois do termino do teste de aceitacao, o usuario informa quais requisitos nao foram

satisfeitos e quais devem ser excluıdos, revisados ou incluıdos devido a necessidade de

modificacoes [Pfleeger, 2004]. Os usuarios que realizaram o teste de aceitacao verificaram

que o prototipo satisfazia o que foi proposto pelos desenvolvedores. Confirmando desta

maneira, que o prototipo PROF QUIM realiza todas as funcoes planejadas.

3.5.3 Teste de Instalacao

O ciclo final dos testes consiste em instalar o sistema nos locais em que estao os

usuarios. Se os testes de aceitacao tiverem sido realizados no local, o teste de instalacao

podera ser dispensado. O Teste de Instalacao e executado no ambiente real de funciona-

mento, para permitir que os usuarios executem as funcoes do prototipo e documentem

problemas adicionais especıficos do verdadeiro local de operacao [Delamaro e Jino, 2007].

O teste de instalacao requer novamente a execucao dos testes antes executados, para

verificar se o sistema foi instalado corretamente e se ”em campo”, ele funciona como nos

testes anteriores. Assegurando ao usuario que o sistema esta completo e que todos os

arquivos e dispositivos necessarios estao presentes. Enfocando aspectos de integridade

e verificacao se alguma caracterıstica funcional foi afetada pelas condicoes do local de

operacao [Pfleeger, 2004].

Como este prototipo e um executavel, implementado na linguagem Java, basta o

usuario ter em sua maquina instalado o JDK 1.6 ou qualquer versao nao muito antiga do

70

Page 84: Estudo e Desenvolvimento de um Protótipo de Análise de Nomes

JDK.

Todos os testes foram realizados de acordo com os criterios de aceitacao e medidas de

qualidade na definicao do projeto. Obtendo assim um prototipo consistente.

Concluindo desta forma todas as fases de construcao do prototipo PROF QUIM.

71

Page 85: Estudo e Desenvolvimento de um Protótipo de Análise de Nomes

Consideracoes Finais

Reconhecimento de nomes quımicos organicos para a geracao de suas estruturas nao

e uma tarefa facil de se realizar. Sendo assim, o PROF QUIM e criado para auxiliar

alunos, professores e profissionais no aprendizado ou apenas numa simples consulta de

nomenclatura e estrutura quımica. Em uma pesquisa realizada pelo autor Rodrigues

[Rodrigues et al., 2008], no Rio de Janeiro, revela que entre 3.250 usuarios, estes sendo

alunos e professores, 74% utilizam e aprovam softwares voltados para quımica, 16% nao

sabem usar o computador e 8% nao possuem tempo para aprender. Esta pesquisa nos

mostra que, este mundo atual impoe a educadores, criancas, jovens e adultos a tarefa

de absorver as novas tecnologias das mais diversas areas do saber. Exigindo ferramen-

tas educacionais abertas ao novo, ao dinamico, ao interativo, atentas a uma realidade

que se transforma a cada momento. Este prototipo surge para facilitar a obtencao do

conhecimento para os usuarios interessados em quımica organica.

Foi abordado um diferencial dos trabalhos aqui apresentados, como por exemplo, ex-

plicacoes de erros, interface amigavel e aprendizado de cada parte do nome, para que este

prototipo tenha um atrativo sobre os usuarios interessados por este assunto.

Este trabalho apresentou um estudo das tecnicas e ferramentas para o reconhecimento

de nomes e geracao de estruturas quımicas. Houve um estudo aprofundado a respeito

da teoria da quımica organica, em relacao as regras de nomenclatura especificada pela

IUPAC sobre os compostos alcanos, alcenos, alcinos, alcadienos, alcoois, aldeıdos, cetonas

e eteres. Tambem houve um conhecimento de etapas de analises para a obtencao de um

resultado final. Apreciando as facilidades encontradas em ferramentas (JFlex, Java CUP,

SMILE) e da linguagem de programacao (Java).

Este prototipo voltado para a quımica, esta incluıdo em uma area conhecida popu-

larmente como Quımica Computacional. Esta area vem crescendo gradativamente e ga-

nhando espaco no mercado, havendo ate reconhecimento, de tecnicas computacionais

desenvolvidas utilizando a quımica, por meio do premio Nobel. O desenvolvimento deste

prototipo vem para consolidar ainda mais a importancia tecnologica com a teoria e pratica

da quımica.

Um ponto bastante positivo deste trabalho foi o fato da obtencao de bibliografia rela-

cionada a regras de nomenclatura e ferramentas de facil aprendizagem, como JFLEX e

72

Page 86: Estudo e Desenvolvimento de um Protótipo de Análise de Nomes

Java CUP. Um ponto negativo e o fato deste prototipo nao aceitar mais que 5 carbonos

na cadeia principal do nome quımico, assim diminuindo sua capacidade de analisar nomes

de cadeias longas da quımica organica. Outro ponto negativo foi o relatorio dos testes,

por nao ser bem detalhado.

As dificuldades encontradas no decorrer deste prototipo foram: A escolha da linguagem

de programacao, pois este prototipo seria implementado na linguagem Python, mas por

esta linguagem estar em desenvolvimento constante e ainda sem uma padronizacao forte

houve problemas na utilizacao de combinadores de parser e tambem em construir uma

interface bem elaborada na linguagem. Por esse motivo e outros apresentados no Capıtulo

3, a escolha da linguagem foi Java, por apresentar algumas facilidades. Uma outra di-

ficuldade foi a capacidade de Memoria, pois em Java temos uma certa quantidade de

memoria, pelo codigo consumir toda a memoria do Java a quantidade de carbono teve

de ser diminuıda. De uma cadeia de dez carbonos passou-se para cinco carbonos. Em

Java pode-se aumentar a sua memoria, mas nao conseguimos realizar esta tarefa. Entao o

prototipo realiza a verificacao de nomes que contenham somente cinco carbonos na cadeia

principal. O tempo foi outra dificuldade encontrada por este projeto, pois o tempo foi

insuficiente para solucionar o problema da memoria do Java e para aumentar a quantidade

de carbonos na cadeia principal das funcoes quımicas.

Para trabalhos futuros tem-se a perspectiva de ampliacao do prototipo PROF QUIM,

no intuito do sistema aceitar mais que 5 carbonos e reconhecer mais funcoes da quımica

organica. Um outro objetivo esta na analise da estrutura para obtencao do nome quımico,

ou seja, o processo inverso tratado neste trabalho. Tambem a realizacao de um relatorio

de testes bem mais detalhado.

Outro objetivo de trabalho futuro, e fazer o reconhecimento de nomes para estruturas

e estruturas para nomes com a quımica inorganica e entao juntar todas estas funcionali-

dades no prototipo PROF QUIM obtendo desta maneira um prototipo consistente com

varias opcoes de conhecimento e de grande auxılio para os usuarios que se interessem por

nomenclatura de nomes de compostos quımicos.

73

Page 87: Estudo e Desenvolvimento de um Protótipo de Análise de Nomes

Referencias

Almeida, C. B. G. (2009). Autenticacao Segura Baseada em Biometria Voltada para

a Dinamica da Digitacao. Projeto Final de Curso, Universidade Federal de Goias,

Campus Catalao, Curso de Bacharelado em Ciencia da Computacao.

Alves, L. P. (2009). A Pesquisa como Pratica Pedagogica da Sala de Aula na Educacao Su-

perior. www.anped.org.br/reunioes/25/posteres/leonirpessatealvesp04.rtf, Centro Uni-

versitario de Jaragua do Sul-SC.

Campos, S. L. e Mourato, P. M. (1999). Nomenclatura dos Compostos Organicos. Escolar

Editora.

Cesta, A. A. (2004). Tutorial: A linguagem de Programacao Java. Disponıvel em:

http://www.ic.unicamp.br/ cmrubira/aacesta/java/javatut.html.

Chen, L. W. (2006). Chemoinformatics: Past, Present, and Future. Disponıvel em:

http://pubs.acs.org/doi/abs/10.1021/ci060016u.

Deitel, H. M. (2005). Java Como Programar. 6a. Edicao.

Delamaro, E. M. e Jino, M. (2007). Introducao ao Teste de Software. Editora Campus.

Dias, S. M. (2006). Dissertacao de Mestrado: Analise de Nomes da Quımica Organica

a luz da Teoria do Lexico Gerativo - Da Analise Sintatico-Semantica a Geracao das

Estruturas Quımicas atraves dos Combinadores de Parser. Uberlandia, MG.

Eggert, A. A., Middlecamp, H. C., e Jacob, A. T. (1992). Convert-

ing Chemical Formulas to Names: An Expert Strategy. Disponıvel em:

http://pubs.acs.org/doi/abs/10.1021/ci00013a026.

Eggert, A. A., Middlecamp, H. C., e Jacob, A. T. (1993). Converting Chemical Names

to Formulas: A Second Expert Problem. Disponıvel em: http://www.informatik.uni-

trier.de/ ley/db/journals/jcisd/jcisd32.html, UNICAMP.

Ferreira, H. B. A. (1999). Novo Dicionario Aurelio - Seculo XXI.

Freitas, L. C. (1998). Premio Nobel de Quımica 1998. Disponıvel em:

lqes.iqm.unicamp.br/lqes-cultural-culturaquimica3-3premionobel.pdf, Quımica Nova

na Escola, Sao Paulo n. 8, p. 3- 6,.

Herold, J. B. (2000). O papel dos professores e investigadores universitarios na traducao

cientıfica. Disponıvel em: http://dtil.unilat.org/IXseminariofct-ul/bernardo-jerosch-

herold.htm, Instituto Superior Tecnico, Universidade Tecnica de Lisboa.

74

Page 88: Estudo e Desenvolvimento de um Protótipo de Análise de Nomes

Hornung, R. e Matos, N. S. (2000). Aplicando o Processo Dirigido por Responsabilidades

para a Criacao de um Subframework para Validacao Sintatica de Formulas. Disponıvel

em: http://www.pg.cefetpr.br/coinf/nasser/?page-id=6.

Junior, J. P. (2000). Introducao ao Java. Disponıvel em:

http://www.dm.ufscar.br/ waldeck/curso/java/part21.html.

Lipkowitz, K. B., Boyd, D. B., Larter, R., e Cundari, T. R. (2000). Reviews in Compu-

tational Chemistry. Volume 21.

Machado, J. (2000). Tutorial JFlex. Disponıvel em:

http://tutoriais.ccp.tripod.com/jflex/jflex.html.

Neto, F. R. J. e Junior, P. M. W. (2000). A Utilizacao do Hot Potatoes no Ensino Medio

da Escola Municipal ”Machado de Assis”, Criando Palavras Cruzadas e Auxiliando a

Construcao do Conhecimento em Nomenclatura de Hidrocarbonetos. Disponıvel em:

www.profjoaoneto.com/.../artigo-hot-potatoes-Seminario-UFU.pdf.

Pfleeger, S. L. (2004). Engenharia de Software: teoria e pratica. Prentice Hall.

Pinto, S. A. (2003). Introducao a Linguagem Java. Disponıvel em:

www.conquista.cefetba.br/stenio/java.pdf, Unicamp.

Raupp, D., Serrano, A., e Martins, T. L. C. (2008). A evolucao da quımica

computacional e sua contribuicao para a educacao em Quımica. Disponıvel em:

www.liberato.com.br/upload/arquivos/0103110810131419.pdf, Revista Liberato, Novo

Hamburgo, v. 9, n. 12, p. 13-22, jul./dez.

Rissato, R. S. e Gerenutti, M. (2005). Quımica Organica: Compreendendo a Ciencia da

Vida. Campinas-SP, Editora Atomo.

Rodrigues, C. R., Diniz, J. M., e Albuquerque, M. G. (2008). Ambiente Virtual: ainda

uma proposta para o ensino. Disponıvel em: www.cienciasecognicao.org/pdf/v13-

2/m318212.pdf.

Rodrigues, R. A. J. (2001). Recomendacoes da IUPAC para Nomenclatura de Moleculas

Organicas. Disponıvel em: http://qnesc.sbq.org.br/online/qnesc13/v13a05.pdf.

Rossum, G. (2005). Tutorial Python. Disponıvel em:

www.python.org.br/wiki/DocumentacaoPython?action...python24.pdf.

Salvador, R. (2003). API para Validacao de Editores Moleculares. Disponıvel em:

http://periodicos.uniso.br/index.php/reu/article/view/84/47.

75

Page 89: Estudo e Desenvolvimento de um Protótipo de Análise de Nomes

Santos, R. P. (2006). Compiladores: Ferramentas de Desenvolvimento. Disponıvel

em: https://dspace.ist.utl.pt/bitstream/2295/104119/1/tools.pdf, Departamento de

Engenharia de Informatica.

Sousa, A. J. (2002). Quimio-informatica. Soquımica: Sociedade de Representacoes de

Quımica, LTDA.

Stefani, R., Nascimento, D. B. G. P., e Costa, B. F. (2007). Elucidacao Estrutural de

Substancias Organicas com Auxılio de Computador: Evolucoes Recentes. Disponıvel

em: http://www.scielo.br/scielo.php?pid=S0100-40422007000500048&script=sci-

arttext, Quımica Nova, Vol. 30, No. 5, 1347-1356.

Usberco, J. e Usberco, E. (2001). Quımica Essencial. Sao Paulo, Editora Saraiva.

Zielesny, A. (2005). Chemistry Software Package ChemOffice Ultra 2005. Disponıvel

em: http://pubs.acs.org/doi/abs/10.1021/ci050273j, University of Applied Sciences

Gelsenkirchen, Germany.

76

Page 90: Estudo e Desenvolvimento de um Protótipo de Análise de Nomes

Apendice A

Codigo Fonte

A.1 Arquivo JFlex1 /* Sec~ao Codigo do Usuario */

2

3 package sintatico;

4

5 import java_cup.runtime.*;

6 import javax.swing.JOptionPane;

7 import sintatico.frame2;

8

9 %%

10

11 /* Sec~ao de Opc~oes e Declarac~oes */

12

13 %public

14 %class quimica

15 %line

16 %column

17 %unicode

18 %cup

19 %type Symbol

20

21

22

23 %{

24 String expr = "";

25 StringBuffer string = new StringBuffer();

26

27 private Symbol symbol(int type) {

28 return new Symbol(type, yyline, yycolumn);

29 }

30

31 private Symbol symbol(int type, Object value) {

32 return new Symbol(type, yyline, yycolumn, value);

33 }

34

35

36 %}

37

38 numero = [1-5]

39

40

41 %state STRING

42

43 %%

44

45 /* Sec~ao de Regras Lexicas */

46

47 <YYINITIAL>{

48 /* Prefixo */

49 "met" {return symbol(sym.MET);}

77

Page 91: Estudo e Desenvolvimento de um Protótipo de Análise de Nomes

50 "et" {return symbol(sym.ET);}

51 "prop" {return symbol(sym.PROP);}

52 "but" {return symbol(sym.BUT);}

53 "pent" {return symbol(sym.PENT);}

54 "hex" {return symbol(sym.HEX);}

55 "hept" {return symbol(sym.HEPT);}

56 "oct" {return symbol(sym.OCT);}

57 "non" {return symbol(sym.NON);}

58 "dec" {return symbol(sym.DEC);}

59

60 /* Saturacao */

61 "an" {return symbol(sym.AN);}

62 "en" {return symbol(sym.EN);}

63 "in" {return symbol(sym.IN);}

64 "adien" {return symbol(sym.DIEN);}

65 "trien" {return symbol(sym.TRIEN);}

66 "diin" {return symbol(sym.DIIN);}

67 "triin" {return symbol(sym.TRIIN);}

68

69 /* Funcao */

70 "o" {return symbol(sym.O);}

71 "odiol" {return symbol(sym.DIOL);}

72 "otriol" {return symbol(sym.TRIOL);}

73 "ol" {return symbol(sym.OL);}

74 "al" {return symbol(sym.AL);}

75 "odial" {return symbol(sym.DIAL);}

76 "ona" {return symbol(sym.ONA);}

77 "oxi" {return symbol(sym.OXI);}

78

79 /* Radicais */

80 "metil" {return symbol(sym.METIL);}

81 "etil" {return symbol(sym.ETIL);}

82 "propil" {return symbol(sym.PROPIL);}

83 "dipropil" {return symbol(sym.DIPROPIL);}

84 "butil" {return symbol(sym.BUTIL);}

85 "dimetil" {return symbol(sym.DIMETIL);}

86 "trimetil" {return symbol(sym.TRIMETIL);}

87 "dietil" {return symbol(sym.DIETIL);}

88 "trietil" {return symbol(sym.TRIETIL);}

89 "isopropil" {return symbol(sym.ISOPROPIL);}

90 "vinil" {return symbol(sym.VINIL);}

91 "isobutil" {return symbol(sym.ISOBUTIL);}

92

93 "-" {return symbol(sym.ESPACO);}

94 "," {return symbol(sym.VIRGULA);}

95

96

97 {numero} {return symbol(sym.NUMERO, yytext());}

98

99

100 /* STRING */

101 \" {string.setLength(0); yybegin(STRING);}

102

103

104 /*ERRO*/

105 . {String s = "Erro Lexico:\n Este sımbolo ( "+yytext()+" )\n n~ao pertence

106 a gramatica\n do PROF QUIM"; JOptionPane.showMessageDialog(null,s);}

107

108 }

109

110 <STRING> {

111 \" {yybegin(YYINITIAL);}

112 [^\n\r\"\\]+ {string.append( yytext());}

113 \\t {string.append( ’\t’ );}

114 \\n {string.append( ’\n’ );}

115

116 \\r {string.append( ’\r’ );}

117 \\\" {string.append( ’\"’ );}

118 \\ {string.append( ’\"’ );}

119

120 /* Erro*/

121 .|\n {throw new Error("Ilegal caracter "+yytext()+" "+yyline);}

122

123 }

78

Page 92: Estudo e Desenvolvimento de um Protótipo de Análise de Nomes

A.2 Arquivo Java CUP1 /* Declarac~ao de Package e Import */

2

3 package sintatico;

4 import java_cup.runtime.*;

5 import java.awt.Color;

6 import java.awt.Font;

7 import sintatico.frame2;

8

9 /* Componentes de Codigo do Usuario */

10

11 parser code {:

12

13 public void report_error(String message, Object info) {

14 StringBuffer m = new StringBuffer("Atenc~ao \n ");

15 if (info instanceof java_cup.runtime.Symbol) {

16 java_cup.runtime.Symbol s = ((java_cup.runtime.Symbol) info);

17 if (s.right >= 0){

18 m.append("A formac~ao deste nome n~ao se encaixa nas regras da IUPAC.

19 \n Verifique ramificac~oes e posic~oes, pois\n este nome torna a nomenclatura incorreta.");

20 }

21 }

22 m.append("\n "+message+" "+((quimica)getScanner()).expr);

23 frame2.saida.setFont(new Font("Arial", Font.PLAIN, 15));

24 frame2.saida.setForeground(Color.RED);

25 frame2.saida.setText("\n"+m);

26 }

27

28

29 public void syntax_error(Symbol cur_token){

30 report_error("Erro sintatico.", cur_token);

31 }

32

33

34 public void report_fatal_error(String message, Object info) {

35 //report_error(message, info);

36 // System.exit(1);

37 }

38

39

40 :};

41

42 /* Lista de Sımbolos */

43

44 /* ------------ Declaracao de Terminal e Nao Terminal ----------- */

45

46 /* Terminais usados na gramatica.*/

47

48 terminal O, OL, DIOL, TRIOL, AL, DIAL, ONA, OXI;

49 terminal AN, EN, IN, DIEN, TRIEN, DIIN, TRIIN;

50 terminal MET, ET, PROP, BUT, PENT, HEX, HEPT, OCT, NON, DEC;

51 terminal METIL, ETIL, PROPIL, DIPROPIL, BUTIL, DIMETIL, TRIMETIL, DIETIL, TRIETIL, ISOPROPIL, VINIL, ISOBUTIL;

52 terminal ESPACO, VIRGULA;

53 terminal String NUMERO;

54

55

56 /* N~ao terminais usados na gramatica.*/

57

58 non terminal String nomenclatura;

59

60 non terminal String alcano;

61 non terminal String alcanoEt;

62 non terminal String alcanoProp;

63 non terminal String alcanoBut;

64

65 non terminal String alceno;

66 non terminal String alcenoEt;

67 non terminal String alcenoProp;

68 non terminal String alcenoBut;

69

70 non terminal String alcino;

71 non terminal String alcinoEt;

72 non terminal String alcinoProp;

79

Page 93: Estudo e Desenvolvimento de um Protótipo de Análise de Nomes

73 non terminal String alcinoBut;

74

75 non terminal String alcadieno;

76 non terminal String alcadienoMet;

77 non terminal String alcadienoProp;

78 non terminal String alcadienoBut;

79

80 non terminal String alcool;

81 non terminal String alcoolMet;

82 non terminal String alcoolEt;

83 non terminal String alcoolProp;

84

85 non terminal String aldeido;

86 non terminal String aldeidoMet;

87 non terminal String aldeidoEt;

88 non terminal String aldeidoProp;

89

90 non terminal String cetona;

91 non terminal String cetonaMet;

92 non terminal String cetonaEt;

93 non terminal String cetonaProp;

94

95 non terminal String eter;

96 non terminal String eterMet;

97 non terminal String eterMetEt;

98 non terminal String eterMetProp;

99

100 non terminal String eterEt;

101 non terminal String eterEtProp;

102

103 non terminal String eterProp;

104

105 non terminal String hidrocarboneto;

106 non terminal String alcoois;

107 non terminal String aldeidos;

108 non terminal String cetonas;

109 non terminal String simples;

110 non terminal String dupla;

111 non terminal String tripla;

112 non terminal String dduplas;

113 non terminal String prefixo;

114 non terminal String sufixo;

115 non terminal String central;

116 non terminal String numero;

117 non terminal String radical;

118

119 /* Declarac~ao de Precedencia e Associativismo */

120

121 /* ------------- Precedencia ----------- */

122 precedence left O, OL, DIOL, TRIOL, AL, DIAL, ONA, OXI;

123 precedence left AN, EN, IN, DIEN, TRIEN, DIIN, TRIIN;

124 precedence left MET, ET, PROP, BUT, PENT, HEX, HEPT, OCT, NON, DEC;

125 precedence left METIL, ETIL, PROPIL, DIPROPIL, BUTIL, DIMETIL, TRIMETIL, DIETIL, TRIETIL, ISOPROPIL, VINIL, ISOBUTIL;

126 precedence left NUMERO;

127

128 /* Gramatica */

129

130 /* ---------------------------- Gramatica -------------------- */

131

132 nomenclatura ::= alcano:al

133 {: RESULT = al; :}

134 | alceno: ae

135 {: RESULT = ae; :}

136 | alcino: ai

137 {: RESULT = ai; :}

138 | alcadieno: die

139 {: RESULT = die; :}

140 | alcool: ol

141 {: RESULT = ol; :}

142 | aldeido: dei

143 {: RESULT = dei; :}

144 | cetona: ce

145 {: RESULT = ce; :}

146 | eter: te

80

Page 94: Estudo e Desenvolvimento de um Protótipo de Análise de Nomes

147 {: RESULT = te; :}

148 ;

149

150

151 /* ************* Alcano ************** */

152

153 alcano ::= alcanoEt: ae

154 {: RESULT = ae; :}

155 | alcanoProp: ap

156 {: RESULT = ap; :}

157 | alcanoBut : ab

158 {: RESULT = ab; :}

159 ;

160

161 alcanoEt ::= MET simples:en hidrocarboneto:hi {:

162 frame2.saida.setFont(new Font("Arial", Font.PLAIN, 15));

163 frame2.saida.setForeground(Color.BLUE);

164 frame2.saida.setText(" Nome correto.\n \n Esta substancia e um Alcano \n Possuindo 1

165 carbono na cadeia principal (met), \n ligac~ao simples ("+en+") e \n pertencendo ao grupo hidrocarboneto ("+hi+")");

166 frame2.est.setText("\n \n C ");

167 :}

168 | numero:nu radical:ra MET simples:en hidrocarboneto:hi {:

169 frame2.saida.setForeground(Color.RED);

170 frame2.saida.setText(" Nome incorreto.\n\n N~ao podemos ter ramificac~oes com o prefixo MET,

171 \n pois n~ao sera mais um met e\n sim outro prefixo maior que 1 carbono.");

172 :}

173 | ET simples:en hidrocarboneto: hi {:

174 frame2.saida.setForeground(Color.BLUE);

175 frame2.saida.setText(" Nome correto.\n \n Esta substancia e um Alcano \n Possuindo 2

176 carbonos na cadeia principal (et), \n ligac~ao simples ("+en+") e \n pertencendo ao grupo hidrocarboneto ("+hi+")");

177 frame2.est.setText("\n \n CC ");

178 :}

179 | numero:nu radical:ra ET simples:en hidrocarboneto:hi {:

180 frame2.saida.setForeground(Color.RED);

181 frame2.saida.setText(" Nome incorreto.\n\n N~ao podemos ter ramificac~oes com o prefixo ET,

182 \n pois n~ao sera mais um et e\n sim outro prefixo maior que 2 carbonos.");

183 :}

184 ;

185

186 alcanoProp ::= PROP simples:en hidrocarboneto:hi {:

187 frame2.saida.setFont(new Font("Arial", Font.PLAIN, 15));

188 frame2.saida.setForeground(Color.BLUE);

189 frame2.saida.setText(" Nome correto.\n\n Esta substancia e um Alcano\n Possuindo 3

190 carbonos na cadeia principal (prop),\n ligac~ao simples ("+en+") e \n pertencendo ao grupo hidrocarboneto ("+hi+")");

191 frame2.est.setText("\n\n CCC ");

192 :}

193 | numero: num METIL PROP simples:en hidrocarboneto:hi {:

194 if(Integer.parseInt(num) == 1){

195 frame2.saida.setForeground(Color.RED);

196 frame2.saida.setText(" \n Erro na posic~ao da ramificac~ao METIL.\n Se colocar a ramificac~ao

197 na posic~ao 1,\n seguindo a regra da cadeia, tornara um but n~ao\n mais o prefixo prop");

198 }else{

199 if(Integer.parseInt(num) == 3){

200 frame2.saida.setForeground(Color.RED);

201 frame2.saida.setText(" \n Erro na posic~ao da ramificac~ao METIL.\n Se colocar a ramificac~ao

202 na posic~ao 3,\n seguindo a regra da cadeia, tornara um but n~ao\n mais o prefixo prop");

203 }else{

204 if(Integer.parseInt(num) > 3){

205 frame2.saida.setForeground(Color.RED);

206 frame2.saida.setText(" Numero da posic~ao esta incorreto.\n Com o prefixo PROP so

207 podemos ter 3\n carbonos na cadeia principal");

208 }else{

209 frame2.saida.setForeground(Color.BLUE);

210 frame2.saida.setText(" Nome correto.\n\n Esta substancia e um Alcano\n Possuindo 3

211 carbonos na cadeia principal (prop),\n ligac~ao simples ("+en+"),\n uma ramificac~ao metil na posic~ao: ("+num+")

212 e \n pertencendo ao grupo hidrocarboneto ("+hi+")");

213 frame2.est.setText("\n\n CC(C)C ");

214 }

215 }

216 }

217 :}

218 | numero: num numero:nu DIMETIL PROP simples:en hidrocarboneto: hi {:

219 if(Integer.parseInt(num) == 1 || Integer.parseInt(nu) == 1){

220 frame2.saida.setForeground(Color.RED);

81

Page 95: Estudo e Desenvolvimento de um Protótipo de Análise de Nomes

221 frame2.saida.setText(" Erro na posic~ao da ramificac~ao DIMETIL.\n Se colocar uma das

222 ramificac~oes na posic~ao 1,\n seguindo a regra da cadeia, tornara um but n~ao\n mais o prefixo prop");

223 }else{

224 if(Integer.parseInt(num) == 3 || Integer.parseInt(nu) == 3){

225 frame2.saida.setForeground(Color.RED);

226 frame2.saida.setText(" Erro na posic~ao da ramificac~ao DIMETIL.\n Se colocar uma das

227 ramificac~oes na posic~ao 3,\n seguindo a regra da cadeia, tornara um but n~ao\n mais o prefixo prop");

228 }else{

229 if(Integer.parseInt(num) > 3 || Integer.parseInt(nu) > 3){

230 frame2.saida.setForeground(Color.RED);

231 frame2.saida.setText(" Numero da posic~ao esta incorreto.\n Com o prefixo PROP so

232 podemos ter 3 carbonos na cadeia principal");

233 }else{

234 frame2.saida.setForeground(Color.BLUE);

235 frame2.saida.setText(" Nome correto.\n\n Esta substancia e um Alcano\n Possuindo 3

236 carbonos na cadeia principal (prop),\n ligac~ao simples ("+en+"),\n ramificac~ao dimetil na posic~ao:

237 ("+num+","+nu+") e \n pertencendo ao grupo hidrocarboneto ("+hi+")");

238 frame2.est.setText("\n\n CC(C)(C)C ");

239 }

240 }

241 }

242 :}

243 | numero:num numero:nu numero:ero TRIMETIL PROP simples:en hidrocarboneto: hi {:

244 frame2.saida.setFont(new Font("Arial", Font.PLAIN, 15));

245 frame2.saida.setForeground(Color.RED);

246 frame2.saida.setText(" Nome incorreto.\n\n N~ao podemos ter ramificac~ao TRIMETIL

247 com o prefixo PROP,\n pois n~ao sera mais um prop e\n sim outro prefixo maior que 3 carbonos.");

248 :}

249 ;

250

251 alcanoBut ::= BUT simples:en hidrocarboneto:hi {:

252 frame2.saida.setFont(new Font("Arial", Font.PLAIN, 15));

253 frame2.saida.setForeground(Color.BLUE);

254 frame2.saida.setText(" Nome correto.\n\n Esta substancia e um Alcano\n

255 Possuindo 4 carbonos na cadeia principal (but),\n ligac~ao simples ("+en+") e \n pertencendo ao grupo

256 hidrocarboneto ("+hi+")");

257 frame2.est.setText("\n\n CCCC ");

258 :}

259 | numero: num METIL BUT simples:en hidrocarboneto:hi {:

260 if(Integer.parseInt(num) == 1){

261 frame2.saida.setForeground(Color.RED);

262 frame2.saida.setText(" Erro na posic~ao da ramificac~ao METIL.\n Se colocar a ramificac~ao

263 na posic~ao 1,\n seguindo a regra da cadeia, tornara um pent n~ao\n mais o prefixo but");

264 }else{

265 if(Integer.parseInt(num) == 4){

266 frame2.saida.setForeground(Color.RED);

267 frame2.saida.setText(" Erro na posic~ao da ramificac~ao METIL.\n Se colocar a ramificac~ao

268 na posic~ao 4,\n seguindo a regra da cadeia, tornara um pent n~ao\n mais o prefixo but");

269 }else{

270 if(Integer.parseInt(num) > 4){

271 frame2.saida.setForeground(Color.RED);

272 frame2.saida.setText(" Numero da posic~ao esta incorreto.\n Com o prefixo BUT so podemos

273 ter 4\n carbonos na cadeia principal");

274 }else{

275 frame2.saida.setForeground(Color.BLUE);

276 frame2.saida.setText(" Nome correto.\n\n Esta substancia e um Alcano\n Possuindo 4

277 carbonos na cadeia principal (but),\n ligac~ao simples ("+en+"),\n uma ramificac~ao metil na posic~ao: ("+num+")

278 e \n pertencendo ao grupo hidrocarboneto ("+hi+")");

279 if(Integer.parseInt(num)==2){

280 frame2.est.setText("\n\n CC(C)CC ");

281 }else{

282 frame2.est.setText("\n\n CCC(C)C ");

283

284 }

285 }

286 }

287 }

288 :}

289 | numero:num numero:nu DIMETIL BUT simples:en hidrocarboneto: hi {:

290 if(Integer.parseInt(num) == 1 || Integer.parseInt(nu) == 1){

291 frame2.saida.setForeground(Color.RED);

292 frame2.saida.setText(" Erro na posic~ao da ramificac~ao DIMETIL.\n Se colocar uma das

293 ramificac~oes na posic~ao 1,\n seguindo a regra da cadeia, tornara um pent n~ao\n mais o prefixo but");

294 }else{

82

Page 96: Estudo e Desenvolvimento de um Protótipo de Análise de Nomes

295 if(Integer.parseInt(num) == 4 || Integer.parseInt(nu) == 4){

296 frame2.saida.setForeground(Color.RED);

297 frame2.saida.setText(" Erro na posic~ao da ramificac~ao DIMETIL.\n Se colocar uma das

298 ramificac~oes na posic~ao 4,\n seguindo a regra da cadeia, tornara um pent n~ao\n mais o prefixo but");

299 }else{

300 if(Integer.parseInt(num) > 4 || Integer.parseInt(nu) > 4){

301 frame2.saida.setForeground(Color.RED);

302 frame2.saida.setText(" Numero da posic~ao esta incorreto.\n Com o prefixo BUT so podemos ter

303 4\n carbonos na cadeia principal");

304 }else{

305 frame2.saida.setForeground(Color.BLUE);

306 frame2.saida.setText(" Nome correto.\n\n Esta substancia e um Alcano\n Possuindo 4 carbonos

307 na cadeia principal (but),\n ligac~ao simples ("+en+"),\n ramificac~ao dimetil na posic~ao: ("+num+","+nu+") e

308 \n pertencendo ao grupo hidrocarboneto ("+hi+")");

309 if(Integer.parseInt(num)==2 && Integer.parseInt(nu)==2){

310 frame2.est.setText("\n\n CC(C)(C)CC ");

311 }else{

312 if(Integer.parseInt(num)==2 && Integer.parseInt(nu)==3 || Integer.parseInt(num)==3 &&

313 Integer.parseInt(nu)==2){

314 frame2.est.setText("\n\n CC(C)C(C)C ");

315 }else{

316 frame2.est.setText("\n\n CCC(C)(C)C ");

317 }

318 }

319 }

320 }

321 }

322 :}

323 | numero:num numero:nu numero:numer TRIMETIL BUT simples:en hidrocarboneto: hi {:

324 if(Integer.parseInt(num) == 1 || Integer.parseInt(nu) == 1 || Integer.parseInt(numer) == 1){

325 frame2.saida.setForeground(Color.RED);

326 frame2.saida.setText(" Erro na posic~ao da ramificac~ao TRIMETIL.\n Se colocar uma das

327 ramificac~oes na posic~ao 1,\n seguindo a regra da cadeia, tornara um pent n~ao\n mais o prefixo but");

328 }else{

329 if(Integer.parseInt(num) == 4 || Integer.parseInt(nu) == 4 || Integer.parseInt(numer) == 4){

330 frame2.saida.setForeground(Color.RED);

331 frame2.saida.setText(" Erro na posic~ao da ramificac~ao TRIMETIL.\n Se colocar uma das

332 ramificac~oes na posic~ao 4,\n seguindo a regra da cadeia, tornara um pent n~ao\n mais o prefixo but");

333 }else{

334 if(Integer.parseInt(num) > 4 || Integer.parseInt(nu) > 4 || Integer.parseInt(numer) > 4){

335 frame2.saida.setForeground(Color.RED);

336 frame2.saida.setText(" Numero da posic~ao esta incorreto.\n Com o prefixo BUT so podemos

337 ter 4 carbonos na cadeia principal");

338 }else{

339 if(Integer.parseInt(num)==2 && Integer.parseInt(nu)==2 && Integer.parseInt(numer)==2 ||

340 Integer.parseInt(num)==3 && Integer.parseInt(nu)==3 && Integer.parseInt(numer)==3){

341 frame2.saida.setForeground(Color.RED);

342 frame2.saida.setText(" Atenc~ao, as tres posic~oes da ramificac~ao trimetil\n n~ao podem ter

343 o mesmo numero");

344 }else{

345 frame2.saida.setForeground(Color.BLUE);

346 frame2.saida.setText(" Nome correto.\n\n Esta substancia e um Alcano\n Possuindo 4 carbonos

347 na cadeia principal (but),\n ligac~ao simples ("+en+"),\n ramificac~ao trimetil na posic~ao:

348 ("+num+","+nu+","+numer+") e \n pertencendo ao grupo hidrocarboneto ("+hi+")");

349 if(Integer.parseInt(num)==2 && Integer.parseInt(nu)==2 && Integer.parseInt(numer)==3 ||

350 Integer.parseInt(num)==3 && Integer.parseInt(nu)==2 && Integer.parseInt(numer)==2 ||

351 Integer.parseInt(num)==2 && Integer.parseInt(nu)==3 && Integer.parseInt(numer)==2){

352 frame2.est.setText("\n\n CC(C)(C)C(C)C ");

353 }else{

354 frame2.est.setText("\n\n CC(C)C(C)(C)C ");

355 }

356 }

357 }

358 }

359 }

360 :}

361 ;

362

363 /* ************* Alceno ************** */

364

365 alceno ::= alcenoEt: ae

366 {: RESULT = ae; :}

367 |alcenoProp: ap

368 {: RESULT = ap; :}

83

Page 97: Estudo e Desenvolvimento de um Protótipo de Análise de Nomes

369 | alcenoBut : ab

370 {: RESULT = ab; :}

371 ;

372

373

374 alcenoEt ::= numero: num ET dupla:en hidrocarboneto: hi {:

375 if(Integer.parseInt(num) > 2){

376 frame2.saida.setFont(new Font("Arial", Font.PLAIN, 15));

377 frame2.saida.setForeground(Color.RED);

378 frame2.saida.setText(" Numero da posic~ao da ligac~ao esta incorreto.\n Com o prefixo ET so podemos ter 2

379 carbonos na cadeia principal");

380 }else{

381 if(Integer.parseInt(num)==2){

382 frame2.saida.setForeground(Color.RED);

383 frame2.saida.setText(" Nome incorreto.\n N~ao e possivel colocar a ligac~ao neste carbono.");

384 }else{

385 frame2.saida.setFont(new Font("Arial", Font.PLAIN, 15));

386 frame2.saida.setForeground(Color.BLUE);

387 frame2.saida.setText(" Nome correto.\n \n Esta substancia e um Alceno \n Possuindo 2 carbonos na cadeia

388 principal (et), \n ligac~ao dupla ("+en+") na posic~ao ("+num+") e \n pertencendo ao grupo hidrocarboneto ("+hi+")");

389 frame2.est.setText("\n \n C=C ");

390 }

391 }

392 :}

393 | numero:nu MET dupla:en hidrocarboneto:hi {:

394 frame2.saida.setForeground(Color.RED);

395 frame2.saida.setText(" Nome incorreto.\n\n N~ao podemos utilizar o prefixo MET,\n pois com o hidrocarboneto

396 alceno temos\n que ter um carbono se ligando ao outro\n com uma dupla ligac~ao.");

397 :}

398 | numero:nu METIL numero:num MET dupla:en hidrocarboneto:hi {:

399 frame2.saida.setForeground(Color.RED);

400 frame2.saida.setText(" Nome incorreto.\n\n N~ao podemos ter ramificac~oes com o prefixo MET,\n pois n~ao

401 sera mais um met e\n sim outro prefixo maior que 1 carbono.");

402 :}

403 | numero:nu METIL numero:num ET dupla:en hidrocarboneto:hi {:

404 frame2.saida.setForeground(Color.RED);

405 frame2.saida.setText(" Nome incorreto.\n\n N~ao podemos ter ramificac~oes com o prefixo ET,\n pois n~ao

406 sera mais um et e\n sim outro prefixo maior que 2 carbonos.");

407 :}

408 ;

409

410 alcenoProp ::= numero:nume PROP dupla:en hidrocarboneto:hi {:

411 if(Integer.parseInt(nume) > 3){

412 frame2.saida.setFont(new Font("Arial", Font.PLAIN, 15));

413 frame2.saida.setForeground(Color.RED);

414 frame2.saida.setText(" Numero da posic~ao da ligac~ao esta incorreto.\n Com o prefixo PROP so podemos

415 ter\n 3 carbonos na cadeia principal");

416 }else{

417 if(Integer.parseInt(nume)==3){

418 frame2.saida.setForeground(Color.RED);

419 frame2.saida.setText(" Nome incorreto.\n N~ao e possivel colocar a ligac~ao neste carbono.");

420 }else{

421 frame2.saida.setForeground(Color.BLUE);

422 frame2.saida.setText(" Nome correto.\n\n Esta substancia e um Alceno\n Possuindo 3 carbonos na cadeia

423 principal (prop),\n ligac~ao dupla ("+en+") na posic~ao ("+nume+") e \n pertencendo ao grupo hidrocarboneto

424 ("+hi+")");

425 if(Integer.parseInt(nume)==1){

426 frame2.est.setText("\n\n C=CC ");

427 }else{

428 frame2.est.setText("\n\n CC=C ");

429 }

430 }

431 }

432 :}

433 | numero:num METIL numero:nume PROP dupla:en hidrocarboneto:hi {:

434 if(Integer.parseInt(num) == 1){

435 frame2.saida.setFont(new Font("Arial", Font.PLAIN, 15));

436 frame2.saida.setForeground(Color.RED);

437 frame2.saida.setText(" Erro na posic~ao da ramificac~ao METIL.\n Se colocar a ramificac~ao na posic~ao 1,

438 seguindo a regra da cadeia,\n tornara um but n~ao mais o prefixo prop");

439 }else{

440 if(Integer.parseInt(num) == 3){

441 frame2.saida.setForeground(Color.RED);

442 frame2.saida.setText(" Erro na posic~ao da ramificac~ao METIL.\n Se colocar a ramificac~ao na posic~ao 3,

84

Page 98: Estudo e Desenvolvimento de um Protótipo de Análise de Nomes

443 seguindo a regra da cadeia,\n tornara um but n~ao mais o prefixo prop");

444 }else{

445 if(Integer.parseInt(num) > 3 || Integer.parseInt(nume) > 3){

446 frame2.saida.setForeground(Color.RED);

447 frame2.saida.setText(" Numero da posic~ao esta incorreto.\n Com o prefixo PROP so podemos ter 3

448 carbonos na cadeia principal");

449 }else{

450 if(Integer.parseInt(nume)==3){

451 frame2.saida.setForeground(Color.RED);

452 frame2.saida.setText(" Nome incorreto.\n N~ao e possivel colocar a ligac~ao neste carbono.");

453 }else{

454 frame2.saida.setForeground(Color.BLUE);

455 frame2.saida.setText(" Nome correto.\n\n Esta substancia e um Alceno\n Possuindo 3 carbonos

456 na cadeia principal (prop),\n ligac~ao dupla ("+en+") na posic~ao ("+nume+"),\n uma ramificac~ao metil

457 na posic~ao: ("+num+") e \n pertencendo ao grupo hidrocarboneto ("+hi+")");

458 if(Integer.parseInt(nume)==1){

459 frame2.est.setText("\n\n C=C(C)C ");

460 }else{

461 frame2.est.setText("\n\n CC=(C)C ");

462 }

463 }

464 }

465 }

466 }

467 :}

468 | numero:num numero:numer DIMETIL numero:nume PROP dupla:en hidrocarboneto: hi {:

469 if(Integer.parseInt(num) == 1 || Integer.parseInt(numer) == 1){

470 frame2.saida.setFont(new Font("Arial", Font.PLAIN, 15));

471 frame2.saida.setForeground(Color.RED);

472 frame2.saida.setText(" Erro na posic~ao da ramificac~ao DIMETIL.\n Se colocar a ramificac~ao na posic~ao 1,

473 seguindo a regra da cadeia,\n tornara um but n~ao mais o prefixo prop");

474 }else{

475 if(Integer.parseInt(num) == 3 || Integer.parseInt(numer) == 3){

476 frame2.saida.setForeground(Color.RED);

477 frame2.saida.setText(" Erro na posic~ao da ramificac~ao DIMETIL.\n Se colocar a ramificac~ao na posic~ao 3,

478 seguindo a regra da cadeia,\n tornara um but n~ao mais o prefixo prop");

479 }else{

480 if(Integer.parseInt(num) > 3 || Integer.parseInt(numer) > 3 || Integer.parseInt(nume) > 3){

481 frame2.saida.setForeground(Color.RED);

482 frame2.saida.setText(" Numero da posic~ao esta incorreto.\n Com o prefixo PROP so podemos ter 3\n

483 carbonos na cadeia principal");

484 }else{

485 if(Integer.parseInt(nume)==3){

486 frame2.saida.setForeground(Color.RED);

487 frame2.saida.setText(" Nome incorreto.\n N~ao e possivel colocar a ligac~ao neste carbono.");

488 }else{

489 frame2.saida.setForeground(Color.BLUE);

490 frame2.saida.setText(" Nome correto.\n\n Esta substancia e um Alceno\n Possuindo 3 carbonos na cadeia

491 principal (prop),\n ligac~ao dupla ("+en+") na posic~ao ("+nume+"),\n ramificac~ao dimetil na posic~ao:

492 ("+num+","+numer+") e \n pertencendo ao grupo hidrocarboneto ("+hi+")");

493 if(Integer.parseInt(nume)==1){

494 frame2.est.setText("\n\n C=C(C)(C)C ");

495 }else{

496 frame2.est.setText("\n\n CC=(C)(C)C ");

497 }

498 }

499 }

500 }

501 }

502 :}

503 | numero:num numero:nu numero:ero TRIMETIL numero:ro PROP dupla:en hidrocarboneto: hi {:

504 frame2.saida.setFont(new Font("Arial", Font.PLAIN, 15));

505 frame2.saida.setForeground(Color.RED);

506 frame2.saida.setText(" Nome incorreto.\n\n N~ao podemos ter ramificac~ao TRIMETIL com o prefixo PROP,\n

507 pois n~ao sera mais um prop e\n sim outro prefixo maior que 3 carbonos.");

508 :}

509 ;

510

511

512 alcenoBut ::= numero:nume BUT dupla:en hidrocarboneto:hi {:

513 if(Integer.parseInt(nume) > 4){

514 frame2.saida.setFont(new Font("Arial", Font.PLAIN, 15));

515 frame2.saida.setForeground(Color.RED);

516 frame2.saida.setText(" Numero da posic~ao da ligac~ao esta incorreto.\n Com o prefixo BUT so podemos ter

85

Page 99: Estudo e Desenvolvimento de um Protótipo de Análise de Nomes

517 4 carbonos na cadeia principal");

518 }else{

519 if(Integer.parseInt(nume)==4){

520 frame2.saida.setForeground(Color.RED);

521 frame2.saida.setText(" Nome incorreto.\n N~ao e possivel colocar a ligac~ao neste carbono.");

522 }else{

523 frame2.saida.setForeground(Color.BLUE);

524 frame2.saida.setText(" Nome correto.\n\n Esta substancia e um Alceno\n Possuindo 4 carbonos na

525 cadeia principal (but),\n ligac~ao dupla ("+en+") na posic~ao ("+nume+") e \n pertencendo ao grupo

526 hidrocarboneto ("+hi+")");

527 if(Integer.parseInt(nume)==1){

528 frame2.est.setText("\n\n C=CCC ");

529 }else{

530 if(Integer.parseInt(nume)==2){

531 frame2.est.setText("\n\n CC=CC ");

532 }else{

533 frame2.est.setText("\n\n CCC=C ");

534 }

535 }

536 }

537 }

538 :}

539 | numero:num METIL numero:nume BUT dupla:en hidrocarboneto:hi {:

540 if(Integer.parseInt(num) == 1){

541 frame2.saida.setFont(new Font("Arial", Font.PLAIN, 15));

542 frame2.saida.setForeground(Color.RED);

543 frame2.saida.setText(" Erro na posic~ao da ramificac~ao METIL.\n Se colocar a ramificac~ao na posic~ao

544 1, seguindo a regra da cadeia,\n tornara um pent n~ao mais o prefixo but");

545 }else{

546 if(Integer.parseInt(num) == 4){

547 frame2.saida.setForeground(Color.RED);

548 frame2.saida.setText(" Erro na posic~ao da ramificac~ao METIL.\n Se colocar a ramificac~ao na posic~ao

549 4, seguindo a regra da cadeia,\n tornara um pent n~ao mais o prefixo but");

550 }else{

551 if(Integer.parseInt(num) > 4 || Integer.parseInt(nume) > 4){

552 frame2.saida.setForeground(Color.RED);

553 frame2.saida.setText(" Numero da posic~ao esta incorreto.\n Com o prefixo BUT so podemos ter 4

554 carbonos na cadeia principal");

555 }else{

556 if(Integer.parseInt(nume)==4){

557 frame2.saida.setForeground(Color.RED);

558 frame2.saida.setText(" Nome incorreto.\n N~ao e possivel colocar a ligac~ao neste carbono.");

559 }else{

560 frame2.saida.setForeground(Color.BLUE);

561 frame2.saida.setText(" Nome correto.\n\n Esta substancia e um Alceno\n Possuindo 4 carbonos

562 na cadeia principal (but),\n ligac~ao dupla ("+en+") na posic~ao ("+nume+"),\n uma ramificac~ao

563 metil na posic~ao: ("+num+") e \n pertencendo ao grupo hidrocarboneto ("+hi+")");

564 if(Integer.parseInt(nume)==1 && Integer.parseInt(num)==2){

565 frame2.est.setText("\n\n C=C(C)CC ");

566 }else{

567 if(Integer.parseInt(nume)==1 && Integer.parseInt(num)==3){

568 frame2.est.setText("\n\n C=CC(C)C ");

569 }else{

570 if(Integer.parseInt(nume)==2 && Integer.parseInt(num)==2){

571 frame2.est.setText("\n\n CC=(C)CC ");

572 }else{

573 if(Integer.parseInt(nume)==2 && Integer.parseInt(num)==3){

574 frame2.est.setText("\n\n CC=C(C)C ");

575 }else{

576 if(Integer.parseInt(nume)==3 && Integer.parseInt(num)==2){

577 frame2.est.setText("\n\n CC=C(C)C ");

578 }else{

579 frame2.est.setText("\n\n CCC=(C)C ");

580 }

581 }

582 }

583 }

584 }

585 }

586 }

587 }

588 }

589 :}

590 | numero:num numero:nu DIMETIL numero:nume BUT dupla:en hidrocarboneto: hi {:

86

Page 100: Estudo e Desenvolvimento de um Protótipo de Análise de Nomes

591 if(Integer.parseInt(num) == 1 || Integer.parseInt(nu) == 1){

592 frame2.saida.setFont(new Font("Arial", Font.PLAIN, 15));

593 frame2.saida.setForeground(Color.RED);

594 frame2.saida.setText(" Erro na posic~ao da ramificac~ao DIMETIL.\n Se colocar a ramificac~ao na

595 posic~ao 1, seguindo a regra da cadeia,\n tornara um pent n~ao mais o prefixo but");

596 }else{

597 if(Integer.parseInt(num) == 4 || Integer.parseInt(nu) == 4 ){

598 frame2.saida.setForeground(Color.RED);

599 frame2.saida.setText(" Erro na posic~ao da ramificac~ao DIMETIL.\n Se colocar a ramificac~ao na

600 posic~ao 4, seguindo a regra da cadeia,\n tornara um pent n~ao mais o prefixo but");

601 }else{

602 if(Integer.parseInt(num) > 4 || Integer.parseInt(nu) > 4 || Integer.parseInt(nume) > 4){

603 frame2.saida.setForeground(Color.RED);

604 frame2.saida.setText(" Numero da posic~ao esta incorreto.\n Com o prefixo BUT so podemos ter

605 4 carbonos na cadeia principal");

606 }else{

607 if(Integer.parseInt(nume)==4){

608 frame2.saida.setForeground(Color.RED);

609 frame2.saida.setText(" Nome incorreto.\n N~ao e possivel colocar a ligac~ao neste carbono.");

610 }else{

611 frame2.saida.setForeground(Color.BLUE);

612 frame2.saida.setText(" Nome correto.\n\n Esta substancia e um Alceno\n Possuindo 4 carbonos

613 na cadeia principal (but),\n ligac~ao dupla ("+en+") na posic~ao ("+nume+"), \n ramificac~ao

614 dimetil na posic~ao ("+num+","+nu+") e \n pertencendo ao grupo hidrocarboneto ("+hi+")");

615 if(Integer.parseInt(nume)==1){

616 if(Integer.parseInt(num)==2 && Integer.parseInt(nu)==2){

617 frame2.est.setText("\n\n C=C(C)(C)CC ");

618 }else{

619 if(Integer.parseInt(num)==2 && Integer.parseInt(nu)==3 || Integer.parseInt(num)==3 &&

620 Integer.parseInt(nu)==2){

621 frame2.est.setText("\n\n C=C(C)C(C)C ");

622 }else{

623 frame2.est.setText("\n\n C=CC(C)(C)C ");

624 }

625 }

626 }else{

627 if(Integer.parseInt(nume)==2){

628 if(Integer.parseInt(num)==2 && Integer.parseInt(nu)==2){

629 frame2.est.setText("\n\n CC=(C)(C)CC ");

630 }else{

631 if(Integer.parseInt(num)==2 && Integer.parseInt(nu)==3 || Integer.parseInt(num)==3 &&

632 Integer.parseInt(nu)==2){

633 frame2.est.setText("\n\n CC=(C)C(C)C ");

634 }else{

635 frame2.est.setText("\n\n CC=C(C)(C)C ");

636 }

637 }

638 }else{

639 if(Integer.parseInt(nume)==3){

640 if(Integer.parseInt(num)==2 && Integer.parseInt(nu)==2){

641 frame2.est.setText("\n\n CC(C)(C)C=C ");

642 }else{

643 if(Integer.parseInt(num)==2 && Integer.parseInt(nu)==3 || Integer.parseInt(num)==3 &&

644 Integer.parseInt(nu)==2){

645 frame2.est.setText("\n\n CC(C)C=(C)C ");

646 }else{

647 frame2.est.setText("\n\n CCC=(C)(C)C ");

648 }

649 }

650 }

651 }

652 }

653 }

654 }

655 }

656 }

657 :}

658 | numero:num numero:nu numero:numer TRIMETIL numero:nume BUT dupla:en hidrocarboneto: hi {:

659 if(Integer.parseInt(num) == 1 || Integer.parseInt(nu) == 1 || Integer.parseInt(numer) == 1){

660 frame2.saida.setFont(new Font("Arial", Font.PLAIN, 15));

661 frame2.saida.setForeground(Color.RED);

662 frame2.saida.setText(" Erro na posic~ao da ramificac~ao TRIMETIL.\n Se colocar a ramificac~ao na

663 posic~ao 1, seguindo a regra da cadeia,\n tornara um pent n~ao mais o prefixo but");

664 }else{

87

Page 101: Estudo e Desenvolvimento de um Protótipo de Análise de Nomes

665 if(Integer.parseInt(num) == 4 || Integer.parseInt(nu) == 4 || Integer.parseInt(numer) == 4){

666 frame2.saida.setForeground(Color.RED);

667 frame2.saida.setText(" Erro na posic~ao da ramificac~ao TRIMETIL.\n Se colocar a ramificac~ao

668 na posic~ao 4, seguindo a regra da cadeia,\n tornara um pent n~ao mais o prefixo but");

669 }else{

670 if(Integer.parseInt(num) > 4 || Integer.parseInt(nu) > 4 || Integer.parseInt(nume) > 4 ||

671 Integer.parseInt(numer) > 4){

672 frame2.saida.setForeground(Color.RED);

673 frame2.saida.setText(" Numero da posic~ao esta incorreto.\n Com o prefixo BUT so podemos

674 ter 4 carbonos na cadeia principal");

675 }else{

676 if(Integer.parseInt(nume)==4){

677 frame2.saida.setForeground(Color.RED);

678 frame2.saida.setText(" Nome incorreto.\n N~ao e possivel colocar a ligac~ao neste carbono.");

679 }else{

680 if(Integer.parseInt(num)==2 && Integer.parseInt(nu)==2 && Integer.parseInt(numer)==2 ||

681 Integer.parseInt(num)==3 && Integer.parseInt(nu)==3 && Integer.parseInt(numer)==3){

682 frame2.saida.setForeground(Color.RED);

683 frame2.saida.setText(" Atenc~ao, as tres posic~oes da ramificac~ao trimetil\n n~ao podem

684 ter o mesmo numero");

685 }else{

686 frame2.saida.setForeground(Color.BLUE);

687 frame2.saida.setText(" Nome correto.\n\n Esta substancia e um Alceno\n Possuindo 4

688 carbonos na cadeia principal (but),\n ligac~ao dupla ("+en+") na posic~ao ("+nume+"),\n

689 ramificac~ao trimetil na posic~ao ("+num+","+nu+","+numer+") e \n pertencendo ao grupo

690 hidrocarboneto ("+hi+")");

691 if(Integer.parseInt(nume)==1){

692 if(Integer.parseInt(num)==2 && Integer.parseInt(nu)==2 && Integer.parseInt(numer)==3

693 || Integer.parseInt(num)==3 && Integer.parseInt(nu)==2 && Integer.parseInt(numer)==2 ||

694 Integer.parseInt(num)==2 && Integer.parseInt(nu)==3 && Integer.parseInt(numer)==2){

695 frame2.est.setText("\n\n C=C(C)(C)C(C)C ");

696 }else{

697 frame2.est.setText("\n\n C=C(C)C(C)(C)C ");

698 }

699 }else{

700 if(Integer.parseInt(nume)==2){

701 if(Integer.parseInt(num)==2 && Integer.parseInt(nu)==2 && Integer.parseInt(numer)==3 ||

702 Integer.parseInt(num)==3 && Integer.parseInt(nu)==2 && Integer.parseInt(numer)==2 ||

703 Integer.parseInt(num)==2 && Integer.parseInt(nu)==3 && Integer.parseInt(numer)==2){

704 frame2.est.setText("\n\n CC=(C)(C)C(C)C ");

705 }else{

706 frame2.est.setText("\n\n CC=(C)C(C)(C)C ");

707 }

708 }else{

709 if(Integer.parseInt(nume)==3){

710 if(Integer.parseInt(num)==2 && Integer.parseInt(nu)==2 && Integer.parseInt(numer)==3 ||

711 Integer.parseInt(num)==3 && Integer.parseInt(nu)==2 && Integer.parseInt(numer)==2 ||

712 Integer.parseInt(num)==2 && Integer.parseInt(nu)==3 && Integer.parseInt(numer)==2){

713 frame2.est.setText("\n\n CC(C)(C)C=(C)C ");

714 }else{

715 frame2.est.setText("\n\n CC(C)C=(C)(C)C ");

716 }

717 }

718 }

719 }

720 }

721

722 }

723 }

724 }

725 }

726 :}

727 ;

728

729 /* ************* Alcino ************** */

730

731 alcino ::= alcinoEt: ae

732 {: RESULT = ae; :}

733 | alcinoProp: ap

734 {: RESULT = ap; :}

735 | alcinoBut : ab

736 {: RESULT = ab; :}

737 ;

738

88

Page 102: Estudo e Desenvolvimento de um Protótipo de Análise de Nomes

739

740 alcinoEt ::= numero:num ET tripla:en hidrocarboneto: hi {:

741 if(Integer.parseInt(num) > 2){

742 frame2.saida.setFont(new Font("Arial", Font.PLAIN, 15));

743 frame2.saida.setForeground(Color.RED);

744 frame2.saida.setText(" Numero da posic~ao da ligac~ao esta incorreto.\n

745 Com o prefixo ET so podemos ter 2\n carbonos na cadeia principal");

746 }else{

747 if(Integer.parseInt(num)==2){

748 frame2.saida.setForeground(Color.RED);

749 frame2.saida.setText(" Nome incorreto.\n N~ao e possivel colocar a ligac~ao neste carbono.");

750 }else{

751 frame2.saida.setForeground(Color.BLUE);

752 frame2.saida.setText(" Nome correto.\n \n Esta substancia e um Alcino \n Possuindo 2

753 carbonos na cadeia principal (et), \n ligac~ao tripla ("+en+") na posic~ao ("+num+") e \n

754 pertencendo ao grupo hidrocarboneto ("+hi+")");

755 frame2.est.setText("\n \n C#C ");

756 }

757 }

758 :}

759 | numero:nu MET tripla:en hidrocarboneto:hi {:

760 frame2.saida.setForeground(Color.RED);

761 frame2.saida.setText(" Nome incorreto.\n\n N~ao podemos utilizar o prefixo MET,\n pois com

762 o hidrocarboneto alcino temos\n que ter um carbono se ligando ao outro\n com uma tripla ligac~ao.");

763 :}

764 | numero:nu METIL numero:num MET tripla:en hidrocarboneto:hi {:

765 frame2.saida.setForeground(Color.RED);

766 frame2.saida.setText(" Nome incorreto.\n\n N~ao podemos ter ramificac~oes com o prefixo MET,

767 \n pois n~ao sera mais um met e\n sim outro prefixo maior que 1 carbono.");

768 :}

769 | numero:nu METIL numero:num ET tripla:en hidrocarboneto:hi {:

770 frame2.saida.setForeground(Color.RED);

771 frame2.saida.setText(" Nome incorreto.\n\n N~ao podemos ter ramificac~oes com o prefixo ET,

772 \n pois n~ao sera mais um et e\n sim outro prefixo maior que 2 carbonos.");

773 :}

774 ;

775

776 alcinoProp ::= numero:nume PROP tripla:en hidrocarboneto:hi {:

777 if(Integer.parseInt(nume) > 3){

778 frame2.saida.setFont(new Font("Arial", Font.PLAIN, 15));

779 frame2.saida.setForeground(Color.RED);

780 frame2.saida.setText(" Numero da posic~ao da ligac~ao esta incorreto.\n Com o prefixo PROP

781 so podemos ter 3 carbonos na cadeia principal");

782 }else{

783 if(Integer.parseInt(nume)==3){

784 frame2.saida.setForeground(Color.RED);

785 frame2.saida.setText(" Nome incorreto.\n N~ao e possivel colocar a ligac~ao neste carbono.");

786 }else{

787 frame2.saida.setForeground(Color.BLUE);

788 frame2.saida.setText(" Nome correto.\n\n Esta substancia e um Alcino\n Possuindo 3

789 carbonos na cadeia principal (prop),\n ligac~ao tripla ("+en+") na posic~ao ("+nume+") e \n

790 pertencendo ao grupo hidrocarboneto ("+hi+")");

791 if(Integer.parseInt(nume)==1){

792 frame2.est.setText("\n\n C#CC ");

793 }else{

794 frame2.est.setText("\n\n CC#C ");

795 }

796 }

797 }

798

799 :}

800 | numero:num METIL numero: nume PROP tripla:en hidrocarboneto:hi {:

801 if(Integer.parseInt(num) == 1){

802 frame2.saida.setForeground(Color.RED);

803 frame2.saida.setText(" Erro na posic~ao da ramificac~ao METIL.\n Se colocar a ramificac~ao

804 na posic~ao 1, seguindo a regra da cadeia,\n tornara um but n~ao mais o prefixo prop");

805 }else{

806 if(Integer.parseInt(num) == 3){

807 frame2.saida.setForeground(Color.RED);

808 frame2.saida.setText(" Erro na posic~ao da ramificac~ao METIL.\n Se colocar a ramificac~ao

809 na posic~ao 3, seguindo a regra da cadeia,\n tornara um but n~ao mais o prefixo prop");

810 }else{

811 if(Integer.parseInt(num) > 3 || Integer.parseInt(nume) > 3){

812 frame2.saida.setForeground(Color.RED);

89

Page 103: Estudo e Desenvolvimento de um Protótipo de Análise de Nomes

813 frame2.saida.setText(" Numero da posic~ao esta incorreto.\n Com o prefixo PROP so

814 podemos ter 3\n carbonos na cadeia principal");

815 }else{

816 if(Integer.parseInt(nume)==3){

817 frame2.saida.setForeground(Color.RED);

818 frame2.saida.setText(" Nome incorreto.\n N~ao e possivel colocar a ligac~ao neste carbono.");

819 }else{

820 frame2.saida.setForeground(Color.BLUE);

821 frame2.saida.setText(" Nome correto.\n\n Esta substancia e um Alcino\n Possuindo 3

822 carbonos na cadeia principal (prop),\n ligac~ao tripla ("+en+") na posic~ao ("+nume+"),

823 \n uma ramificac~ao metil na posic~ao: ("+num+") e \n pertencendo ao grupo hidrocarboneto ("+hi+")");

824 if(Integer.parseInt(nume)==1){

825 frame2.est.setText("\n\n C#C(C)C ");

826 }else{

827 frame2.est.setText("\n\n CC#(C)C ");

828 }

829 }

830 }

831 }

832 }

833 :}

834 | numero:num numero:numer DIMETIL numero:nume PROP tripla:en hidrocarboneto: hi {:

835 if(Integer.parseInt(num) == 1 || Integer.parseInt(numer) == 1){

836 frame2.saida.setForeground(Color.RED);

837 frame2.saida.setText(" Erro na posic~ao da ramificac~ao DIMETIL.\n Se colocar a ramificac~ao na

838 posic~ao 1, seguindo a regra da cadeia,\n tornara um but n~ao mais o prefixo prop");

839 }else{

840 if(Integer.parseInt(num) == 3 || Integer.parseInt(numer) == 3){

841 frame2.saida.setForeground(Color.RED);

842 frame2.saida.setText(" Erro na posic~ao da ramificac~ao DIMETIL.\n Se colocar a ramificac~ao

843 na posic~ao 3, seguindo a regra da cadeia,\n tornara um but n~ao mais o prefixo prop");

844 }else{

845 if(Integer.parseInt(num) > 3 || Integer.parseInt(numer) > 3 || Integer.parseInt(nume) > 3){

846 frame2.saida.setForeground(Color.RED);

847 frame2.saida.setText(" Numero da posic~ao esta incorreto.\n Com o prefixo PROP so podemos

848 ter 3\n carbonos na cadeia principal");

849 }else{

850 if(Integer.parseInt(nume)==3){

851 frame2.saida.setForeground(Color.RED);

852 frame2.saida.setText(" Nome incorreto.\n N~ao e possivel colocar a ligac~ao neste carbono.");

853 }else{

854 frame2.saida.setForeground(Color.BLUE);

855 frame2.saida.setText(" Nome correto.\n\n Esta substancia e um Alcino\n Possuindo 3

856 carbonos na cadeia principal (prop),\n ligac~ao tripla ("+en+") na posic~ao ("+nume+"),

857 \n ramificac~ao dimetil na posic~ao: ("+num+","+numer+") e \n pertencendo ao grupo hidrocarboneto

858 ("+hi+")");

859 if(Integer.parseInt(nume)==1){

860 frame2.est.setText("\n\n C#C(C)(C)C ");

861 }else{

862 frame2.est.setText("\n\n CC#(C)(C)C ");

863 }

864 }

865 }

866 }

867 }

868 :}

869 | numero:num numero:nu numero:ero TRIMETIL numero:ro PROP tripla:en hidrocarboneto: hi {:

870 frame2.saida.setForeground(Color.RED);

871 frame2.saida.setText(" Nome incorreto.\n\n N~ao podemos ter ramificac~ao TRIMETIL com

872 o prefixo PROP,\n pois n~ao sera mais um prop e\n sim outro prefixo maior que 3 carbonos.");

873 :}

874 ;

875

876

877 alcinoBut ::= numero:nume BUT tripla:en hidrocarboneto:hi {:

878 if(Integer.parseInt(nume) > 4){

879 frame2.saida.setFont(new Font("Arial", Font.PLAIN, 15));

880 frame2.saida.setForeground(Color.RED);

881 frame2.saida.setText(" Numero da posic~ao da ligacao esta incorreto.\n Com o prefixo BUT so

882 podemos ter 4 carbonos na cadeia principal");

883 }else{

884 if(Integer.parseInt(nume)==4){

885 frame2.saida.setForeground(Color.RED);

886 frame2.saida.setText(" Nome incorreto.\n N~ao e possivel colocar a ligac~ao neste carbono.");

90

Page 104: Estudo e Desenvolvimento de um Protótipo de Análise de Nomes

887 }else{

888 frame2.saida.setForeground(Color.BLUE);

889 frame2.saida.setText(" Nome correto.\n\n Esta substancia e um Alcino\n Possuindo 4

890 carbonos na cadeia principal (but),\n ligac~ao tripla ("+en+") na posic~ao ("+nume+") e \n

891 pertencendo ao grupo hidrocarboneto ("+hi+")");

892 if(Integer.parseInt(nume)==1){

893 frame2.est.setText("\n\n C#CCC ");

894 }else{

895 if(Integer.parseInt(nume)==2){

896 frame2.est.setText("\n\n CC#CC ");

897 }else{

898 frame2.est.setText("\n\n CCC#C ");

899 }

900 }

901 }

902 }

903 :}

904 | numero:num METIL numero:nume BUT tripla:en hidrocarboneto:hi {:

905 if(Integer.parseInt(num) == 1){

906 frame2.saida.setForeground(Color.RED);

907 frame2.saida.setText(" Erro na posic~ao da ramificac~ao METIL.\n Se colocar a ramificac~ao

908 na posic~ao 1, seguindo a regra da cadeia,\n tornara um pent n~ao mais o prefixo but");

909 }else{

910 if(Integer.parseInt(num) == 4){

911 frame2.saida.setForeground(Color.RED);

912 frame2.saida.setText(" Erro na posic~ao da ramificac~ao METIL.\n Se colocar a ramificac~ao

913 na posic~ao 4, seguindo a regra da cadeia,\n tornara um pent n~ao mais o prefixo but");

914 }else{

915 if(Integer.parseInt(num) > 4 || Integer.parseInt(nume) > 4){

916 frame2.saida.setForeground(Color.RED);

917 frame2.saida.setText(" Numero da posic~ao esta incorreto.\n Com o prefixo BUT so podemos

918 ter 4\n carbonos na cadeia principal");

919 }else{

920 if(Integer.parseInt(nume)==4){

921 frame2.saida.setForeground(Color.RED);

922 frame2.saida.setText(" Nome incorreto.\n N~ao e possivel colocar a ligac~ao neste carbono.");

923 }else{

924 frame2.saida.setForeground(Color.BLUE);

925 frame2.saida.setText(" Nome correto.\n\n Esta substancia e um Alcino\n Possuindo 4

926 carbonos na cadeia principal (but),\n ligac~ao tripla ("+en+") na posic~ao ("+nume+"),\n

927 uma ramificac~ao metil na posic~ao: ("+num+") e \n pertencendo ao grupo hidrocarboneto ("+hi+")");

928 if(Integer.parseInt(nume)==1 && Integer.parseInt(num)==2){

929 frame2.est.setText("\n\n C#C(C)CC ");

930 }else{

931 if(Integer.parseInt(nume)==1 && Integer.parseInt(num)==3){

932 frame2.est.setText("\n\n C#CC(C)C ");

933 }else{

934 if(Integer.parseInt(nume)==2 && Integer.parseInt(num)==2){

935 frame2.est.setText("\n\n CC#(C)CC ");

936 }else{

937 if(Integer.parseInt(nume)==2 && Integer.parseInt(num)==3){

938 frame2.est.setText("\n\n CC#C(C)C ");

939 }else{

940 if(Integer.parseInt(nume)==3 && Integer.parseInt(num)==2){

941 frame2.est.setText("\n\n CC#C(C)C ");

942 }else{

943 frame2.est.setText("\n\n CCC#(C)C ");

944 }

945 }

946 }

947 }

948 }

949 }

950 }

951 }

952 }

953 :}

954

955 | numero:num numero:nu DIMETIL numero:nume BUT tripla:en hidrocarboneto: hi {:

956 if(Integer.parseInt(num) == 1 || Integer.parseInt(nu) == 1){

957 frame2.saida.setForeground(Color.RED);

958 frame2.saida.setText(" Erro na posic~ao da ramificac~ao DIMETIL.\n Se colocar a ramificac~ao

959 na posic~ao 1, seguindo a regra da cadeia,\n tornara um pent n~ao mais o prefixo but");

960 }else{

91

Page 105: Estudo e Desenvolvimento de um Protótipo de Análise de Nomes

961 if(Integer.parseInt(num) == 4 || Integer.parseInt(nu) == 4 ){

962 frame2.saida.setForeground(Color.RED);

963 frame2.saida.setText(" Erro na posic~ao da ramificac~ao DIMETIL.\n Se colocar a ramificac~ao

964 na posic~ao 4, seguindo a regra da cadeia,\n tornara um pent n~ao mais o prefixo but");

965 }else{

966 if(Integer.parseInt(num) > 4 || Integer.parseInt(nu) > 4 || Integer.parseInt(nume) > 4){

967 frame2.saida.setForeground(Color.RED);

968 frame2.saida.setText(" Numero da posic~ao esta incorreto.\n Com o prefixo BUT so podemos

969 ter 4\n carbonos na cadeia principal");

970 }else{

971 if(Integer.parseInt(nume)==4){

972 frame2.saida.setForeground(Color.RED);

973 frame2.saida.setText(" Nome incorreto.\n N~ao e possivel colocar a ligac~ao neste carbono.");

974 }else{

975 frame2.saida.setForeground(Color.BLUE);

976 frame2.saida.setText(" Nome correto.\n\n Esta substancia e um Alcino\n Possuindo 4

977 carbonos na cadeia principal (but),\n ligac~ao tripla ("+en+") na posic~ao ("+nume+"),

978 \n ramificac~ao dimetil na posic~ao ("+num+","+nu+") e \n pertencendo ao grupo hidrocarboneto ("+hi+")");

979 if(Integer.parseInt(nume)==1){

980 if(Integer.parseInt(num)==2 && Integer.parseInt(nu)==2){

981 frame2.est.setText("\n\n C#C(C)(C)CC ");

982 }else{

983 if(Integer.parseInt(num)==2 && Integer.parseInt(nu)==3 || Integer.parseInt(num)==3

984 && Integer.parseInt(nu)==2){

985 frame2.est.setText("\n\n C#C(C)C(C)C ");

986 }else{

987 frame2.est.setText("\n\n C#CC(C)(C)C ");

988 }

989 }

990 }else{

991 if(Integer.parseInt(nume)==2){

992 if(Integer.parseInt(num)==2 && Integer.parseInt(nu)==2){

993 frame2.est.setText("\n\n CC#(C)(C)CC ");

994 }else{

995 if(Integer.parseInt(num)==2 && Integer.parseInt(nu)==3 || Integer.parseInt(num)==3 &&

996 Integer.parseInt(nu)==2){

997 frame2.est.setText("\n\n CC#(C)C(C)C ");

998 }else{

999 frame2.est.setText("\n\n CC#C(C)(C)C ");

1000 }

1001 }

1002 }else{

1003 if(Integer.parseInt(nume)==3){

1004 if(Integer.parseInt(num)==2 && Integer.parseInt(nu)==2){

1005 frame2.est.setText("\n\n CC(C)(C)C#C ");

1006 }else{

1007 if(Integer.parseInt(num)==2 && Integer.parseInt(nu)==3 || Integer.parseInt(num)==3 &&

1008 Integer.parseInt(nu)==2){

1009 frame2.est.setText("\n\n CC(C)C#(C)C ");

1010 }else{

1011 frame2.est.setText("\n\n CCC#(C)(C)C ");

1012 }

1013 }

1014 }

1015 }

1016 }

1017 }

1018 }

1019 }

1020 }

1021 :}

1022 | numero:num numero:nu numero:numer TRIMETIL numero:nume BUT tripla:en hidrocarboneto: hi {:

1023 if(Integer.parseInt(num) == 1 || Integer.parseInt(nu) == 1 || Integer.parseInt(numer) == 1){

1024 frame2.saida.setForeground(Color.RED);

1025 frame2.saida.setText(" Erro na posic~ao da ramificac~ao TRIMETIL.\n Se colocar a ramificac~ao

1026 na posic~ao 1, seguindo a regra da cadeia,\n tornara um pent n~ao mais o prefixo but");

1027 }else{

1028 if(Integer.parseInt(num) == 4 || Integer.parseInt(nu) == 4 || Integer.parseInt(numer) == 4){

1029 frame2.saida.setText(" Erro na posic~ao da ramificac~ao TRIMETIL.\n Se colocar a ramificac~ao

1030 na posic~ao 4, seguindo a regra da cadeia,\n tornara um pent n~ao mais o prefixo but");

1031 }else{

1032 if(Integer.parseInt(num) > 4 || Integer.parseInt(nu) > 4 || Integer.parseInt(nume) > 4 ||

1033 Integer.parseInt(numer) > 4){

1034 frame2.saida.setText(" Numero da posic~ao esta incorreto.\n Com o prefixo BUT so podemos

92

Page 106: Estudo e Desenvolvimento de um Protótipo de Análise de Nomes

1035 ter 4\n carbonos na cadeia principal");

1036 }else{

1037 if(Integer.parseInt(nume)==4){

1038 frame2.saida.setForeground(Color.RED);

1039 frame2.saida.setText(" Nome incorreto.\n N~ao e possivel colocar a ligac~ao neste carbono.");

1040 }else{

1041 if(Integer.parseInt(num)==2 && Integer.parseInt(nu)==2 && Integer.parseInt(numer)==2 ||

1042 Integer.parseInt(num)==3 && Integer.parseInt(nu)==3 && Integer.parseInt(numer)==3){

1043 frame2.saida.setForeground(Color.RED);

1044 frame2.saida.setText(" Atenc~ao, as tres posic~oes da ramificac~ao trimetil\n n~ao

1045 podem ter o mesmo numero");

1046 }else{

1047 frame2.saida.setForeground(Color.BLUE);

1048 frame2.saida.setText(" Nome correto.\n\n Esta substancia e um Alcino\n Possuindo 4

1049 carbonos na cadeia principal (but),\n ligac~ao tripla ("+en+") na posic~ao ("+nume+"),\n

1050 ramificac~ao trimetil na posic~ao ("+num+","+nu+","+numer+") e \n pertencendo ao grupo

1051 hidrocarboneto ("+hi+")");

1052 if(Integer.parseInt(nume)==1){

1053 if(Integer.parseInt(num)==2 && Integer.parseInt(nu)==2 && Integer.parseInt(numer)==3 ||

1054 Integer.parseInt(num)==3 && Integer.parseInt(nu)==2 && Integer.parseInt(numer)==2 ||

1055 Integer.parseInt(num)==2 && Integer.parseInt(nu)==3 && Integer.parseInt(numer)==2){

1056 frame2.est.setText("\n\n C#C(C)(C)C(C)C ");

1057 }else{

1058 frame2.est.setText("\n\n C#C(C)C(C)(C)C ");

1059 }

1060 }else{

1061 if(Integer.parseInt(nume)==2){

1062 if(Integer.parseInt(num)==2 && Integer.parseInt(nu)==2 && Integer.parseInt(numer)==3 ||

1063 Integer.parseInt(num)==3 && Integer.parseInt(nu)==2 && Integer.parseInt(numer)==2 ||

1064 Integer.parseInt(num)==2 && Integer.parseInt(nu)==3 && Integer.parseInt(numer)==2){

1065 frame2.est.setText("\n\n CC#(C)(C)C(C)C ");

1066 }else{

1067 frame2.est.setText("\n\n CC#(C)C(C)(C)C ");

1068 }

1069 }else{

1070 if(Integer.parseInt(nume)==3){

1071 if(Integer.parseInt(num)==2 && Integer.parseInt(nu)==2 && Integer.parseInt(numer)==3 ||

1072 Integer.parseInt(num)==3 && Integer.parseInt(nu)==2 && Integer.parseInt(numer)==2 ||

1073 Integer.parseInt(num)==2 && Integer.parseInt(nu)==3 && Integer.parseInt(numer)==2){

1074 frame2.est.setText("\n\n CC(C)(C)C#(C)C ");

1075 }else{

1076 frame2.est.setText("\n\n CC(C)C#(C)(C)C ");

1077 }

1078 }

1079 }

1080 }

1081

1082 }

1083 }

1084 }

1085 }

1086 }

1087 :}

1088 ;

1089

1090 /* ************* Alcadieno ************** */

1091

1092 alcadieno ::= alcadienoMet: alm

1093 {: RESULT = alm; :}

1094 |alcadienoProp: ap

1095 {: RESULT = ap; :}

1096 | alcadienoBut : ab

1097 {: RESULT = ab; :}

1098 ;

1099

1100 alcadienoMet ::= numero:nu numero:ro MET dduplas:en hidrocarboneto:hi {:

1101 frame2.saida.setForeground(Color.RED);

1102 frame2.saida.setText(" Nome incorreto.\n\n N~ao podemos utilizar o prefixo MET,\n

1103 pois com o hidrocarboneto alcadieno temos\n que ter duas duplas ligac~oes entre os carbonos.");

1104 :}

1105 | numero:nu METIL numero:num numero:ro MET dduplas:en hidrocarboneto:hi {:

1106 frame2.saida.setForeground(Color.RED);

1107 frame2.saida.setText(" Nome incorreto.\n\n N~ao podemos ter ramificac~oes com o prefixo MET,\n

1108 pois n~ao sera mais um met e\n sim outro prefixo maior que 1 carbono.");

93

Page 107: Estudo e Desenvolvimento de um Protótipo de Análise de Nomes

1109 :}

1110 | numero:nu METIL numero:num numero:ro ET dduplas:en hidrocarboneto:hi {:

1111 frame2.saida.setForeground(Color.RED);

1112 frame2.saida.setText(" Nome incorreto.\n\n N~ao podemos ter ramificac~oes com o prefixo ET,\n

1113 pois n~ao sera mais um et e\n sim outro prefixo maior que 2 carbonos.");

1114 :}

1115 |numero:nu numero:ro ET dduplas:en hidrocarboneto:hi {:

1116 frame2.saida.setForeground(Color.RED);

1117 frame2.saida.setText(" Nome incorreto.\n\n N~ao podemos utilizar o prefixo ET,\n

1118 pois com o hidrocarboneto alcadieno temos\n que ter duas duplas ligac~oes entre os carbonos.");

1119 :}

1120 ;

1121

1122

1123 alcadienoProp ::= numero:ero numero:ro PROP dduplas:en hidrocarboneto:hi {:

1124 if(Integer.parseInt(ero) > 3 || Integer.parseInt(ro) > 3){

1125 frame2.saida.setFont(new Font("Arial", Font.PLAIN, 15));

1126 frame2.saida.setForeground(Color.RED);

1127 frame2.saida.setText(" Numero da posic~ao da ligac~ao esta incorreto.\n Com o prefixo PROP

1128 so podemos ter 3\n carbonos na cadeia principal");

1129 }else{

1130 if(Integer.parseInt(ero)==3 || Integer.parseInt(ro)==3){

1131 frame2.saida.setForeground(Color.RED);

1132 frame2.saida.setText(" Nome incorreto.\n N~ao e possivel colocar a ligac~ao neste carbono.");

1133 }else{

1134 if(Integer.parseInt(ero)==1 && Integer.parseInt(ro)==1){

1135 frame2.saida.setForeground(Color.RED);

1136 frame2.saida.setText(" Nome incorreto.\n N~ao e possivel colocar as duas ligac~oes neste carbono.");

1137 }else{

1138 if(Integer.parseInt(ero)==2 && Integer.parseInt(ro)==2){

1139 frame2.saida.setForeground(Color.RED);

1140 frame2.saida.setText(" Nome incorreto.\n N~ao e possivel colocar as duas\n ligac~oes neste carbono.");

1141 }else{

1142 frame2.saida.setForeground(Color.BLUE);

1143 frame2.saida.setText(" Nome correto.\n\n Esta substancia e um Alcadieno\n Possuindo 3

1144 carbonos na cadeia principal (prop),\n duas duplas ligac~oes ("+en+") na posic~ao ("+ero+","+ro+")

1145 e \n pertencendo ao grupo hidrocarboneto ("+hi+")");

1146 frame2.est.setText("\n\n C=C=C ");

1147 }

1148 }

1149 }

1150 }

1151 :}

1152 | numero:num METIL numero:ero numero:ro PROP dduplas:en hidrocarboneto:hi {:

1153 if(Integer.parseInt(num) == 1){

1154 frame2.saida.setForeground(Color.RED);

1155 frame2.saida.setText(" Erro na posic~ao da ramificac~ao METIL.\n Se colocar a ramificac~ao

1156 na posic~ao 1, seguindo a regra da cadeia,\n tornara um but n~ao mais o prefixo prop");

1157 }else{

1158 if(Integer.parseInt(num) == 3){

1159 frame2.saida.setForeground(Color.RED);

1160 frame2.saida.setText(" Erro na posic~ao da ramificac~ao METIL.\n Se colocar a ramificac~ao

1161 na posic~ao 3, seguindo a regra da cadeia,\n tornara um but n~ao mais o prefixo prop");

1162 }else{

1163 if(Integer.parseInt(num) > 3 || Integer.parseInt(ero) > 3 || Integer.parseInt(ro) > 3){

1164 frame2.saida.setForeground(Color.RED);

1165 frame2.saida.setText(" Numero da posic~ao esta incorreto.\n Com o prefixo PROP so podemos

1166 ter 3\n carbonos na cadeia principal");

1167 }else{

1168 if(Integer.parseInt(ero)==3 || Integer.parseInt(ro)==3){

1169 frame2.saida.setForeground(Color.RED);

1170 frame2.saida.setText(" Nome incorreto.\n N~ao e possivel colocar a ligac~ao neste carbono.");

1171 }else{

1172 if(Integer.parseInt(ero)==1 && Integer.parseInt(ro)==1){

1173 frame2.saida.setForeground(Color.RED);

1174 frame2.saida.setText(" Nome incorreto.\n N~ao e possivel colocar as duas ligac~oes neste carbono.");

1175 }else{

1176 if(Integer.parseInt(ero)==2 && Integer.parseInt(ro)==2){

1177 frame2.saida.setForeground(Color.RED);

1178 frame2.saida.setText(" Nome incorreto.\n N~ao e possivel colocar as duas\n ligac~oes neste carbono.");

1179 }else{

1180 frame2.saida.setForeground(Color.BLUE);

1181 frame2.saida.setText(" Nome correto.\n\n Esta substancia e um Alcadieno\n Possuindo 3

1182 carbonos na cadeia principal (prop),\n duas duplas ligac~oes ("+en+") na posic~ao ("+ero+","+ro+"),

94

Page 108: Estudo e Desenvolvimento de um Protótipo de Análise de Nomes

1183 \n uma ramificac~ao metil na posic~ao: ("+num+") e \n pertencendo ao grupo hidrocarboneto ("+hi+")");

1184 frame2.est.setText("\n\n C=C=(C)C ");

1185 }

1186 }

1187 }

1188 }

1189 }

1190 }

1191 :}

1192 | numero:num numero:numer DIMETIL numero:ero numero:ro PROP dduplas:en hidrocarboneto: hi {:

1193 if(Integer.parseInt(num) == 1 || Integer.parseInt(numer) == 1){

1194 frame2.saida.setForeground(Color.RED);

1195 frame2.saida.setText(" Erro na posic~ao da ramificac~ao DIMETIL.\n Se colocar a ramificac~ao

1196 na posic~ao 1, seguindo a regra da cadeia,\n tornara um but n~ao mais o prefixo prop");

1197 }else{

1198 if(Integer.parseInt(num) == 3 || Integer.parseInt(numer) == 3){

1199 frame2.saida.setForeground(Color.RED);

1200 frame2.saida.setText(" Erro na posic~ao da ramificac~ao DIMETIL.\n Se colocar a ramificac~ao

1201 na posic~ao 3, seguindo a regra da cadeia,\n tornara um but n~ao mais o prefixo prop");

1202 }else{

1203 if(Integer.parseInt(num) > 3 || Integer.parseInt(numer) > 3 || Integer.parseInt(ero) > 3 ||

1204 Integer.parseInt(ro) > 3){

1205 frame2.saida.setForeground(Color.RED);

1206 frame2.saida.setText(" Numero da posic~ao esta incorreto.\n Com o prefixo PROP so podemos ter

1207 3\n carbonos na cadeia principal");

1208 }else{

1209 if(Integer.parseInt(num)==3 || Integer.parseInt(numer)==3){

1210 frame2.saida.setForeground(Color.RED);

1211 frame2.saida.setText(" Nome incorreto.\n N~ao e possivel colocar a ligac~ao neste carbono.");

1212 }else{

1213 if(Integer.parseInt(ero)==1 && Integer.parseInt(ro)==1){

1214 frame2.saida.setForeground(Color.RED);

1215 frame2.saida.setText(" Nome incorreto.\n N~ao e possivel colocar as duas ligac~oes neste carbono.");

1216 }else{

1217 if(Integer.parseInt(ero)==2 && Integer.parseInt(ro)==2){

1218 frame2.saida.setForeground(Color.RED);

1219 frame2.saida.setText(" Nome incorreto.\n N~ao e possivel colocar as duas\n ligac~oes neste carbono.");

1220 }else{

1221 frame2.saida.setForeground(Color.BLUE);

1222 frame2.saida.setText(" Nome correto.\n\n Esta substancia e um Alcadieno\n Possuindo 3

1223 carbonos na cadeia principal (prop),\n duas duplas ligac~oes ("+en+") na posic~ao ("+ero+","+ro+"),

1224 \n ramificac~ao dimetil na posic~ao ("+num+","+numer+") e \n pertencendo ao grupo hidrocarboneto ("+hi+")");

1225 frame2.est.setText("\n\n C=C=(C)(C)C ");

1226 }

1227 }

1228 }

1229 }

1230 }

1231 }

1232 :}

1233 | numero:num numero:nu numero:ero TRIMETIL numero:ro numero:roo PROP dduplas:en hidrocarboneto: hi {:

1234 frame2.saida.setForeground(Color.RED);

1235 frame2.saida.setText(" Nome incorreto.\n\n N~ao podemos ter ramificac~ao TRIMETIL com o prefixo

1236 PROP,\n pois n~ao sera mais um prop e\n sim outro prefixo maior que 3 carbonos.");

1237 :}

1238 ;

1239

1240 alcadienoBut ::= numero:ero numero:ro BUT dduplas:en hidrocarboneto:hi {:

1241 if(Integer.parseInt(ero) > 4 || Integer.parseInt(ro) > 4){

1242 frame2.saida.setFont(new Font("Arial", Font.PLAIN, 15));

1243 frame2.saida.setForeground(Color.RED);

1244 frame2.saida.setText(" Numero da posic~ao da ligac~ao esta incorreto.\n Com o prefixo BUT

1245 so podemos ter 4\n carbonos na cadeia principal");

1246 }else{

1247 if(Integer.parseInt(ero)==4 || Integer.parseInt(ro)==4){

1248 frame2.saida.setForeground(Color.RED);

1249 frame2.saida.setText(" Nome incorreto.\n N~ao e possivel colocar a ligac~ao neste carbono.");

1250 }else{

1251 if(Integer.parseInt(ero)==1 && Integer.parseInt(ro)==1){

1252 frame2.saida.setForeground(Color.RED);

1253 frame2.saida.setText(" Nome incorreto.\n N~ao e possivel colocar as duas ligac~oes neste carbono.");

1254 }else{

1255 if(Integer.parseInt(ero)==2 && Integer.parseInt(ro)==2){

1256 frame2.saida.setForeground(Color.RED);

95

Page 109: Estudo e Desenvolvimento de um Protótipo de Análise de Nomes

1257 frame2.saida.setText(" Nome incorreto.\n N~ao e possivel colocar as duas\n ligac~oes neste carbono.");

1258 }else{

1259 if(Integer.parseInt(ero)==3 && Integer.parseInt(ro)==3){

1260 frame2.saida.setForeground(Color.RED);

1261 frame2.saida.setText(" Nome incorreto.\n N~ao e possivel colocar as duas ligac~oes neste carbono.");

1262 }else{

1263 frame2.saida.setForeground(Color.BLUE);

1264 frame2.saida.setText(" Nome correto.\n\n Esta substancia e um Alcadieno\n Possuindo 4

1265 carbonos na cadeia principal (but),\n duas duplas ligac~oes ("+en+") na posic~ao ("+ero+","+ro+") e

1266 \n pertencendo ao grupo hidrocarboneto ("+hi+")");

1267 if(Integer.parseInt(ero)==1 && Integer.parseInt(ro)==2 ||Integer.parseInt(ero)==2 &&

1268 Integer.parseInt(ro)==1){

1269 frame2.est.setText("\n\n C=C=CC ");

1270 }else{

1271 if(Integer.parseInt(ero)==1 && Integer.parseInt(ro)==3 ||Integer.parseInt(ero)==3 &&

1272 Integer.parseInt(ro)==1){

1273 frame2.est.setText("\n\n C=CC=C ");

1274 }else{

1275 frame2.est.setText("\n\n CC=C=C ");

1276 }

1277 }

1278 }

1279 }

1280 }

1281 }

1282 }

1283 :}

1284

1285 | numero:num METIL numero:ero numero:ro BUT dduplas:en hidrocarboneto:hi {:

1286 if(Integer.parseInt(num) == 1){

1287 frame2.saida.setForeground(Color.RED);

1288 frame2.saida.setText(" Erro na posic~ao da ramificac~ao METIL.\n Se colocar a ramificac~ao na

1289 posic~ao 1, seguindo a regra da cadeia,\n tornara um pent n~ao mais o prefixo but");

1290 }else{

1291 if(Integer.parseInt(num) == 4){

1292 frame2.saida.setForeground(Color.RED);

1293 frame2.saida.setText(" Erro na posic~ao da ramificac~ao METIL.\n Se colocar a ramificac~ao

1294 na posic~ao 4, seguindo a regra da cadeia,\n tornara um pent n~ao mais o prefixo but");

1295 }else{

1296 if(Integer.parseInt(num) > 4 || Integer.parseInt(ero) > 4 || Integer.parseInt(ro) > 4){

1297 frame2.saida.setForeground(Color.RED);

1298 frame2.saida.setText(" Numero da posic~ao esta incorreto.\n Com o prefixo BUT so podemos

1299 ter 4\n carbonos na cadeia principal");

1300 }else{

1301 if(Integer.parseInt(ero)==4 || Integer.parseInt(ro)==4){

1302 frame2.saida.setForeground(Color.RED);

1303 frame2.saida.setText(" Nome incorreto.\n N~ao e possivel colocar a ligac~ao neste carbono.");

1304 }else{

1305 if(Integer.parseInt(ero)==1 && Integer.parseInt(ro)==1){

1306 frame2.saida.setForeground(Color.RED);

1307 frame2.saida.setText(" Nome incorreto.\n N~ao e possivel colocar as duas ligac~oes neste carbono.");

1308 }else{

1309 if(Integer.parseInt(ero)==2 && Integer.parseInt(ro)==2){

1310 frame2.saida.setForeground(Color.RED);

1311 frame2.saida.setText(" Nome incorreto.\n N~ao e possivel colocar as duas ligac~oes neste carbono.");

1312 }else{

1313 if(Integer.parseInt(ero)==3 && Integer.parseInt(ro)==3){

1314 frame2.saida.setForeground(Color.RED);

1315 frame2.saida.setText(" Nome incorreto.\n N~ao e possivel colocar as duas\n ligac~oes neste carbono.");

1316 }else{

1317 frame2.saida.setForeground(Color.BLUE);

1318 frame2.saida.setText(" Nome correto.\n\n Esta substancia e um Alcadieno\n Possuindo 4

1319 carbonos na cadeia principal (but),\n duas duplas ligac~oes ("+en+") na posic~ao ("+ero+","+ro+"),

1320 \n uma ramificac~ao metil na posic~ao ("+num+") e \n pertencendo ao grupo hidrocarboneto ("+hi+")");

1321 if(Integer.parseInt(num) == 2){

1322 if(Integer.parseInt(ero)==1 && Integer.parseInt(ro)==2 ||Integer.parseInt(ero)==2 &&

1323 Integer.parseInt(ro)==1){

1324 frame2.est.setText("\n\n C=C=(C)CC ");

1325 }else{

1326 if(Integer.parseInt(ero)==1 && Integer.parseInt(ro)==3 ||Integer.parseInt(ero)==3 &&

1327 Integer.parseInt(ro)==1){

1328 frame2.est.setText("\n\n C=C(C)C=C ");

1329 }else{

1330 frame2.est.setText("\n\n CC=(C)C=C ");

96

Page 110: Estudo e Desenvolvimento de um Protótipo de Análise de Nomes

1331 }

1332 }

1333 }else{

1334 if(Integer.parseInt(num) == 3){

1335 if(Integer.parseInt(ero)==1 && Integer.parseInt(ro)==2 ||Integer.parseInt(ero)==2 &&

1336 Integer.parseInt(ro)==1){

1337 frame2.est.setText("\n\n C=C=C(C)C ");

1338 }else{

1339 if(Integer.parseInt(ero)==1 && Integer.parseInt(ro)==3 ||Integer.parseInt(ero)==3 &&

1340 Integer.parseInt(ro)==1){

1341 frame2.est.setText("\n\n C=CC=(C)C ");

1342 }else{

1343 frame2.est.setText("\n\n CC=C=(C)C ");

1344 }

1345 }

1346 }

1347 }

1348 }

1349 }

1350 }

1351 }

1352 }

1353 }

1354 }

1355 :}

1356

1357 |numero:num numero:nu DIMETIL numero:ero numero:ro BUT dduplas:en hidrocarboneto: hi {:

1358 if(Integer.parseInt(num) == 1 || Integer.parseInt(nu) == 1){

1359 frame2.saida.setForeground(Color.RED);

1360 frame2.saida.setText(" Erro na posic~ao da ramificac~ao DIMETIL.\n Se colocar a ramificac~ao

1361 na posic~ao 1, seguindo a regra da cadeia,\n tornara um pent n~ao mais o prefixo but");

1362 }else{

1363 if(Integer.parseInt(num) == 4 || Integer.parseInt(nu) == 4 ){

1364 frame2.saida.setForeground(Color.RED);

1365 frame2.saida.setText(" Erro na posic~ao da ramificac~ao DIMETIL.\n Se colocar a ramificac~ao

1366 na posic~ao 4, seguindo a regra da cadeia,\n tornara um pent n~ao mais o prefixo but");

1367 }else{

1368 if(Integer.parseInt(num) > 4 || Integer.parseInt(nu) > 4 || Integer.parseInt(ero) > 4 ||

1369 Integer.parseInt(ro) > 4){

1370 frame2.saida.setForeground(Color.RED);

1371 frame2.saida.setText(" Numero da posic~ao esta incorreto.\n Com o prefixo BUT

1372 so podemos ter 4\n carbonos na cadeia principal");

1373 }else{

1374 if(Integer.parseInt(ero)==4 || Integer.parseInt(ro)==4){

1375 frame2.saida.setForeground(Color.RED);

1376 frame2.saida.setText(" Nome incorreto.\n N~ao e possivel colocar a ligac~ao neste carbono.");

1377 }else{

1378 if(Integer.parseInt(ero)==1 && Integer.parseInt(ro)==1){

1379 frame2.saida.setForeground(Color.RED);

1380 frame2.saida.setText(" Nome incorreto.\n N~ao e possivel colocar as duas ligac~oes neste carbono.");

1381 }else{

1382 if(Integer.parseInt(ero)==2 && Integer.parseInt(ro)==2){

1383 frame2.saida.setForeground(Color.RED);

1384 frame2.saida.setText(" Nome incorreto.\n N~ao e possivel colocar as duas ligac~oes neste carbono.");

1385 }else{

1386 if(Integer.parseInt(ero)==3 && Integer.parseInt(ro)==3){

1387 frame2.saida.setForeground(Color.RED);

1388 frame2.saida.setText(" Nome incorreto.\n N~ao e possivel colocar as duas ligac~oes neste carbono.");

1389 }else{

1390 frame2.saida.setForeground(Color.BLUE);

1391 frame2.saida.setText(" Nome correto.\n\n Esta substancia e um Alcadieno\n Possuindo 4

1392 carbonos na cadeia principal (but),\n duas duplas ligac~oes ("+en+") na posic~ao ("+ero+","+ro+"),

1393 \n ramificac~ao dimetil na posic~ao ("+num+","+nu+") e \n pertencendo ao grupo hidrocarboneto ("+hi+")");

1394 if(Integer.parseInt(num) == 2 && Integer.parseInt(nu) == 2){

1395 if(Integer.parseInt(ero)==1 && Integer.parseInt(ro)==2 ||Integer.parseInt(ero)==2 &&

1396 Integer.parseInt(ro)==1){

1397 frame2.est.setText("\n\n C=C=(C)(C)CC ");

1398 }else{

1399 if(Integer.parseInt(ero)==1 && Integer.parseInt(ro)==3 ||Integer.parseInt(ero)==3 &&

1400 Integer.parseInt(ro)==1){

1401 frame2.est.setText("\n\n C=C(C)(C)C=C ");

1402 }else{

1403 frame2.est.setText("\n\n CC=(C)(C)C=C ");

1404 }

97

Page 111: Estudo e Desenvolvimento de um Protótipo de Análise de Nomes

1405 }

1406 }else{

1407 if(Integer.parseInt(num) == 2 && Integer.parseInt(nu) == 3 || Integer.parseInt(num) == 3 &&

1408 Integer.parseInt(nu) == 2){

1409 if(Integer.parseInt(ero)==1 && Integer.parseInt(ro)==2 ||Integer.parseInt(ero)==2 &&

1410 Integer.parseInt(ro)==1){

1411 frame2.est.setText("\n\n C=C=(C)C(C)C ");

1412 }else{

1413 if(Integer.parseInt(ero)==1 && Integer.parseInt(ro)==3 ||Integer.parseInt(ero)==3 &&

1414 Integer.parseInt(ro)==1){

1415 frame2.est.setText("\n\n C=C(C)C=(C)C ");

1416 }else{

1417 frame2.est.setText("\n\n CC=(C)C=(C)C ");

1418 }

1419 }

1420 }else{

1421 if(Integer.parseInt(num) == 3 && Integer.parseInt(nu) == 3){

1422 if(Integer.parseInt(ero)==1 && Integer.parseInt(ro)==2 ||Integer.parseInt(ero)==2 &&

1423 Integer.parseInt(ro)==1){

1424 frame2.est.setText("\n\n C=C=C(C)(C)C ");

1425 }else{

1426 if(Integer.parseInt(ero)==1 && Integer.parseInt(ro)==3 ||Integer.parseInt(ero)==3 &&

1427 Integer.parseInt(ro)==1){

1428 frame2.est.setText("\n\n C=CC=(C)(C)C ");

1429 }else{

1430 frame2.est.setText("\n\n CC=C=(C)(C)C ");

1431 }

1432 }

1433 }

1434 }

1435 }

1436 }

1437 }

1438 }

1439 }

1440 }

1441 }

1442 }

1443

1444 :}

1445

1446 | numero:num numero:nu numero:numer TRIMETIL numero:ero numero:ro BUT dduplas:en hidrocarboneto: hi {:

1447 if(Integer.parseInt(num) == 1 || Integer.parseInt(nu) == 1 || Integer.parseInt(numer) == 1){

1448 frame2.saida.setForeground(Color.RED);

1449 frame2.saida.setText(" Erro na posic~ao da ramificac~ao TRIMETIL.\n Se colocar a

1450 ramificac~ao na posic~ao 1, seguindo a regra da cadeia,\n tornara um pent n~ao mais o prefixo but");

1451 }else{

1452 if(Integer.parseInt(num) == 4 || Integer.parseInt(nu) == 4 || Integer.parseInt(numer) == 4){

1453 frame2.saida.setForeground(Color.RED);

1454 frame2.saida.setText(" Erro na posic~ao da ramificac~ao TRIMETIL.\n Se colocar a ramificac~ao

1455 na posic~ao 4, seguindo a regra da cadeia,\n tornara um pent n~ao mais o prefixo but");

1456 }else{

1457 if(Integer.parseInt(num) > 4 || Integer.parseInt(nu) > 4 || Integer.parseInt(ero) > 4 ||

1458 Integer.parseInt(numer) > 4 || Integer.parseInt(ro) > 4 ){

1459 frame2.saida.setForeground(Color.RED);frame2.saida.setForeground(Color.RED);

1460 frame2.saida.setText(" Numero da posic~ao esta incorreto.\n Com o prefixo BUT so podemos ter

1461 4 carbonos na cadeia principal");

1462 }else{

1463 if(Integer.parseInt(ero)==4 || Integer.parseInt(ro)==4){

1464 frame2.saida.setForeground(Color.RED);

1465 frame2.saida.setText(" Nome incorreto.\n N~ao e possivel colocar a ligac~ao neste carbono.");

1466 }else{

1467 if(Integer.parseInt(ero)==1 && Integer.parseInt(ro)==1){

1468 frame2.saida.setForeground(Color.RED);

1469 frame2.saida.setText(" Nome incorreto.\n N~ao e possivel colocar as duas ligac~oes neste carbono.");

1470 }else{

1471 if(Integer.parseInt(ero)==2 && Integer.parseInt(ro)==2){

1472 frame2.saida.setForeground(Color.RED);

1473 frame2.saida.setText(" Nome incorreto.\n N~ao e possivel colocar as duas ligac~oes neste carbono.");

1474 }else{

1475 if(Integer.parseInt(ero)==3 && Integer.parseInt(ro)==3){

1476 frame2.saida.setForeground(Color.RED);

1477 frame2.saida.setText(" Nome incorreto.\n N~ao e possivel colocar as duas ligac~oes neste carbono.");

1478 }else{

98

Page 112: Estudo e Desenvolvimento de um Protótipo de Análise de Nomes

1479 if(Integer.parseInt(num)==2 && Integer.parseInt(nu)==2 && Integer.parseInt(numer)==2 ||

1480 Integer.parseInt(num)==3 && Integer.parseInt(nu)==3 && Integer.parseInt(numer)==3){

1481 frame2.saida.setForeground(Color.RED);

1482 frame2.saida.setText(" Atenc~ao, as tres posic~oes da ramificac~ao trimetil\n n~ao

1483 podem ter o mesmo numero");

1484 }else{

1485 frame2.saida.setForeground(Color.BLUE);

1486 frame2.saida.setText(" Nome correto.\n\n Esta substancia e um Alcadieno\n == Possuindo 4

1487 carbonos na cadeia principal (but),\n duas duplas ligac~oes ("+en+") na posic~ao ("+ero+","+ro+"),

1488 \n ramificac~ao trimetil na posic~ao ("+num+","+nu+","+numer+") e \n pertencendo ao grupo hidrocarboneto ("+hi+")");

1489 if(Integer.parseInt(num) == 2 && Integer.parseInt(nu) == 2 && Integer.parseInt(numer) == 3 ||

1490 Integer.parseInt(num) == 2 && Integer.parseInt(nu) == 3 && Integer.parseInt(numer) == 2){

1491 if(Integer.parseInt(ero)==1 && Integer.parseInt(ro)==2 ||Integer.parseInt(ero)==2 &&

1492 Integer.parseInt(ro)==1){

1493 frame2.est.setText("\n\n C=C=(C)(C)C(C)C ");

1494 }else{

1495 if(Integer.parseInt(ero)==1 && Integer.parseInt(ro)==3 ||Integer.parseInt(ero)==3 &&

1496 Integer.parseInt(ro)==1){

1497 frame2.est.setText("\n\n C=C(C)(C)C=(C)C ");

1498 }else{

1499 frame2.est.setText("\n\n CC=(C)(C)C=(C)C ");

1500 }

1501 }

1502 }else{

1503 if(Integer.parseInt(num) == 3 && Integer.parseInt(nu) == 3 && Integer.parseInt(numer) == 2

1504 || Integer.parseInt(num) == 3 && Integer.parseInt(nu) == 2 && Integer.parseInt(numer) == 3){

1505 if(Integer.parseInt(ero)==1 && Integer.parseInt(ro)==2 ||Integer.parseInt(ero)==2 &&

1506 Integer.parseInt(ro)==1){

1507 frame2.est.setText("\n\n C=C=(C)C(C)(C)C ");

1508 }else{

1509 if(Integer.parseInt(ero)==1 && Integer.parseInt(ro)==3 ||Integer.parseInt(ero)==3 &&

1510 Integer.parseInt(ro)==1){

1511 frame2.est.setText("\n\n C=C(C)C=(C)(C)C ");

1512 }else{

1513 frame2.est.setText("\n\n CC=(C)C=(C)(C)C ");

1514 }

1515 }

1516 }

1517 }

1518 }

1519 }

1520 }

1521 }

1522 }

1523 }

1524 }

1525 }

1526

1527 :}

1528 ;

1529

1530

1531 /* ************* Alcool ************** */

1532

1533 alcool ::= alcoolMet:me

1534 {: RESULT = me; :}

1535 | alcoolEt: ae

1536 {: RESULT = ae; :}

1537 | alcoolProp: ap

1538 {: RESULT = ap; :}

1539 ;

1540

1541 alcoolMet ::= MET central:en alcoois:al {:

1542 if(! en.equals("an")){

1543 frame2.saida.setFont(new Font("Arial", Font.PLAIN, 15));

1544 frame2.saida.setForeground(Color.RED);

1545 frame2.saida.setText(" Com o prefixo MET so e aceito ligac~ao simples (an)");

1546 }else{

1547 frame2.saida.setForeground(Color.BLUE);

1548 frame2.saida.setText(" Nome correto.\n \n Esta substancia e um Alcool \n Possuindo 1

1549 carbono na cadeia principal (met), \n ligac~ao simples ("+en+") e \n pertencendo ao

1550 grupo oxigenado ("+al+")");

1551 frame2.est.setText("\n \n C(O) ");

1552 }

99

Page 113: Estudo e Desenvolvimento de um Protótipo de Análise de Nomes

1553 :}

1554 | MET central:en numero:nu alcoois:al {:

1555 if(! en.equals("an")){

1556 frame2.saida.setFont(new Font("Arial", Font.PLAIN, 15));

1557 frame2.saida.setForeground(Color.RED);

1558 frame2.saida.setText(" Com o prefixo MET so e aceito ligac~ao simples (an)");

1559 }else{

1560 if(Integer.parseInt(nu)>1){

1561 frame2.saida.setForeground(Color.RED);

1562 frame2.saida.setText(" Numero da posic~ao esta incorreto.\n Com o prefixo MET so

1563 podemos ter 1 carbono na cadeia principal");

1564 }else{

1565 frame2.saida.setForeground(Color.BLUE);

1566 frame2.saida.setText(" Nome correto.\n \n Esta substancia e um Alcool \n Possuindo 1

1567 carbono na cadeia principal (met), \n ligac~ao simples ("+en+") e \n pertencendo

1568 ao grupo oxigenado ("+al+")");

1569 frame2.est.setText("\n \n C(O) ");

1570 }

1571 }

1572 :}

1573 | numero:nu radical:ra MET central:en alcoois:hi {:

1574 frame2.saida.setForeground(Color.RED);

1575 frame2.saida.setText(" Nome incorreto.\n\n N~ao podemos ter ramificac~oes com o prefixo MET,\n

1576 pois n~ao sera mais um met e\n sim outro prefixo maior que 1 carbono.");

1577 :}

1578 ;

1579

1580 alcoolEt ::= numero:nume ET central:en alcoois:al {:

1581 frame2.saida.setFont(new Font("Arial", Font.PLAIN, 15));

1582 frame2.saida.setForeground(Color.RED);

1583 frame2.saida.setText(" Com o prefixo ET so e aceito ligac~ao simples (an),\n

1584 pois a ligac~ao en, in n~ao pode ser do mesmo carbono \n da hidroxila");

1585 :}

1586 | ET central:en alcoois:al {:

1587 if(en.equals("en")||en.equals("in")||en.equals("adien")){

1588 frame2.saida.setText(" Necessario informar o numero da ligac~ao");

1589 frame2.saida.setForeground(Color.RED);

1590 }else{

1591 frame2.saida.setForeground(Color.BLUE);

1592 frame2.saida.setText(" Nome correto.\n \n Esta substancia e um Alcool \n Possuindo 2

1593 carbonos na cadeia principal (et), \n ligac~ao simples ("+en+") e \n pertencendo

1594 ao grupo oxigenado ("+al+")");

1595 frame2.est.setText("\n \n CC(O) ");

1596 }

1597 :}

1598 | ET central:en numero:nu alcoois:al {:

1599 if(en.equals("en")||en.equals("in")||en.equals("adien")){

1600 frame2.saida.setForeground(Color.RED);

1601 frame2.saida.setText(" Necessario informar o numero da ligac~ao");

1602 }else{

1603 if(Integer.parseInt(nu)>1){

1604 frame2.saida.setForeground(Color.RED);

1605 frame2.saida.setText(" Numero da posic~ao esta incorreto.\n Com o prefixo ET

1606 a posic~ao da hidroxila sera 1.");

1607 }else{

1608 frame2.saida.setForeground(Color.BLUE);

1609 frame2.saida.setText(" Nome correto.\n \n Esta substancia e um Alcool \n Possuindo 2

1610 carbonos na cadeia principal (et), \n ligac~ao simples ("+en+") e \n pertencendo

1611 ao grupo oxigenado ("+al+")");

1612 frame2.est.setText("\n \n CC(O) ");

1613 }

1614 }

1615 :}

1616

1617 | numero:nu radical:ra ET central:en alcoois:hi {:

1618 frame2.saida.setForeground(Color.RED);

1619 frame2.saida.setText(" Nome incorreto.\n\n N~ao podemos ter ramificac~oes com o prefixo ET,\n

1620 pois n~ao sera mais um et e\n sim outro prefixo maior que 2 carbonos.");

1621 :}

1622 ;

1623

1624

1625 alcoolProp ::= numero:nume METIL numero:nu PROP central:en numero:num alcoois:al {:

1626 if(Integer.parseInt(nume) > 3 || Integer.parseInt(num) > 3 || Integer.parseInt(nu) > 3){

100

Page 114: Estudo e Desenvolvimento de um Protótipo de Análise de Nomes

1627 frame2.saida.setFont(new Font("Arial", Font.PLAIN, 15));

1628 frame2.saida.setForeground(Color.RED);

1629 frame2.saida.setText(" Numero da posic~ao esta incorreto.\n Com o prefixo PROP so podemos

1630 ter 3 carbonos na cadeia principal");

1631 }else{

1632 if(Integer.parseInt(nume) != 2){

1633 frame2.saida.setForeground(Color.RED);

1634 frame2.saida.setText(" Nome incorreto,\n Pois se colocar a ramificac~ao na posic~ao 1

1635 ou 3\n n~ao sera mais um prop e sim um but");

1636 }else{

1637 if(Integer.parseInt(num)==3){

1638 frame2.saida.setForeground(Color.RED);

1639 frame2.saida.setText(" A regra da cadeia sempre comeca pelo carbono da hidroxila, \n

1640 portanto sua posic~ao seria 1 ou 2");

1641 }else{

1642 if(Integer.parseInt(nu)==3){

1643 frame2.saida.setForeground(Color.RED);

1644 frame2.saida.setText(" Nome incorreto.\n N~ao e possivel colocar a ligac~ao neste carbono.");

1645 }else{

1646 if(en.equals("an")){

1647 frame2.saida.setForeground(Color.RED);

1648 frame2.saida.setText(" Nome incorreto.\n N~ao e permitido colocar posic~ao em ligac~ao simples.");

1649 }else{

1650 if(en.equals("en")){

1651 if(Integer.parseInt(num)==2 && Integer.parseInt(nu) != 1 ){

1652 frame2.saida.setForeground(Color.RED);

1653 frame2.saida.setText(" N~ao podemos colocar ligac~ao em um carbono \n que ja

1654 contenha uma hidroxila");

1655 }else{

1656 if(Integer.parseInt(num)==2 && Integer.parseInt(nu) == 1 ){

1657 frame2.saida.setForeground(Color.BLUE);

1658 frame2.saida.setText(" Nome correto.\n \n Esta substancia e um Alcool \n Possuindo 3

1659 carbonos na cadeia principal (prop), \n ligac~ao dupla ("+en+") na posic~ao ("+nu+"),

1660 com ramificac~ao metil na posic~ao ("+nume+") e \n pertencendo ao grupo oxigenado

1661 ("+al+") localizado na posic~ao ("+num+")");

1662 frame2.est.setText("\n \n C=C(O)(C)C ");

1663 }

1664 }

1665 if(Integer.parseInt(num)==1 && Integer.parseInt(nu) != 2){

1666 frame2.saida.setForeground(Color.RED);

1667 frame2.saida.setText(" N~ao podemos colocar ligac~ao em um carbono \n que ja contenha uma hidroxila");

1668 }else{

1669 if(Integer.parseInt(num)==1 && Integer.parseInt(nu) == 2){

1670 frame2.saida.setForeground(Color.BLUE);

1671 frame2.saida.setText(" Nome correto.\n \n Esta substancia e um Alcool \n Possuindo 3

1672 carbonos na cadeia principal (prop), \n ligac~ao dupla ("+en+") na posic~ao ("+nu+"),

1673 com ramificac~ao metil na posic~ao ("+nume+") e \n pertencendo ao grupo oxigenado ("+al+")

1674 localizado na posic~ao ("+num+")");

1675 frame2.est.setText("\n \n C(C)=CC(O) ");

1676 }

1677 }

1678 }else{

1679 if(en.equals("in")){

1680 if(Integer.parseInt(num)==2 && Integer.parseInt(nu) != 1){

1681 frame2.saida.setForeground(Color.RED);

1682 frame2.saida.setText(" N~ao podemos colocar ligac~ao em um carbono \n que ja contenha uma hidroxila");

1683 }else{

1684 if(Integer.parseInt(num)==2 && Integer.parseInt(nu) == 1){

1685 frame2.saida.setForeground(Color.BLUE);

1686 frame2.saida.setText(" Nome correto.\n \n Esta substancia e um Alcool \n Possuindo 3

1687 carbonos na cadeia principal (prop), \n ligac~ao tripla ("+en+") na posic~ao ("+nu+"),

1688 com ramificac~ao metil na posic~ao ("+nume+") e \n pertencendo ao grupo oxigenado ("+al+")

1689 localizado na posic~ao ("+num+")");

1690 frame2.est.setText("\n \n C#C(O)(C)C ");

1691 }

1692 }

1693 if(Integer.parseInt(num)==1 && Integer.parseInt(nu) != 2){

1694 frame2.saida.setForeground(Color.RED);

1695 frame2.saida.setText(" N~ao podemos colocar ligac~ao em um carbono \n que ja contenha uma hidroxila");

1696 }else{

1697 if(Integer.parseInt(num)==1 && Integer.parseInt(nu) == 2){

1698 frame2.saida.setForeground(Color.BLUE);

1699 frame2.saida.setText(" Nome correto.\n \n Esta substancia e um Alcool \n Possuindo 3

1700 carbonos na cadeia principal (prop), \n ligac~ao tripla ("+en+") na posic~ao ("+nu+"),

101

Page 115: Estudo e Desenvolvimento de um Protótipo de Análise de Nomes

1701 com ramificac~ao metil na posic~ao ("+nume+") e \n pertencendo ao grupo oxigenado ("+al+")

1702 localizado na posic~ao ("+num+")");

1703 frame2.est.setText("\n \n C(C)#CC(O) ");

1704 }

1705 }

1706 }

1707 }

1708 }

1709 }

1710 }

1711 }

1712 }

1713 :}

1714 | numero:nume METIL numero:nu PROP central:en alcoois:al {:

1715 if(Integer.parseInt(nume) > 3 || Integer.parseInt(nu) > 3){

1716 frame2.saida.setForeground(Color.RED);

1717 frame2.saida.setText(" Numero da posic~ao esta incorreto.\n Com o prefixo PROP so podemos ter 3

1718 \n carbonos na cadeia principal");

1719 }else{

1720 if(Integer.parseInt(nume) == 1 || Integer.parseInt(nume) == 3){

1721 frame2.saida.setForeground(Color.RED);

1722 frame2.saida.setText(" Nome incorreto,\n Pois se colocar a ramificac~ao na posic~ao 1 ou 3

1723 n~ao sera mais um prop e sim um but");

1724 }else{

1725 if(en.equals("an")){

1726 frame2.saida.setForeground(Color.RED);

1727 frame2.saida.setText(" Nome incorreto.\n N~ao e permitido colocar posic~ao em ligac~ao simples.");

1728 }else{

1729 if(Integer.parseInt(nu)==3){

1730 frame2.saida.setForeground(Color.RED);

1731 frame2.saida.setText(" Nome incorreto.\n N~ao e possivel colocar a ligac~ao neste carbono.");

1732 }else{

1733 if(en.equals("en")){

1734 if(Integer.parseInt(nu)== 2){

1735 frame2.saida.setForeground(Color.BLUE);

1736 frame2.saida.setText(" Nome correto.\n \n Esta substancia e um Alcool \n Possuindo 3

1737 carbonos na cadeia principal (prop), \n ligac~ao dupla ("+en+") na posic~ao ("+nu+"),

1738 com ramificac~ao metil na posic~ao ("+nume+") e \n pertencendo ao grupo oxigenado ("+al+")");

1739 frame2.est.setText("\n \n C(C)=CC(O) ");

1740 }else{

1741 frame2.saida.setForeground(Color.RED);

1742 frame2.saida.setText(" N~ao podemos colocar ligac~ao em um carbono \n que ja contenha uma hidroxila");

1743 }

1744 }else{

1745 if(en.equals("in")){

1746 if(Integer.parseInt(nu)== 2){

1747 frame2.saida.setForeground(Color.BLUE);

1748 frame2.saida.setText(" Nome correto.\n \n Esta substancia e um Alcool \n Possuindo 3

1749 carbonos na cadeia principal (prop), \n ligac~ao tripla ("+en+") na posic~ao ("+nu+"),

1750 com ramificac~ao metil na posic~ao ("+nume+") e \n pertencendo ao grupo oxigenado ("+al+")");

1751 frame2.est.setText("\n \n C(C)#CC(O) ");

1752 }else{

1753 frame2.saida.setForeground(Color.RED);

1754 frame2.saida.setText(" N~ao podemos colocar ligac~ao em um carbono \n que ja contenha uma hidroxila");

1755 }

1756 }

1757 }

1758 }

1759 }

1760 }

1761 }

1762 :}

1763

1764 | numero:nume METIL numero:nu PROP simples:en alcoois:al {:

1765 if(Integer.parseInt(nume) > 3 || Integer.parseInt(nu) > 3){

1766 frame2.saida.setForeground(Color.RED);

1767 frame2.saida.setText(" Numero da posic~ao esta incorreto.\n Com o prefixo PROP so podemos ter 3

1768 carbonos na cadeia principal");

1769 }else{

1770 if(Integer.parseInt(nume) == 1 || Integer.parseInt(nume) == 3){

1771 frame2.saida.setForeground(Color.RED);

1772 frame2.saida.setText(" Nome incorreto.\n Pois se colocar a ramificac~ao na posic~ao 1 ou 3

1773 \n n~ao sera mais um prop e sim um but");

1774 }else{

102

Page 116: Estudo e Desenvolvimento de um Protótipo de Análise de Nomes

1775 if(Integer.parseInt(nu)==3){

1776 frame2.saida.setForeground(Color.RED);

1777 frame2.saida.setText(" A regra da cadeia sempre comeca pelo carbono da hidroxila, \n

1778 portanto sua posic~ao seria 1 ou 2");

1779 }else{

1780 if(Integer.parseInt(nu) == 1){

1781 frame2.saida.setForeground(Color.BLUE);

1782 frame2.saida.setText(" Nome correto.\n \n Esta substancia e um Alcool \n Possuindo 3

1783 carbonos na cadeia principal (prop), \n ligac~ao simples ("+en+"), \n ramificac~ao metil

1784 na posic~ao ("+nume+") e \n pertencendo ao grupo oxigenado ("+al+") localizado na posic~ao ("+nu+")");

1785 frame2.est.setText("\n \n C(C)CC(O) ");

1786 }else{

1787 frame2.saida.setForeground(Color.BLUE);

1788 frame2.saida.setText(" Nome correto.\n \n Esta substancia e um Alcool \n Possuindo 3

1789 carbonos na cadeia principal (prop), \n ligac~ao simples ("+en+"), \n ramificac~ao metil na

1790 posic~ao ("+nume+") e \n pertencendo ao grupo oxigenado ("+al+") localizado na posic~ao ("+nu+")");

1791 frame2.est.setText("\n \n CC(O)(C)C ");

1792 }

1793 }

1794 }

1795 }

1796 :}

1797

1798

1799 | numero:nume METIL PROP simples:en alcoois:al {:

1800 if(Integer.parseInt(nume) > 3){

1801 frame2.saida.setForeground(Color.RED);

1802 frame2.saida.setText(" Numero da posic~ao esta incorreto.\n Com o prefixo PROP so podemos

1803 ter 3 carbonos na cadeia principal");

1804 }else{

1805 if(Integer.parseInt(nume) == 1 || Integer.parseInt(nume) == 3){

1806 frame2.saida.setForeground(Color.RED);

1807 frame2.saida.setText(" Nome incorreto.\n Pois se colocar a ramificac~ao na posic~ao 1 ou 3

1808 \n n~ao sera mais um prop e sim um but");

1809 }else{

1810 frame2.saida.setForeground(Color.BLUE);

1811 frame2.saida.setText(" Nome correto.\n \n Esta substancia e um Alcool \n Possuindo 3

1812 carbonos na cadeia principal (prop), \n ligac~ao simples ("+en+"),\n ramificac~ao metil

1813 com posic~ao ("+nume+") e \n pertencendo ao grupo oxigenado ("+al+")");

1814 frame2.est.setText("\n \n C(C)CC(O) ");

1815 }

1816 }

1817 :}

1818 | PROP central:en alcoois:al {:

1819 if(en.equals("en")||en.equals("in")||en.equals("adien")){

1820 frame2.saida.setForeground(Color.RED);

1821 frame2.saida.setText(" Necessario informar o numero da ligac~ao");

1822 }else{

1823 frame2.saida.setForeground(Color.BLUE);

1824 frame2.saida.setText(" Nome correto.\n \n Esta substancia e um Alcool \n Possuindo 3

1825 carbonos na cadeia principal (prop), \n ligac~ao simples ("+en+") e \n pertencendo ao

1826 grupo oxigenado ("+al+")");

1827 frame2.est.setText("\n \n CCC(O) ");

1828 }

1829 :}

1830 | numero:nu PROP central:en alcoois:al {:

1831 if(Integer.parseInt(nu) > 3){

1832 frame2.saida.setForeground(Color.RED);

1833 frame2.saida.setText(" Numero da posic~ao esta incorreto.\n Com o prefixo PROP so

1834 podemos ter 3 carbonos na cadeia principal");

1835 }else{

1836 if(en.equals("an")){

1837 frame2.saida.setForeground(Color.RED);

1838 frame2.saida.setText(" Nome incorreto.\n N~ao e permitido colocar posic~ao em ligac~ao simples.");

1839 }else{

1840 if(Integer.parseInt(nu)==3){

1841 frame2.saida.setForeground(Color.RED);

1842 frame2.saida.setText(" Nome incorreto.\n N~ao e possivel colocar a ligac~ao neste carbono.");

1843 }else{

1844 if(en.equals("en")){

1845 if(Integer.parseInt(nu)== 2){

1846 frame2.saida.setForeground(Color.BLUE);

1847 frame2.saida.setText(" Nome correto.\n \n Esta substancia e um Alcool \n Possuindo 2

1848 carbonos na cadeia principal (prop), \n ligac~ao dupla ("+en+") na posic~ao ("+nu+") e

103

Page 117: Estudo e Desenvolvimento de um Protótipo de Análise de Nomes

1849 \n pertencendo ao grupo oxigenado ("+al+")");

1850 frame2.est.setText("\n \n C=CC(O) ");

1851 }else{

1852 frame2.saida.setForeground(Color.RED);

1853 frame2.saida.setText(" N~ao podemos colocar ligac~ao em um carbono \n que ja contenha uma hidroxila");

1854 }

1855 }else{

1856 if(en.equals("in")){

1857 if(Integer.parseInt(nu)== 2){

1858 frame2.saida.setForeground(Color.BLUE);

1859 frame2.saida.setText(" Nome correto.\n \n Esta substancia e um Alcool \n Possuindo 2

1860 carbonos na cadeia principal (prop), \n ligac~ao tripla ("+en+") na posic~ao ("+nu+") e

1861 \n pertencendo ao grupo oxigenado ("+al+")");

1862 frame2.est.setText("\n \n C#CC(O) ");

1863 }else{

1864 frame2.saida.setForeground(Color.RED);

1865 frame2.saida.setText(" N~ao podemos colocar ligac~ao em um carbono \n que ja contenha uma hidroxila");

1866 }

1867 }

1868 }

1869 }

1870 }

1871 }

1872 :}

1873

1874 | numero:nu PROP central:en numero:num alcoois:al {:

1875 if(Integer.parseInt(num) > 3 || Integer.parseInt(nu) > 3){

1876 frame2.saida.setForeground(Color.RED);

1877 frame2.saida.setText(" Numero da posic~ao esta incorreto.\n Com o prefixo PROP so

1878 podemos ter 3 carbonos na cadeia principal");

1879 }else{

1880 if(Integer.parseInt(num)==3){

1881 frame2.saida.setForeground(Color.RED);

1882 frame2.saida.setText(" A regra da cadeia sempre comeca pelo carbono da hidroxila,

1883 \n portanto sua posic~ao seria 1 ou 2");

1884 }else{

1885 if(Integer.parseInt(nu)==3){

1886 frame2.saida.setForeground(Color.RED);

1887 frame2.saida.setText(" Nome incorreto.\n N~ao e possivel colocar a ligac~ao neste carbono.");

1888 }else{

1889 if(en.equals("an")){

1890 frame2.saida.setForeground(Color.RED);

1891 frame2.saida.setText(" Nome incorreto.\n N~ao e permitido colocar posic~ao em ligac~ao simples.");

1892 }else{

1893 if(en.equals("en")){

1894 if(Integer.parseInt(num)==2 && Integer.parseInt(nu) != 1){

1895 frame2.saida.setForeground(Color.RED);

1896 frame2.saida.setText(" N~ao podemos colocar ligac~ao em um carbono \n que ja contenha uma hidroxila");

1897 }else{

1898 if(Integer.parseInt(num)==2 && Integer.parseInt(nu) == 1){

1899 frame2.saida.setForeground(Color.BLUE);

1900 frame2.saida.setText(" Nome correto.\n \n Esta substancia e um Alcool \n Possuindo 2

1901 carbonos na cadeia principal (prop), \n ligac~ao dupla ("+en+") na posic~ao ("+nu+") e

1902 \n pertencendo ao grupo oxigenado ("+al+") localizado na posic~ao ("+num+")");

1903 frame2.est.setText("\n \n C=C(O)C ");

1904 }

1905 }

1906 if(Integer.parseInt(num)==1 && Integer.parseInt(nu) != 2){

1907 frame2.saida.setForeground(Color.RED);

1908 frame2.saida.setText(" N~ao podemos colocar ligac~ao em um carbono \n que ja contenha uma hidroxila");

1909 }else{

1910 if(Integer.parseInt(num)==1 && Integer.parseInt(nu) == 2){

1911 frame2.saida.setForeground(Color.BLUE);

1912 frame2.saida.setText(" Nome correto.\n \n Esta substancia e um Alcool \n Possuindo 2

1913 carbonos na cadeia principal (prop), \n ligac~ao dupla ("+en+") na posic~ao ("+nu+") e

1914 \n pertencendo ao grupo oxigenado ("+al+") localizado na posic~ao ("+num+")");

1915 frame2.est.setText("\n \n C=CC(O) ");

1916 }

1917 }

1918 }else{

1919 if(en.equals("in")){

1920 if(Integer.parseInt(num)==2 && Integer.parseInt(nu) != 1){

1921 frame2.saida.setForeground(Color.RED);

1922 frame2.saida.setText(" N~ao podemos colocar ligac~ao em um carbono \n que ja contenha uma hidroxila");

104

Page 118: Estudo e Desenvolvimento de um Protótipo de Análise de Nomes

1923 }else{

1924 if(Integer.parseInt(num)==2 && Integer.parseInt(nu) == 1){

1925 frame2.saida.setForeground(Color.BLUE);

1926 frame2.saida.setText(" Nome correto.\n \n Esta substancia e um Alcool \n Possuindo 3

1927 carbonos na cadeia principal (prop), \n ligac~ao tripla ("+en+") na posic~ao ("+nu+") e

1928 \n pertencendo ao grupo oxigenado ("+al+") localizado na posic~ao ("+num+")");

1929 frame2.est.setText("\n \n C#C(O)C ");

1930 }

1931 }

1932 if(Integer.parseInt(num)==1 && Integer.parseInt(nu) != 2){

1933 frame2.saida.setForeground(Color.RED);

1934 frame2.saida.setText(" N~ao podemos colocar ligac~ao em um carbono \n que ja contenha uma hidroxila");

1935 }else{

1936 if(Integer.parseInt(num)==1 && Integer.parseInt(nu) == 2){

1937 frame2.saida.setForeground(Color.BLUE);

1938 frame2.saida.setText(" Nome correto.\n \n Esta substancia e um Alcool \n Possuindo 3

1939 carbonos na cadeia principal (prop), \n ligac~ao tripla ("+en+") na posic~ao ("+nu+") e

1940 \n pertencendo ao grupo oxigenado ("+al+") localizado na posic~ao ("+num+")");

1941 frame2.est.setText("\n \n C#CC(O) ");

1942 }

1943 }

1944 }

1945 }

1946 }

1947 }

1948 }

1949 }

1950 :}

1951

1952 | numero:num PROP simples:en alcoois:al {:

1953 if(Integer.parseInt(num) > 3){

1954 frame2.saida.setForeground(Color.RED);

1955 frame2.saida.setText(" Numero da posic~ao esta incorreto.\n Com o prefixo PROP so

1956 podemos ter 3 carbonos na cadeia principal");

1957 }else{

1958 if(Integer.parseInt(num)==3){

1959 frame2.saida.setForeground(Color.RED);

1960 frame2.saida.setText(" A regra da cadeia sempre comeca pelo carbono da hidroxila,

1961 \n portanto sua posic~ao seria 1 ou 2");

1962 }else{

1963 if(Integer.parseInt(num) == 1){

1964 frame2.saida.setForeground(Color.BLUE);

1965 frame2.saida.setText(" Nome correto.\n \n Esta substancia e um Alcool \n Possuindo 3

1966 carbonos na cadeia principal (prop), \n ligac~ao simples ("+en+") e \n pertencendo ao

1967 grupo oxigenado ("+al+") localizado na posic~ao ("+num+")");

1968 frame2.est.setText("\n \n CCC(O) ");

1969 }else{

1970 frame2.saida.setForeground(Color.BLUE);

1971 frame2.saida.setText(" Nome correto.\n \n Esta substancia e um Alcool \n Possuindo 3

1972 carbonos na cadeia principal (prop), \n ligac~ao simples ("+en+") e \n pertencendo ao

1973 grupo oxigenado ("+al+") localizado na posic~ao ("+num+")");

1974 frame2.est.setText("\n \n CC(O)C ");

1975 }

1976 }

1977 }

1978 :}

1979

1980 |numero:nume numero:ero DIMETIL numero:nu PROP central:en numero:num alcoois:al {:

1981 if(Integer.parseInt(nume) > 3 || Integer.parseInt(num) > 3 || Integer.parseInt(nu) > 3

1982 || Integer.parseInt(ero) > 3){

1983 frame2.saida.setForeground(Color.RED);

1984 frame2.saida.setText(" Numero da posic~ao esta incorreto.\n Com o prefixo PROP so podemos

1985 ter 3 carbonos na cadeia principal");

1986 }else{

1987 if(Integer.parseInt(nume) != 2 || Integer.parseInt(ero) != 2){

1988 frame2.saida.setForeground(Color.RED);

1989 frame2.saida.setText(" Nome incorreto.\n Pois se colocar a ramificac~ao na posic~ao 1

1990 ou 3\n n~ao sera mais um prop e sim um but");

1991 }else{

1992 if(Integer.parseInt(num)==3){

1993 frame2.saida.setForeground(Color.RED);

1994 frame2.saida.setText(" A regra da cadeia sempre comeca pelo carbono da hidroxila,

1995 \n portanto sua posic~ao seria 1 ou 2");

1996 }else{

105

Page 119: Estudo e Desenvolvimento de um Protótipo de Análise de Nomes

1997 if(Integer.parseInt(nume)==2 && Integer.parseInt(ero)==2 && Integer.parseInt(num)==2){

1998 frame2.saida.setForeground(Color.RED);

1999 frame2.saida.setText(" N~ao podemos ter o carbono 2 ligado a tres ramificac~oes");

2000 }else{

2001 if(Integer.parseInt(nu)==3){

2002 frame2.saida.setForeground(Color.RED);

2003 frame2.saida.setText(" Nome incorreto.\n N~ao e possivel colocar a ligac~ao neste carbono.");

2004 }else{

2005 if(en.equals("an")){

2006 frame2.saida.setForeground(Color.RED);

2007 frame2.saida.setText(" Nome incorreto.\n N~ao e permitido colocar posic~ao em ligac~ao simples.");

2008 }else{

2009 if(en.equals("en")){

2010 if(Integer.parseInt(num)==1 && Integer.parseInt(nu) != 2){

2011 frame2.saida.setForeground(Color.RED);

2012 frame2.saida.setText(" N~ao podemos colocar ligac~ao em um carbono \n que ja contenha uma hidroxila");

2013 }else{

2014 if(Integer.parseInt(num)==1 && Integer.parseInt(nu) == 2){

2015 frame2.saida.setForeground(Color.BLUE);

2016 frame2.saida.setText(" Nome correto.\n \n Esta substancia e um Alcool \n Possuindo 3

2017 carbonos na cadeia principal (prop), \n ligac~ao dupla ("+en+") na posic~ao ("+nu+"),

2018 com ramificac~ao dimetil na posic~ao ("+nume+","+ero+") e \n pertencendo ao grupo oxigenado

2019 ("+al+") localizado na posic~ao ("+num+")");

2020 frame2.est.setText("\n \n C(C)(C)=CC(O) ");

2021 }

2022 }

2023 }else{

2024 if(en.equals("in")){

2025 if(Integer.parseInt(num)==1 && Integer.parseInt(nu) != 2){

2026 frame2.saida.setForeground(Color.RED);

2027 frame2.saida.setText(" N~ao podemos colocar ligac~ao em um carbono \n que ja contenha uma hidroxila");

2028 }else{

2029 if(Integer.parseInt(num)==1 && Integer.parseInt(nu) == 2){

2030 frame2.saida.setForeground(Color.BLUE);

2031 frame2.saida.setText(" Nome correto.\n \n Esta substancia e um Alcool \n Possuindo 3

2032 carbonos na cadeia principal (prop), \n ligac~ao tripla ("+en+") na posic~ao ("+nu+"),

2033 com ramificac~ao dimetil na posic~ao ("+nume+","+ero+") e \n pertencendo ao grupo oxigenado

2034 ("+al+") localizado na posic~ao ("+num+")");

2035 frame2.est.setText("\n \n C(C)(C)#CC(O) ");

2036 }

2037 }

2038 }

2039 }

2040 }

2041 }

2042 }

2043 }

2044 }

2045 }

2046 :}

2047 | numero:nume numero:ero DIMETIL numero:nu PROP central:en alcoois:al {:

2048 if(Integer.parseInt(nume) > 3 || Integer.parseInt(nu) > 3 || Integer.parseInt(ero) > 3){

2049 frame2.saida.setForeground(Color.RED);

2050 frame2.saida.setText(" Numero da posic~ao esta incorreto.\n Com o prefixo PROP so

2051 podemos ter 3 carbonos na cadeia principal");

2052 }else{

2053 if(Integer.parseInt(nume) == 1 || Integer.parseInt(nume) == 3 || Integer.parseInt(ero) == 1

2054 || Integer.parseInt(ero) == 3){

2055 frame2.saida.setForeground(Color.RED);

2056 frame2.saida.setText(" Nome incorreto.\n Pois se colocar a ramificac~ao na posic~ao 1 ou 3

2057 \n n~ao sera mais um prop e sim um but");

2058 }else{

2059 if(en.equals("an")){

2060 frame2.saida.setForeground(Color.RED);

2061 frame2.saida.setText(" Nome incorreto.\n N~ao e permitido colocar posic~ao em ligac~ao simples.");

2062 }else{

2063 if(Integer.parseInt(nu)==3){

2064 frame2.saida.setForeground(Color.RED);

2065 frame2.saida.setText(" Nome incorreto.\n N~ao e possivel colocar a ligac~ao neste carbono.");

2066 }else{

2067 if(en.equals("en")){

2068 if(Integer.parseInt(nu)== 2){

2069 frame2.saida.setForeground(Color.BLUE);

2070 frame2.saida.setText(" Nome correto.\n \n Esta substancia e um Alcool \n Possuindo 2

106

Page 120: Estudo e Desenvolvimento de um Protótipo de Análise de Nomes

2071 carbonos na cadeia principal (prop), \n ligac~ao dupla ("+en+") na posic~ao ("+nu+"),

2072 com ramificac~ao dimetil na posic~ao ("+nume+","+ero+") e \n pertencendo ao grupo oxigenado ("+al+")");

2073 frame2.est.setText("\n \n C(C)(C)=CC(O) ");

2074 }else{

2075 frame2.saida.setForeground(Color.RED);

2076 frame2.saida.setText(" N~ao podemos colocar ligac~ao em um carbono \n que ja contenha uma hidroxila");

2077 }

2078 }else{

2079 if(en.equals("in")){

2080 if(Integer.parseInt(nu)== 2){

2081 frame2.saida.setForeground(Color.BLUE);

2082 frame2.saida.setText(" Nome correto.\n \n Esta substancia e um Alcool \n Possuindo 2

2083 carbonos na cadeia principal (prop), \n ligac~ao tripla ("+en+") na posic~ao ("+nu+"),

2084 com ramificac~ao dimetil na posic~ao ("+nume+","+ero+") e \n pertencendo ao grupo oxigenado ("+al+")");

2085 frame2.est.setText("\n \n C(C)(C)#CC(O) ");

2086 }else{

2087 frame2.saida.setForeground(Color.RED);

2088 frame2.saida.setText(" N~ao podemos colocar ligac~ao em um carbono \n que ja contenha uma hidroxila");

2089 }

2090 }

2091 }

2092 }

2093 }

2094 }

2095 }

2096 :}

2097

2098 | numero:nume numero:ero DIMETIL numero:nu PROP simples:en alcoois:al {:

2099 if(Integer.parseInt(nume) > 3 || Integer.parseInt(nu) > 3 || Integer.parseInt(ero) > 3){

2100 frame2.saida.setForeground(Color.RED);

2101 frame2.saida.setText(" Numero da posic~ao esta incorreto.\n Com o prefixo PROP so

2102 podemos ter 3 carbonos na cadeia principal");

2103 }else{

2104 if(Integer.parseInt(nume) == 1 || Integer.parseInt(nume) == 3 || Integer.parseInt(ero) == 1

2105 || Integer.parseInt(ero) == 3){

2106 frame2.saida.setForeground(Color.RED);

2107 frame2.saida.setText(" Nome incorreto.\n Pois se colocar a ramificac~ao na posic~ao 1 ou 3

2108 \n n~ao sera mais um prop e sim um but");

2109 }else{

2110 if(Integer.parseInt(nu)==3){

2111 frame2.saida.setForeground(Color.RED);

2112 frame2.saida.setText(" A regra da cadeia sempre comeca pelo carbono da hidroxila, \n

2113 portanto sua posic~ao seria 1 ou 2");

2114 }else{

2115 if(Integer.parseInt(nu) == 1){

2116 frame2.saida.setForeground(Color.BLUE);

2117 frame2.saida.setText(" Nome correto.\n \n Esta substancia e um Alcool \n Possuindo 3

2118 carbonos na cadeia principal (prop), \n ligac~ao simples ("+en+"), \n ramificac~ao

2119 dimetil na posic~ao ("+nume+","+ero+") e \n pertencendo ao grupo oxigenado ("+al+")

2120 localizado na posic~ao ("+nu+")");

2121 frame2.est.setText("\n \n C(C)(C)CC(O) ");

2122 }else{

2123 frame2.saida.setForeground(Color.RED);

2124 frame2.saida.setText(" N~ao podemos ter o carbono 2 ligado a tres ramificac~oes");

2125 }

2126 }

2127 }

2128 }

2129 :}

2130

2131

2132 | numero:nume numero:ero DIMETIL PROP simples:en alcoois:al {:

2133 if(Integer.parseInt(nume) > 3 || Integer.parseInt(ero) > 3){

2134 frame2.saida.setForeground(Color.RED);

2135 frame2.saida.setText(" Numero da posic~ao esta incorreto.\n Com o prefixo PROP so

2136 podemos ter 3 carbonos na cadeia principal");

2137 }else{

2138 if(Integer.parseInt(nume) == 1 || Integer.parseInt(nume) == 3 || Integer.parseInt(ero) == 1

2139 || Integer.parseInt(ero) == 3){

2140 frame2.saida.setForeground(Color.RED);

2141 frame2.saida.setText(" Nome incorreto.\n Pois se colocar a ramificac~ao na posic~ao 1

2142 ou 3 n~ao sera mais um prop e sim um but");

2143 }else{

2144 frame2.saida.setForeground(Color.BLUE);

107

Page 121: Estudo e Desenvolvimento de um Protótipo de Análise de Nomes

2145 frame2.saida.setText(" Nome correto.\n \n Esta substancia e um Alcool \n Possuindo 3

2146 carbonos na cadeia principal (prop), \n ligac~ao simples ("+en+"),\n ramificac~ao dimetil

2147 com posic~ao ("+nume+","+ero+") e \n pertencendo ao grupo oxigenado ("+al+")");

2148 frame2.est.setText("\n \n C(C)(C)CC(O) ");

2149 }

2150 }

2151 :}

2152

2153 |numero:nume numero:ero numero:me TRIMETIL numero:nu PROP central:en numero:num alcoois:al {:

2154 frame2.saida.setForeground(Color.RED);

2155 frame2.saida.setText(" Nome incorreto.\n Com o prefixo PROP n~ao podemos\n utilizar

2156 da ramificac~ao TRIMETIL, pois\n n~ao podemos ter mais que 3 carbonos");

2157 :}

2158 | numero:nume numero:ero numero:me TRIMETIL numero:nu PROP central:en alcoois:al {:

2159 frame2.saida.setForeground(Color.RED);

2160 frame2.saida.setText(" Nome incorreto.\n Com o prefixo PROP n~ao podemos\n utilizar

2161 da ramificac~ao TRIMETIL, pois\n n~ao podemos ter mais que 3 carbonos");

2162 :}

2163 | numero:nume numero:ero numero:me TRIMETIL numero:nu PROP simples:en alcoois:al {:

2164 frame2.saida.setForeground(Color.RED);

2165 frame2.saida.setText(" Nome incorreto.\n Com o prefixo PROP n~ao podemos\n utilizar

2166 da ramificac~ao TRIMETIL, pois\n n~ao podemos ter mais que 3 carbonos");

2167 :}

2168 | numero:nume numero:ero numero:me TRIMETIL PROP simples:en alcoois:al {:

2169 frame2.saida.setForeground(Color.RED);

2170 frame2.saida.setText(" Nome incorreto.\n Com o prefixo PROP n~ao podemos\n utilizar

2171 da ramificac~ao TRIMETIL, pois\n n~ao podemos ter mais que 3 carbonos");

2172 :}

2173 ;

2174

2175

2176 /* ************* Aldeıdo ************** */

2177

2178 aldeido ::= aldeidoMet:me

2179 {: RESULT = me; :}

2180 | aldeidoEt: ae

2181 {: RESULT = ae; :}

2182 | aldeidoProp: ap

2183 {: RESULT = ap; :}

2184 ;

2185

2186

2187 aldeidoMet ::= MET central:en aldeidos:al {:

2188 if(! en.equals("an")){

2189 frame2.saida.setFont(new Font("Arial", Font.PLAIN, 15));

2190 frame2.saida.setForeground(Color.RED);

2191 frame2.saida.setText(" Com o prefixo MET so e aceito ligac~ao simples (an)");

2192 }else{

2193 frame2.saida.setForeground(Color.BLUE);

2194 frame2.saida.setText(" Nome correto.\n \n Esta substancia e um Aldeıdo \n

2195 Possuindo 1 carbono na cadeia principal (met), \n ligac~ao simples ("+en+")

2196 e \n pertencendo ao grupo oxigenado ("+al+")");

2197 frame2.est.setText("\n \n C(=O) ");

2198 }

2199 :}

2200 | numero:nu radical:ra MET central:en aldeidos:hi {:

2201 frame2.saida.setForeground(Color.RED);

2202 frame2.saida.setText(" Nome incorreto.\n\n N~ao podemos ter ramificac~oes

2203 com o prefixo MET,\n pois n~ao sera mais um met e\n sim outro prefixo

2204 maior que 1 carbono.");

2205 :}

2206 ;

2207

2208

2209 aldeidoEt ::= numero:nume ET central:en aldeidos:al {:

2210 frame2.saida.setFont(new Font("Arial", Font.PLAIN, 15));

2211 frame2.saida.setForeground(Color.RED);

2212 frame2.saida.setText(" Com o prefixo et n~ao utilizamos ligac~oes en,

2213 in ou dien,\n pois o carbono que contem a carbonila e saturado.");

2214 :}

2215 | ET central:en aldeidos:al {:

2216 if(en.equals("en")||en.equals("in")||en.equals("adien")){

2217 frame2.saida.setForeground(Color.RED);

2218 frame2.saida.setText(" Necessario informar o numero da ligac~ao");

108

Page 122: Estudo e Desenvolvimento de um Protótipo de Análise de Nomes

2219 }else{

2220 frame2.saida.setForeground(Color.BLUE);

2221 frame2.saida.setText(" Nome correto.\n \n Esta substancia e um Aldeıdo \n Possuindo 2

2222 carbonos na cadeia principal (et), \n ligac~ao simples ("+en+") e \n pertencendo

2223 ao grupo oxigenado ("+al+")");

2224 frame2.est.setText("\n \n CC(=O) ");

2225 }

2226 :}

2227 | numero:nu radical:ra ET central:en aldeidos:hi {:

2228 frame2.saida.setForeground(Color.RED);

2229 frame2.saida.setText(" Nome incorreto.\n\n N~ao podemos ter ramificac~oes com o

2230 prefixo ET,\n pois n~ao sera mais um et e\n sim outro prefixo maior que 2 carbonos.");

2231 :}

2232 ;

2233

2234

2235 aldeidoProp ::= numero:nume METIL numero:nu PROP central:en numero:num aldeidos:al {:

2236 frame2.saida.setFont(new Font("Arial", Font.PLAIN, 15));

2237 frame2.saida.setForeground(Color.RED);

2238 frame2.saida.setText(" Atenc~ao, como o grupo funcional esta sempre na extremidade,

2239 \n esse carbono sempre sera o numero 1.\n Portanto, sua posic~ao n~ao precisa ser indicada");

2240 :}

2241 | numero:nume METIL numero:nu PROP central:en aldeidos:al {:

2242 if(Integer.parseInt(nume) > 3 || Integer.parseInt(nu) > 3){

2243 frame2.saida.setForeground(Color.RED);

2244 frame2.saida.setText(" Numero da posic~ao esta incorreto.\n Com o prefixo PROP

2245 so podemos ter 3 carbonos na cadeia principal");

2246 }else{

2247 if(Integer.parseInt(nume) == 1 || Integer.parseInt(nume) == 3){

2248 frame2.saida.setForeground(Color.RED);

2249 frame2.saida.setText(" Nome incorreto.\n Pois se colocar a ramificac~ao na

2250 posic~ao 1 ou 3 n~ao sera mais um prop e sim um but");

2251 }else{

2252 if(en.equals("an")){

2253 frame2.saida.setForeground(Color.RED);

2254 frame2.saida.setText(" Nome incorreto.\n N~ao e permitido colocar posic~ao em ligac~ao simples.");

2255 }else{

2256 if(Integer.parseInt(nu) == 1){

2257 frame2.saida.setForeground(Color.RED);

2258 frame2.saida.setText(" Nome incorreto. \n N~ao e permitido colocar ligac~ao no

2259 carbono\n que possui o grupo funcional.");

2260 }else{

2261 if(Integer.parseInt(nu) == 3){

2262 frame2.saida.setForeground(Color.RED);

2263 frame2.saida.setText(" Nome incorreto. \n N~ao e permitido colocar ligac~ao no ultimo carbono.");

2264 }else{

2265 if(en.equals("en")){

2266 frame2.saida.setForeground(Color.BLUE);

2267 frame2.saida.setText(" Nome correto.\n \n Esta substancia e um Aldeıdo \n Possuindo 3

2268 carbonos na cadeia principal (prop), \n ligac~ao dupla ("+en+") na posic~ao ("+nu+"),

2269 \n com ramificac~ao metil na posic~ao ("+nume+") e \n pertencendo ao grupo oxigenado ("+al+")");

2270 frame2.est.setText("\n \n C(C)=CC(=O) ");

2271 }else{

2272 frame2.saida.setForeground(Color.BLUE);

2273 frame2.saida.setText(" Nome correto.\n \n Esta substancia e um Aldeıdo \n Possuindo 3

2274 carbonos na cadeia principal (prop), \n ligac~ao tripla ("+en+") na posic~ao ("+nu+"),

2275 \n com ramificac~ao metil na posic~ao ("+nume+") e \n pertencendo ao grupo oxigenado ("+al+")");

2276 frame2.est.setText("\n \n C(C)#CC(=O) ");

2277 }

2278 }

2279 }

2280 }

2281 }

2282 }

2283 :}

2284

2285 | numero:nume METIL PROP simples:en aldeidos:al {:

2286 if(Integer.parseInt(nume) > 3){

2287 frame2.saida.setForeground(Color.RED);

2288 frame2.saida.setText(" Numero da posic~ao esta incorreto.\n Com o prefixo PROP

2289 so podemos ter 3 carbonos na cadeia principal");

2290 }else{

2291 if(Integer.parseInt(nume) == 1 || Integer.parseInt(nume) == 3){

2292 frame2.saida.setForeground(Color.RED);

109

Page 123: Estudo e Desenvolvimento de um Protótipo de Análise de Nomes

2293 frame2.saida.setText(" Nome incorreto.\n Pois se colocar a ramificac~ao na

2294 posic~ao 1 ou 3\n n~ao sera mais um prop e sim um but");

2295 }else{

2296 frame2.saida.setForeground(Color.BLUE);

2297 frame2.saida.setText(" Nome correto.\n \n Esta substancia e um Aldeıdo \n

2298 Possuindo 3 carbonos na cadeia principal (prop), \n ligac~ao simples ("+en+"),

2299 \n com ramificac~ao metil na posic~ao ("+nume+") e \n pertencendo ao grupo oxigenado ("+al+")");

2300 frame2.est.setText("\n \n C(C)CC(=O) ");

2301 }

2302 }

2303 :}

2304 | PROP central:en aldeidos:al {:

2305 if(en.equals("en")||en.equals("in")||en.equals("adien")){

2306 frame2.saida.setForeground(Color.RED);

2307 frame2.saida.setText(" Necessario informar o numero da ligac~ao");

2308 }else{

2309 frame2.saida.setForeground(Color.BLUE);

2310 frame2.saida.setText(" Nome correto.\n \n Esta substancia e um Aldeıdo \n Possuindo 3

2311 carbonos na cadeia principal (prop) e \n pertencendo ao grupo oxigenado ("+al+")");

2312 frame2.est.setText("\n \n CCC(=O) ");

2313 }

2314 :}

2315 | numero:nu PROP central:en aldeidos:al {:

2316 if(Integer.parseInt(nu) > 3){

2317 frame2.saida.setForeground(Color.RED);

2318 frame2.saida.setText(" Numero da posic~ao esta incorreto.\n Com o prefixo PROP so

2319 podemos ter 3 carbonos na cadeia principal");

2320 }else{

2321 if(en.equals("an")){

2322 frame2.saida.setForeground(Color.RED);

2323 frame2.saida.setText(" Nome incorreto.\n N~ao e permitido colocar posic~ao em ligac~ao simples.");

2324 }else{

2325 if(Integer.parseInt(nu) == 1){

2326 frame2.saida.setForeground(Color.RED);

2327 frame2.saida.setText(" Nome incorreto. \n N~ao e permitido colocar ligac~ao no

2328 carbono que possui o grupo funcional.");

2329 }else{

2330 if(Integer.parseInt(nu) == 3){

2331 frame2.saida.setForeground(Color.RED);

2332 frame2.saida.setText(" Nome incorreto. \n N~ao e permitido colocar ligac~ao no ultimo carbono.");

2333 }else{

2334 if(en.equals("en")){

2335 frame2.saida.setForeground(Color.BLUE);

2336 frame2.saida.setText(" Nome correto.\n \n Esta substancia e um Aldeıdo \n

2337 Possuindo 3 carbonos na cadeia principal (prop), \n ligac~ao dupla ("+en+") na

2338 posic~ao ("+nu+") e \n pertencendo ao grupo oxigenado ("+al+")");

2339 frame2.est.setText("\n \n C=CC(=O) ");

2340 }else{

2341 frame2.saida.setForeground(Color.BLUE);

2342 frame2.saida.setText(" Nome correto.\n \n Esta substancia e um Aldeıdo \n

2343 Possuindo 3 carbonos na cadeia principal (prop), \n ligac~ao tripla ("+en+") na

2344 posic~ao ("+nu+") e \n pertencendo ao grupo oxigenado ("+al+")");

2345 frame2.est.setText("\n \n C#CC(=O) ");

2346 }

2347 }

2348 }

2349 }

2350 }

2351 :}

2352 | numero:nu PROP central:en numero:num aldeidos:al {:

2353 frame2.saida.setForeground(Color.RED);

2354 frame2.saida.setText(" Atenc~ao, como o grupo funcional esta sempre na extremidade,

2355 \n esse carbono sempre sera o numero 1.\n Portanto, sua posic~ao n~ao precisa ser indicada");

2356 :}

2357 | numero:nume numero:ero DIMETIL numero:nu PROP central:en numero:num aldeidos:al {:

2358 frame2.saida.setForeground(Color.RED);

2359 frame2.saida.setText(" Atenc~ao, como o grupo funcional esta sempre na extremidade,

2360 \n esse carbono sempre sera o numero 1.\n Portanto, sua posic~ao n~ao precisa ser indicada");

2361 :}

2362 | numero:nume numero:ero DIMETIL numero:nu PROP central:en aldeidos:al {:

2363 if(Integer.parseInt(nume) > 3 || Integer.parseInt(nu) > 3 || Integer.parseInt(ero) > 3){

2364 frame2.saida.setForeground(Color.RED);

2365 frame2.saida.setText(" Numero da posic~ao esta incorreto.\n Com o prefixo PROP so

2366 podemos ter 3 carbonos na cadeia principal");

110

Page 124: Estudo e Desenvolvimento de um Protótipo de Análise de Nomes

2367 }else{

2368 if(Integer.parseInt(nume) == 1 || Integer.parseInt(nume) == 3 || Integer.parseInt(ero) == 1

2369 || Integer.parseInt(ero) == 3) {

2370 frame2.saida.setForeground(Color.RED);

2371 frame2.saida.setText(" Nome incorreto.\n Pois se colocar a ramificac~ao na posic~ao 1 ou 3

2372 \n n~ao sera mais um prop e sim um but");

2373 }else{

2374 if(en.equals("an")){

2375 frame2.saida.setForeground(Color.RED);

2376 frame2.saida.setText(" Nome incorreto.\n N~ao e permitido colocar posic~ao em ligac~ao simples.");

2377 }else{

2378 if(Integer.parseInt(nu) == 1){

2379 frame2.saida.setForeground(Color.RED);

2380 frame2.saida.setText(" Nome incorreto. \n N~ao e permitido colocar ligac~ao no carbono

2381 que possui o grupo funcional.");

2382 }else{

2383 if(Integer.parseInt(nu) == 3){

2384 frame2.saida.setForeground(Color.RED);

2385 frame2.saida.setText(" Nome incorreto. \n N~ao e permitido colocar ligac~ao no ultimo carbono.");

2386 }else{

2387 if(en.equals("en")){

2388 frame2.saida.setForeground(Color.BLUE);

2389 frame2.saida.setText(" Nome correto.\n \n Esta substancia e um Aldeıdo \n

2390 Possuindo 3 carbonos na cadeia principal (prop), \n ligac~ao dupla ("+en+") na

2391 posic~ao ("+nu+"), \n com ramificac~ao dimetil na posic~ao ("+nume+","+ero+") e

2392 \n pertencendo ao grupo oxigenado ("+al+")");

2393 frame2.est.setText("\n \n C(C)(C)=CC(=O) ");

2394 }else{

2395 frame2.saida.setForeground(Color.BLUE);

2396 frame2.saida.setText(" Nome correto.\n \n Esta substancia e um Aldeıdo \n

2397 Possuindo 3 carbonos na cadeia principal (prop), \n ligac~ao tripla ("+en+")

2398 na posic~ao ("+nu+"), \n com ramificac~ao dimetil na posic~ao ("+nume+","+ero+")

2399 e \n pertencendo ao grupo oxigenado ("+al+")");

2400 frame2.est.setText("\n \n C(C)(C)#CC(=O) ");

2401 }

2402 }

2403 }

2404 }

2405 }

2406 }

2407 :}

2408

2409 | numero:nume numero:ero DIMETIL PROP simples:en aldeidos:al {:

2410 if(Integer.parseInt(nume) > 3 || Integer.parseInt(ero) > 3){

2411 frame2.saida.setForeground(Color.RED);

2412 frame2.saida.setText(" Numero da posic~ao esta incorreto.\n Com o prefixo PROP

2413 so podemos ter 3 carbonos na cadeia principal");

2414 }else{

2415 if(Integer.parseInt(nume) == 1 || Integer.parseInt(nume) == 3 ||

2416 Integer.parseInt(ero) == 1 || Integer.parseInt(ero) == 3){

2417 frame2.saida.setForeground(Color.RED);

2418 frame2.saida.setText(" Nome incorreto.\n Pois se colocar a ramificac~ao na posic~ao 1

2419 ou 3\n n~ao sera mais um prop e sim um but");

2420 }else{

2421 frame2.saida.setForeground(Color.BLUE);

2422 frame2.saida.setText(" Nome correto.\n \n Esta substancia e um Aldeıdo \n Possuindo

2423 3 carbonos na cadeia principal (prop), \n ligac~ao simples ("+en+"),\n com ramificac~ao

2424 dimetil na posic~ao ("+nume+","+ero+") e \n pertencendo ao grupo oxigenado ("+al+")");

2425 frame2.est.setText("\n \n C(C)(C)CC(=O) ");

2426 }

2427 }

2428

2429 :}

2430 | numero:nume numero:ero numero:b TRIMETIL numero:nu PROP central:en numero:num aldeidos:al {:

2431 frame2.saida.setForeground(Color.RED);

2432 frame2.saida.setText(" Nome incorreto.\n Com o prefixo PROP n~ao podemos\n

2433 utilizar da ramificac~ao TRIMETIL, pois\n n~ao podemos ter mais que 3 carbonos");

2434 :}

2435

2436 | numero:nume numero:ero numero:b TRIMETIL numero:nu PROP central:en aldeidos:al {:

2437 frame2.saida.setForeground(Color.RED);

2438 frame2.saida.setText(" Nome incorreto.\n Com o prefixo PROP n~ao podemos\n utilizar

2439 da ramificac~ao TRIMETIL, pois\n n~ao podemos ter mais que 3 carbonos");

2440 :}

111

Page 125: Estudo e Desenvolvimento de um Protótipo de Análise de Nomes

2441 | numero:nume numero:ero numero:b TRIMETIL PROP simples:en aldeidos:al {:

2442 frame2.saida.setForeground(Color.RED);

2443 frame2.saida.setText(" Nome incorreto.\n Com o prefixo PROP n~ao podemos\n utilizar

2444 da ramificac~ao TRIMETIL, pois\n n~ao podemos ter mais que 3 carbonos");

2445 :}

2446 ;

2447

2448 /* ************* Cetona ************** */

2449

2450 cetona ::= cetonaMet:me

2451 {: RESULT = me; :}

2452 | cetonaEt: ae

2453 {: RESULT = ae; :}

2454 | cetonaProp: ap

2455 {: RESULT = ap; :}

2456 ;

2457

2458

2459 cetonaMet ::= MET central:en cetonas:al {:

2460 frame2.saida.setFont(new Font("Arial", Font.PLAIN, 15));

2461 frame2.saida.setForeground(Color.RED);

2462 frame2.saida.setText(" Atenc~ao, as cetonas apresentam o grupo funcional

2463 carbonila,\n sendo este carbono secundario.\n Portanto prefixo met n~ao se encaixa nas cetonas.");

2464 :}

2465 | numero:nu radical:ra MET central:en cetonas:hi {:

2466 frame2.saida.setForeground(Color.RED);

2467 frame2.saida.setText(" Nome incorreto.\n\n N~ao podemos ter ramificac~oes

2468 com o prefixo MET,\n pois n~ao sera mais um met e\n sim outro prefixo maior que 1 carbono.");

2469 :}

2470 ;

2471

2472

2473 cetonaEt ::= numero:nume ET central:en cetonas:al {:

2474 frame2.saida.setFont(new Font("Arial", Font.PLAIN, 15));

2475 frame2.saida.setForeground(Color.RED);

2476 frame2.saida.setText(" Atenc~ao, as cetonas apresentam o grupo funcional carbonila,

2477 \n sendo este carbono secundario.\n Portanto prefixo et n~ao se encaixa nas cetonas.");

2478 :}

2479 | ET central:en cetonas:al {:

2480 frame2.saida.setFont(new Font("Arial", Font.PLAIN, 15));

2481 frame2.saida.setForeground(Color.RED);

2482 frame2.saida.setText(" Atenc~ao, as cetonas apresentam o grupo funcional carbonila,\n

2483 sendo este carbono secundario.\n Portanto prefixo met n~ao se encaixa nas cetonas.");

2484 :}

2485 | numero:nu radical:ra ET central:en cetonas:hi {:

2486 frame2.saida.setForeground(Color.RED);

2487 frame2.saida.setText(" Nome incorreto.\n\n N~ao podemos ter ramificac~oes com o

2488 prefixo ET,\n pois n~ao sera mais um et e\n sim outro prefixo maior que 2 carbonos.");

2489 :}

2490 ;

2491

2492

2493 cetonaProp ::= numero:nume METIL numero:nu PROP central:en numero:num cetonas:al {:

2494 frame2.saida.setFont(new Font("Arial", Font.PLAIN, 15));

2495 frame2.saida.setForeground(Color.RED);

2496 frame2.saida.setText(" Com o prefixo prop n~ao podemos utilizar\n a ramificac~ao metil,

2497 pois se colocarmos em suas\n extremidades n~ao sera mais um prop e sim um but. \n E

2498 no carbono 2 n~ao podemos colocar,\n pois o grupo funcional da cetona e secundario.");

2499 :}

2500 | numero:nume METIL numero:nu PROP central:en cetonas:al {:

2501 frame2.saida.setForeground(Color.RED);

2502 frame2.saida.setText(" Com o prefixo prop n~ao podemos utilizar\n a ramificac~ao metil,

2503 pois se colocarmos em suas\n extremidades n~ao sera mais um prop e sim um but. \n E

2504 no carbono 2 n~ao podemos colocar,\n pois o grupo funcional da cetona e secundario.");

2505 :}

2506 | numero:nume METIL PROP central:en cetonas:al {:

2507 frame2.saida.setForeground(Color.RED);

2508 frame2.saida.setText(" Com o prefixo prop n~ao podemos utilizar\n a ramificac~ao metil,

2509 pois se colocarmos em suas\n extremidades n~ao sera mais um prop e sim um but. \n E

2510 no carbono 2 n~ao podemos colocar,\n pois o grupo funcional da cetona e secundario.");

2511 :}

2512 | PROP central:en cetonas:al {:

2513 if(en.equals("en")||en.equals("in")||en.equals("adien")){

2514 frame2.saida.setForeground(Color.RED);

112

Page 126: Estudo e Desenvolvimento de um Protótipo de Análise de Nomes

2515 frame2.saida.setText(" Com o prefixo prop n~ao se usa ligac~oes triplas,\n duplas ou

2516 duas duplas");

2517 }else{

2518 frame2.saida.setForeground(Color.BLUE);

2519 frame2.saida.setText(" Nome correto.\n \n Esta substancia e uma Cetona \n Possuindo

2520 3 carbonos na cadeia principal (prop), \n ligac~ao simples ("+en+") e \n pertencendo

2521 ao grupo oxigenado ("+al+")");

2522 frame2.est.setText("\n \n CC(=O)C ");

2523 }

2524 :}

2525 | numero:nu PROP simples:en cetonas:al {:

2526 if(Integer.parseInt(nu)>3){

2527 frame2.saida.setForeground(Color.RED);

2528 frame2.saida.setText(" Numero da posic~ao esta incorreto.\n Com o prefixo PROP

2529 so podemos ter 3 carbonos na cadeia principal");

2530 }else{

2531 if(Integer.parseInt(nu)==2){

2532 frame2.saida.setForeground(Color.BLUE);

2533 frame2.saida.setText(" Nome correto.\n \n Esta substancia e uma Cetona

2534 \n Possuindo 3 carbonos na cadeia principal (prop), \n ligac~ao simples

2535 ("+en+") e \n pertencendo ao grupo oxigenado ("+al+") localizado na posic~ao ("+nu+")");

2536 frame2.est.setText("\n \n CC(=O)C ");

2537 }else{

2538 frame2.saida.setForeground(Color.RED);

2539 frame2.saida.setText(" Nome incorreto.\n \n O grupo funcional e secundario

2540 \n e com o prefixo prop so temos 3 carbonos\n portanto a posic~ao sera a segunda.");

2541 }

2542 }

2543 :}

2544 | numero:nu PROP central:en cetonas:al {:

2545 if(en.equals("an")){

2546 frame2.saida.setForeground(Color.RED);

2547 frame2.saida.setText(" Nome incorreto.\n \n Com ligac~ao simples n~ao e necessario

2548 informar posic~ao.");

2549 }else{

2550 frame2.saida.setForeground(Color.RED);

2551 frame2.saida.setText(" Com o prefixo prop n~ao podemos utilizar as ligac~oes en, in, dien");

2552 }

2553 :}

2554 | numero:num PROP central:en numero:nu cetonas:al {:

2555 frame2.saida.setForeground(Color.RED);

2556 frame2.saida.setText(" Com o prefixo prop n~ao podemos utilizar a ligac~oes en, in, dien");

2557 :}

2558 | numero:nume numero:b DIMETIL numero:nu PROP central:en numero:num cetonas:al {:

2559 frame2.saida.setFont(new Font("Arial", Font.PLAIN, 15));

2560 frame2.saida.setForeground(Color.RED);

2561 frame2.saida.setText(" Com o prefixo prop n~ao podemos utilizar\n a ramificac~ao

2562 dimetil, pois se colocarmos em suas\n extremidades n~ao sera mais um prop e sim

2563 um pent. \n E no carbono 2 n~ao podemos colocar,\n pois o grupo funcional da cetona e secundario.");

2564 :}

2565 | numero:nume numero:b DIMETIL numero:nu PROP central:en cetonas:al {:

2566 frame2.saida.setForeground(Color.RED);

2567 frame2.saida.setText(" Com o prefixo prop n~ao podemos utilizar\n a ramificac~ao

2568 dimetil, pois se colocarmos em suas\n extremidades n~ao sera mais um prop e sim um

2569 pent. \n E no carbono 2 n~ao podemos colocar,\n pois o grupo funcional da cetona e secundario.");

2570 :}

2571 | numero:nume numero:b DIMETIL PROP central:en cetonas:al {:

2572 frame2.saida.setForeground(Color.RED);

2573 frame2.saida.setText(" Com o prefixo prop n~ao podemos utilizar\n a ramificac~ao dimetil,

2574 pois se colocarmos em suas\n extremidades n~ao sera mais um prop e sim um pent. \n E

2575 no carbono 2 n~ao podemos colocar,\n pois o grupo funcional da cetona e secundario.");

2576 :}

2577 | numero:nume numero:b numero:c TRIMETIL numero:nu PROP central:en numero:num cetonas:al {:

2578 frame2.saida.setFont(new Font("Arial", Font.PLAIN, 15));

2579 frame2.saida.setForeground(Color.RED);

2580 frame2.saida.setText(" Nome incorreto.\n Com o prefixo PROP n~ao podemos\n utilizar

2581 da ramificac~ao TRIMETIL, pois\n n~ao podemos ter mais que 3 carbonos");

2582 :}

2583 | numero:nume numero:b numero:c TRIMETIL numero:nu PROP central:en cetonas:al {:

2584 frame2.saida.setForeground(Color.RED);

2585 frame2.saida.setText(" Nome incorreto.\n Com o prefixo PROP n~ao podemos\n utilizar

2586 da ramificac~ao TRIMETIL, pois\n n~ao podemos ter mais que 3 carbonos");

2587 :}

2588 | numero:nume numero:b numero:c TRIMETIL PROP central:en cetonas:al {:

113

Page 127: Estudo e Desenvolvimento de um Protótipo de Análise de Nomes

2589 frame2.saida.setForeground(Color.RED);

2590 frame2.saida.setText(" Nome incorreto.\n Com o prefixo PROP n~ao podemos\n utilizar

2591 da ramificac~ao TRIMETIL, pois\n n~ao podemos ter mais que 3 carbonos");

2592 :}

2593 ;

2594

2595 /* ************** Eteres **************** */

2596

2597 eter ::= eterMet:me

2598 {: RESULT = me; :}

2599 | eterMetEt:mt

2600 {: RESULT = mt; :}

2601 | eterMetProp:mp

2602 {: RESULT = mp; :}

2603 | eterEt: ae

2604 {: RESULT = ae; :}

2605 | eterEtProp: ep

2606 {: RESULT = ep; :}

2607 | eterProp: ap

2608 {: RESULT = ap; :}

2609 ;

2610

2611

2612 eterMet ::= MET OXI ESPACO MET central:en hidrocarboneto:al {:

2613 if(en.equals("in") || en.equals("en") || en.equals("adien")){

2614 frame2.saida.setFont(new Font("Arial", Font.PLAIN, 15));

2615 frame2.saida.setForeground(Color.RED);

2616 frame2.saida.setText(" Atenc~ao, com o prefixo met n~ao podemos utilizar este tipo de ligac~ao.");

2617 }else{

2618 frame2.saida.setForeground(Color.BLUE);

2619 frame2.saida.setText(" Nome correto.\n \n Esta substancia e um Eter \n Possuindo 1

2620 carbono (met) representando o carnono de menor radical,\n recebendo o radical (oxi)

2621 \n e recebendo o nome do hidrocarboneto de maior radical \n com prefixo (met), ligac~ao

2622 simples ("+en+") e \n pertencendo ao grupo hidrocarboneto ("+al+")");

2623 frame2.est.setText("\n \n C(O)C ");

2624 }

2625 :}

2626 ;

2627

2628 eterMetEt ::= MET OXI ESPACO numero:num ET central:en hidrocarboneto:al {:

2629 if(Integer.parseInt(num) > 2){

2630 frame2.saida.setFont(new Font("Arial", Font.PLAIN, 15));

2631 frame2.saida.setForeground(Color.RED);

2632 frame2.saida.setText(" Numero da posic~ao esta incorreto.\n Com o prefixo ET so

2633 podemos ter 2 carbonos na cadeia principal");

2634 }else{

2635 if(en.equals("an")){

2636 frame2.saida.setForeground(Color.RED);

2637 frame2.saida.setText(" Nome incorreto.\n N~ao e permitido colocar posic~ao em ligac~ao simples.");

2638 }else{

2639 if(en.equals("adien")){

2640 frame2.saida.setForeground(Color.RED);

2641 frame2.saida.setText(" Nome incorreto.\n N~ao e permitido este tipo de ligac~ao com prefixo et.");

2642 }else{

2643 if(Integer.parseInt(num) == 2){

2644 frame2.saida.setForeground(Color.RED);

2645 frame2.saida.setText(" Numero da ligac~ao esta incorreto.\n N~ao podemos colocar a

2646 ligac~ao neste carbono");

2647 }else{

2648 if(en.equals("en")){

2649 frame2.saida.setForeground(Color.BLUE);

2650 frame2.saida.setText(" Nome correto.\n \n Esta substancia e um Eter \n Possuindo 1

2651 carbono (met) representando o carnono de menor radical,\n recebendo o radical (oxi)

2652 \n e recebendo o nome do hidrocarboneto de maior radical \n com prefixo (met), ligac~ao

2653 dupla ("+en+") e \n pertencendo ao grupo hidrocarboneto ("+al+")");

2654 frame2.est.setText("\n \n C(O)C=C ");

2655 }else{

2656 frame2.saida.setForeground(Color.BLUE);

2657 frame2.saida.setText(" Nome correto.\n \n Esta substancia e um Eter \n Possuindo 1

2658 carbono (met) representando o carnono de menor radical,\n recebendo o radical (oxi)

2659 \n e recebendo o nome do hidrocarboneto de maior radical \n com prefixo (met), ligac~ao

2660 tripla ("+en+") e \n pertencendo ao grupo hidrocarboneto ("+al+")");

2661 frame2.est.setText("\n \n C(O)C#C ");

2662 }

114

Page 128: Estudo e Desenvolvimento de um Protótipo de Análise de Nomes

2663 }

2664 }

2665 }

2666 }

2667 :}

2668 | MET OXI ESPACO ET central:en hidrocarboneto:al {:

2669 if(en.equals("in")|| en.equals("en")){

2670 frame2.saida.setFont(new Font("Arial", Font.PLAIN, 15));

2671 frame2.saida.setForeground(Color.RED);

2672 frame2.saida.setText(" Atenc~ao, e necessario informar a posic~ao da ligac~ao.");

2673 }else{

2674 if(en.equals("adien")){

2675 frame2.saida.setForeground(Color.RED);

2676 frame2.saida.setText(" Nome incorreto.\n N~ao e permitido este tipo de ligac~ao com prefixo et.");

2677 }else{

2678 frame2.saida.setForeground(Color.BLUE);

2679 frame2.saida.setText(" Nome correto.\n \n Esta substancia e um Eter \n Possuindo 1

2680 carbono (met) representando o carbono de menor radical,\n recebendo o radical (oxi)

2681 \n e recebendo o nome do hidrocarboneto de maior radical \n com prefixo (met), ligac~ao

2682 simples ("+en+") e \n pertencendo ao grupo hidrocarboneto ("+al+")");

2683 frame2.est.setText("\n \n C(O)CC ");

2684 }

2685 }

2686 :}

2687 ;

2688

2689 eterMetProp ::= MET OXI ESPACO numero:num PROP central:en hidrocarboneto:al {:

2690 if(Integer.parseInt(num) > 3){

2691 frame2.saida.setFont(new Font("Arial", Font.PLAIN, 15));

2692 frame2.saida.setForeground(Color.RED);

2693 frame2.saida.setText(" Numero da posic~ao esta incorreto.\n Com o prefixo PROP so

2694 podemos ter 3 carbonos na cadeia principal");

2695 }else{

2696 if(en.equals("an")){

2697 frame2.saida.setForeground(Color.RED);

2698 frame2.saida.setText(" Nome incorreto. \n N~ao e permitido colocar posic~ao em ligac~ao simples.");

2699 }else{

2700 if(en.equals("adien")){

2701 frame2.saida.setForeground(Color.RED);

2702 frame2.saida.setText(" Nome incorreto.\n E nesessario informar duas posic~oes.");

2703 }else{

2704 if(Integer.parseInt(num) == 3){

2705 frame2.saida.setForeground(Color.RED);

2706 frame2.saida.setText(" Nome incorreto. \n N~ao e permitido colocar ligac~ao neste carbono.");

2707 }else{

2708 if(en.equals("en")){

2709 if(Integer.parseInt(num)==1){

2710 frame2.saida.setForeground(Color.BLUE);

2711 frame2.saida.setText(" Nome correto.\n \n Esta substancia e um Eter \n Possuindo 1

2712 carbono (met) representando o carbono de menor radical,\n recebendo o radical (oxi)

2713 \n e recebendo o nome do hidrocarboneto de maior radical \n com prefixo (prop), ligac~ao

2714 dupla ("+en+") e \n pertencendo ao grupo hidrocarboneto ("+al+")");

2715 frame2.est.setText("\n \n C(O)C=CC ");

2716 }else{

2717 if(Integer.parseInt(num)==2){

2718 frame2.saida.setForeground(Color.BLUE);

2719 frame2.saida.setText(" Nome correto.\n \n Esta substancia e um Eter \n Possuindo 1

2720 carbono (met) representando o carbono de menor radical,\n recebendo o radical (oxi)

2721 \n e recebendo o nome do hidrocarboneto de maior radical \n com prefixo (prop), ligac~ao

2722 dupla ("+en+") e \n pertencendo ao grupo hidrocarboneto ("+al+")");

2723 frame2.est.setText("\n \n C(O)CC=C ");

2724 }

2725 }

2726 }else{

2727 if(en.equals("in")){

2728 if(Integer.parseInt(num)==1){

2729 frame2.saida.setForeground(Color.BLUE);

2730 frame2.saida.setText(" Nome correto.\n \n Esta substancia e um Eter \n Possuindo 1

2731 carbono (met) representando o carbono de menor radical,\n recebendo o radical (oxi)

2732 \n e recebendo o nome do hidrocarboneto de maior radical \n com prefixo (prop), ligac~ao

2733 tripla ("+en+") e \n pertencendo ao grupo hidrocarboneto ("+al+")");

2734 frame2.est.setText("\n \n C(O)C#CC ");

2735 }else{

2736 if(Integer.parseInt(num)==2){

115

Page 129: Estudo e Desenvolvimento de um Protótipo de Análise de Nomes

2737 frame2.saida.setForeground(Color.BLUE);

2738 frame2.saida.setText(" Nome correto.\n \n Esta substancia e um Eter \n Possuindo 1

2739 carbono (met) representando o carbono de menor radical,\n recebendo o radical (oxi)

2740 \n e recebendo o nome do hidrocarboneto de maior radical \n com prefixo (prop), ligac~ao

2741 tripla ("+en+") e \n pertencendo ao grupo hidrocarboneto ("+al+")");

2742 frame2.est.setText("\n \n C(O)CC#C ");

2743 }

2744 }

2745 }

2746 }

2747 }

2748 }

2749 }

2750 }

2751 :}

2752 | MET OXI ESPACO PROP central:en hidrocarboneto:al {:

2753 if(en.equals("in")|| en.equals("en")|| en.equals("adien")){

2754 frame2.saida.setForeground(Color.RED);

2755 frame2.saida.setText(" Atenc~ao, e necessario informar a posic~ao da ligac~ao.");

2756 }else{

2757 frame2.saida.setForeground(Color.BLUE);

2758 frame2.saida.setText(" Nome correto.\n \n Esta substancia e um Eter \n Possuindo 1

2759 carbono (met) representando o carbono de menor radical,\n recebendo o radical (oxi)

2760 \n e recebendo o nome do hidrocarboneto de maior radical \n com prefixo (prop), ligac~ao

2761 simples ("+en+") e \n pertencendo ao grupo hidrocarboneto ("+al+")");

2762 frame2.est.setText("\n \n C(O)CCC ");

2763 }

2764 :}

2765 | MET OXI ESPACO numero:nu numero:me PROP central:en hidrocarboneto:al {:

2766 if(Integer.parseInt(nu)>3 || Integer.parseInt(me)>3){

2767 frame2.saida.setForeground(Color.RED);

2768 frame2.saida.setText(" Numero da posic~ao esta incorreto.\n Com o prefixo PROP so

2769 podemos ter 3 carbonos na cadeia principal");

2770 }else{

2771 if(en.equals("in")|| en.equals("en")){

2772 frame2.saida.setForeground(Color.RED);

2773 frame2.saida.setText(" Nome incorreto.\n E necessario informar a posic~ao da

2774 ligac~ao com apenas 1 posic~ao.");

2775 }else{

2776 if(en.equals("an")){

2777 frame2.saida.setForeground(Color.RED);

2778 frame2.saida.setText(" Nome incorreto.\n N~ao e permitido colocar posic~ao em ligac~ao simples.");

2779 }else{

2780 if(Integer.parseInt(nu) == 3 || Integer.parseInt(me) == 3){

2781 frame2.saida.setForeground(Color.RED);

2782 frame2.saida.setText(" Nome incorreto. \n N~ao e permitido colocar ligac~ao neste carbono.");

2783 }else{

2784 if(Integer.parseInt(nu)==1 && Integer.parseInt(me)==1){

2785 frame2.saida.setForeground(Color.RED);

2786 frame2.saida.setText(" Nome incorreto.\n N~ao e possivel colocar as duas ligac~oes neste carbono.");

2787 }else{

2788 if(Integer.parseInt(nu)==2 && Integer.parseInt(me)==2){

2789 frame2.saida.setForeground(Color.RED);

2790 frame2.saida.setText(" Nome incorreto.\n N~ao e possivel colocar as duas\n ligac~oes neste carbono.");

2791 }else{

2792 frame2.saida.setForeground(Color.BLUE);

2793 frame2.saida.setText(" Nome correto.\n \n Esta substancia e um Eter \n Possuindo 1

2794 carbono (met) representando o carbono de menor radical,\n recebendo o radical (oxi)

2795 \n e recebendo o nome do hidrocarboneto de maior radical \n com prefixo (prop), duas

2796 duplas ligac~oes ("+en+") e \n pertencendo ao grupo hidrocarboneto ("+al+")");

2797 frame2.est.setText("\n \n C(O)C=C=C ");

2798 }

2799 }

2800 }

2801 }

2802 }

2803 }

2804 :}

2805 | MET OXI ESPACO numero:ero METIL numero:num PROP central:en hidrocarboneto:al {:

2806 if(Integer.parseInt(num) > 3 || Integer.parseInt(ero) > 3){

2807 frame2.saida.setForeground(Color.RED);

2808 frame2.saida.setText(" Numero da posic~ao esta incorreto.\n Com o prefixo PROP so

2809 podemos ter 3 carbonos na cadeia principal");

2810 }else{

116

Page 130: Estudo e Desenvolvimento de um Protótipo de Análise de Nomes

2811 if(Integer.parseInt(ero) == 1 || Integer.parseInt(ero) == 3){

2812 frame2.saida.setForeground(Color.RED);

2813 frame2.saida.setText(" Nome incorreto.\n Pois se colocar a ramificac~ao METIL na

2814 posic~ao 1 ou 3\n n~ao sera mais um prop e sim um but");

2815 }else{

2816 if(en.equals("an")){

2817 frame2.saida.setForeground(Color.RED);

2818 frame2.saida.setText(" Nome incorreto. \n N~ao e permitido colocar posic~ao em ligac~ao simples.");

2819 }else{

2820 if(en.equals("adien")){

2821 frame2.saida.setForeground(Color.RED);

2822 frame2.saida.setText(" Nome incorreto.\n E nesessario informar duas posic~oes.");

2823 }else{

2824 if(Integer.parseInt(num) == 3){

2825 frame2.saida.setForeground(Color.RED);

2826 frame2.saida.setText(" Nome incorreto. \n N~ao e permitido colocar ligac~ao neste carbono.");

2827 }else{

2828 if(en.equals("en")){

2829 if(Integer.parseInt(num)==1){

2830 frame2.saida.setForeground(Color.BLUE);

2831 frame2.saida.setText(" Nome correto.\n \n Esta substancia e um Eter \n Possuindo 1

2832 carbono (met) representando o carbono de menor radical,\n recebendo o radical (oxi)

2833 \n e recebendo o nome do hidrocarboneto de maior radical \n com prefixo (prop), ligac~ao

2834 dupla ("+en+"), \n com ramificac~ao metil na posic~ao ("+ero+") e \n pertencendo ao grupo

2835 hidrocarboneto ("+al+")");

2836 frame2.est.setText("\n \n C(O)C=C(C)C ");

2837 }else{

2838 if(Integer.parseInt(num)==2){

2839 frame2.saida.setForeground(Color.BLUE);

2840 frame2.saida.setText(" Nome correto.\n \n Esta substancia e um Eter \n Possuindo 1

2841 carbono (met) representando o carbono de menor radical,\n recebendo o radical (oxi)

2842 \n e recebendo o nome do hidrocarboneto de maior radical \n com prefixo (prop), ligac~ao

2843 dupla ("+en+"), \n com ramificac~ao metil na posic~ao ("+ero+") e \n pertencendo ao grupo

2844 hidrocarboneto ("+al+")");

2845 frame2.est.setText("\n \n C(O)CC=(C)C ");

2846 }

2847 }

2848 }else{

2849 if(en.equals("in")){

2850 if(Integer.parseInt(num)==1){

2851 frame2.saida.setForeground(Color.BLUE);

2852 frame2.saida.setText(" Nome correto.\n \n Esta substancia e um Eter \n Possuindo 1

2853 carbono (met) representando o carbono de menor radical,\n recebendo o radical (oxi)

2854 \n e recebendo o nome do hidrocarboneto de maior radical \n com prefixo (prop), ligac~ao

2855 tripla ("+en+"), \n com ramificac~ao metil na posic~ao ("+ero+") e \n pertencendo ao

2856 grupo hidrocarboneto ("+al+")");

2857 frame2.est.setText("\n \n C(O)C#C(C)C ");

2858 }else{

2859 if(Integer.parseInt(num)==2){

2860 frame2.saida.setForeground(Color.BLUE);

2861 frame2.saida.setText(" Nome correto.\n \n Esta substancia e um Eter \n Possuindo 1

2862 carbono (met) representando o carbono de menor radical,\n recebendo o radical (oxi)

2863 \n e recebendo o nome do hidrocarboneto de maior radical \n com prefixo (prop), ligac~ao

2864 tripla ("+en+"),\n com ramificac~ao metil na posic~ao ("+ero+") e \n pertencendo ao

2865 grupo hidrocarboneto ("+al+")");

2866 frame2.est.setText("\n \n C(O)CC#(C)C ");

2867 }

2868 }

2869 }

2870 }

2871 }

2872 }

2873 }

2874 }

2875 }

2876 :}

2877 | MET OXI ESPACO numero:ero METIL PROP central:en hidrocarboneto:al {:

2878 if(Integer.parseInt(ero)>3){

2879 frame2.saida.setForeground(Color.RED);

2880 frame2.saida.setText(" Numero da posic~ao esta incorreto.\n Com o prefixo PROP

2881 so podemos ter 3 carbonos na cadeia principal");

2882 }else{

2883 if(en.equals("in")|| en.equals("en")|| en.equals("adien")){

2884 frame2.saida.setForeground(Color.RED);

117

Page 131: Estudo e Desenvolvimento de um Protótipo de Análise de Nomes

2885 frame2.saida.setText(" Atenc~ao, e necessario informar a posic~ao da ligac~ao.");

2886 }else{

2887 if(Integer.parseInt(ero) == 1 || Integer.parseInt(ero) == 3){

2888 frame2.saida.setForeground(Color.RED);

2889 frame2.saida.setText(" Nome incorreto,\n Pois se colocar a ramificac~ao METIL na

2890 posic~ao 1 ou 3\n n~ao sera mais um prop e sim um but");

2891 }else{

2892 frame2.saida.setForeground(Color.BLUE);

2893 frame2.saida.setText(" Nome correto.\n \n Esta substancia e um Eter \n Possuindo 1

2894 carbono (met) representando o carbono de menor radical,\n recebendo o radical (oxi)

2895 \n e recebendo o nome do hidrocarboneto de maior radical \n com prefixo (prop), ligac~ao

2896 simples ("+en+"),\n com ramificac~ao metil na posic~ao ("+ero+") e \n pertencendo ao

2897 grupo hidrocarboneto ("+al+")");

2898 frame2.est.setText("\n \n C(O)CC(C)C ");

2899 }

2900 }

2901 }

2902 :}

2903 | MET OXI ESPACO numero:ero METIL numero:nu numero:me PROP central:en hidrocarboneto:al {:

2904 if(Integer.parseInt(nu)>3 || Integer.parseInt(me)>3 || Integer.parseInt(ero)>3){

2905 frame2.saida.setForeground(Color.RED);

2906 frame2.saida.setText(" Numero da posic~ao esta incorreto.\n Com o prefixo PROP

2907 so podemos ter 3 carbonos na cadeia principal");

2908 }else{

2909 if(en.equals("in")|| en.equals("en")){

2910 frame2.saida.setForeground(Color.RED);

2911 frame2.saida.setText(" Nome incorreto.\n E necessario informar a posic~ao da

2912 ligac~ao com apenas 1 posic~ao.");

2913 }else{

2914 if(Integer.parseInt(ero) == 1 || Integer.parseInt(ero) == 3){

2915 frame2.saida.setForeground(Color.RED);

2916 frame2.saida.setText(" Nome incorreto.\n Pois se colocar a ramificac~ao METIL na

2917 posic~ao 1 ou 3\n n~ao sera mais um prop e sim um but");

2918 }else{

2919 if(en.equals("an")){

2920 frame2.saida.setForeground(Color.RED);

2921 frame2.saida.setText(" Nome incorreto.\n N~ao e permitido colocar posic~ao em ligac~ao simples.");

2922 }else{

2923 if(Integer.parseInt(nu) == 3 || Integer.parseInt(me) == 3){

2924 frame2.saida.setForeground(Color.RED);

2925 frame2.saida.setText(" Nome incorreto. \n N~ao e permitido colocar ligac~ao neste carbono.");

2926 }else{

2927 if(Integer.parseInt(nu)==1 && Integer.parseInt(me)==1){

2928 frame2.saida.setForeground(Color.RED);

2929 frame2.saida.setText(" Nome incorreto.\n N~ao e possivel colocar as duas ligac~oes neste carbono.");

2930 }else{

2931 if(Integer.parseInt(nu)==2 && Integer.parseInt(me)==2){

2932 frame2.saida.setForeground(Color.RED);

2933 frame2.saida.setText(" Nome incorreto.\n N~ao e possivel colocar as duas\n ligac~oes neste carbono.");

2934 }else{

2935 frame2.saida.setForeground(Color.BLUE);

2936 frame2.saida.setText(" Nome correto.\n \n Esta substancia e um Eter \n Possuindo 1

2937 carbono (met) representando o carbono de menor radical,\n recebendo o radical (oxi)

2938 \n e recebendo o nome do hidrocarboneto de maior radical \n com prefixo (prop), duas

2939 duplas ligac~oes ("+en+") na posic~ao ("+nu+","+me+"),\n com ramificac~ao metil na posic~ao

2940 ("+ero+") e \n pertencendo ao grupo hidrocarboneto ("+al+")");

2941 frame2.est.setText("\n \n C(O)C=C=(C)C ");

2942 }

2943 }

2944 }

2945 }

2946 }

2947 }

2948 }

2949 :}

2950 ;

2951

2952

2953 eterEt ::= ET OXI ESPACO numero:num ET central:en hidrocarboneto:al {:

2954 if(Integer.parseInt(num) > 2){

2955 frame2.saida.setFont(new Font("Arial", Font.PLAIN, 15));

2956 frame2.saida.setForeground(Color.RED);

2957 frame2.saida.setText(" Numero da posic~ao esta incorreto.\n Com o prefixo ET

2958 so podemos ter 2 carbonos na cadeia principal");

118

Page 132: Estudo e Desenvolvimento de um Protótipo de Análise de Nomes

2959 }else{

2960 if(en.equals("an")){

2961 frame2.saida.setForeground(Color.RED);

2962 frame2.saida.setText(" Nome incorreto.\n N~ao e permitido colocar posic~ao em ligac~ao simples.");

2963 }else{

2964 if(en.equals("adien")){

2965 frame2.saida.setForeground(Color.RED);

2966 frame2.saida.setText(" Nome incorreto.\n N~ao e permitido este tipo de ligac~ao com prefixo et.");

2967 }else{

2968 if(Integer.parseInt(num) == 2){

2969 frame2.saida.setForeground(Color.RED);

2970 frame2.saida.setText(" Numero da ligac~ao esta incorreto.\n N~ao podemos colocar

2971 a ligac~ao neste carbono");

2972 }else{

2973 if(en.equals("en")){

2974 frame2.saida.setForeground(Color.BLUE);

2975 frame2.saida.setText(" Nome correto.\n \n Esta substancia e um Eter \n Possuindo 2

2976 carbonos (et) representando o carnono de menor radical,\n recebendo o radical (oxi)

2977 \n e recebendo o nome do hidrocarboneto de maior radical \n com prefixo (met), ligac~ao

2978 dupla ("+en+") e \n pertencendo ao grupo hidrocarboneto ("+al+")");

2979 frame2.est.setText("\n \n CC(O)C=C ");

2980 }else{

2981 frame2.saida.setForeground(Color.BLUE);

2982 frame2.saida.setText(" Nome correto.\n \n Esta substancia e um Eter \n Possuindo 2

2983 carbonos (et) representando o carnono de menor radical,\n recebendo o radical (oxi)

2984 \n e recebendo o nome do hidrocarboneto de maior radical \n com prefixo (met), ligac~ao

2985 tripla ("+en+") e \n pertencendo ao grupo hidrocarboneto ("+al+")");

2986 frame2.est.setText("\n \n CC(O)C#C ");

2987 }

2988 }

2989 }

2990 }

2991 }

2992 :}

2993 | ET OXI ESPACO ET central:en hidrocarboneto:al {:

2994 if(en.equals("in")|| en.equals("en")){

2995 frame2.saida.setForeground(Color.RED);

2996 frame2.saida.setText(" Atenc~ao, e necessario informar a posic~ao da ligac~ao.");

2997 }else{

2998 if(en.equals("adien")){

2999 frame2.saida.setForeground(Color.RED);

3000 frame2.saida.setText(" Nome incorreto.\n N~ao e permitido este tipo de ligac~ao com prefixo et.");

3001 }else{

3002 frame2.saida.setForeground(Color.BLUE);

3003 frame2.saida.setText(" Nome correto.\n \n Esta substancia e um Eter \n Possuindo 2

3004 carbonos (et) representando o carbono de menor radical,\n recebendo o radical (oxi)

3005 \n e recebendo o nome do hidrocarboneto de maior radical \n com prefixo (met), ligac~ao

3006 simples ("+en+") e \n pertencendo ao grupo hidrocarboneto ("+al+")");

3007 frame2.est.setText("\n \n CC(O)CC ");

3008 }

3009 }

3010 :}

3011 | ET OXI ESPACO MET central:en hidrocarboneto:al {:

3012 frame2.saida.setForeground(Color.RED);

3013 frame2.saida.setText(" Atenc~ao,\n E necessario informar primeiro o prefixo\n que

3014 indica o numero de carbonos \n do menor radical e depois o nome do \n hidrocarboneto

3015 correspondente \n ao maior radical.");

3016 :}

3017 ;

3018

3019 eterEtProp ::= ET OXI ESPACO numero:num PROP central:en hidrocarboneto:al {:

3020 if(Integer.parseInt(num) > 3){

3021 frame2.saida.setFont(new Font("Arial", Font.PLAIN, 15));

3022 frame2.saida.setForeground(Color.RED);

3023 frame2.saida.setText(" Numero da posic~ao esta incorreto.\n Com o prefixo PROP so podemos

3024 ter 3 carbonos na cadeia principal");

3025 }else{

3026 if(en.equals("an")){

3027 frame2.saida.setForeground(Color.RED);

3028 frame2.saida.setText(" Nome incorreto, \n N~ao e permitido colocar posic~ao em ligac~ao simples.");

3029 }else{

3030 if(en.equals("adien")){

3031 frame2.saida.setForeground(Color.RED);

3032 frame2.saida.setText(" Nome incorreto,\n E nesessario informar duas posic~oes.");

119

Page 133: Estudo e Desenvolvimento de um Protótipo de Análise de Nomes

3033 }else{

3034 if(Integer.parseInt(num) == 3){

3035 frame2.saida.setForeground(Color.RED);

3036 frame2.saida.setText(" Nome incorreto. \n N~ao e permitido colocar ligac~ao neste carbono.");

3037 }else{

3038 if(en.equals("en")){

3039 if(Integer.parseInt(num)==1){

3040 frame2.saida.setForeground(Color.BLUE);

3041 frame2.saida.setText(" Nome correto.\n \n Esta substancia e um Eter \n Possuindo 2

3042 carbonos (et) representando o carbono de menor radical,\n recebendo o radical (oxi)

3043 \n e recebendo o nome do hidrocarboneto de maior radical \n com prefixo (prop), ligac~ao

3044 dupla ("+en+") e \n pertencendo ao grupo hidrocarboneto ("+al+")");

3045 frame2.est.setText("\n \n CC(O)C=CC ");

3046 }else{

3047 if(Integer.parseInt(num)==2){

3048 frame2.saida.setForeground(Color.BLUE);

3049 frame2.saida.setText(" Nome correto.\n \n Esta substancia e um Eter \n Possuindo 2

3050 carbonos (et) representando o carbono de menor radical,\n recebendo o radical (oxi)

3051 \n e recebendo o nome do hidrocarboneto de maior radical \n com prefixo (prop), ligac~ao

3052 dupla ("+en+") e \n pertencendo ao grupo hidrocarboneto ("+al+")");

3053 frame2.est.setText("\n \n CC(O)CC=C ");

3054 }

3055 }

3056 }else{

3057 if(en.equals("in")){

3058 if(Integer.parseInt(num)==1){

3059 frame2.saida.setForeground(Color.BLUE);

3060 frame2.saida.setText(" Nome correto.\n \n Esta substancia e um Eter \n Possuindo 2

3061 carbonos (et) representando o carbono de menor radical,\n recebendo o radical (oxi)

3062 \n e recebendo o nome do hidrocarboneto de maior radical \n com prefixo (prop), ligac~ao

3063 tripla ("+en+") e \n pertencendo ao grupo hidrocarboneto ("+al+")");

3064 frame2.est.setText("\n \n CC(O)C#CC ");

3065 }else{

3066 if(Integer.parseInt(num)==2){

3067 frame2.saida.setForeground(Color.BLUE);

3068 frame2.saida.setText(" Nome correto.\n \n Esta substancia e um Eter \n Possuindo 2

3069 carbonos (et) representando o carbono de menor radical,\n recebendo o radical (oxi)

3070 \n e recebendo o nome do hidrocarboneto de maior radical \n com prefixo (prop), ligac~ao

3071 tripla ("+en+") e \n pertencendo ao grupo hidrocarboneto ("+al+")");

3072 frame2.est.setText("\n \n CC(O)CC#C ");

3073 }

3074 }

3075 }

3076 }

3077 }

3078 }

3079 }

3080 }

3081 :}

3082 | ET OXI ESPACO PROP central:en hidrocarboneto:al {:

3083 if(en.equals("in")|| en.equals("en")|| en.equals("adien")){

3084 frame2.saida.setForeground(Color.BLUE);

3085 frame2.saida.setText(" Atenc~ao, e necessario informar a posic~ao da ligac~ao.");

3086 }else{

3087 frame2.saida.setForeground(Color.BLUE);

3088 frame2.saida.setText(" Nome correto.\n \n Esta substancia e um Eter \n Possuindo 2

3089 carbonos (et) representando o carbono de menor radical,\n recebendo o radical (oxi)

3090 \n e recebendo o nome do hidrocarboneto de maior radical \n com prefixo (prop), ligac~ao

3091 simples ("+en+") e \n pertencendo ao grupo hidrocarboneto ("+al+")");

3092 frame2.est.setText("\n \n CC(O)CCC ");

3093 }

3094 :}

3095 | ET OXI ESPACO numero:nu numero:me PROP central:en hidrocarboneto:al {:

3096 if(Integer.parseInt(nu)>3 || Integer.parseInt(me)>3){

3097 frame2.saida.setForeground(Color.RED);

3098 frame2.saida.setText(" Numero da posic~ao esta incorreto.\n Com o prefixo PROP so podemos

3099 ter 3 carbonos na cadeia principal");

3100 }else{

3101 if(en.equals("in")|| en.equals("en")){

3102 frame2.saida.setForeground(Color.RED);

3103 frame2.saida.setText(" Nome incorreto.\n E necessario informar a posic~ao da ligac~ao

3104 com apenas 1 posic~ao.");

3105 }else{

3106 if(en.equals("an")){

120

Page 134: Estudo e Desenvolvimento de um Protótipo de Análise de Nomes

3107 frame2.saida.setForeground(Color.RED);

3108 frame2.saida.setText(" Nome incorreto.\n N~ao e permitido colocar posic~ao em ligac~ao simples.");

3109 }else{

3110 if(Integer.parseInt(nu) == 3 || Integer.parseInt(me) == 3){

3111 frame2.saida.setForeground(Color.RED);

3112 frame2.saida.setText(" Nome incorreto. \n N~ao e permitido colocar ligac~ao neste carbono.");

3113 }else{

3114 if(Integer.parseInt(nu)==1 && Integer.parseInt(me)==1){

3115 frame2.saida.setForeground(Color.RED);

3116 frame2.saida.setText(" Nome incorreto.\n N~ao e possivel colocar as duas ligac~oes neste carbono.");

3117 }else{

3118 if(Integer.parseInt(nu)==2 && Integer.parseInt(me)==2){

3119 frame2.saida.setForeground(Color.RED);

3120 frame2.saida.setText(" Nome incorreto.\n N~ao e possivel colocar as duas\n ligac~oes neste carbono.");

3121 }else{

3122 frame2.saida.setForeground(Color.BLUE);

3123 frame2.saida.setText(" Nome correto.\n \n Esta substancia e um Eter \n Possuindo 1

3124 carbono (met) representando o carbono de menor radical,\n recebendo o radical (oxi)

3125 \n e recebendo o nome do hidrocarboneto de maior radical \n com prefixo (prop), duas

3126 duplas ligac~oes ("+en+") e \n pertencendo ao grupo hidrocarboneto ("+al+")");

3127 frame2.est.setText("\n \n CC(O)C=C=C ");

3128 }

3129 }

3130 }

3131 }

3132 }

3133 }

3134 :}

3135

3136 | ET OXI ESPACO numero:ero METIL numero:num PROP central:en hidrocarboneto:al {:

3137 if(Integer.parseInt(num) > 3 || Integer.parseInt(ero) > 3){

3138 frame2.saida.setForeground(Color.RED);

3139 frame2.saida.setText(" Numero da posic~ao esta incorreto.\n Com o prefixo PROP

3140 so podemos ter 3 carbonos na cadeia principal");

3141 }else{

3142 if(Integer.parseInt(ero) == 1 || Integer.parseInt(ero) == 3){

3143 frame2.saida.setForeground(Color.RED);

3144 frame2.saida.setText(" Nome incorreto.\n Pois se colocar a ramificac~ao METIL na

3145 posic~ao 1 ou 3\n n~ao sera mais um prop e sim um but");

3146 }else{

3147 if(en.equals("an")){

3148 frame2.saida.setForeground(Color.RED);

3149 frame2.saida.setText(" Nome incorreto, \n N~ao e permitido colocar posic~ao em ligac~ao simples.");

3150 }else{

3151 if(en.equals("adien")){

3152 frame2.saida.setForeground(Color.RED);

3153 frame2.saida.setText(" Nome incorreto,\n E nesessario informar duas posic~oes.");

3154 }else{

3155 if(Integer.parseInt(num) == 3){

3156 frame2.saida.setForeground(Color.RED);

3157 frame2.saida.setText(" Nome incorreto. \n N~ao e permitido colocar ligac~ao neste carbono.");

3158 }else{

3159 if(en.equals("en")){

3160 if(Integer.parseInt(num)==1){

3161 frame2.saida.setForeground(Color.BLUE);

3162 frame2.saida.setText(" Nome correto.\n \n Esta substancia e um Eter \n Possuindo 2

3163 carbonos (et) representando o carbono de menor radical,\n recebendo o radical (oxi)

3164 \n e recebendo o nome do hidrocarboneto de maior radical \n com prefixo (prop), ligac~ao

3165 dupla ("+en+"), \n com ramificac~ao metil na posic~ao ("+ero+") e \n pertencendo ao

3166 grupo hidrocarboneto ("+al+")");

3167 frame2.est.setText("\n \n CC(O)C=C(C)C ");

3168 }else{

3169 if(Integer.parseInt(num)==2){

3170 frame2.saida.setForeground(Color.BLUE);

3171 frame2.saida.setText(" Nome correto.\n \n Esta substancia e um Eter \n Possuindo 2

3172 carbonos (et) representando o carbono de menor radical,\n recebendo o radical (oxi)

3173 \n e recebendo o nome do hidrocarboneto de maior radical \n com prefixo (prop), ligac~ao

3174 dupla ("+en+"), \n com ramificac~ao metil na posic~ao ("+ero+") e \n pertencendo ao

3175 grupo hidrocarboneto ("+al+")");

3176 frame2.est.setText("\n \n CC(O)CC=(C)C ");

3177 }

3178 }

3179 }else{

3180 if(en.equals("in")){

121

Page 135: Estudo e Desenvolvimento de um Protótipo de Análise de Nomes

3181 if(Integer.parseInt(num)==1){

3182 frame2.saida.setForeground(Color.BLUE);

3183 frame2.saida.setText(" Nome correto.\n \n Esta substancia e um Eter \n Possuindo 2

3184 carbonos (et) representando o carbono de menor radical,\n recebendo o radical (oxi)

3185 \n e recebendo o nome do hidrocarboneto de maior radical \n com prefixo (prop), ligac~ao

3186 tripla ("+en+"), \n com ramificac~ao metil na posic~ao ("+ero+") e \n pertencendo ao

3187 grupo hidrocarboneto ("+al+")");

3188 frame2.est.setText("\n \n CC(O)C#C(C)C ");

3189 }else{

3190 if(Integer.parseInt(num)==2){

3191 frame2.saida.setForeground(Color.BLUE);

3192 frame2.saida.setText(" Nome correto.\n \n Esta substancia e um Eter \n Possuindo 2

3193 carbonos (et) representando o carbono de menor radical,\n recebendo o radical (oxi)

3194 \n e recebendo o nome do hidrocarboneto de maior radical \n com prefixo (prop), ligac~ao

3195 tripla ("+en+"),\n com ramificac~ao metil na posic~ao ("+ero+") e \n pertencendo ao

3196 grupo hidrocarboneto ("+al+")");

3197 frame2.est.setText("\n \n CC(O)CC#(C)C ");

3198 }

3199 }

3200 }

3201 }

3202 }

3203 }

3204 }

3205 }

3206 }

3207 :}

3208 | ET OXI ESPACO numero:ero METIL PROP central:en hidrocarboneto:al {:

3209 if(Integer.parseInt(ero)>3){

3210 frame2.saida.setForeground(Color.RED);

3211 frame2.saida.setText(" Numero da posic~ao esta incorreto.\n Com o prefixo PROP

3212 so podemos ter 3 carbonos na cadeia principal");

3213 }else{

3214 if(en.equals("in")|| en.equals("en")|| en.equals("adien")){

3215 frame2.saida.setForeground(Color.RED);

3216 frame2.saida.setText(" Atenc~ao, e necessario informar a posic~ao da ligac~ao.");

3217 }else{

3218 if(Integer.parseInt(ero) == 1 || Integer.parseInt(ero) == 3){

3219 frame2.saida.setForeground(Color.RED);

3220 frame2.saida.setText(" Nome incorreto.\n Pois se colocar a ramificac~ao METIL na posic~ao

3221 1 ou 3\n n~ao sera mais um prop e sim um but");

3222 }else{

3223 frame2.saida.setForeground(Color.BLUE);

3224 frame2.saida.setText(" Nome correto.\n \n Esta substancia e um Eter \n Possuindo 2

3225 carbonos (et) representando o carbono de menor radical,\n recebendo o radical (oxi)

3226 \n e recebendo o nome do hidrocarboneto de maior radical \n com prefixo (prop), ligac~ao

3227 simples ("+en+"),\n com ramificac~ao metil na posic~ao ("+ero+") e \n pertencendo ao

3228 grupo hidrocarboneto ("+al+")");

3229 frame2.est.setText("\n \n CC(O)CC(C)C ");

3230 }

3231 }

3232 }

3233 :}

3234 | ET OXI ESPACO numero:ero METIL numero:nu numero:me PROP central:en hidrocarboneto:al {:

3235 if(Integer.parseInt(nu)>3 || Integer.parseInt(me)>3 || Integer.parseInt(ero)>3){

3236 frame2.saida.setForeground(Color.RED);

3237 frame2.saida.setText(" Numero da posic~ao esta incorreto.\n Com o prefixo PROP

3238 so podemos ter 3 carbonos na cadeia principal");

3239 }else{

3240 if(en.equals("in")|| en.equals("en")){

3241 frame2.saida.setForeground(Color.RED);

3242 frame2.saida.setText(" Nome incorreto.\n E necessario informar a posic~ao da

3243 ligac~ao com apenas 1 posic~ao.");

3244 }else{

3245 if(Integer.parseInt(ero) == 1 || Integer.parseInt(ero) == 3){

3246 frame2.saida.setForeground(Color.RED);

3247 frame2.saida.setText(" Nome incorreto.\n Pois se colocar a ramificac~ao METIL

3248 na posic~ao 1 ou 3\n n~ao sera mais um prop e sim um but");

3249 }else{

3250 if(en.equals("an")){

3251 frame2.saida.setForeground(Color.RED);

3252 frame2.saida.setText(" Nome incorreto.\n N~ao e permitido colocar posic~ao em ligac~ao simples.");

3253 }else{

3254 if(Integer.parseInt(nu) == 3 || Integer.parseInt(me) == 3){

122

Page 136: Estudo e Desenvolvimento de um Protótipo de Análise de Nomes

3255 frame2.saida.setForeground(Color.RED);

3256 frame2.saida.setText(" Nome incorreto. \n N~ao e permitido colocar ligac~ao neste carbono.");

3257 }else{

3258 if(Integer.parseInt(nu)==1 && Integer.parseInt(me)==1){

3259 frame2.saida.setForeground(Color.RED);

3260 frame2.saida.setText(" Nome incorreto.\n N~ao e possivel colocar as duas ligac~oes neste carbono.");

3261 }else{

3262 if(Integer.parseInt(nu)==2 && Integer.parseInt(me)==2){

3263 frame2.saida.setForeground(Color.RED);

3264 frame2.saida.setText(" Nome incorreto.\n N~ao e possivel colocar as duas\n ligac~oes neste carbono.");

3265 }else{

3266 frame2.saida.setForeground(Color.BLUE);

3267 frame2.saida.setText(" Nome correto.\n \n Esta substancia e um Eter \n Possuindo 2

3268 carbonos (et) representando o carbono de menor radical,\n recebendo o radical (oxi)

3269 \n e recebendo o nome do hidrocarboneto de maior radical \n com prefixo (prop), duas

3270 duplas ligac~oes ("+en+") na posic~ao ("+nu+","+me+"),\n com ramificac~ao metil na posic~ao

3271 ("+ero+") e \n pertencendo ao grupo hidrocarboneto ("+al+")");

3272 frame2.est.setText("\n \n CC(O)C=C=(C)C ");

3273 }

3274 }

3275 }

3276 }

3277 }

3278 }

3279 }

3280 :}

3281 ;

3282

3283 eterProp ::= PROP OXI ESPACO numero:num PROP central:en hidrocarboneto:al {:

3284 if(Integer.parseInt(num) > 3){

3285 frame2.saida.setFont(new Font("Arial", Font.PLAIN, 15));

3286 frame2.saida.setForeground(Color.RED);

3287 frame2.saida.setText(" Numero da posic~ao esta incorreto.\n Com o prefixo PROP

3288 so podemos ter 3 carbonos na cadeia principal");

3289 }else{

3290 if(en.equals("an")){

3291 frame2.saida.setForeground(Color.RED);

3292 frame2.saida.setText(" Nome incorreto, \n N~ao e permitido colocar posic~ao em ligac~ao simples.");

3293 }else{

3294 if(en.equals("adien")){

3295 frame2.saida.setForeground(Color.RED);

3296 frame2.saida.setText(" Nome incorreto,\n E nesessario informar duas posic~oes.");

3297 }else{

3298 if(Integer.parseInt(num) == 3){

3299 frame2.saida.setForeground(Color.RED);

3300 frame2.saida.setText(" Nome incorreto. \n N~ao e permitido colocar ligac~ao neste carbono.");

3301 }else{

3302 if(en.equals("en")){

3303 if(Integer.parseInt(num)==1){

3304 frame2.saida.setForeground(Color.BLUE);

3305 frame2.saida.setText(" Nome correto.\n \n Esta substancia e um Eter \n Possuindo 3

3306 carbonos (prop) representando o carbono de menor radical,\n recebendo o radical (oxi)

3307 \n e recebendo o nome do hidrocarboneto de maior radical \n com prefixo (prop), ligac~ao

3308 dupla ("+en+") e \n pertencendo ao grupo hidrocarboneto ("+al+")");

3309 frame2.est.setText("\n \n CCC(O)C=CC ");

3310 }else{

3311 if(Integer.parseInt(num)==2){

3312 frame2.saida.setForeground(Color.BLUE);

3313 frame2.saida.setText(" Nome correto.\n \n Esta substancia e um Eter \n Possuindo 3

3314 carbonos (prop) representando o carbono de menor radical,\n recebendo o radical (oxi)

3315 \n e recebendo o nome do hidrocarboneto de maior radical \n com prefixo (prop), ligac~ao

3316 dupla ("+en+") e \n pertencendo ao grupo hidrocarboneto ("+al+")");

3317 frame2.est.setText("\n \n CCC(O)CC=C ");

3318 }

3319 }

3320 }else{

3321 if(en.equals("in")){

3322 if(Integer.parseInt(num)==1){

3323 frame2.saida.setForeground(Color.BLUE);

3324 frame2.saida.setText(" Nome correto.\n \n Esta substancia e um Eter \n Possuindo 3

3325 carbonos (prop) representando o carbono de menor radical,\n recebendo o radical (oxi)

3326 \n e recebendo o nome do hidrocarboneto de maior radical \n com prefixo (prop), ligac~ao

3327 tripla ("+en+") e \n pertencendo ao grupo hidrocarboneto ("+al+")");

3328 frame2.est.setText("\n \n CCC(O)C#CC ");

123

Page 137: Estudo e Desenvolvimento de um Protótipo de Análise de Nomes

3329 }else{

3330 if(Integer.parseInt(num)==2){

3331 frame2.saida.setForeground(Color.BLUE);

3332 frame2.saida.setText(" Nome correto.\n \n Esta substancia e um Eter \n Possuindo 3

3333 carbonos (prop) representando o carbono de menor radical,\n recebendo o radical (oxi)

3334 \n e recebendo o nome do hidrocarboneto de maior radical \n com prefixo (prop), ligac~ao

3335 tripla ("+en+") e \n pertencendo ao grupo hidrocarboneto ("+al+")");

3336 frame2.est.setText("\n \n CCC(O)CC#C ");

3337 }

3338 }

3339 }

3340 }

3341 }

3342 }

3343 }

3344 }

3345 :}

3346

3347 | PROP OXI ESPACO PROP central:en hidrocarboneto:al {:

3348 if(en.equals("in")|| en.equals("en")|| en.equals("adien")){

3349 frame2.saida.setForeground(Color.BLUE);

3350 frame2.saida.setText(" Atenc~ao, e necessario informar a posic~ao da ligac~ao.");

3351 }else{

3352 frame2.saida.setForeground(Color.BLUE);

3353 frame2.saida.setText(" Nome correto.\n \n Esta substancia e um Eter \n

3354 Possuindo 3 carbonos (prop) representando o carbono de menor radical,\n

3355 recebendo o radical (oxi) \n e recebendo o nome do hidrocarboneto de maior

3356 radical \n com prefixo (prop), ligac~ao simples ("+en+") e \n pertencendo ao

3357 grupo hidrocarboneto ("+al+")");

3358 frame2.est.setText("\n \n CCC(O)CCC ");

3359 }

3360 :}

3361 | PROP OXI ESPACO MET central:en hidrocarboneto:al {:

3362 frame2.saida.setForeground(Color.RED);

3363 frame2.saida.setText(" Atenc~ao,\n E necessario informar primeiro o prefixo\n

3364 que indica o numero de carbonos \n do menor radical e depois o nome do \n

3365 hidrocarboneto correspondente \n ao maior radical.");

3366 :}

3367 | PROP OXI ESPACO ET central:en hidrocarboneto:al {:

3368 frame2.saida.setForeground(Color.RED);

3369 frame2.saida.setText(" Atenc~ao,\n E necessario informar primeiro o prefixo\n

3370 que indica o numero de carbonos \n do menor radical e depois o nome do \n

3371 hidrocarboneto correspondente \n ao maior radical.");

3372 :}

3373 | PROP OXI ESPACO numero:nu numero:me PROP central:en hidrocarboneto:al {:

3374 if(Integer.parseInt(nu)>3 || Integer.parseInt(me)>3){

3375 frame2.saida.setForeground(Color.RED);

3376 frame2.saida.setText(" Numero da posic~ao esta incorreto.\n Com o prefixo

3377 PROP so podemos ter 3 carbonos na cadeia principal");

3378 }else{

3379 if(en.equals("in")|| en.equals("en")){

3380 frame2.saida.setForeground(Color.RED);

3381 frame2.saida.setText(" Nome incorreto.\n E necessario informar a posic~ao

3382 da ligac~ao com apenas 1 posic~ao.");

3383 }else{

3384 if(en.equals("an")){

3385 frame2.saida.setForeground(Color.RED);

3386 frame2.saida.setText(" Nome incorreto.\n N~ao e permitido colocar posic~ao

3387 em ligac~ao simples.");

3388 }else{

3389 if(Integer.parseInt(nu) == 3 || Integer.parseInt(me) == 3){

3390 frame2.saida.setForeground(Color.RED);

3391 frame2.saida.setText(" Nome incorreto. \n N~ao e permitido colocar ligac~ao neste carbono.");

3392 }else{

3393 frame2.saida.setForeground(Color.BLUE);

3394 frame2.saida.setText(" Nome correto.\n \n Esta substancia e um Eter \n Possuindo 3

3395 carbonos (prop) representando o carbono de menor radical,\n recebendo o radical (oxi)

3396 \n e recebendo o nome do hidrocarboneto de maior radical \n com prefixo (prop), duas

3397 duplas ligac~oes ("+en+") e \n pertencendo ao grupo hidrocarboneto ("+al+")");

3398 frame2.est.setText("\n \n CCC(O)C=C=C ");

3399 }

3400 }

3401 }

3402 }

124

Page 138: Estudo e Desenvolvimento de um Protótipo de Análise de Nomes

3403 :}

3404

3405 | PROP OXI ESPACO numero:ero METIL numero:num PROP central:en hidrocarboneto:al {:

3406 if(Integer.parseInt(num) > 3 || Integer.parseInt(ero) > 3){

3407 frame2.saida.setForeground(Color.RED);

3408 frame2.saida.setText(" Numero da posic~ao esta incorreto.\n Com o prefixo PROP

3409 so podemos ter 3 carbonos na cadeia principal");

3410 }else{

3411 if(Integer.parseInt(ero) == 1 || Integer.parseInt(ero) == 3){

3412 frame2.saida.setForeground(Color.RED);

3413 frame2.saida.setText(" Nome incorreto,\n Pois se colocar a ramificac~ao METIL na

3414 posic~ao 1 ou 3\n n~ao sera mais um prop e sim um but");

3415 }else{

3416 if(en.equals("an")){

3417 frame2.saida.setForeground(Color.RED);

3418 frame2.saida.setText(" Nome incorreto, \n N~ao e permitido colocar posic~ao em ligac~ao simples.");

3419 }else{

3420 if(en.equals("adien")){

3421 frame2.saida.setForeground(Color.RED);

3422 frame2.saida.setText(" Nome incorreto,\n E nesessario informar duas posic~oes.");

3423 }else{

3424 if(Integer.parseInt(num) == 3){

3425 frame2.saida.setForeground(Color.RED);

3426 frame2.saida.setText(" Nome incorreto. \n N~ao e permitido colocar ligac~ao neste carbono.");

3427 }else{

3428 if(en.equals("en")){

3429 if(Integer.parseInt(num)==1){

3430 frame2.saida.setForeground(Color.BLUE);

3431 frame2.saida.setText(" Nome correto.\n \n Esta substancia e um Eter \n Possuindo 3

3432 carbonos (prop) representando o carbono de menor radical,\n recebendo o radical (oxi)

3433 \n e recebendo o nome do hidrocarboneto de maior radical \n com prefixo (prop), ligac~ao

3434 dupla ("+en+"), \n com ramificac~ao metil na posic~ao ("+ero+") e \n pertencendo ao

3435 grupo hidrocarboneto ("+al+")");

3436 frame2.est.setText("\n \n CCC(O)C=C(C)C ");

3437 }else{

3438 if(Integer.parseInt(num)==2){

3439 frame2.saida.setForeground(Color.BLUE);

3440 frame2.saida.setText(" Nome correto.\n \n Esta substancia e um Eter \n Possuindo 3

3441 carbonos (prop) representando o carbono de menor radical,\n recebendo o radical (oxi)

3442 \n e recebendo o nome do hidrocarboneto de maior radical \n com prefixo (prop), ligac~ao

3443 dupla ("+en+"), \n com ramificac~ao metil na posic~ao ("+ero+") e \n pertencendo ao

3444 grupo hidrocarboneto ("+al+")");

3445 frame2.est.setText("\n \n CCC(O)CC=(C)C ");

3446 }

3447 }

3448 }else{

3449 if(en.equals("in")){

3450 if(Integer.parseInt(num)==1){

3451 frame2.saida.setForeground(Color.BLUE);

3452 frame2.saida.setText(" Nome correto.\n \n Esta substancia e um Eter \n Possuindo 3

3453 carbonos (prop) representando o carbono de menor radical,\n recebendo o radical (oxi)

3454 \n e recebendo o nome do hidrocarboneto de maior radical \n com prefixo (prop), ligac~ao

3455 tripla ("+en+"), \n com ramificac~ao metil na posic~ao ("+ero+") e \n pertencendo ao

3456 grupo hidrocarboneto ("+al+")");

3457 frame2.est.setText("\n \n CCC(O)C#C(C)C ");

3458 }else{

3459 if(Integer.parseInt(num)==2){

3460 frame2.saida.setForeground(Color.BLUE);

3461 frame2.saida.setText(" Nome correto.\n \n Esta substancia e um Eter \n Possuindo 3

3462 carbonos (prop) representando o carbono de menor radical,\n recebendo o radical (oxi)

3463 \n e recebendo o nome do hidrocarboneto de maior radical \n com prefixo (prop), ligac~ao

3464 tripla ("+en+"),\n com ramificac~ao metil na posic~ao ("+ero+") e \n pertencendo ao

3465 grupo hidrocarboneto ("+al+")");

3466 frame2.est.setText("\n \n CCC(O)CC#(C)C ");

3467 }

3468 }

3469 }

3470 }

3471 }

3472 }

3473 }

3474 }

3475 }

3476 :}

125

Page 139: Estudo e Desenvolvimento de um Protótipo de Análise de Nomes

3477

3478 | PROP OXI ESPACO numero:ero METIL PROP central:en hidrocarboneto:al {:

3479 if(Integer.parseInt(ero)>3){

3480 frame2.saida.setForeground(Color.RED);

3481 frame2.saida.setText(" Numero da posic~ao esta incorreto.\n Com o prefixo PROP

3482 so podemos ter 3 carbonos na cadeia principal");

3483 }else{

3484 if(en.equals("in")|| en.equals("en")|| en.equals("adien")){

3485 frame2.saida.setForeground(Color.RED);

3486 frame2.saida.setText(" Atenc~ao, e necessario informar a posic~ao da ligac~ao.");

3487 }else{

3488 if(Integer.parseInt(ero) == 1 || Integer.parseInt(ero) == 3){

3489 frame2.saida.setForeground(Color.RED);

3490 frame2.saida.setText(" Nome incorreto,\n Pois se colocar a ramificac~ao METIL na

3491 posic~ao 1 ou 3\n n~ao sera mais um prop e sim um but");

3492 }else{

3493 frame2.saida.setForeground(Color.BLUE);

3494 frame2.saida.setText(" Nome correto.\n \n Esta substancia e um Eter \n Possuindo 3

3495 carbonos (prop) representando o carbono de menor radical,\n recebendo o radical (oxi)

3496 \n e recebendo o nome do hidrocarboneto de maior radical \n com prefixo (prop), ligac~ao

3497 simples ("+en+"),\n com ramificac~ao metil na posic~ao ("+ero+") e \n pertencendo ao

3498 grupo hidrocarboneto ("+al+")");

3499 frame2.est.setText("\n \n CCC(O)CC(C)C ");

3500 }

3501 }

3502 }

3503 :}

3504 | PROP OXI ESPACO numero:ero METIL numero:nu numero:me PROP central:en hidrocarboneto:al {:

3505 if(Integer.parseInt(nu)>3 || Integer.parseInt(me)>3 || Integer.parseInt(ero)>3){

3506 frame2.saida.setForeground(Color.RED);

3507 frame2.saida.setText(" Numero da posic~ao esta incorreto.\n Com o prefixo PROP

3508 so podemos ter 3 carbonos na cadeia principal");

3509 }else{

3510 if(en.equals("in")|| en.equals("en")){

3511 frame2.saida.setForeground(Color.RED);

3512 frame2.saida.setText(" Nome incorreto.\n E necessario informar a posic~ao da

3513 ligac~ao com apenas 1 posic~ao.");

3514 }else{

3515 if(Integer.parseInt(ero) == 1 || Integer.parseInt(ero) == 3){

3516 frame2.saida.setForeground(Color.RED);

3517 frame2.saida.setText(" Nome incorreto,\n Pois se colocar a ramificac~ao METIL na

3518 posic~ao 1 ou 3\n n~ao sera mais um prop e sim um but");

3519 }else{

3520 if(en.equals("an")){

3521 frame2.saida.setForeground(Color.RED);

3522 frame2.saida.setText(" Nome incorreto.\n N~ao e permitido colocar posic~ao em ligac~ao simples.");

3523 }else{

3524 if(Integer.parseInt(nu) == 3 || Integer.parseInt(me) == 3){

3525 frame2.saida.setForeground(Color.RED);

3526 frame2.saida.setText(" Nome incorreto. \n N~ao e permitido colocar ligac~ao neste carbono.");

3527 }else{

3528 frame2.saida.setForeground(Color.BLUE);

3529 frame2.saida.setText(" Nome correto.\n \n Esta substancia e um Eter \n Possuindo 3

3530 carbonos (prop) representando o carbono de menor radical,\n recebendo o radical (oxi)

3531 \n e recebendo o nome do hidrocarboneto de maior radical \n com prefixo (prop), duas duplas

3532 ligac~oes ("+en+") na posic~ao ("+nu+","+me+"),\n com ramificac~ao metil na posic~ao ("+ero+")

3533 e \n pertencendo ao grupo hidrocarboneto ("+al+")");

3534 frame2.est.setText("\n \n CCC(O)C=C=(C)C ");

3535 }

3536 }

3537 }

3538 }

3539 }

3540 :}

3541

3542 | numero:eroo METIL PROP OXI ESPACO numero:num PROP central:en hidrocarboneto:al {:

3543 if(Integer.parseInt(num) > 3 || Integer.parseInt(eroo) > 3){

3544 frame2.saida.setForeground(Color.RED);

3545 frame2.saida.setText(" Numero da posic~ao esta incorreto.\n Com o prefixo PROP

3546 so podemos ter 3 carbonos na cadeia principal");

3547 }else{

3548 if(en.equals("an")){

3549 frame2.saida.setForeground(Color.RED);

3550 frame2.saida.setText(" Nome incorreto, \n N~ao e permitido colocar posic~ao em ligac~ao simples.");

126

Page 140: Estudo e Desenvolvimento de um Protótipo de Análise de Nomes

3551 }else{

3552 if(en.equals("adien")){

3553 frame2.saida.setForeground(Color.RED);

3554 frame2.saida.setText(" Nome incorreto,\n E nesessario informar duas posic~oes.");

3555 }else{

3556 if(Integer.parseInt(num) == 3){

3557 frame2.saida.setForeground(Color.RED);

3558 frame2.saida.setText(" Nome incorreto. \n N~ao e permitido colocar ligac~ao neste carbono.");

3559 }else{

3560 if(Integer.parseInt(eroo) == 1 || Integer.parseInt(eroo) == 3){

3561 frame2.saida.setForeground(Color.RED);

3562 frame2.saida.setText(" Nome incorreto.\n Pois se colocar a ramificac~ao METIL na

3563 posic~ao 1 ou 3\n n~ao sera mais um prop e sim um but");

3564 }else{

3565 if(en.equals("en")){

3566 if(Integer.parseInt(num)==1){

3567 frame2.saida.setForeground(Color.BLUE);

3568 frame2.saida.setText(" Nome correto.\n \n Esta substancia e um Eter \n Possuindo 3

3569 carbonos (prop) representando o carbono de menor radical\n recebendo o radical (oxi),

3570 \n contendo uma ramificac~ao metil na posic~ao("+eroo+"), \n e recebendo o nome do

3571 hidrocarboneto de maior radical \n com prefixo (prop), ligac~ao dupla ("+en+") e \n

3572 pertencendo ao grupo hidrocarboneto ("+al+")");

3573 frame2.est.setText("\n \n CC(C)C(O)C=CC ");

3574 }else{

3575 if(Integer.parseInt(num)==2){

3576 frame2.saida.setForeground(Color.BLUE);

3577 frame2.saida.setText(" Nome correto.\n \n Esta substancia e um Eter \n Possuindo 3

3578 carbonos (prop) representando o carbono de menor radical,\n recebendo o radical (oxi),

3579 \n contendo uma ramificac~ao metil na posic~ao("+eroo+"), \n e recebendo o nome do

3580 hidrocarboneto de maior radical \n com prefixo (prop), ligac~ao dupla ("+en+") e \n

3581 pertencendo ao grupo hidrocarboneto ("+al+")");

3582 frame2.est.setText("\n \n CC(C)C(O)CC=C ");

3583 }

3584 }

3585 }else{

3586 if(en.equals("in")){

3587 if(Integer.parseInt(num)==1){

3588 frame2.saida.setForeground(Color.BLUE);

3589 frame2.saida.setText(" Nome correto.\n \n Esta substancia e um Eter \n Possuindo 3

3590 carbonos (prop) representando o carbono de menor radical,\n recebendo o radical (oxi),

3591 \n contendo uma ramificac~ao metil na posic~ao("+eroo+"), \n e recebendo o nome do

3592 hidrocarboneto de maior radical \n com prefixo (prop), ligac~ao tripla ("+en+") e \n

3593 pertencendo ao grupo hidrocarboneto ("+al+")");

3594 frame2.est.setText("\n \n CC(C)C(O)C#CC ");

3595 }else{

3596 if(Integer.parseInt(num)==2){

3597 frame2.saida.setForeground(Color.BLUE);

3598 frame2.saida.setText(" Nome correto.\n \n Esta substancia e um Eter \n Possuindo 3

3599 carbonos (prop) representando o carbono de menor radical,\n recebendo o radical (oxi),

3600 \n contendo uma ramificac~ao metil na posic~ao("+eroo+"), \n e recebendo o nome do

3601 hidrocarboneto de maior radical \n com prefixo (prop), ligac~ao tripla ("+en+") e \n

3602 pertencendo ao grupo hidrocarboneto ("+al+")");

3603 frame2.est.setText("\n \n CC(C)C(O)CC#C ");

3604 }

3605 }

3606 }

3607 }

3608 }

3609 }

3610 }

3611 }

3612 }

3613 :}

3614 | numero:eroo METIL PROP OXI ESPACO PROP central:en hidrocarboneto:al {:

3615 if(en.equals("in")|| en.equals("en")|| en.equals("adien")){

3616 frame2.saida.setForeground(Color.BLUE);

3617 frame2.saida.setText(" Atenc~ao, e necessario informar a posic~ao da ligac~ao.");

3618 }else{

3619 if(Integer.parseInt(eroo) == 1 || Integer.parseInt(eroo) == 3){

3620 frame2.saida.setForeground(Color.RED);

3621 frame2.saida.setText(" Nome incorreto.\n Pois se colocar a ramificac~ao METIL na

3622 posic~ao 1 ou 3\n n~ao sera mais um prop e sim um but");

3623 }else{

3624 frame2.saida.setForeground(Color.BLUE);

127

Page 141: Estudo e Desenvolvimento de um Protótipo de Análise de Nomes

3625 frame2.saida.setText(" Nome correto.\n \n Esta substancia e um Eter \n Possuindo 3

3626 carbonos (prop) representando o carbono de menor radical,\n recebendo o radical (oxi),

3627 \n contendo uma ramificac~ao metil na posic~ao("+eroo+"), \n e recebendo o nome do

3628 hidrocarboneto de maior radical \n com prefixo (prop), ligac~ao simples ("+en+") e

3629 \n pertencendo ao grupo hidrocarboneto ("+al+")");

3630 frame2.est.setText("\n \n CC(C)C(O)CCC ");

3631 }

3632 }

3633 :}

3634 | numero:eroo METIL PROP OXI ESPACO numero:nu numero:me PROP central:en hidrocarboneto:al {:

3635 if(Integer.parseInt(nu)>3 || Integer.parseInt(me)>3 || Integer.parseInt(eroo) >3){

3636 frame2.saida.setForeground(Color.RED);

3637 frame2.saida.setText(" Numero da posic~ao esta incorreto.\n Com o prefixo PROP

3638 so podemos ter 3 carbonos na cadeia principal");

3639 }else{

3640 if(en.equals("in")|| en.equals("en")){

3641 frame2.saida.setForeground(Color.RED);

3642 frame2.saida.setText(" Nome incorreto.\n E necessario informar a posic~ao da

3643 ligac~ao com apenas 1 posic~ao.");

3644 }else{

3645 if(en.equals("an")){

3646 frame2.saida.setForeground(Color.RED);

3647 frame2.saida.setText(" Nome incorreto.\n N~ao e permitido colocar posic~ao em ligac~ao simples.");

3648 }else{

3649 if(Integer.parseInt(eroo) == 1 || Integer.parseInt(eroo) == 3){

3650 frame2.saida.setForeground(Color.RED);

3651 frame2.saida.setText(" Nome incorreto.\n Pois se colocar a ramificac~ao METIL na

3652 posic~ao 1 ou 3\n n~ao sera mais um prop e sim um but");

3653 }else{

3654 if(Integer.parseInt(nu) == 3 || Integer.parseInt(me) == 3){

3655 frame2.saida.setForeground(Color.RED);

3656 frame2.saida.setText(" Nome incorreto. \n N~ao e permitido colocar ligac~ao neste carbono.");

3657 }else{

3658 frame2.saida.setForeground(Color.BLUE);

3659 frame2.saida.setText(" Nome correto.\n \n Esta substancia e um Eter \n Possuindo 3

3660 carbonos (prop) representando o carbono de menor radical,\n recebendo o radical (oxi),

3661 \n contendo uma ramificac~ao metil na posic~ao("+eroo+"), \n e recebendo o nome do

3662 hidrocarboneto de maior radical \n com prefixo (prop), duas duplas ligac~oes ("+nu+","+me+")

3663 e \n pertencendo ao grupo hidrocarboneto ("+al+")");

3664 frame2.est.setText("\n \n CC(C)C(O)C=C=C ");

3665 }

3666 }

3667 }

3668 }

3669 }

3670 :}

3671 | numero: eroo METIL PROP OXI ESPACO numero:ero METIL numero:num PROP central:en hidrocarboneto:al {:

3672 if(Integer.parseInt(num) > 3 || Integer.parseInt(ero) > 3||Integer.parseInt(eroo) > 3){

3673 frame2.saida.setForeground(Color.RED);

3674 frame2.saida.setText(" Numero da posic~ao esta incorreto.\n Com o prefixo PROP

3675 so podemos ter 3 carbonos na cadeia principal");

3676 }else{

3677 if(Integer.parseInt(ero) == 1 || Integer.parseInt(ero) == 3){

3678 frame2.saida.setForeground(Color.RED);

3679 frame2.saida.setText(" Nome incorreto.\n Pois se colocar a ramificac~ao METIL

3680 na posic~ao 1 ou 3\n n~ao sera mais um prop e sim um but");

3681 }else{

3682 if(Integer.parseInt(eroo) == 1 || Integer.parseInt(eroo) == 3){

3683 frame2.saida.setForeground(Color.RED);

3684 frame2.saida.setText(" Nome incorreto.\n Pois se colocar a ramificac~ao METIL

3685 na posic~ao 1 ou 3\n n~ao sera mais um prop e sim um but");

3686 }else{

3687 if(en.equals("an")){

3688 frame2.saida.setForeground(Color.RED);

3689 frame2.saida.setText(" Nome incorreto. \n N~ao e permitido colocar posic~ao em ligac~ao simples.");

3690 }else{

3691 if(en.equals("adien")){

3692 frame2.saida.setForeground(Color.RED);

3693 frame2.saida.setText(" Nome incorreto.\n E nesessario informar duas posic~oes.");

3694 }else{

3695 if(Integer.parseInt(num) == 3){

3696 frame2.saida.setForeground(Color.RED);

3697 frame2.saida.setText(" Nome incorreto. \n N~ao e permitido colocar ligac~ao neste carbono.");

3698 }else{

128

Page 142: Estudo e Desenvolvimento de um Protótipo de Análise de Nomes

3699 if(en.equals("en")){

3700 if(Integer.parseInt(num)==1){

3701 frame2.saida.setForeground(Color.BLUE);

3702 frame2.saida.setText(" Nome correto.\n \n Esta substancia e um Eter \n Possuindo 3

3703 carbonos (prop) representando o carbono de menor radical,\n recebendo o radical (oxi),

3704 \n com ramificac~ao metil na posic~ao ("+eroo+") \n e recebendo o nome do hidrocarboneto

3705 de maior radical \n com prefixo (prop), ligac~ao dupla ("+en+"), \n com ramificac~ao metil

3706 na posic~ao ("+ero+") e \n pertencendo ao grupo hidrocarboneto ("+al+")");

3707 frame2.est.setText("\n \n CC(C)C(O)C=C(C)C ");

3708 }else{

3709 if(Integer.parseInt(num)==2){

3710 frame2.saida.setForeground(Color.BLUE);

3711 frame2.saida.setText(" Nome correto.\n \n Esta substancia e um Eter \n Possuindo 3

3712 carbonos (prop) representando o carbono de menor radical,\n recebendo o radical (oxi),

3713 \n com ramificac~ao metil na posic~ao ("+eroo+") \n e recebendo o nome do hidrocarboneto

3714 de maior radical \n com prefixo (prop), ligac~ao dupla ("+en+"), \n com ramificac~ao metil

3715 na posic~ao ("+ero+") e \n pertencendo ao grupo hidrocarboneto ("+al+")");

3716 frame2.est.setText("\n \n CC(C)C(O)CC=(C)C ");

3717 }

3718 }

3719 }else{

3720 if(en.equals("in")){

3721 if(Integer.parseInt(num)==1){

3722 frame2.saida.setForeground(Color.BLUE);

3723 frame2.saida.setText(" Nome correto.\n \n Esta substancia e um Eter \n Possuindo 2

3724 carbonos (prop) representando o carbono de menor radical,\n recebendo o radical (oxi),

3725 \n com ramificac~ao metil na posic~ao ("+eroo+") \n e recebendo o nome do hidrocarboneto

3726 de maior radical \n com prefixo (prop), ligac~ao tripla ("+en+"), \n com ramificac~ao metil

3727 na posic~ao ("+ero+") e \n pertencendo ao grupo hidrocarboneto ("+al+")");

3728 frame2.est.setText("\n \n CC(C)C(O)C#C(C)C ");

3729 }else{

3730 if(Integer.parseInt(num)==2){

3731 frame2.saida.setForeground(Color.BLUE);

3732 frame2.saida.setText(" Nome correto.\n \n Esta substancia e um Eter \n Possuindo 2

3733 carbonos (prop) representando o carbono de menor radical,\n recebendo o radical (oxi),

3734 \n com ramificac~ao metil na posic~ao ("+eroo+") \n e recebendo o nome do hidrocarboneto

3735 de maior radical \n com prefixo (prop), ligac~ao tripla ("+en+"),\n com ramificac~ao metil

3736 na posic~ao ("+ero+") e \n pertencendo ao grupo hidrocarboneto ("+al+")");

3737 frame2.est.setText("\n \n CC(C)C(O)CC#(C)C ");

3738 }

3739 }

3740 }

3741 }

3742 }

3743 }

3744 }

3745 }

3746 }

3747 }

3748 :}

3749 | numero:eroo METIL PROP OXI ESPACO numero:ero METIL PROP central:en hidrocarboneto:al {:

3750 if(Integer.parseInt(ero)>3 || Integer.parseInt(eroo)>3){

3751 frame2.saida.setForeground(Color.RED);

3752 frame2.saida.setText(" Numero da posic~ao esta incorreto.\n Com o prefixo PROP

3753 so podemos ter 3 carbonos na cadeia principal");

3754 }else{

3755 if(en.equals("in")|| en.equals("en")|| en.equals("adien")){

3756 frame2.saida.setForeground(Color.RED);

3757 frame2.saida.setText(" Atenc~ao, e necessario informar a posic~ao da ligac~ao.");

3758 }else{

3759 if(Integer.parseInt(ero) == 1 || Integer.parseInt(ero) == 3){

3760 frame2.saida.setForeground(Color.RED);

3761 frame2.saida.setText(" Nome incorreto.\n Pois se colocar a ramificac~ao METIL na

3762 posic~ao 1 ou 3\n n~ao sera mais um prop e sim um but");

3763 }else{

3764 if(Integer.parseInt(eroo) == 1 || Integer.parseInt(eroo) == 3){

3765 frame2.saida.setForeground(Color.RED);

3766 frame2.saida.setText(" Nome incorreto.\n Pois se colocar a ramificac~ao METIL na

3767 posic~ao 1 ou 3\n n~ao sera mais um prop e sim um but");

3768 }else{

3769 frame2.saida.setForeground(Color.BLUE);

3770 frame2.saida.setText(" Nome correto.\n \n Esta substancia e um Eter \n Possuindo 3

3771 carbonos (prop) representando o carbono de menor radical,\n recebendo o radical (oxi),

3772 \n com ramificac~ao metil na posic~ao ("+ero+") \n e recebendo o nome do hidrocarboneto

129

Page 143: Estudo e Desenvolvimento de um Protótipo de Análise de Nomes

3773 de maior radical \n com prefixo (prop), ligac~ao simples ("+en+"),\n com ramificac~ao

3774 metil na posic~ao ("+ero+") e \n pertencendo ao grupo hidrocarboneto ("+al+")");

3775 frame2.est.setText("\n \n CC(C)C(O)CC(C)C ");

3776 }

3777 }

3778 }

3779 }

3780 :}

3781 | numero:eroo METIL PROP OXI ESPACO numero:ero METIL numero:nu numero:me PROP central:en hidrocarboneto:al {:

3782 if(Integer.parseInt(nu)>3 || Integer.parseInt(me)>3 || Integer.parseInt(ero)>3 || Integer.parseInt(eroo)>3){

3783 frame2.saida.setForeground(Color.RED);

3784 frame2.saida.setText(" Numero da posic~ao esta incorreto.\n Com o prefixo PROP

3785 so podemos ter 3 carbonos na cadeia principal");

3786 }else{

3787 if(en.equals("in")|| en.equals("en")){

3788 frame2.saida.setForeground(Color.RED);

3789 frame2.saida.setText(" Nome incorreto.\n E necessario informar a posic~ao da ligac~ao com apenas 1 posic~ao.");

3790 }else{

3791 if(Integer.parseInt(ero) == 1 || Integer.parseInt(ero) == 3){

3792 frame2.saida.setForeground(Color.RED);

3793 frame2.saida.setText(" Nome incorreto.\n Pois se colocar a ramificac~ao METIL na

3794 posic~ao 1 ou 3\n n~ao sera mais um prop e sim um but");

3795 }else{

3796 if(Integer.parseInt(eroo) == 1 || Integer.parseInt(eroo) == 3){

3797 frame2.saida.setForeground(Color.RED);

3798 frame2.saida.setText(" Nome incorreto,\n Pois se colocar a ramificac~ao METIL na

3799 posic~ao 1 ou 3\n n~ao sera mais um prop e sim um but");

3800 }else{

3801 if(en.equals("an")){

3802 frame2.saida.setForeground(Color.RED);

3803 frame2.saida.setText(" Nome incorreto.\n N~ao e permitido colocar posic~ao em ligac~ao simples.");

3804 }else{

3805 if(Integer.parseInt(nu) == 3 || Integer.parseInt(me) == 3){

3806 frame2.saida.setForeground(Color.RED);

3807 frame2.saida.setText(" Nome incorreto. \n N~ao e permitido colocar ligac~ao neste carbono.");

3808 }else{

3809 frame2.saida.setForeground(Color.BLUE);

3810 frame2.saida.setText(" Nome correto.\n \n Esta substancia e um Eter \n Possuindo 3

3811 carbonos (prop) representando o carbono de menor radical,\n recebendo o radical (oxi),

3812 \n com ramificac~ao metil na posic~ao ("+eroo+") \n e recebendo o nome do hidrocarboneto

3813 de maior radical \n com prefixo (prop), duas duplas ligac~oes ("+en+") na posic~ao ("+nu+","+me+"),

3814 \n com ramificac~ao metil na posic~ao ("+ero+") e \n pertencendo ao grupo hidrocarboneto ("+al+")");

3815 frame2.est.setText("\n \n CC(C)C(O)C=C=(C)C ");

3816 }

3817 }

3818 }

3819 }

3820 }

3821 }

3822 :}

3823 ;

3824

3825 numero ::= NUMERO:le ESPACO

3826 {: RESULT = le; :}

3827 | ESPACO NUMERO:le ESPACO

3828 {: RESULT = le; :}

3829 | NUMERO:ll VIRGULA

3830 {: RESULT = ll; :}

3831 | ESPACO NUMERO:ll VIRGULA

3832 {: RESULT = ll; :}

3833 ;

3834

3835 radical ::= METIL

3836 {: RESULT = "metil"; :}

3837 | ETIL

3838 {: RESULT ="etil"; :}

3839 | PROPIL

3840 {: RESULT = "propil"; :}

3841 | BUTIL

3842 {: RESULT = "butil"; :}

3843 | DIMETIL

3844 {: RESULT = "dimetil"; :}

3845 | TRIMETIL

3846 {: RESULT = "trimetil"; :}

130

Page 144: Estudo e Desenvolvimento de um Protótipo de Análise de Nomes

3847 | DIETIL

3848 {: RESULT ="dietil"; :}

3849 | TRIETIL

3850 {: RESULT = "trietil"; :}

3851 | ISOPROPIL

3852 {: RESULT = "isopropil"; :}

3853 | DIPROPIL

3854 {: RESULT = "dipropil"; :}

3855

3856 | VINIL

3857 {: RESULT = "vinil"; :}

3858 | ISOBUTIL

3859 {: RESULT = "isobutil"; :}

3860 ;

3861

3862 prefixo ::= MET

3863 {: RESULT = "met"; :}

3864 | ET

3865 {: RESULT ="et"; :}

3866 | PROP

3867 {: RESULT = "prop"; :}

3868 | BUT

3869 {: RESULT = "but"; :}

3870 | PENT

3871 {: RESULT = "pent"; :}

3872 | HEX

3873 {: RESULT = "hex"; :}

3874 | HEPT

3875 {: RESULT = "hept"; :}

3876 | OCT

3877 {: RESULT = "oct"; :}

3878 | NON

3879 {: RESULT = "non"; :}

3880 | DEC

3881 {: RESULT = "dec"; :}

3882 ;

3883

3884

3885 central ::= simples: ls

3886 {: RESULT = ls; :}

3887 | dupla: dl

3888 {: RESULT = dl; :}

3889 | tripla: tri

3890 {: RESULT = tri; :}

3891 | dduplas: dd

3892 {: RESULT = dd; :}

3893 | TRIEN

3894 {: RESULT = "trien";

3895 frame2.saida.setText("central = trien"); :}

3896 | DIIN

3897 {: RESULT = "diin";

3898 frame2.saida.setText("central = diin"); :}

3899 | TRIIN

3900 {: RESULT = "triin";

3901 frame2.saida.setText("central = triin"); :}

3902 ;

3903

3904

3905 simples ::= AN

3906 {: RESULT = "an"; :}

3907 ;

3908

3909 dupla ::= EN

3910 {: RESULT = "en"; :}

3911 ;

3912

3913 tripla ::= IN

3914 {: RESULT = "in"; :}

3915 ;

3916

3917 dduplas ::= DIEN

3918 {: RESULT = "adien"; :}

3919 ;

3920

131

Page 145: Estudo e Desenvolvimento de um Protótipo de Análise de Nomes

3921 sufixo ::= hidrocarboneto: hd

3922 {: RESULT = hd; :}

3923 | alcoois: al

3924 {: RESULT = al; :}

3925 | aldeidos: ad

3926 {: RESULT = ad; :}

3927 | cetonas: ct

3928 {: RESULT = ct; :}

3929 ;

3930

3931 hidrocarboneto ::= O

3932 {: RESULT = "o"; :}

3933 ;

3934

3935 alcoois ::= OL

3936 {: RESULT = "ol"; :}

3937 ;

3938

3939 aldeidos ::= AL

3940 {: RESULT = "al"; :}

3941 ;

3942

3943 cetonas ::= ONA

3944 {: RESULT = "ona"; :}

3945 ;

A.3 Arquivo Interface - Tela Principal1 /*

2 * Esta classe corresponde a tela principal

3 * contendo 4 bot~oes: nomenclatura, instruc~oes,

4 * informac~oes e sair.

5 */

6

7 package sintatico;

8 import javax.swing.ImageIcon;

9 import javax.swing.JLabel;

10 import javax.swing.SwingConstants;

11

12 /**

13 *

14 * @author Rosangela

15 */

16

17 public class frame extends javax.swing.JFrame {

18

19

20 public frame() {

21 initComponents();

22 }

23

24 /** This method is called from within the constructor to

25 * initialize the form.

26 * WARNING: Do NOT modify this code. The content of this method is

27 * always regenerated by the Form Editor.

28 */

29 // <editor-fold defaultstate="collapsed" desc=" Codigo Gerado ">//GEN-BEGIN:initComponents

30 private void initComponents() {

31 buttonSair = new javax.swing.JButton();

32 buttonInformacao = new javax.swing.JButton();

33 buttonInstrucao = new javax.swing.JButton();

34 buttonNomenclatura = new javax.swing.JButton();

35 jLabel1 = new JLabel(new ImageIcon(getClass().getResource("interface.gif")), SwingConstants.CENTER);

36

37 getContentPane().setLayout(null);

38

39 setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

40 setTitle("Analisador de Nomes da Qu\u00edmica Org\u00e2nica");

41 setResizable(false);

42 buttonSair.setText("Sair");

43 buttonSair.addActionListener(new java.awt.event.ActionListener() {

132

Page 146: Estudo e Desenvolvimento de um Protótipo de Análise de Nomes

44 public void actionPerformed(java.awt.event.ActionEvent evt) {

45 buttonSairActionPerformed(evt);

46 }

47 });

48

49 getContentPane().add(buttonSair);

50 buttonSair.setBounds(240, 270, 120, 30);

51

52 buttonInformacao.setText("Informa\u00e7\u00f5es");

53 buttonInformacao.addActionListener(new java.awt.event.ActionListener() {

54 public void actionPerformed(java.awt.event.ActionEvent evt) {

55 buttonInformacaoActionPerformed(evt);

56 }

57 });

58

59 getContentPane().add(buttonInformacao);

60 buttonInformacao.setBounds(90, 270, 120, 30);

61

62 buttonInstrucao.setText("Instru\u00e7\u00f5es");

63 buttonInstrucao.addActionListener(new java.awt.event.ActionListener() {

64 public void actionPerformed(java.awt.event.ActionEvent evt) {

65 buttonInstrucaoActionPerformed(evt);

66 }

67 });

68

69 getContentPane().add(buttonInstrucao);

70 buttonInstrucao.setBounds(240, 220, 120, 30);

71

72 buttonNomenclatura.setText("Nomenclatura");

73 buttonNomenclatura.addActionListener(new java.awt.event.ActionListener() {

74 public void actionPerformed(java.awt.event.ActionEvent evt) {

75 buttonNomenclaturaActionPerformed(evt);

76 }

77 });

78

79 getContentPane().add(buttonNomenclatura);

80 buttonNomenclatura.setBounds(90, 220, 120, 30);

81

82 jLabel1.setBorder(javax.swing.BorderFactory.createEtchedBorder());

83 getContentPane().add(jLabel1);

84 jLabel1.setBounds(0, 0, 452, 370);

85

86 java.awt.Dimension screenSize = java.awt.Toolkit.getDefaultToolkit().getScreenSize();

87 setBounds((screenSize.width-457)/2, (screenSize.height-400)/2, 457, 400);

88 }// </editor-fold>//GEN-END:initComponents

89

90 private void buttonInstrucaoActionPerformed(java.awt.event.ActionEvent evt) {

91 //GEN-FIRST:event_buttonInstrucaoActionPerformed

92 janelaInstrucoes();

93 }//GEN-LAST:event_buttonInstrucaoActionPerformed

94

95 private void buttonInformacaoActionPerformed(java.awt.event.ActionEvent evt) {

96 //GEN-FIRST:event_buttonInformacaoActionPerformed

97 janelaInformacoes();

98 }//GEN-LAST:event_buttonInformacaoActionPerformed

99

100 private void buttonSairActionPerformed(java.awt.event.ActionEvent evt) {

101 //GEN-FIRST:event_buttonSairActionPerformed

102 this.setVisible(false);

103 this.dispose();

104 }//GEN-LAST:event_buttonSairActionPerformed

105

106 private void buttonNomenclaturaActionPerformed(java.awt.event.ActionEvent evt) {

107 //GEN-FIRST:event_buttonNomenclaturaActionPerformed

108 janelaAnalise();

109 }//GEN-LAST:event_buttonNomenclaturaActionPerformed

110

111 /* Comandos para acessar os bot~oes */

112

113 private void janelaAnalise(){

114 frame2 a = new frame2(this);

115 buttonNomenclatura.setEnabled(false);

116 buttonInformacao.setEnabled(false);

117 buttonInstrucao.setEnabled(false);

133

Page 147: Estudo e Desenvolvimento de um Protótipo de Análise de Nomes

118 a.setVisible(true);

119 }

120

121 private void janelaInformacoes(){

122 informacoes aa = new informacoes(this);

123 buttonNomenclatura.setEnabled(false);

124 buttonInformacao.setEnabled(false);

125 buttonInstrucao.setEnabled(false);

126 aa.setVisible(true);

127 }

128

129 private void janelaInstrucoes(){

130 instrucoes aaa = new instrucoes(this);

131 buttonNomenclatura.setEnabled(false);

132 buttonInformacao.setEnabled(false);

133 buttonInstrucao.setEnabled(false);

134 aaa.setVisible(true);

135 }

136

137 /**

138 * @param args the command line arguments

139 */

140 public static void main(String args[]) {

141 java.awt.EventQueue.invokeLater(new Runnable() {

142 public void run() {

143 new frame().setVisible(true);

144 }

145 });

146 }

147

148 // Declarac~ao de variaveis - n~ao modifique//GEN-BEGIN:variables

149 public javax.swing.JButton buttonInformacao;

150 public javax.swing.JButton buttonInstrucao;

151 public javax.swing.JButton buttonNomenclatura;

152 public javax.swing.JButton buttonSair;

153 public javax.swing.JLabel jLabel1;

154 // Fim da declarac~ao de variaveis//GEN-END:variables

155

156 }

157

A.4 Arquivo Interface - Tela Nomenclatura1 /*

2 * Esta classe contem a func~ao de realizar

3 * a entrada e saıda dos dados do PROF QUIM,

4 * contendo um campo para digitac~ao, 3 bot~oes

5 * (limpar, sair e verificar), um campo para mostrar

6 * as explicac~oes do nome e outro campo para mostrar

7 * a estrutura do nome quımico.

8 */

9

10 package sintatico;

11

12 import javax.swing.ImageIcon;

13 import javax.swing.JLabel;

14 import javax.swing.SwingConstants;

15 import java.io.FileNotFoundException;

16 import java.io.IOException;

17 import sintatico.parser;

18 import sintatico.quimica;

19 import sintatico.sym;

20

21 /**

22 *

23 * @author Rosangela

24 */

25

26 public class frame2 extends javax.swing.JFrame {

27 private frame fra;

28

134

Page 148: Estudo e Desenvolvimento de um Protótipo de Análise de Nomes

29 /** Creates new form frame2 */

30 public frame2(frame f) {

31 initComponents();

32

33 fra = f;

34 }

35

36

37 /** This method is called from within the constructor to

38 * initialize the form.

39 * WARNING: Do NOT modify this code. The content of this method is

40 * always regenerated by the Form Editor.

41 */

42 // <editor-fold defaultstate="collapsed" desc=" Codigo Gerado ">//GEN-BEGIN:initComponents

43 private void initComponents() {

44 jButton1 = new javax.swing.JButton();

45 jScrollPane2 = new javax.swing.JScrollPane();

46 saida = new javax.swing.JTextArea();

47 jButton2 = new javax.swing.JButton();

48 entrada = new javax.swing.JTextField();

49 buttonSair = new javax.swing.JButton();

50 jScrollPane1 = new javax.swing.JScrollPane();

51 est = new javax.swing.JTextArea();

52 jLabel1 = new JLabel(new ImageIcon(getClass().getResource("interfaceAtualizada.gif")),

53 SwingConstants.CENTER);

54

55 getContentPane().setLayout(null);

56

57 setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);

58 setTitle("Nomenclatura - Qu\u00edmica Org\u00e2nica");

59 setBackground(new java.awt.Color(255, 255, 255));

60 setResizable(false);

61 addWindowListener(new java.awt.event.WindowAdapter() {

62 public void windowClosed(java.awt.event.WindowEvent evt) {

63 formWindowClosed(evt);

64 }

65 public void windowOpened(java.awt.event.WindowEvent evt) {

66 formWindowOpened(evt);

67 }

68 });

69

70 jButton1.setText("Verificar");

71 jButton1.addActionListener(new java.awt.event.ActionListener() {

72 public void actionPerformed(java.awt.event.ActionEvent evt) {

73 jButton1ActionPerformed(evt);

74 }

75 });

76

77 getContentPane().add(jButton1);

78 jButton1.setBounds(380, 140, 120, 40);

79

80 jScrollPane2.setBorder(new javax.swing.border.SoftBevelBorder(javax.swing.border.BevelBorder.RAISED));

81 saida.setColumns(20);

82 saida.setFont(new java.awt.Font("Arial", 0, 15));

83 saida.setRows(5);

84 saida.setBorder(javax.swing.BorderFactory.createTitledBorder(null,

85 "Verifica\u00e7\u00e3o", javax.swing.border.TitledBorder.CENTER, javax.swing.border.TitledBorder.

86 DEFAULT_POSITION, new java.awt.Font("Tahoma", 1, 12), new java.awt.Color(0, 0, 204)));

87 jScrollPane2.setViewportView(saida);

88

89 getContentPane().add(jScrollPane2);

90 jScrollPane2.setBounds(60, 200, 470, 230);

91

92 jButton2.setText("Limpar");

93 jButton2.addActionListener(new java.awt.event.ActionListener() {

94 public void actionPerformed(java.awt.event.ActionEvent evt) {

95 jButton2ActionPerformed(evt);

96 }

97 });

98

99 getContentPane().add(jButton2);

100 jButton2.setBounds(450, 470, 90, 30);

101

102 entrada.setFont(new java.awt.Font("Arial", 1, 14));

135

Page 149: Estudo e Desenvolvimento de um Protótipo de Análise de Nomes

103 entrada.setBorder(javax.swing.BorderFactory.createTitledBorder(null, "Digite o nome qu\u00edmico",

104 javax.swing.border.TitledBorder.DEFAULT_JUSTIFICATION, javax.swing.border.TitledBorder.DEFAULT_POSITION,

105 new java.awt.Font("Tahoma", 1, 12), new java.awt.Color(0, 0, 204)));

106 getContentPane().add(entrada);

107 entrada.setBounds(140, 130, 210, 60);

108

109 buttonSair.setText("Sair");

110 buttonSair.addActionListener(new java.awt.event.ActionListener() {

111 public void actionPerformed(java.awt.event.ActionEvent evt) {

112 buttonSairActionPerformed(evt);

113 }

114 });

115

116 getContentPane().add(buttonSair);

117 buttonSair.setBounds(450, 520, 90, 30);

118

119 jScrollPane1.setBorder(new javax.swing.border.SoftBevelBorder(javax.swing.border.BevelBorder.RAISED));

120 est.setColumns(20);

121 est.setFont(new java.awt.Font("Arial", 1, 16));

122 est.setRows(5);

123 est.setBorder(javax.swing.BorderFactory.createTitledBorder(null, "Estrutura Qu\u00edmica em SMILES",

124 javax.swing.border.TitledBorder.CENTER, javax.swing.border.TitledBorder.DEFAULT_POSITION, new java.awt.Font

125 ("Tahoma", 1, 12), new java.awt.Color(0, 0, 204)));

126 jScrollPane1.setViewportView(est);

127

128 getContentPane().add(jScrollPane1);

129 jScrollPane1.setBounds(110, 450, 310, 150);

130

131 jLabel1.setBorder(javax.swing.BorderFactory.createEtchedBorder());

132 getContentPane().add(jLabel1);

133 jLabel1.setBounds(0, 0, 580, 640);

134

135 java.awt.Dimension screenSize = java.awt.Toolkit.getDefaultToolkit().getScreenSize();

136 setBounds((screenSize.width-585)/2, (screenSize.height-672)/2, 585, 672);

137 }// </editor-fold>//GEN-END:initComponents

138

139 private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {

140 //GEN-FIRST:event_jButton1ActionPerformed

141 Arquivo arq = new Arquivo();

142 String text = entrada.getText();

143 try {

144

145 arq.salvar("teste.txt", text, false);

146 } catch (IOException ex) {

147 ex.printStackTrace();

148 }

149

150 try {

151

152 new parser(new quimica(new java.io.FileReader("teste.txt"))).parse();

153 } catch (FileNotFoundException ex) {

154 ex.printStackTrace();

155 } catch (Exception ex) {

156 ex.printStackTrace();

157 }

158 }//GEN-LAST:event_jButton1ActionPerformed

159

160 private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {

161 //GEN-FIRST:event_jButton2ActionPerformed

162 limpaCampos();

163 }//GEN-LAST:event_jButton2ActionPerformed

164

165 private void buttonSairActionPerformed(java.awt.event.ActionEvent evt) {

166 //GEN-FIRST:event_buttonSairActionPerformed

167 this.setVisible(false);

168 this.dispose();

169 }//GEN-LAST:event_buttonSairActionPerformed

170

171 private void formWindowOpened(java.awt.event.WindowEvent evt) {

172 //GEN-FIRST:event_formWindowOpened

173

174 entrada.requestFocus();

175

176 }//GEN-LAST:event_formWindowOpened

136

Page 150: Estudo e Desenvolvimento de um Protótipo de Análise de Nomes

177

178 private void formWindowClosed(java.awt.event.WindowEvent evt) {

179 //GEN-FIRST:event_formWindowClosed

180

181 habilitaMenu();

182

183 }//GEN-LAST:event_formWindowClosed

184

185 /* Habilita o menu da tela principal */

186

187 private void habilitaMenu(){

188 fra.buttonNomenclatura.setEnabled(true);

189 fra.buttonInformacao.setEnabled(true);

190 fra.buttonInstrucao.setEnabled(true);

191 fra.buttonSair.setEnabled(true);

192 }

193

194 /* Limpa os ccampos para proxima consulta */

195

196 private void limpaCampos(){

197 entrada.setText("");

198 saida.setText("");

199 est.setText("");

200 entrada.requestFocus();

201 }

202

203

204

205 // Declarac~ao de variaveis - n~ao modifique//GEN-BEGIN:variables

206 private javax.swing.JButton buttonSair;

207 public javax.swing.JTextField entrada;

208 public static javax.swing.JTextArea est;

209 private javax.swing.JButton jButton1;

210 private javax.swing.JButton jButton2;

211 private javax.swing.JLabel jLabel1;

212 public static javax.swing.JScrollPane jScrollPane1;

213 private javax.swing.JScrollPane jScrollPane2;

214 public static javax.swing.JTextArea saida;

215 // Fim da declarac~ao de variaveis//GEN-END:variables

216

217 }

218

A.5 Arquivo Interface - Tela Instrucoes1 /*

2 * Esta classe contem um campo informando

3 * ao usuario as instruc~oes de como utilizar

4 * o prototipo PROF QUIM.

5 */

6

7 package sintatico;

8

9 import javax.swing.ImageIcon;

10 import javax.swing.JLabel;

11 import javax.swing.SwingConstants;

12

13 /**

14 *

15 * @author Rosangela

16 */

17

18 public class instrucoes extends javax.swing.JFrame {

19 private frame fra;

20 /** Creates new form instrucoes */

21 public instrucoes(frame f) {

22 initComponents();

23 fra = f;

24 }

25

26 /** This method is called from within the constructor to

137

Page 151: Estudo e Desenvolvimento de um Protótipo de Análise de Nomes

27 * initialize the form.

28 * WARNING: Do NOT modify this code. The content of this method is

29 * always regenerated by the Form Editor.

30 */

31 // <editor-fold defaultstate="collapsed" desc=" Codigo Gerado ">//GEN-BEGIN:initComponents

32 private void initComponents() {

33 jScrollPane1 = new javax.swing.JScrollPane();

34 jTextArea1 = new javax.swing.JTextArea();

35 jLabel1 = new JLabel(new ImageIcon(getClass().getResource("interfaceInstrucoes.gif")),

36 SwingConstants.CENTER);

37

38 getContentPane().setLayout(null);

39

40 setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);

41 setTitle("Instru\u00e7\u00f5es - PROF QUIM");

42 setResizable(false);

43 addWindowListener(new java.awt.event.WindowAdapter() {

44 public void windowClosed(java.awt.event.WindowEvent evt) {

45 formWindowClosed(evt);

46 }

47 });

48

49 jScrollPane1.setBorder(new javax.swing.border.LineBorder(java.awt.SystemColor.

50 inactiveCaptionText, 2, true));

51 jScrollPane1.setEnabled(false);

52 jTextArea1.setColumns(20);

53 jTextArea1.setEditable(false);

54 jTextArea1.setFont(new java.awt.Font("Arial", 1, 14));

55 jTextArea1.setForeground(java.awt.SystemColor.desktop);

56 jTextArea1.setRows(5);

57 jTextArea1.setText(" Para acessar o analisador de nomes da \nqu\u00edmica org\u00e2nica

58 \u00e9 necess\u00e1rio clicar no bot\u00e3o \n\"Nomenclatura\", onde ter\u00e1 um campo para digitar\

59 no nome da subst\u00e2ncia, por exemplo:\n\t* propano\n\t* 1-metilbutano\n\t* 2,3-dimetilpentanal\n\t*

60 2,3,4-trimetilpenteno\n\t* 3-etilpentano\n\t* 3-etil-4-metilpentano\n\n Para que o analisador

61 reconhe\u00e7a o nome, o \nusu\u00e1rio precisar\u00e1 digitar em letra minuscula\nsem espa\u00e7o e

62 as ramifica\u00e7\u00f5es com v\u00edrgula \ne tra\u00e7o, como o exemplo acima.\n

63 Depois que o usu\u00e1rio informar o nome e \nclicar no bot\u00e3o \"Enviar\", ir\u00e1 aparecer

64 no \nsegundo campo (Verifica\u00e7\u00e3o) as informa\u00e7\u00f5es\nsobre aquele determinado nome.

65 Se por acaso o \nnome estiver incorreto, o analisador ir\u00e1 \nexplicar o que esta considerando errado.

66 Se o \nusu\u00e1rio desejar tentar novamente basta clicar\nno bot\u00e3o \"Limpar\" e digitar o nome.\n

67 Por fim, se o nome informado pelo usu\u00e1rio\nestiver correto ir\u00e1 gerar no terceiro campo

68 a\nrepresenta\u00e7\u00e3o em SMILE da cadeia carb\u00f4nica \ncorrespondente ao nome.\n

69 Se o usu\u00e1rio tiver d\u00favidas em rela\u00e7\u00e3o as\nsubst\u00e2ncias que o analisador

70 reconhece ou\nsobre a representa\u00e7\u00e3o SMILE, basta clicar\nno bot\u00e3o \"Informa\u00e7\u00f5es\"

71 da tela principal.\nOnde conter\u00e1 todas as explica\u00e7\u00f5es necess\u00e1rias\nsobre cada

72 subst\u00e2ncia e SMILE.\n Se o usu\u00e1rio desejar fechar o programa,\n basta clicar no

73 bot\u00e3o \"Sair\". ");

74 jTextArea1.setBorder(new javax.swing.border.LineBorder(java.awt.SystemColor.inactiveCaptionText, 5,

75 true));

76 jScrollPane1.setViewportView(jTextArea1);

77

78 getContentPane().add(jScrollPane1);

79 jScrollPane1.setBounds(80, 160, 390, 350);

80

81 getContentPane().add(jLabel1);

82 jLabel1.setBounds(0, 0, 530, 580);

83

84 java.awt.Dimension screenSize = java.awt.Toolkit.getDefaultToolkit().getScreenSize();

85 setBounds((screenSize.width-539)/2, (screenSize.height-614)/2, 539, 614);

86 }// </editor-fold>//GEN-END:initComponents

87

88 private void formWindowClosed(java.awt.event.WindowEvent evt) {//GEN-FIRST:event_formWindowClosed

89 habilitaMenu();

90 }//GEN-LAST:event_formWindowClosed

91

92 /**

93 * @param args the command line arguments

94 */

95

96 /* Habilita os campos da tela nomenclatura quando acessada */

97

98 private void habilitaMenu(){

99 fra.buttonNomenclatura.setEnabled(true);

100 fra.buttonInformacao.setEnabled(true);

138

Page 152: Estudo e Desenvolvimento de um Protótipo de Análise de Nomes

101 fra.buttonInstrucao.setEnabled(true);

102 }

103

104

105 // Declarac~ao de variaveis - n~ao modifique//GEN-BEGIN:variables

106 public javax.swing.JLabel jLabel1;

107 private javax.swing.JScrollPane jScrollPane1;

108 private javax.swing.JTextArea jTextArea1;

109 // Fim da declarac~ao de variaveis//GEN-END:variables

110

111 }

112

A.6 Arquivo Interface - Tela Informacoes1 /*

2 * Esta classe contem um link para as

3 * explicac~oes de todas as func~oes que o

4 * PROF QUIM reconhece (alcano, alceno, alcino,

5 * alcadieno, alcool, eter, aldeıdo e cetona), alem

6 * da explicac~ao sobre a representac~ao de string SMILES.

7 */

8

9 package sintatico;

10

11 import java.awt.Color;

12 import javax.swing.ImageIcon;

13 import javax.swing.JLabel;

14 import javax.swing.SwingConstants;

15

16 /**

17 *

18 * @author Rosangela

19 */

20

21 public class informacoes extends javax.swing.JFrame {

22 private frame ffra;

23

24 /** Creates new form informacoes */

25 public informacoes(frame ff) {

26 initComponents();

27

28 ffra = ff;

29 }

30

31 /** This method is called from within the constructor to

32 * initialize the form.

33 * WARNING: Do NOT modify this code. The content of this method is

34 * always regenerated by the Form Editor.

35 */

36 // <editor-fold defaultstate="collapsed" desc=" Codigo Gerado ">//GEN-BEGIN:initComponents

37 private void initComponents() {

38 jPanel4 = new javax.swing.JPanel();

39 jLabel9 = new javax.swing.JLabel();

40 jLabel1 = new javax.swing.JLabel();

41 jLabel2 = new javax.swing.JLabel();

42 jLabel3 = new javax.swing.JLabel();

43 jLabel4 = new javax.swing.JLabel();

44 jLabel5 = new javax.swing.JLabel();

45 jLabel6 = new javax.swing.JLabel();

46 jLabel7 = new javax.swing.JLabel();

47 jLabel8 = new javax.swing.JLabel();

48 jSeparator1 = new javax.swing.JSeparator();

49 jPanel2 = new javax.swing.JPanel();

50 jLabel10 = new JLabel(new ImageIcon(getClass().getResource("intefaceInfo.gif")),

51 SwingConstants.CENTER);

52

53 getContentPane().setLayout(null);

54

55 setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);

56 setTitle("Instru\u00e7\u00f5es - Subst\u00e2ncias");

139

Page 153: Estudo e Desenvolvimento de um Protótipo de Análise de Nomes

57 setResizable(false);

58 addWindowListener(new java.awt.event.WindowAdapter() {

59 public void windowClosed(java.awt.event.WindowEvent evt) {

60 formWindowClosed(evt);

61 }

62 });

63

64 jPanel4.setLayout(null);

65

66 jPanel4.setBackground(new java.awt.Color(255, 255, 255));

67 jPanel4.setBorder(new javax.swing.border.SoftBevelBorder(javax.swing.border.BevelBorder.RAISED));

68 jLabel9.setFont(new java.awt.Font("Arial", 1, 16));

69 jLabel9.setForeground(new java.awt.Color(7, 7, 171));

70 jLabel9.setText("Representa\u00e7\u00e3o SMILE");

71 jLabel9.addMouseListener(new java.awt.event.MouseAdapter() {

72 public void mouseClicked(java.awt.event.MouseEvent evt) {

73 jLabel9MouseClicked(evt);

74 }

75 public void mouseExited(java.awt.event.MouseEvent evt) {

76 jLabel9MouseExited(evt);

77 }

78 });

79 jLabel9.addMouseMotionListener(new java.awt.event.MouseMotionAdapter() {

80 public void mouseMoved(java.awt.event.MouseEvent evt) {

81 jLabel9MouseMoved(evt);

82 }

83 });

84

85 jPanel4.add(jLabel9);

86 jLabel9.setBounds(40, 230, 190, 30);

87

88 jLabel1.setFont(new java.awt.Font("Arial", 1, 16));

89 jLabel1.setForeground(new java.awt.Color(7, 7, 171));

90 jLabel1.setText("Alcano");

91 jLabel1.addMouseListener(new java.awt.event.MouseAdapter() {

92 public void mouseClicked(java.awt.event.MouseEvent evt) {

93 jLabel1MouseClicked(evt);

94 }

95 public void mouseExited(java.awt.event.MouseEvent evt) {

96 jLabel1MouseExited(evt);

97 }

98 });

99 jLabel1.addMouseMotionListener(new java.awt.event.MouseMotionAdapter() {

100 public void mouseMoved(java.awt.event.MouseEvent evt) {

101 jLabel1MouseMoved(evt);

102 }

103 });

104

105 jPanel4.add(jLabel1);

106 jLabel1.setBounds(30, 20, 60, 14);

107

108 jLabel2.setFont(new java.awt.Font("Arial", 1, 16));

109 jLabel2.setForeground(new java.awt.Color(7, 7, 171));

110 jLabel2.setText("Alceno");

111 jLabel2.addMouseListener(new java.awt.event.MouseAdapter() {

112 public void mouseClicked(java.awt.event.MouseEvent evt) {

113 jLabel2MouseClicked(evt);

114 }

115 public void mouseExited(java.awt.event.MouseEvent evt) {

116 jLabel2MouseExited(evt);

117 }

118 });

119 jLabel2.addMouseMotionListener(new java.awt.event.MouseMotionAdapter() {

120 public void mouseMoved(java.awt.event.MouseEvent evt) {

121 jLabel2MouseMoved(evt);

122 }

123 });

124

125 jPanel4.add(jLabel2);

126 jLabel2.setBounds(30, 50, 60, 14);

127

128 jLabel3.setFont(new java.awt.Font("Arial", 1, 16));

129 jLabel3.setForeground(new java.awt.Color(7, 7, 171));

130 jLabel3.setText("Alcino");

140

Page 154: Estudo e Desenvolvimento de um Protótipo de Análise de Nomes

131 jLabel3.addMouseListener(new java.awt.event.MouseAdapter() {

132 public void mouseClicked(java.awt.event.MouseEvent evt) {

133 jLabel3MouseClicked(evt);

134 }

135 public void mouseExited(java.awt.event.MouseEvent evt) {

136 jLabel3MouseExited(evt);

137 }

138 });

139 jLabel3.addMouseMotionListener(new java.awt.event.MouseMotionAdapter() {

140 public void mouseMoved(java.awt.event.MouseEvent evt) {

141 jLabel3MouseMoved(evt);

142 }

143 });

144

145 jPanel4.add(jLabel3);

146 jLabel3.setBounds(30, 80, 60, 14);

147

148 jLabel4.setFont(new java.awt.Font("Arial", 1, 16));

149 jLabel4.setForeground(new java.awt.Color(7, 7, 171));

150 jLabel4.setText("Alcadieno");

151 jLabel4.addMouseListener(new java.awt.event.MouseAdapter() {

152 public void mouseClicked(java.awt.event.MouseEvent evt) {

153 jLabel4MouseClicked(evt);

154 }

155 public void mouseExited(java.awt.event.MouseEvent evt) {

156 jLabel4MouseExited(evt);

157 }

158 });

159 jLabel4.addMouseMotionListener(new java.awt.event.MouseMotionAdapter() {

160 public void mouseMoved(java.awt.event.MouseEvent evt) {

161 jLabel4MouseMoved(evt);

162 }

163 });

164

165 jPanel4.add(jLabel4);

166 jLabel4.setBounds(30, 110, 90, 14);

167

168 jLabel5.setFont(new java.awt.Font("Arial", 1, 16));

169 jLabel5.setForeground(new java.awt.Color(7, 7, 171));

170 jLabel5.setText("\u00c1lcool");

171 jLabel5.addMouseListener(new java.awt.event.MouseAdapter() {

172 public void mouseClicked(java.awt.event.MouseEvent evt) {

173 jLabel5MouseClicked(evt);

174 }

175 public void mouseExited(java.awt.event.MouseEvent evt) {

176 jLabel5MouseExited(evt);

177 }

178 });

179 jLabel5.addMouseMotionListener(new java.awt.event.MouseMotionAdapter() {

180 public void mouseMoved(java.awt.event.MouseEvent evt) {

181 jLabel5MouseMoved(evt);

182 }

183 });

184

185 jPanel4.add(jLabel5);

186 jLabel5.setBounds(180, 80, 60, 20);

187

188 jLabel6.setFont(new java.awt.Font("Arial", 1, 16));

189 jLabel6.setForeground(new java.awt.Color(7, 7, 171));

190 jLabel6.setText("Alde\u00eddo");

191 jLabel6.addMouseListener(new java.awt.event.MouseAdapter() {

192 public void mouseClicked(java.awt.event.MouseEvent evt) {

193 jLabel6MouseClicked(evt);

194 }

195 public void mouseExited(java.awt.event.MouseEvent evt) {

196 jLabel6MouseExited(evt);

197 }

198 });

199 jLabel6.addMouseMotionListener(new java.awt.event.MouseMotionAdapter() {

200 public void mouseMoved(java.awt.event.MouseEvent evt) {

201 jLabel6MouseMoved(evt);

202 }

203 });

204

141

Page 155: Estudo e Desenvolvimento de um Protótipo de Análise de Nomes

205 jPanel4.add(jLabel6);

206 jLabel6.setBounds(180, 120, 60, 14);

207

208 jLabel7.setFont(new java.awt.Font("Arial", 1, 16));

209 jLabel7.setForeground(new java.awt.Color(7, 7, 171));

210 jLabel7.setText("Cetona");

211 jLabel7.addMouseListener(new java.awt.event.MouseAdapter() {

212 public void mouseClicked(java.awt.event.MouseEvent evt) {

213 jLabel7MouseClicked(evt);

214 }

215 public void mouseExited(java.awt.event.MouseEvent evt) {

216 jLabel7MouseExited(evt);

217 }

218 });

219 jLabel7.addMouseMotionListener(new java.awt.event.MouseMotionAdapter() {

220 public void mouseMoved(java.awt.event.MouseEvent evt) {

221 jLabel7MouseMoved(evt);

222 }

223 });

224

225 jPanel4.add(jLabel7);

226 jLabel7.setBounds(180, 150, 60, 14);

227

228 jLabel8.setFont(new java.awt.Font("Arial", 1, 16));

229 jLabel8.setForeground(new java.awt.Color(7, 7, 171));

230 jLabel8.setText("\u00c9ter");

231 jLabel8.addMouseListener(new java.awt.event.MouseAdapter() {

232 public void mouseClicked(java.awt.event.MouseEvent evt) {

233 jLabel8MouseClicked(evt);

234 }

235 public void mouseExited(java.awt.event.MouseEvent evt) {

236 jLabel8MouseExited(evt);

237 }

238 });

239 jLabel8.addMouseMotionListener(new java.awt.event.MouseMotionAdapter() {

240 public void mouseMoved(java.awt.event.MouseEvent evt) {

241 jLabel8MouseMoved(evt);

242 }

243 });

244

245 jPanel4.add(jLabel8);

246 jLabel8.setBounds(180, 180, 60, 20);

247

248 jSeparator1.setForeground(java.awt.SystemColor.inactiveCaptionText);

249 jSeparator1.setOrientation(javax.swing.SwingConstants.VERTICAL);

250 jPanel4.add(jSeparator1);

251 jSeparator1.setBounds(130, 60, 30, 130);

252

253 getContentPane().add(jPanel4);

254 jPanel4.setBounds(140, 170, 270, 270);

255

256 jPanel2.setLayout(null);

257

258 jPanel2.setBackground(java.awt.SystemColor.inactiveCaptionText);

259 jPanel2.setBorder(new javax.swing.border.LineBorder

260 (java.awt.SystemColor.desktop, 3, true));

261 getContentPane().add(jPanel2);

262 jPanel2.setBounds(120, 170, 60, 270);

263

264 getContentPane().add(jLabel10);

265 jLabel10.setBounds(0, 0, 500, 520);

266

267 java.awt.Dimension screenSize = java.awt.Toolkit.getDefaultToolkit().getScreenSize();

268 setBounds((screenSize.width-507)/2, (screenSize.height-553)/2, 507, 553);

269 }// </editor-fold>//GEN-END:initComponents

270

271 private void jLabel9MouseMoved(java.awt.event.MouseEvent evt) {

272 //GEN-FIRST:event_jLabel9MouseMoved

273 jLabel9.setForeground(Color.RED);

274 }//GEN-LAST:event_jLabel9MouseMoved

275

276 private void jLabel9MouseExited(java.awt.event.MouseEvent evt) {

277 //GEN-FIRST:event_jLabel9MouseExited

278 jLabel9.setForeground(new Color(7,7,171));

142

Page 156: Estudo e Desenvolvimento de um Protótipo de Análise de Nomes

279 }//GEN-LAST:event_jLabel9MouseExited

280

281 private void jLabel9MouseClicked(java.awt.event.MouseEvent evt) {

282 //GEN-FIRST:event_jLabel9MouseClicked

283 smile ol = new smile(this);

284 ol.setVisible(true);

285 }//GEN-LAST:event_jLabel9MouseClicked

286

287 private void jLabel8MouseMoved(java.awt.event.MouseEvent evt) {

288 //GEN-FIRST:event_jLabel8MouseMoved

289 jLabel8.setForeground(Color.RED);

290 }//GEN-LAST:event_jLabel8MouseMoved

291

292 private void jLabel8MouseExited(java.awt.event.MouseEvent evt) {

293 //GEN-FIRST:event_jLabel8MouseExited

294 jLabel8.setForeground(new Color(7,7,171));

295 }//GEN-LAST:event_jLabel8MouseExited

296

297 private void jLabel8MouseClicked(java.awt.event.MouseEvent evt) {

298 //GEN-FIRST:event_jLabel8MouseClicked

299 eter ol = new eter(this);

300 ol.setVisible(true);

301 }//GEN-LAST:event_jLabel8MouseClicked

302

303 private void jLabel7MouseMoved(java.awt.event.MouseEvent evt) {

304 //GEN-FIRST:event_jLabel7MouseMoved

305 jLabel7.setForeground(Color.RED);

306 }//GEN-LAST:event_jLabel7MouseMoved

307

308 private void jLabel7MouseExited(java.awt.event.MouseEvent evt) {

309 //GEN-FIRST:event_jLabel7MouseExited

310 jLabel7.setForeground(new Color(7,7,171));

311 }//GEN-LAST:event_jLabel7MouseExited

312

313 private void jLabel7MouseClicked(java.awt.event.MouseEvent evt) {

314 //GEN-FIRST:event_jLabel7MouseClicked

315 cetona ol = new cetona(this);

316 ol.setVisible(true);

317 }//GEN-LAST:event_jLabel7MouseClicked

318

319 private void jLabel6MouseMoved(java.awt.event.MouseEvent evt) {

320 //GEN-FIRST:event_jLabel6MouseMoved

321 jLabel6.setForeground(Color.RED);

322 }//GEN-LAST:event_jLabel6MouseMoved

323

324 private void jLabel6MouseExited(java.awt.event.MouseEvent evt) {

325 //GEN-FIRST:event_jLabel6MouseExited

326 jLabel6.setForeground(new Color(7,7,171));

327 }//GEN-LAST:event_jLabel6MouseExited

328

329 private void jLabel6MouseClicked(java.awt.event.MouseEvent evt) {

330 //GEN-FIRST:event_jLabel6MouseClicked

331 aldeido ol = new aldeido(this);

332 ol.setVisible(true);

333 }//GEN-LAST:event_jLabel6MouseClicked

334

335 private void jLabel5MouseExited(java.awt.event.MouseEvent evt) {

336 //GEN-FIRST:event_jLabel5MouseExited

337 jLabel5.setForeground(new Color(7,7,171));

338 }//GEN-LAST:event_jLabel5MouseExited

339

340 private void jLabel5MouseClicked(java.awt.event.MouseEvent evt) {

341 //GEN-FIRST:event_jLabel5MouseClicked

342 alcool ol = new alcool(this);

343 ol.setVisible(true);

344 }//GEN-LAST:event_jLabel5MouseClicked

345

346 private void jLabel5MouseMoved(java.awt.event.MouseEvent evt) {

347 //GEN-FIRST:event_jLabel5MouseMoved

348 jLabel5.setForeground(Color.RED);

349 }//GEN-LAST:event_jLabel5MouseMoved

350

351 private void jLabel4MouseMoved(java.awt.event.MouseEvent evt) {

352 //GEN-FIRST:event_jLabel4MouseMoved

143

Page 157: Estudo e Desenvolvimento de um Protótipo de Análise de Nomes

353 jLabel4.setForeground(Color.RED);

354 }//GEN-LAST:event_jLabel4MouseMoved

355

356 private void jLabel4MouseExited(java.awt.event.MouseEvent evt) {

357 //GEN-FIRST:event_jLabel4MouseExited

358 jLabel4.setForeground(new Color(7,7,171));

359 }//GEN-LAST:event_jLabel4MouseExited

360

361 private void jLabel4MouseClicked(java.awt.event.MouseEvent evt) {

362 //GEN-FIRST:event_jLabel4MouseClicked

363 alcadieno as = new alcadieno(this);

364 as.setVisible(true);

365 }//GEN-LAST:event_jLabel4MouseClicked

366

367 private void jLabel3MouseExited(java.awt.event.MouseEvent evt) {

368 //GEN-FIRST:event_jLabel3MouseExited

369 jLabel3.setForeground(new Color(7,7,171));

370 }//GEN-LAST:event_jLabel3MouseExited

371

372 private void jLabel3MouseMoved(java.awt.event.MouseEvent evt) {

373 //GEN-FIRST:event_jLabel3MouseMoved

374 jLabel3.setForeground(Color.RED);

375 }//GEN-LAST:event_jLabel3MouseMoved

376

377 private void jLabel3MouseClicked(java.awt.event.MouseEvent evt) {

378 //GEN-FIRST:event_jLabel3MouseClicked

379 alcino as = new alcino(this);

380 as.setVisible(true);

381 }//GEN-LAST:event_jLabel3MouseClicked

382

383 private void jLabel2MouseMoved(java.awt.event.MouseEvent evt) {

384 //GEN-FIRST:event_jLabel2MouseMoved

385 jLabel2.setForeground(Color.RED);

386 }//GEN-LAST:event_jLabel2MouseMoved

387

388 private void jLabel2MouseExited(java.awt.event.MouseEvent evt) {

389 //GEN-FIRST:event_jLabel2MouseExited

390 jLabel2.setForeground(new Color(7,7,171));

391 }//GEN-LAST:event_jLabel2MouseExited

392

393 private void jLabel2MouseClicked(java.awt.event.MouseEvent evt) {

394 //GEN-FIRST:event_jLabel2MouseClicked

395 alceno as = new alceno(this);

396 as.setVisible(true);

397 }//GEN-LAST:event_jLabel2MouseClicked

398

399 private void jLabel1MouseClicked(java.awt.event.MouseEvent evt) {

400 //GEN-FIRST:event_jLabel1MouseClicked

401 alcano al = new alcano(this);

402 al.setVisible(true);

403

404 }//GEN-LAST:event_jLabel1MouseClicked

405

406 private void jLabel1MouseExited(java.awt.event.MouseEvent evt) {

407 //GEN-FIRST:event_jLabel1MouseExited

408 jLabel1.setForeground(new Color(7,7,171));

409

410 }//GEN-LAST:event_jLabel1MouseExited

411

412 private void jLabel1MouseMoved(java.awt.event.MouseEvent evt) {

413 //GEN-FIRST:event_jLabel1MouseMoved

414 jLabel1.setForeground(Color.RED);

415

416 }//GEN-LAST:event_jLabel1MouseMoved

417

418 private void formWindowClosed(java.awt.event.WindowEvent evt) {

419 //GEN-FIRST:event_formWindowClosed

420 habilitaMenu();

421 }//GEN-LAST:event_formWindowClosed

422

423 /**

424 * @param args the command line arguments

425 */

426

144

Page 158: Estudo e Desenvolvimento de um Protótipo de Análise de Nomes

427 /* Habilita os bot~oes da tela principal */

428

429 private void habilitaMenu(){

430 ffra.buttonNomenclatura.setEnabled(true);

431 ffra.buttonInformacao.setEnabled(true);

432 ffra.buttonInstrucao.setEnabled(true);

433 ffra.buttonSair.setEnabled(true);

434 }

435

436 // Declarac~ao de variaveis - n~ao modifique//GEN-BEGIN:variables

437 private javax.swing.JLabel jLabel1;

438 private javax.swing.JLabel jLabel10;

439 private javax.swing.JLabel jLabel2;

440 private javax.swing.JLabel jLabel3;

441 private javax.swing.JLabel jLabel4;

442 private javax.swing.JLabel jLabel5;

443 private javax.swing.JLabel jLabel6;

444 private javax.swing.JLabel jLabel7;

445 private javax.swing.JLabel jLabel8;

446 private javax.swing.JLabel jLabel9;

447 private javax.swing.JPanel jPanel2;

448 private javax.swing.JPanel jPanel4;

449 private javax.swing.JSeparator jSeparator1;

450 // Fim da declarac~ao de variaveis//GEN-END:variables

451

452 }

453

A.7 Arquivo Interface - Tela Alcano1 /*

2 * Esta classe contem a explicac~ao sobre

3 * alcano e um exemplo de como escrever

4 * o nome no prototipo PROF QUIM.

5 * Todas as telas de explicac~ao (tela alceno, tela alcino,

6 * tela alcadieno, tela alcool, tela aldeido, tela eter,

7 * tela cetona e tela SMILE) utilizam o mesmo codigo,

8 * so muda a explicac~ao da func~ao.

9 */

10

11

12 package sintatico;

13

14 import javax.swing.ImageIcon;

15 import javax.swing.JLabel;

16 import javax.swing.SwingConstants;

17

18 /**

19 *

20 * @author Rosangela

21 */

22

23 public class alcano extends javax.swing.JFrame {

24 private informacoes inf;

25 /** Creates new form alcano */

26 public alcano(informacoes infor) {

27 initComponents();

28 inf = infor;

29 }

30

31 /** This method is called from within the constructor to

32 * initialize the form.

33 * WARNING: Do NOT modify this code. The content of this method is

34 * always regenerated by the Form Editor.

35 */

36 // <editor-fold defaultstate="collapsed" desc=" Codigo Gerado ">//GEN-BEGIN:initComponents

37 private void initComponents() {

38 jPanel1 = new javax.swing.JPanel();

39 jScrollPane1 = new javax.swing.JScrollPane();

40 jTextArea1 = new javax.swing.JTextArea();

41 jLabel1 = new JLabel(new ImageIcon(getClass().getResource("alcano.gif")),

145

Page 159: Estudo e Desenvolvimento de um Protótipo de Análise de Nomes

42 SwingConstants.CENTER);

43

44 getContentPane().setLayout(null);

45

46 setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);

47 setTitle("Informa\u00e7\u00f5es - Alcano");

48 setResizable(false);

49 jPanel1.setLayout(null);

50

51 jPanel1.setBackground(new java.awt.Color(255, 255, 255));

52 jPanel1.setBorder(javax.swing.BorderFactory.createBevelBorder

53 (javax.swing.border.BevelBorder.RAISED));

54 jScrollPane1.setBorder(new javax.swing.border.LineBorder

55 (java.awt.SystemColor.inactiveCaption, 1, true));

56 jTextArea1.setColumns(20);

57 jTextArea1.setEditable(false);

58 jTextArea1.setFont(new java.awt.Font("Arial", 1, 14));

59 jTextArea1.setRows(5);

60 jTextArea1.setText("\tAlcanos \n S\u00e3o hidrocarbonetos alif\u00e1ticos\nsaturados,

61 ou seja, apresentam cadeia\naberta com simples liga\u00e7\u00f5es apenas.\n

62 Exemplo:\n\n\tbutano\n but = 4 carbonos\n an = liga\u00e7\u00e3o simples\n

63 o = hidrocarboneto");

64 jTextArea1.setBorder(new javax.swing.border.LineBorder(java.awt.SystemColor.inactiveCaptionText,

65 3, true));

66 jScrollPane1.setViewportView(jTextArea1);

67

68 jPanel1.add(jScrollPane1);

69 jScrollPane1.setBounds(20, 20, 280, 180);

70

71 getContentPane().add(jPanel1);

72 jPanel1.setBounds(50, 140, 320, 220);

73

74 getContentPane().add(jLabel1);

75 jLabel1.setBounds(0, 0, 420, 450);

76

77 java.awt.Dimension screenSize = java.awt.Toolkit.getDefaultToolkit().getScreenSize();

78 setBounds((screenSize.width-428)/2, (screenSize.height-483)/2, 428, 483);

79 }// </editor-fold>//GEN-END:initComponents

80

81 /**

82 * @param args the command line arguments

83 */

84

85

86 // Declarac~ao de variaveis - n~ao modifique//GEN-BEGIN:variables

87 private javax.swing.JLabel jLabel1;

88 private javax.swing.JPanel jPanel1;

89 private javax.swing.JScrollPane jScrollPane1;

90 private javax.swing.JTextArea jTextArea1;

91 // Fim da declarac~ao de variaveis//GEN-END:variables

92

93 }

94

146