Arquivo em PDF - DCC

Propaganda
UNIVERSIDADE FEDERAL DE GOIÁS – UFG
CAMPUS CATALÃO – CAC
DEPARTAMENTO DE CIÊNCIA DA COMPUTAÇÃO – DCC
Bacharelado em Ciência da Computação
Projeto Final de Curso
Estudo e Desenvolvimento de um Protótipo de
Análise de Nomes da Quı́mica Orgânica
Autor: Rosângela Alves de Brito
Orientador: Ms. Márcio de Souza Dias
Catalão - 2009
Rosângela Alves de Brito
Estudo e Desenvolvimento de um Protótipo de Análise de Nomes da
Quı́mica Orgânica
Monografia apresentada ao Curso de
Bacharelado em Ciência da Computação da
Universidade Federal de Goiás Campus Catalão
como requisito parcial para obtenção do tı́tulo de
Bacharel em Ciência da Computação
Área de Concentração: Inteligência Artificial
Sub-Área: Processamento de Linguagem Natural
Orientador: Ms. Márcio de Souza Dias
Catalão - 2009
Brito, Rosângela Alves
Estudo e Desenvolvimento de um Protótipo de Análise de Nomes da
Quı́mica Orgânica /Ms. Márcio de Souza Dias- Catalão - 2009
Número de paginas: 146
Projeto Final de Curso (Bacharelado) Universidade Federal de Goiás, Campus
Catalão, Curso de Bacharelado em Ciência da Computação, 2009.
Palavras-Chave: 1. Quı́mica Orgânica. 2. IUPAC. 3. Nomenclatura
Rosângela Alves de Brito
Estudo e Desenvolvimento de um Protótipo de Análise de Nomes da
Quı́mica Orgânica
Monografia apresentada e aprovada em
de
Pela Banca Examinadora constituı́da pelos professores.
Ms. Márcio de Souza Dias – Presidente da Banca
Dra. Selma Terezinha Milagre
Dr. Vaston Gonçalves da Costa
Dedico este trabalho a minha Mãe Catarina, ao meu Pai
Romeu, aos meus avôs e a minha Irmã Rosemeire.
AGRADECIMENTOS
Agradeço aos meus pais, Romeu e Catarina por todo amor, atenção, compreensão e
carinho durante toda a minha vida. Foram os meus grandes incentivadores para nunca
desistir. Também agradeço a minha irmã Rosemeire, pelo companheirismo, apoio e momentos divertidos.
Agradeço aos colegas da graduação, que sempre me ajudaram, compartilhando momentos difı́ceis e alegres que serão guardados com carinho. Em especial aos amigos Rayner
Pires, Salviano Ludgério, Gabriela Pereira, César Evangelista, Fernando Asevedo, Fábio
Assunção, Adair Borba, José Augusto Cabral e pelo sincero companheirismo a Rafael
Ulhôa.
Também um agradecimento aos professores de graduação, e em especial ao meu orientador professor Ms. Márcio de Souza Dias, por acreditar em mim, ser atencioso em todas
as minhas dúvidas e tornar possı́vel a realização deste trabalho.
Por fim, agradeço a DEUS por me dar forças para viver e todos aqueles que conviveram
comigo durante esses quatro anos, contribuindo para minha formação tanto pessoal como
acadêmica.
A todos, meus sinceros agradecimentos. Obrigada.
“Fez cessar a tormenta, e acalmam-se as ondas.”
Salmo 107:29
RESUMO
Brito, Rosângela Alves Estudo e Desenvolvimento de um Protótipo de
Análise de Nomes da Quı́mica Orgânica . Curso de Ciência da Computação, Campus
Catalão, UFG, Catalão, Brasil, 2009, 146p.
A capacidade de escrever e entender uma estrutura quı́mica para compostos da quı́mica
orgânica, a partir do seu nome, é essencial tanto para a teoria quanto para a prática. O
entendimento da estrutura quı́mica é indispensável para os vários tipos de indústrias,
pesquisas entre outros, para melhor compreender componentes que envolvem este mundo
moderno em transformação.
Softwares são desenvolvidos para que possam ser uma ferramenta de auxı́lio e apoio.
Unindo a evolução tecnológica com a importância quı́mica, softwares quı́micos educativos são construı́dos para ajudar na obtenção de conhecimento e melhorar o aprendizado
de alunos auxiliando professores e pesquisadores. Sendo assim, este projeto consiste em
desenvolver um protótipo de análise de nomes de compostos da Quı́mica Orgânica denominado PROF QUIM que tratará dos Hidrocarbonetos (Alcano, Alceno, Alcino e Alcadieno)
e Funções Oxigenadas (Álcool, Aldeı́do, Cetona e Éter) de acordo com a especificação e
regras estabelecidas pela IUPAC, visando à formação da representação de suas estruturas
quı́micas em string SMILE. Diferente de outros trabalhos que aqui serão apresentados,
o PROF QUIM proporciona explicações de erros obtidos de forma legı́vel para qualquer
tipo de usuário, possui uma interface amigável, uma representação da estrutura do nome
quı́mico bem intuitiva conhecida como string SMILE e a explicação do que significa cada
parte do nome do composto quı́mico orgânico correto. Sendo assim, este trabalho vem
para auxiliar e apoiar usuários interessados em aplicativos voltados para a nomenclatura
e estrutura da quı́mica orgânica.
Palavras-Chaves: Quı́mica Orgânica, IUPAC, Nomenclatura
i
Sumário
Lista de Abreviações
1
Introdução
2
1 Estado da Arte
4
1.1
Quı́mica Computacional . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4
1.2
A Nomenclatura-IUPAC . . . . . . . . . . . . . . . . . . . . . . . . . . . .
6
2 Fundamentação Teórica
2.1
2.2
2.3
2.4
22
Quı́mica Orgânica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
2.1.1
Encadeamento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
2.1.2
Tipos de Carbono . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
2.1.3
Ligação entre Carbono . . . . . . . . . . . . . . . . . . . . . . . . . 24
2.1.4
Cadeias Carbônicas . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
Funções Quı́micas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
2.2.1
Hidrocarbonetos
. . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
2.2.2
Funções Oxigenadas . . . . . . . . . . . . . . . . . . . . . . . . . . 30
Nomenclatura dos Compostos Orgânicos . . . . . . . . . . . . . . . . . . . 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 Funções Oxigenadas . . . . . . . . . . . . . . . . 41
Linguagem de Programação Java . . . . . . . . . . . . . . . . . . . . . . . 44
2.4.1
Introdução . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 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 Construção do Protótipo PROF QUIM
3.1
56
O PROF QUIM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56
ii
3.2
Linguagem de Programação . . . . . . . . . . . . . . . . . . . . . . . . . . 57
3.3
Fases da Construção do Protótipo . . . . . . . . . . . . . . . . . . . . . . . 57
3.3.1
Análise Léxica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
3.3.2
Análise Sintática e Semântica . . . . . . . . . . . . . . . . . . . . . 61
3.4
Interface . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
3.5
Testes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68
3.5.1
Teste Funcional . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68
3.5.2
Teste de Aceitação . . . . . . . . . . . . . . . . . . . . . . . . . . . 70
3.5.3
Teste de Instalação . . . . . . . . . . . . . . . . . . . . . . . . . . . 70
Considerações Finais
72
Referências
74
Apêndices
76
A Código 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 Instruções . . . . . . . . . . . . . . . . . . . . . . 137
A.6 Arquivo Interface - Tela Informações . . . . . . . . . . . . . . . . . . . . . 139
A.7 Arquivo Interface - Tela Alcano . . . . . . . . . . . . . . . . . . . . . . . . 145
iii
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 Júnior, 2000]. . . . . . . . . . . . . . . . . . 12
1.5
JCross: Palavras Cruzadas [Neto e Júnior, 2000]. . . . . . . . . . . . . . . 12
1.6
Ferramenta ACD/Chemsketch Freeware 5.12 [Neto e Júnior, 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 Carbônicas. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
2.2
Tipos de Carbono. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
2.3
Cadeia fechada. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
2.4
Radicais [Usberco e Usberco, 2001]. . . . . . . . . . . . . . . . . . . . . . . 38
2.5
Os números em vermelho correspondem a cadeia principal e o traço significa
a localização da ramificação. . . . . . . . . . . . . . . . . . . . . . . . . . . 39
2.6
Arquivo de definição JFlex. . . . . . . . . . . . . . . . . . . . . . . . . . . 47
2.7
Macros no JFlex. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
2.8
Forma geral de uma regra léxica. . . . . . . . . . . . . . . . . . . . . . . . 49
2.9
Intercace do Gerador Léxico JFlex. . . . . . . . . . . . . . . . . . . . . . . 50
3.1
Diagrama de Atividades do PROF QUIM. . . . . . . . . . . . . . . . . . . 58
3.2
Seção Código do Usuário.
3.3
Seção de Opções e Declarações. . . . . . . . . . . . . . . . . . . . . . . . . 60
3.4
Seção de Regras Léxicas. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
3.5
Declaração de Package e Import. . . . . . . . . . . . . . . . . . . . . . . . 61
3.6
Componentes de Código do Usuário. . . . . . . . . . . . . . . . . . . . . . 62
3.7
Listas de Sı́mbolos. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62
3.8
Declarações de Precedência e Associativismo. . . . . . . . . . . . . . . . . . 63
. . . . . . . . . . . . . . . . . . . . . . . . . . . 59
iv
3.9
Gramática. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
3.10 Tela Principal do Protótipo. . . . . . . . . . . . . . . . . . . . . . . . . . . 65
3.11 Tela Nomenclatura. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66
3.12 Tela Instruções. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66
3.13 Tela Informações. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
3.14 Tela Alcano. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
v
Lista de Tabelas
2.1
Formação do nome quı́mico orgânico [Usberco e Usberco, 2001]. . . . . . . 35
vi
Lista de Abreviações
IUPAC - International Union of Pure and Applied Chemistry - União Internacional
da Quı́mica Pura e Aplicada
SMILES - Simplified Molecular Input Line Entry System - Sistema de Entrada Linear
de Simplificação Molecular
1
Introdução
A quı́mica sempre se revelou essencial para o entendimento e evolução do ser humano. Ela estuda a estrutura das substâncias, correlacionando-a com as propriedades
macroscópicas, e investigando as transformações dessas substâncias. Por isso, o entendimento da estrutura quı́mica é indispensável para melhor entendimento dos componentes
que envolvem os vários tipos de pesquisas, indústrias e outros ramos como a quı́mica
biológica, inorgânica, orgânica entre outros. Além de entender a sua formação, também
é 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 são fundamentais tanto
para a teoria quanto para a prática.
Atualmente neste mundo globalizado e informatizado o crescente uso de computadores
por quı́micos (entre outras ciências em geral) é de vital importância para a propagação
e disseminação 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 são criados para dar assistência àqueles que
já têm um bom conhecimento e também para melhor aprendizado daqueles que serão os
futuros profissionais.
Pensando na importância de facilitar o entendimento e aprendizado da relação entre
estruturas e nomenclaturas, é que este trabalho propõe a construção de um protótipo
de análise de nomes de compostos da Quı́mica Orgânica, visando à formação correta da
representação de suas respectivas estruturas quı́micas.
O protótipo proposto (PROF QUIM) funcionará da seguinte maneira: primeiramente
terá uma interface gráfica onde a comunicação visual com o usuário será de fácil compreensão. O usuário entrará com o nome, especificamente do idioma português do Brasil,
do composto orgânico das seguintes funções quı́micas: Hidrocarboneto (alcanos, alcenos,
alcinos e alcadienos) e algumas funções Oxigenadas (álcool, éter, aldeı́do e cetona) e o
mesmo analisará este nome retornando uma saı́da visual da estrutura quı́mica em representação de string SMILE (utilizada principalmente por ser mais inteligı́vel para leitura
humana [?]) do nome fornecido. O protótipo irá gerar a saı́da dos nomes dos compostos que se enquadram nos padrões das nomenclaturas oficiais da IUPAC (International
2
Union of Pure and Applied Chemistry), além de fornecer explicações de cada parte do
nome. Caso o nome utilizado na entrada for considerado pelo protótipo incorreto, o
sistema apresentará a explicação do que for considerado errado no nome dado, assim
possibilitando o usuário a fazer uma simples correção para a obtenção do nome correto.
Neste protótipo não foi utilizada todas as funções da quı́mica orgânica. Esta limitação
está relacionada a falta de tempo para implementar mais funções e também pelo fato que
o PROF QUIM analisará as funções consideradas básicas para o aprendizado da quı́mica
orgânica.
Para a realização deste protótipo será utilizado: a ferramenta JFlex1 , um gerador de
analisadores léxicos; a ferramenta Java CUP2 , para análise sintática; representação de
estruturas quı́micas SMILE e a linguagem de programação Java.
Espera-se que este protótipo seja uma boa fonte de conhecimento, abordando técnicas
utilizadas em trabalhos dos pesquisadores Dias [Dias, 2006] e Eggert [Eggert et al., 1993].
Sendo assim, este trabalho vem para esclarecer as dúvidas presentes em usuários interessados em aplicativos voltados para a quı́mica orgânica. O trabalho descrito neste texto
está dividido em 3 capı́tulos.
No capı́tulo 1 há um levantamento sobre o estado da arte da área de pesquisa deste
trabalho, com foco principal em resoluções de nomenclatura e estrutura quı́mica, obtendo
ao final semelhanças e diferenças dos trabalhos apresentados em relação ao protótipo
proposto, que podem ajudar na constução deste sistema.
No capı́tulo 2 são apresentados os conceitos e funcionamento de cada ferramenta e
técnicas utilizadas para a implementação do protótipo.
No capı́tulo 3 é abordada a construção do PROF QUIM, desde sua gramática, análise
léxica, análise sintática e semântica, linguagem de programação, representação da estrutura quı́mica SMILE, interface gráfica, testes e dificuldades encontradas. Por fim, há
as considerações finais do trabalho realizado, levantando os objetivos alcançados, pontos
positivos, pontos negativos e trabalhos futuros.
Encontram-se os códigos da análise léxica, análise sintática, semântica e de interface
do protótipo no apêndice desta monografia.
1
2
http://jflex.de/
http://www.cs.princeton.edu/ appel/modern/java/CUP
3
Capı́tulo 1
Estado da Arte
Neste capı́tulo, serão 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 importância que os
mesmos trazem ao campo da ”Quı́mica Computacional”ou Chemoinformatics.
1.1
Quı́mica Computacional
Nesta subseção serão apresentados trabalhos relacionados à pesquisa da quı́mica computacional.
Um dos principais objetivos dos pesquisadores em ensino de quı́mica durante as últimas
décadas tem sido para melhorar a compreensão dos novos pesquisadores, quı́micos, industriais e alunos sobre assuntos referentes a conceitos de Quı́mica (bem como de Ciências em
geral). Um dos recursos que vem sendo utilizado desde a década de 60 como instrumento
para a aprendizagem é o computador, que com o passar dos anos vem sendo evoluı́do e
modificado [Chen, 2006].
Tem-se observado um extraordinário incremento do poder computacional e uma notável
sofisticação das técnicas de computação no contexto da Quı́mica. Um exemplo é a modelação molecular que se tornou clássica, ganhou honras de prêmio Nobel e tantos outros
ramos que obteve reconhecimento do trabalho realizado. Os frutos obtidos em todas estas
frentes estão acessı́veis ao quı́mico experimental comum por meio de softwares de fácil
utilização para os sistemas operativos que lhe são familiares através de interfaces WWW.
São ferramentas que invadiram gradualmente os laboratórios e que se impõe aos quı́micos
que não gostam da modernidade eletrônica [Sousa, 2002].
Esta nova área é uma ”fronteira”entre a Quı́mica e a Informática, que aplica e desenvolve sistemas de informação, algoritmos, técnicas computacionais e métodos estatı́sticos
para problemas de Quı́mica. O nome desta ”fronteira”é ”Cheminformatics”, que pode
ser traduzido para ”Quimio-informática”que é a designação que vai sendo mais consen4
sualmente aceita, mais existe também o termo ”Quı́mica Computacional”que pode ser
utilizado como sinônimo [Chen, 2006].
Uma pesquisa realizada por Raupp [Raupp et al., 2008] em seu artigo, revela algumas fases da história da quı́mica computacional. No seu estudo Raupp e seus parceiros
mostram que no inı́cio da década de 70, na University of Lancaster, Inglaterra, um curso
de Quı́mica Quântica foi cuidadosamente organizado pelo quı́mico B. Duke. Este curso
tinha a finalidade de recuperar a motivação perdida devido às tentativas frustradas de cientistas da computação que, ao introduzir técnicas computacionais no ensino de quı́mica,
não utilizavam assuntos relevantes para a Quı́mica (hoje existem cientistas da computação
especialistas nesta área). O uso de computadores nesta época já era um foco de pesquisas,
mas os alunos não eram incentivados de maneira que despertasse interesse. Em seu curso,
Duke utilizou um programa para calcular as propriedades de compostos aromáticos pelo
”método de orbitais moleculares”1 . De acordo com o quı́mico Duke, o interesse dos alunos
aumentou com a experiência prática. Aspectos do uso de computadores de fato, não substituem e sim auxiliam o aprendizado de conceitos quı́micos. Todos começaram a gostar da
nova modalidade e anos mais tarde o mesmo tópico 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 são de grande ajuda para o ensino.
Dez anos depois, a Real Academia de Ciências da Suécia outorgou o Prêmio Nobel
de Quı́mica de 1998 aos pesquisadores: Walter Kohn (Universidade da Califórnia) e John
A. Pople (Universidade North Western, Evanston, Illinois, EUA). O primeiro por sua
contribuição ao desenvolvimento da Teoria do Funcional de Densidade e a de Pople por sua
contribuição ao desenvolvimento de métodos computacionais em quı́mica quântica. Com
as pesquisas e programas que foram iniciados desde a década de 1960, a quı́mica reafirmase como uma ciência exata computável [Freitas, 1998]. O progresso no desenvolvimento
de softwares e hardwares aliado a uma redução constante de custo dos materiais, torna a
quı́mica computacional uma das áreas 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 códigos
capazes de resolver as equações da mecânica quântica. O segundo caminho seguiu a partir
de aproximações e resultados de cálculos parametrizados por grupos atômicos, a fim de
economizar etapas de cálculo computacional. Finalmente, nas últimas décadas, uma nova
escala de cálculo foi introduzida, com os métodos de simulação que, basicamente, não
tratam o sistema quı́mico como obedecendo a regras da mecânica quântica, mas como
sistemas atômicos clássicos. [Raupp et al., 2008].
1
Considera que os elétrons de valência estão em orbitais espalhados pela molécula inteira.
[Raupp et al., 2008]
5
A conclusão de Raupp neste estudo de levantamento de informações da quı́mica computacional foi que o desenvolvimento e o posterior uso de softwares em sala de aula
auxiliam a resolução de problemas quı́micos, e a versatilidade da quı́mica computacional
permite não só sua aplicação no ensino de quı́mica como também nas áreas de pesquisa
e desenvolvimento de laboratórios e indústrias. Pode-se salientar que estas ferramentas,
quando devidamente aplicadas, além de motivar aprendizagem, comprovada pelo professor quı́mico B. Duke na década de 70 [Raupp et al., 2008], colaboram com a adaptação
do aluno a uma sociedade cada vez mais tecnológica.
Na seção seguinte serão 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 informações sobre a nomenclatura
de compostos quı́micos. De acordo com o autor a nomenclatura quı́mica estabelece regras que permitem construir de uma forma sistemática nomes para quaisquer substâncias
quı́micas a partir do conhecimento da sua estrutura molecular. Como já se conhece perto
de vinte milhões de substâncias, essas regras têm vastas consequências sobre a introdução
de novas palavras nas lı́nguas de todo o mundo.
Herold volta um pouco na história e mostra que as primeiras regras de nomenclatura
quı́mica sistemática foram criadas por Guyton de Morveau, Lavoisier, Fourcroy e Berthollet no idioma francês, em 1787, e foram quase imediatamente traduzidas para inglês e
alemão em 1788, para italiano em 1790 e para dinamarquês em 1794. Em 1801, Vicente
Coelho de Seabra Silva Telles, Universidade de Coimbra e Sócio da Real Academia das
Ciências de Lisboa, publica uma tradução para o portugues.
Após um longo intervalo na publicação de trabalhos sobre nomenclatura quı́mica portuguesa, em 1905, Silva [Herold, 2000], inicia a publicação de uma série 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 exemplo: Adolpho Coelho e Rómulo de Carvalho [Herold, 2000]. Observou-se muitos conflitos
no estudo da nomenclatura quı́mica sem uma determinada lı́ngua e regra para a construção
do nome quı́mico.
A partir da década de 1950, o predomı́nio da lı́ngua inglesa como veı́culo internacional
da comunicação em Ciência e a sua adoção como lı́ngua oficial única pela IUPAC (International Union of Pure and Applied Chemistry), teve como resultado que a grande
maioria das traduções portuguesas de textos cientı́ficos, normas de terminologia e nomenclatura quı́micas se fizesse a partir do inglês. E sempre seguindo as regras determinadas
pela IUPAC. A estabilização daı́ resultante foi reforçada pelo caráter mais definitivo das
6
normas de terminologia e das regras de nomenclatura internacionais [Herold, 2000].
Conforme Herold foi complicado a formulação, construção e tradução de nomes quı́micos
sem uma regra universal. Hoje a ”União Internacional de Quı́mica Pura e Aplicada”2 contribui para o avanço de aspectos mundiais das ciências quı́micas e para a aplicação da
quı́mica a serviço da humanidade. Formada em 1919, tem sido bem sucedida em incentivar a comunicação internacional na área da quı́mica e em unir a quı́mica acadêmica,
industrial e pública em uma linguagem comum.
Muitos estudos seguem as determinações da IUPAC para a realização de um trabalho
universal. Logo abaixo serão mostrados os principais trabalhos que fazem uso das normas
estabelecidas pela IUPAC.
Nas Figuras 1.1 e 1.2 são mostradas interface de softwares que utilizam as regras de
formação de nomes de compostos quı́micos estabelecida pela IUPAC, para geração de
estrutura a partir da nomenclatura e vice-versa.
Figura 1.1: IUPAC NameIt [Rodrigues, 2001].
O software IUPAC NameIt possui a função de gerar o nome a partir da estrutura
quı́mica. Este software foi desenvolvido pela própria IUPAC.
O software IUPAC DrawIt possui a função de gerar a estrutura a partir do nome. Este
software também foi desenvolvido pela própria IUPAC.
2
www.iupac.org
7
Figura 1.2: IUPAC DrawIt [Rodrigues, 2001].
Um dos projetos pioneiros no ramo de estruturas quı́micas e o mais clássico de todos foi
o DENDRAL [Stefani et al., 2007]. Desenvolvido em 1965, na Universidade de Stanford,
o programa funcionava com a estratégia denominada ”planejar-montar-testar”. Na fase
”planejar”, os dados disponı́veis eram confrontados com dados de uma biblioteca e subestruturas obtidas a partir destes dados, depois na fase ”montar”, as estruturas quı́micas
eram geradas e finalmente na fase ”testar”, havia uma verificação se as estruturas geradas
eram compatı́veis com os dados apresentados. Durante a realização do projeto, foram
desenvolvidos diversos algoritmos e técnicas que se tornaram clássicas em sua utilização.
O DENDRAL possuı́a um banco de dados contendo vários fragmentos de estruturas
quı́micas com seus respectivos deslocamentos quı́micos. Todos esses fragmentos eram
pequenos, com no máximo quatro ou cinco átomos, incluindo heteroátomos. Este programa não era totalmente automatizado, pois o quı́mico deveria informar ao programa
quais grupamentos funcionais ou subestruturas deveriam estar presentes na solução final
do problema (”goodlist”) e quais deveriam estar ausentes (”badlist”). Após esta etapa o
programa elaborava as propostas estruturais [Stefani et al., 2007].
Três programas desenvolvidos por Munk [Stefani et al., 2007] e colaboradores, segundo
o autor da pesquisa Stefani também foram importantes para apresentação de estruturas
quı́micas: ASSEMBLE, o SESAMI e o HOUDINI, criados em 1967 [Lipkowitz et al., 2000].
Todos realizam quase a mesma função, com poucas diferenças, mais o ASSEMBLE
8
diferencia-se dos outros sistemas por não possuir banco de dados. Tal sistema lida apenas
com a fórmula molecular e todos os isômeros3 possı́veis são gerados a partir desta fórmula
molecular. Os projetistas do ASSEMBLE adicionaram opções para o usuário poder indicar ao programa fragmentos que deveriam estar presentes ou ausentes na solução final.
Este programa evoluiu e hoje está na versão 2.0.
Um outro sistema CHEMICS, desenvolvido por um grupo de pesquisadores japoneses
na década de 60. Utiliza algoritmos semelhantes aos usados pelo DENDRAL e realiza
funções parecidas para geração estrutural.[Stefani et al., 2007]
Com a realização destes trabalhos foi possı́vel a criação de vários sistemas, onde boa
parte trata de estruturas orgânicas. Um exemplo de um destes sistemas é o SPINUS-WEB.
É uma ferramenta on-line, como mostrado na Figura 1.3, destinada à verificação e validação de estruturas orgânicas. 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 usuário possa desenhar a estrutura
desejada (2D) antes do cálculo 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].
3
fenômeno relacionado à existência de dois ou mais compostos quı́micos com fórmulas e pesos molec-
ulares idênticos, mas propriedades diferentes[Usberco e Usberco, 2001].
4
http:// www.dq.fct.unl.pt/spinus
9
Após os resultados bem sucedidos de alguns destes projetos e com o rápido desenvolvimento de diferentes técnicas computacionais, foram criadas condições para a evolução e o
aperfeiçoamento das técnicas que pudessem auxiliar o quı́mico no reconhecimento estrutural de substâncias orgânicas. Stefani conclui que as técnicas de Inteligência 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 construção
[Stefani et al., 2007]. Busca-se aumentar a produtividade, pois se torna evidente que a
etapa limitante do processo de reconhecimento de uma substância não é mais a geração
de dados, mas sim como interpretá-los. Rapidez também é essencial, sendo que já existem
programas que realizam tarefas complexas de reconhecimento em apenas alguns segundos. Logo, é evidente a necessidade do emprego de técnicas computacionais que possam
auxiliar o quı́mico neste processo. Desta forma, tanto a academia quanto as empresas de
pesquisa e desenvolvimento de softwares dedicados à quı́mica investiram maciçamente no
setor, gerando bons resultados. Tal fato pode ser constatado observando-se o aumento da
quantidade de publicações de artigos cientı́ficos inerentes ao tema e nos produtos oferecidos pelas empresas [Stefani et al., 2007].
Como os computadores começaram a ser cada vez mais utilizados pelos quı́micos,
softwares estão evoluindo gradativamente nesta área, 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 além das capacidades de planilhas e bancos de dados, e
também de serem mais versáteis do que somente os pedaços de código que fazem cálculos
especı́ficos, que mesmo contendo a sua importância, 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 fórmulas
quı́micas, mas também podem através de uma fórmula quı́mica (ou nome), serem capazes
de processar e determinar automaticamente o nome quı́mico (ou fórmula), por meio da
”quebra”e reconhecimento de partes para então diferenciar e disponibilizar o resultado.
Abaixo estão relacionados e explicados alguns dos trabalhos voltados para nomenclatura
e estrutura quı́mica.
Um dos sistemas que será apresentado primeiramente nesta seção voltado para a
quı́mica orgânica é o sistema ”RALQ”. Desenvolvido por Dias [Dias, 2006], o sistema
RALQ (Resolvedor de Ambiguidades Linguı́sticas da Quı́mica Orgânica) possui como
principais objetivos: analisar sintática e semanticamente nomes de compostos quı́micos
e resolver possı́veis ambiguidades dos nomes de alguns compostos da quı́mica orgânica.
E por fim, desenhar as estruturas quı́micas correspondentes aos mesmos. Para tanto, o
sistema recebe um nome de um composto orgânico, analisa-o sintática e semanticamente
e, caso ele represente um composto quimicamente correto, gera uma saı́da visual para a
estrutura quı́mica que lhe corresponda.
10
Uma caracterı́stica importante apresentada por Dias que o sistema possui, é o fato de
conseguir analisar tanto nomes de compostos que se enquadram nos padrões das nomenclaturas oficiais vigentes (IUPAC), quanto aqueles que, apesar de não se enquadrarem nos
mesmos, representam compostos orgânicos verdadeiros. Este sistema utiliza a técnica da
Teoria do Léxico Gerativo 5 , a motivação de se usar esta técnica foi a análise sintática e
semântica que são guiadas pelos tipos dos componentes dos nomes quı́micos. Além desta
técnica, 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 Programação Funcional CLEAN 2.2.1 e um pacote em Latex6 denominado Xymtex,
utilizado para montar formas estruturais [Dias, 2006].
A ferramenta alemã ”ACD/Name”7 fornecida pelo ScienceServe/Scientific Software
Solutions apresenta a geração de estruturas a partir de nomes de composto quı́mico e
vice-versa. Sendo uma ferramenta comercial, nenhuma documentação detalhada está
disponı́vel aos interessados [Dias, 2006].
O software ”Hot Potatoes”que se concentra na nomenclatura de hidrocarbonetos, de
acordo com a nomenclatura IUPAC, é uma ferramenta que auxilia os ensinamentos da
quı́mica orgânica. Hot Potatoes é um software criado pelo Humanities Computing and
Media Center da University of Victoria/Canadá, como software de autoria8 , veja Figura
1.4. Este software é um conjunto de seis ferramentas de autoria (JQuiz 9 , JMix 10 , JCross,
JMatch 11 , JCloze 12 e The Master 13 ), que possibilitam a elaboração de seis tipos básicos de
exercı́cios interativos utilizando programação em HTML. Com a ferramenta do JCross, o
usuário informa a ferramenta os nomes dos compostos que estarão 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 usuário vai observar a fórmula estrutural do
composto e digitar o seu nome [Neto e Júnior, 2000].
Uma outra ferramenta é a ACD/Chemsketch Freeware 5.12, Figura 1.6. É um software
de desenvolvimento da Quı́mica Avançada. Utilizado para desenhar estruturas quı́micas,
reações e diagramas esquemáticos e também pode ser usado para projeções em 3D. Tra5
Utiliza os tipos dos itens léxicos como fatores de organização da composição dos mesmos. Tal es-
tratégia auxilia na resolução de ambiguidades, pois, essa teoria dá todas as condições para que o tipo de
um item léxico seja encontrado de acordo com os seus possı́veis complementos [Dias, 2006].
6
http://www.latex-project.org/
7
http://www.scienceserve.com/software/acd
8
É um programa computacional para a realização de obras hipertextuais ou hiperdidáticas sem utilizar
códigos e linguagens de programação. [Rodrigues, 2001]
9
produz atividades de resposta curta, múltipla escolha ou atividades hı́bridas
10
produz atividades para ordenar frases ou palavras
11
produz atividades de correspondência
12
produz atividades com preenchimento de lacunas
13
produz uma unidade didática com vários exercı́cios
11
Figura 1.4: Software Hot Potatoes [Neto e Júnior, 2000].
Figura 1.5: JCross: Palavras Cruzadas [Neto e Júnior, 2000].
balha com barramento 32 bits e é aplicável aos sistemas operacionais Microsoft Windows95/98/ NT/ME/2000/XP [Neto e Júnior, 2000].
Uma ferramenta divulgada pelo autor Zielesny [Zielesny, 2005] é o pacote do software
da quı́mica ChemOffice Ultra 2005. Voltado para Microsoft Windows e PCs. Este programa foi revisto e atualizado várias vezes para uma boa qualidade. Seu público alvo
12
Figura 1.6: Ferramenta ACD/Chemsketch Freeware 5.12 [Neto e Júnior, 2000].
são cientistas quı́micos, e universitários. Ele consiste em três aplicações fundamentais: o
editor ChemDraw (desenho da estrutura quı́mica), o ChemFinder (banco de dados das
estruturas quı́micas) e o Chem3D (aplicação da modelagem molecular).
O ChemDraw fornece todas as funções básicas de apoio para o desenho de estruturas quı́mica, bem como para compostos orgânicos e bioquı́micos (anéis, aromáticos,
DNA/RNA, etc.). A interface bem elaborada e de fácil manipulação, Figura 1.7, possibilita a conversão de nome para estrutura e estrutura para nome [Zielesny, 2005].
O ChemFinder é um banco de dados do sistema em apoio a quı́mica. Possui a possibilidade de realizar consultas SQL em suas tabelas. Úteis para armazenar e investigar dados
quı́micos individuais. E produz também o desenho da estrutura quı́mica molecular para
um nome quı́mico, isto é, por meio de um nome de consulta o sistema gerará o desenho da
estrutura molecular correspondente a consulta de entrada, além de fornecer informações
detalhadas sobre o composto. Esse sistema inclui uma lista de sinônimos entre os nomes
usuais e oficiais. É baseada em uma análise linguı́stica do nome do composto quı́mico
13
Figura 1.7: ChemDraw [Zielesny, 2005].
de entrada, aceita mais de uma variante de nomenclatura e compostos que não fazem
parte das nomenclaturas oficiais não são tratados por essa ferramenta. Não faz parte do
pacote a recuperação de dados, mas outras linhas do ChemOffice CambridgeSoft Oracle
disponibilizam esta comodidade [Zielesny, 2005]. A interface do ChemFinder é mostrada
na Figura 1.8.
O Chem3D possibilita a construção e análise de modelos de estruturas quı́micas em
3D, como pode ser visto na Figura 1.9, junto com cálculos computacionais da quı́mica.
A aplicação é constituı́da pela utilização de OpenGL 3D e um ”motor”para renderização.
Existem diálogos e guias para que os usuários não se percam no momento da utilização
[Zielesny, 2005].
Um trabalho mais recente na área da linguı́stica computacional voltada para a quı́mica
orgânica 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 programação lógica Prolog. Esse sistema gera uma representação semântica
intermediária para um nome de composto quı́mico-orgânico. O processamento dessa estrutura semântica gerará cadeias de caracteres SMILES14 que descreverão a estrutura
14
Uma cadeia de caracteres SMILES é uma notação estrutural de uma molécula que consecutivamente
lista os elementos de cadeia principal com suas propriedades e ramificações [Dias, 2006].
14
Figura 1.8: ChemFinder [Zielesny, 2005].
Figura 1.9: Chem3D [Zielesny, 2005].
15
molecular do composto e que permitirão a classificação do mesmo. O sistema é apto para
analisar, inclusive, nomes usuais dos compostos quı́micos [Dias, 2006].
O CHEMSKETCH [Raupp et al., 2008] é uma ferramenta avançada de desenho quı́mico
que fornece às propriedades moleculares, otimização, visualização 3D, capacidade de
nomear as moléculas, conforme as regras IUPAC, e ainda possui um grande banco de
dados com estruturas quı́micas e materiais de laboratório. O software calcula automaticamente a valência de cada átomo e restringe a construção da molécula com base na regra
do octeto, a não ser que seja instruı́do a não fazer esta limitação. Em seguida, é possı́vel
solicitar a construção da forma espacial 3D da espécie estudada, o que aciona outra janela
onde o estudante pode, agora, rotacionar tridimensionalmente a espécie estudada, além de
observar estas espécies em diferentes visualizações (Ball and sticks, sticks only, spacefill,
wireframe, dots only e disks) com possibilidade de visualizar ligações e arranjo espacial
das espécies de forma realçada em cada uma destas representações [Raupp et al., 2008].
Um outro programa é o ARGUSLAB. Uma ferramenta em 3D especializada em estruturas moleculares de interesse para a medicina, indústria farmacêutica e quı́mica orgânica.
O programa permite desenhar complicadas configurações de proteı́nas obtendo cadeias helicoidais de aminoácidos, de hélice alfa, etc [Raupp et al., 2008]. A Figura 1.10 mostra a
interface do programa.
Figura 1.10: ARGUSLAB [Raupp et al., 2008].
16
O programa ACD/StrucEluc (Structure Elucidator ) que está na versão 8.0, foi desenvolvido para o conhecimento estrutural automatizada de estruturas quı́micas. O programa
possui uma moderna interface com o usuário. Os algoritmos do sistema baseiam-se na
fórmula molecular. O sistema também é capaz de determinar a estereoquı́mica15 relativa
automaticamente. Cria uma lista de fragmentos compatı́veis com as correlações apresentadas. Tais fragmentos são enviados ao gerador para combinação e geração das soluções,
que são validadas pelo ACD/NMR Predictor [Stefani et al., 2007].
O ChemSite Pro é um programa interativo de modelagem de estruturas quı́micas
3D. Permite a manipulação de moléculas para a construção da visualização da estrutura
quı́mica. Possui uma interface intuitiva, interativa e modelagem 3D com animação em
tempo real. Pode facilmente modelar proteı́nas, DNA, moléculas orgânicas e inorgânicas
convertendo para 3D com texturas. Veja na Figura 1.11 o tipo de imagem que o ChemSite
Pro constrói [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 fórmulas
quı́micas inorgânicas a partir dos nomes quı́micos. O estudo gerou um modelo baseado
em um sistema pericial que mapeia nomes em fórmulas quı́micas. Este modelo utiliza
um banco de dados e dois sistemas de controle para detectar erros ortográficos que são
esclarecidos.
Eggert mostra que ao trabalhar com nomes quı́micos, o computador tem de lidar com
dois tipos de problemas. O primeiro, é que o computador não sabe que nome o usuário
está fornecendo como entrada. O problema é ter uma seqüência de caracteres e convertêlos em uma fórmula quı́mica reconhecı́vel para um quı́mico. Dificuldades podem surgir
como: ortografia incorreta, nomes de fórmulas que não existem, produtos que não sejam
15
Parte da quı́mica que investiga a disposição espacial dos átomos nas moléculas. [Ferreira, 1999]
17
da quı́mica, entre outros. O segundo, é que o computador ”sabe”como a entrada deve
ser. Então o problema é determinar o que está errado na entrada do usuário e enviar um
relatório sobre o erro.
Reconhecimento de sintaxe em computadores não é uma tarefa difı́cil, porque pode
facilmente ser especificada por padrões. No entanto, reconhecimento da semântica, exige
complexas relações entre as palavras e até mesmo um conhecimento cultural. Para o reconhecimento de nomes podemos restringir um padrão fornecendo assim um modelo quase
completo de compostos inorgânicos, com o nome da maioria das substâncias encontradas
na quı́mica inorgânica para certo grupo de quı́micos (deixando de fora nomes de interesse
para grupos de quı́micos especializados).
Os autores mostram que a verificação do nome de entrada é importante para a geração
da fórmula, pois o programa saberá que é um nome quı́mico e retornará a fórmula que o
usuário solicitou com o respectivo nome. O processo de converter nomes inorgânicos em
fórmulas parece ser um processo simples, mas é gravemente afetado pelos erros ortográficos
e de espaçamento. Eggert enumera os possı́veis fatores de erros na entrada pela ortografia
ou digitação.
O primeiro erro seria o usuário pensar que a palavra é escrita de forma diferente,
exemplo: o elemento fluorine digitado como ”flourine”. O segundo erro, tido por eles o
mais freqüente, seria a omissão de letras. O usuário pode digitar a palavra faltando letras,
exemplo: ”carbnate”para carbonate. O terceiro erro, a adição extra de caracter, exemplo:
”broimide”para bromide. O quarto tipo de erro resulta da transposição de letras, por
exemplo, entrar com ”cholrine”em vez de chlorine.
Tem-se também erros relacionados ao espaço. O primeiro tipo é quando o usuário
intencionalmente digita a palavra com um determinado espaço, exemplo: ”copper (II)”em
vez de copper(II). O segundo tipo é a adição extra de espaço, enquanto que o primeiro
tipo é intencional o segundo não é. O terceiro tipo é a omissão de espaço. E o quarto
tipo é a combinação do terceiro com o segundo tipo de erro.
Pode-se ter erros relacionados aos parênteses. Os erros são: não ter fechado o parêntese
aberto, ter omitido os parênteses e a colocação inapropriada de caracteres entre parênteses.
Observam-se também erros na utilização do estado de oxidação, são de três tipos: quando
a necessidade de um estado de oxidação é omitida, exemplo: ”copper sulfate”em vez de
copper(II) sulfate; o segundo caso é o fornecimento do estado de oxidação quando não
era para ser fornecido, exemplo: ”magnesium(II)”em vez de magnesium; e o terceiro
caso, quando o próprio estado de oxidação pode ser incorreto. Podem acontecer erros
aos ”nomes com partes”ou fragmentos, por exemplo, ”Bicarbonato de sódio”, 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 são: os prefixos desnecessários, os nomes
18
que estejam faltando prefixo e os prefixos incorretos. Os sufixos podem também apresentar erros, como confusões com letras, os sufixos desnecessários e sufixos incorretos.
Alguns erros são aplicáveis a todo o nome. Estes incluem dando o nome errado, um nome
irreconhecı́vel, ou o usuário dá um nome alternativo para um composto quı́mico. Eggert
descreve alguns erros complicados de resolver, mais o principal seria: a combinação de
um erro no espaçamento com um erro de ortografia, exemplo: ”calciusulfate”em vez de
calcium sulfate.
Toda esta parte está relacionado com parser, pois quando o usuário entrar com o
nome a palavra deverá ser ”quebrada”para a verificação, e neste momento a atenção na
implementação é essencial para a correta saı́da do programa. Os autores também mostram
alguns processos do parser como: além de corrigir o nome inscrito com a melhor correspondência e detectar os erros de ortografia e espaçamento também precisa ter cuidado com
os prefixos porque o mesmo prefixo pode ter significados diferentes em diferentes contextos
da quı́mica, ter uma atenção no momento que o analisador identificará quando um nome
começa, termina e sequencialmente começa o próximo. Depois da análise da palavra será o
momento de cada nome, ou fragmento, ter sua fórmula para serem combinadas formando
uma fórmula (estrutura) geral ou a fórmula que o usuário solicitou.
Para ajudar o usuário quando o programa não puder compreender a entrada ou não
puder completar a fórmula, os erros devem ser detectados, identificados e informados para
que os usuários obtenham assim uma melhor compreensão dos erros.
Um outro estudo importante que também é de autoria de Arthur A. Eggert, Anthony T. Jacob, e Catherine H. Middlecamp [Eggert et al., 1992] foi a capacidade de obter
nomes de produtos quı́micos inorgânicos, dadas as suas fórmulas quı́micas. Mostrando
que é essencial o conhecimento da conversão não só aos quı́micos e aos estudantes de
quı́mica, mas também para os computadores se eles vão assumir o papel de assistentes
inteligentes no laboratório quı́mico. Para estudar os problemas da conversão de fórmula
para nome, desenvolveram um modelo em forma de um PC baseado em um sistema que
mapeia fórmulas 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, é
a codificação de conhecimento da quı́mica de uma forma aplicável à automatização da
solução de problemas. Essa resolução é feita por programas que contêm as informações
necessárias para permitir orientar o aluno na resolução de um determinado problema especı́fico. Um exemplo de resolução apresentado é a conversão de fórmula para nome.
Este problema é composto de duas partes. Primeiro, deve ser determinado se a fórmula
fornecida pelo usuário é quimicamente viável. Em segundo lugar, a fórmula deve ser
decomposta em subpartes, e os fragmentos devem ser recompostos em um nome quimicamente correto. Cada um tem uma fórmula quı́mica viável ou mais nomes para o qual ele
19
pode ser convertido segundo as regras IUPAC.
Para sistematizar o processo de conversão de uma fórmula para um nome, a fórmula
deve ser separada em componentes quı́micos que fazem sentido. No momento da análise
da fórmula, observa-se a variedade de possibilidades para a elaboração das primeiras
operações que irão afetar diretamente a partir do nome, para desenhar o arranjo estrutural e descobrir a relação entre os diversos componentes. Esta operação aparenta ser
improvável, mas Eggert usou um procedimento utilizando uma estrutura chamada ”parse
tree”. Depois da construção da árvore, ela é avaliada, seus nodos são reordenados, os estados de oxidação são recursivamente atribuı́dos aos nós, e finalmente, após o retorno para
o nó raiz, os nomes são atribuı́dos a cada um dos nodos. Esta árvore é utilizada porque
é uma forma de organizar as informações em que cada item é um componente do item
acima. O item inicial a ser analisado é colocado no topo da árvore, que é chamado de nó
”raiz”, e cada fragmento quebrado são colocados em um nó ”filho”. Cada nó ”filho”pode
também ter filhos. Caso isso não ocorra, é chamado de nó ”folha”.
As informações armazenadas na árvore são úteis para a verificação da classificação,
dos dados armazenados em cada nodo, o armazenamento dos atributos de cada grupo e a
ocorrência de atributos armazenados de cada elemento. Embora este tipo de fragmentação
possa ser considerado lento, é essencial para prevenir combinações falsas entre os elementos
para a formação do grupo.
Após completar a árvore as informações recolhidas são utilizadas para iniciar a tomada
de decisões. As informações são passadas por uma avaliação, dos dados recolhidos na
árvore, para então a formação do nome ser concluı́da.
O reconhecimento da entrada também é tratado com cuidado, pois os usuários podem
usar espaços inapropriados, posicionamento inadequado da carga, o uso de ”1”ou ”0”como
um expoente, a correspondência inadequada entre parênteses são detectados, fórmulas
escritas incorretamente, fórmulas que não estão nas regras IUPAC, entre outras citadas.
O projeto CHEMPROF reconhece fórmulas (estruturas) e converte fórmulas para
nomes (análise). Ao dar o resultado explica cada componente da fórmula para o usuário,
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 fórmulas quı́micas e, em seguida, integrar esses dois tipos de métodos em
rotinas resolvendo assim, problemas quı́micos de nı́vel superior. Como já foi explicado
acima, Eggert e sua equipe conseguiram concluir seu trabalho integrando no CHEMPROF
a conversão de nomes para estruturas (fórmula).
Este projeto estará seguindo os passos e as observações levantadas nos trabalhos apresentados nestas subseções, principalmente os trabalhos de Eggert e Dias. Estes dois
trabalhos apresentam algumas diferenças e semelhanças com o protótipo PROF QUIM
deste projeto, como: Eggert trabalhou com reconhecimento de compostos inorgânicos,
20
utilizou a linguagem de programação Turbo Pascal, possui uma interface, informa um
erro (mas não o esclarece) e explica cada parte da estrutura quı́mica. Já Dias, trabalhou
com quı́mica orgânica abordando somente a função hidrocarboneto (alcano, alceno, alcino
e alcadieno), utilizou a linguagem de programação CLEAN, faz o reconhecimento de nomes
”comuns”(nomes que os pesquisadores não conseguiram impor uma regra por serem populares) e nomes que seguem as regras da IUPAC, resolve questões de ambiguidades do nome,
não possui uma interface gráfica (apenas linha de comando), não informa se aconteceu um
erro no reconhecimento do nome e não há uma explicação do nome quı́mico. Neste projeto,
o PROF QUIM irá trabalhar com quı́mica orgânica abordando a função hidrocarboneto
(alcano, alceno, alcino e alcadieno) e a função oxigenada (álcool, éter, aldeı́do e cetona),
utilizou a linguagem de programação Java, reconhecendo somente nomes que seguem as
regras da IUPAC, possui uma interface gráfica para entrada e saı́da de dados, informa ao
usuário onde aconteceu um erro, explica o tipo do erro dando uma sugestão, a estrutura
quı́mica é dada em representação string SMILES e explica o significado de cada parte
do nome quı́mico fornecido. Observa-se que o PROF QUIM possui algumas semelhanças
entre os dois trabalhos, mas também possui algumas inovações para o seu diferencial.
Comparando os trabalhos do passado, aqui explicados, com os de hoje observa-se que
obter a habilidade de trabalhar com inteligência e processamento de linguagem quı́mica
são fundamentais para o avanço de soluções de problemas complexos e desafiadores da
quı́mica.
No capı́tulo 2 será exposto toda a teoria (algumas abordadas pelos autores Dias e
Eggert como análise sintática) utilizada para a construção do protótipo PROF QUIM,
deste projeto.
21
Capı́tulo 2
Fundamentação Teórica
Neste capı́tulo serão apresentadas as técnicas e ferramentas que serão o alicerce teórico
para a construção do protótipo de análise de nomes da quı́mica orgânica.
2.1
Quı́mica Orgânica
A vida é baseada na água e nos compostos de carbono. A água fornece o fluido da vida,
e o carbono, se combinado com outros átomos de carbono, hidrogênio, oxigênio, nitrogênio,
enxofre e fósforo, constitui as moléculas da vida. Os compostos de carbono ocorrem em
todos os organismos vivos e sem eles a vida não existiria [Rissato e Gerenutti, 2005].
A Quı́mica Orgânica é o estudo dos compostos que contêm carbono, cuja principal
propriedade é a formação de cadeias carbônicas1 . Sua denominação foi baseada nas conclusões de Lavoisier que, em 1784, provou que os compostos obtidos de seres vivos ou
fósseis continham carbono[Rissato e Gerenutti, 2005].
Atualmente a Quı́mica Orgânica é definida como a área que estuda uma gama de
substâncias compostas com a participação do carbono. Inclui também os hidrocarbonetos
(petróleo, gás natural), produtos de fermentações (como o álcool comum e o ácido acético
do vinagre), ésteres (usados como solventes e aromatizantes), medicamentos (penicilinas,
sulfas), corantes (anilinas), polı́meros (fibras sintéticas e plásticos), além de substâncias de
origem orgânica, como açucares, gorduras e proteı́nas. A denominação Quı́mica Orgânica
foi mantida, entretanto, para indicar o estudo dos compostos cujas moléculas possuem
em sua cadeia o elemento quı́mico carbono [Usberco e Usberco, 2001].
1
É o conjunto de todos os átomos de carbono e de todos os heteroátomos que constituem a molécula
de qualquer composto orgânico[Usberco e Usberco, 2001]
22
2.1.1
Encadeamento
Os átomos de carbono têm a propriedade de se unir, formando estruturas denominadas
cadeias carbônicas. Essa propriedade é a principal responsável pela existência de milhões
de compostos orgânicos. Vejamos algumas cadeias na Figura 2.1.
Figura 2.1: Cadeias Carbônicas.
Uma cadeia carbônica pode apresentar, além de átomos de carbono, átomos de outros
elementos quı́micos, desde que estes estejam entre os átomos de carbono. Os elementos
diferentes do carbono que freqüentemente podem fazer parte da cadeia carbônica são: O
(oxigênio), N (nitrogênio), S (enxofre), P (fósforo) e H (hidrogênio). Nesta situação, tais
átomos são denominados heteroátomos [Dias, 2006].
2.1.2
Tipos de Carbono
Em uma cadeia, cada carbono é classificado de acordo com o número de outros átomos
de carbono a ele ligados. Desta forma tem-se [Campos e Mourato, 1999]:
• Carbono Primário - quando um átomo de carbono está ligado somente a outro átomo
de carbono.
o
C1 − C
• Carbono Secundário - quando um átomo de carbono está ligado a dois outros átomos
de carbono.
o
C − C2 − C
• Carbono Terciário - quando um átomo de carbono está ligado a três átomos de
carbono.
• Carbono Quaternário - quando um átomo de carbono está ligado a quatro átomos
de carbono.
23
Com a presença de dupla ou tripla ligação não há interferência na classificação do
carbono. A cadeia carbônica da Figura 2.2, representa esta classificação sem influência
[Dias, 2006].
Figura 2.2: Tipos de Carbono.
Onde temos (Figura 2.2):
• 1a → carbono primário;
• 2a → carbono secundário;
• 3a → carbono terciário.
2.1.3
Ligação entre Carbono
Os tipos de ligações entre carbonos são:
• Ligação Simples - quando dois átomos de carbono se ligam por apenas uma unidade
de valência 2 .
C −C
• Ligação Dupla - quando dois átomos de carbono se ligam por duas unidades de
valência.
C=C
2
O número de ligações estáveis que um átomo ou um grupo de átomos pode efetuar com outros átomos,
ou outros grupos.[Ferreira, 1999]
24
• Ligação Tripla - quando dois átomos de carbono se ligam por três unidades de
valência.
C≡C
2.1.4
Cadeias Carbônicas
Cadeia carbônica ou estrutura quı́mica é o conjunto de todos os átomos de carbono
e de todos os heteroátomos que constituem a molécula de qualquer composto orgânico
[Usberco e Usberco, 2001].
As Cadeias Carbônicas são classificadas de acordo com a forma pela qual os átomos
de carbono se associam. Tem-se:
Cadeia aberta, acı́clica ou alifática - os átomos de carbono ligam-se, sem formar
anel ou ciclo.
Exemplo:
C
C
O
C
C
A sequência que apresenta maior número de átomos de carbono é chamada cadeia
principal. Estas cadeias principais, de classificação aberta, podem ser:
• Normal - possuem apenas carbono primário e secundário na cadeia principal.
Exemplo:
C
C
C
O
C
C
O
• Ramificada - possuem carbono terciário e ou quaternário na cadeia principal.
C
C
C
C
O
C
C
• Saturada - possuem apenas ligações simples entre carbono.
C
C
C
C
25
N
• Insaturada - quando há pelo menos uma dupla e/ou tripla ligação entre carbono.
O
C
C
C
O
C
C
C
• Homogênea - apresentam apenas átomos de carbono na cadeia principal.
O
C
C
C
@
OH
• Heterogênea - apresentam pelo menos um heteroátomo3 na cadeia.
C
C
N
C
C
Cadeia cı́clica ou fechada - os átomos de carbono ligam-se formando um ciclo ou
anel. Podem ser simples, quando todos os átomos de carbono pertencem ao anel ou
mistas, quando há ramificações no anel. Tem também:
• Saturada - possuem apenas ligações simples entre carbono.
• Insaturada - possuem pelo menos uma dupla e/ou tripla ligação entre carbono.
• Homocı́clica - apresentam apenas átomos de carbono no anel.
• Heterocı́clica - possuem pelo menos um heteroátomo no anel.
A Figura 2.3 mostra alguns tipos de cadeia fechada:
No protótipo proposto neste trabalho será abordado apenas a classificação das cadeias
abertas. As cadeias fechadas não serão reconhecidas pelo protótipo por falta de tempo
para sua implementação.
2.2
Funções Quı́micas
A Quı́mica Orgânica agrupa as substâncias quı́micas com base em critérios de semelhanças estruturais. Desse modo, cada função orgânica é caracterizada por um grupo
funcional e apresenta uma nomenclatura caracterı́stica [Usberco e Usberco, 2001]. Os
principais tipos são: Hidrocarbonetos (alcanos, alcenos, alcinos e alcadienos) e Funções
Oxigenadas (álcool, éter, cetona e aldeı́do).
3
Átomo diferente do elemento carbono na cadeia.
26
Figura 2.3: Cadeia fechada.
2.2.1
Hidrocarbonetos
Os hidrocarbonetos são compostos cujas moléculas são formadas apenas por carbono
(C) e hidrogênio (H), a partir dele é possı́vel produzir uma grande variedade de produtos que utiliza-se no dia-a-dia, como: velas (parafina), plásticos, borracha, combustı́veis
(gasolina, diesel, etc) e muitos outros. As fontes de hidrocarbonetos são os chamados combustı́veis fósseis, aqueles que levaram milhões de anos para se formar, como o petróleo, gás
natural, carvão, etc. Os hidrocarbonetos podem ser oxidados com uma grande facilidade,
liberando muita energia e calor, por isso são utilizados como combustı́veis [Rossum, 2005].
Os hidrocarbonetos correspondem a mais simples classe de compostos estudados na
quı́mica orgânica. Uma vez que os hidrocarbonetos estão presentes no nosso cotidiano, é
importante estudá-los e classificá-los.
Podemos classificar os hidrocarbonetos em algumas classes, onde cada uma possui algumas caracterı́sticas especı́ficas. Serão apresentados os Hidrocarbonetos (alcano, alceno,
alcino e alcadieno).
Alcanos ou Parafinas
São hidrocarbonetos alifáticos saturados, ou seja, apresentam fórmulas moleculares formadas somente por Carbono (C) e Hidrogênio (H) e possuem cadeia aberta constituı́da
apenas por ligações simples [Dias, 2006]. São encontrados em animais, plantas, no gás
natural e no petróleo [Rissato e Gerenutti, 2005].
Metano:
H
H
C
H
27
H
Etano:
H
H
H
C
C
H
H
H
H
H
C
C
C
H
H
H
H
H
H
H
C
C
C
C
H
H
H
H
H
Propano:
H
H
Butano:
H
H
Alcenos, Alquenos ou Olefinas
São hidrocarbonetos alifáticos insaturados que apresentam uma dupla ligação. Os alcenos ocorrem abundantemente na natureza e muitos desempenham papel fundamental
na biologia e também na bioquı́mica. O etileno, por exemplo, é um hormônio vegetal, na
forma gasosa, formado durante o metabolismo das frutas que induz seu amadurecimento
[Campos e Mourato, 1999].
Eteno:
H
H
H
C
C
H
H
H
C
C
C
H
Propeno:
H
H
28
H
1-Buteno:
H
H
H
H
H
C
C
C
C
H
C
H
CH3
C
C
H
1-Metilpropeno:
H
H
C
H
H
Alcinos ou Alquinos
Os hidrocarbonetos que possuem uma cadeia carbonada com, pelo menos, uma ligação
tripla constituem a famı́lia dos alcinos. Têm sido empregado em diversas sı́nteses de compostos de interesse farmacêutico e também em sı́nteses de produtos naturais. Constituem
uma das classes mais interessantes de novas drogas anticâncer, os quais penetram nas
moléculas de DNA [Campos e Mourato, 1999].
Etino:
H
C
C
H
Propino:
H
H
C
C
C
H
H
1-Butino:
H
C
C
H
H
C
C
H
H
H
2-Pentino:
H
H
H
C
C
H
H
29
H
C
C
C
H
H
Alcadienos ou Dienos
São hidrocarbonetos alifáticos insaturados por duas duplas ligações.
1,2-Butadieno:
H
H
C
C
H
2.2.2
C
C
H
H
H
Funções Oxigenadas
As funções oxigenadas possuem carbono, hidrogênio e oxigênio.
Álcoois
Álcoois são compostos que apresentam grupo hidroxila (-OH) ligado a carbono saturado.
grupof uncional : H3 C − CH2 - OH
Todos os álcoois têm grande importância comercial como solventes ou como intermediários de reação. O principal deles é o etanol, o qual possui muitas aplicações como
solvente industrial e também na área farmacêutica, sendo ainda muito usado na fabricação de bebidas. O uso mais popular é como combustı́vel, sendo misturado à gasolina
[Rossum, 2005].
Propanol:
H
H
H
H
C
C
C
H
H
H
H
H
OH H
C
C
C
H
H
H
OH H
C
C
H
CH3 H
OH
2-Butanol:
H
C
H
2-Metil-2-propanol:
H
30
C
H
H
Éteres
Os éteres apresentam um átomo de oxigênio (O) ligado a dois radicais orgânicos: R –
O – R’, em que R e R’ não são necessariamente iguais.
H3 C − O − CH3
O mais importante da série é o éter etı́lico, muito utilizado na medicina desde 1842
como anestésico em cirurgias prolongadas.
Possui atividade fisiológica por inalação,
agindo por solubilização dos lipóides4 dos tecidos nervosos, ou seja, não existe reação
quı́mica [Rissato e Gerenutti, 2005].
Atualmente o éter etı́lico é evitado devido aos danos hepáticos e por suas propriedades
inflamáveis.
Metóxi-metano:
H
H
H
C
O
C
H
H
H
H
H
H
C
C
H
H
Metóxi-etano:
H
O
C
H
H
Etóxi-etano:
H
H
H
C
C
H
H
O
H
H
C
C
H
H
H
Aldeı́dos
Os aldeı́dos apresentam o grupo carbonila na extremidade da cadeia.
grupof uncional :
O
C
@
4
tecidos gordurosos
31
H
Um dos mais importantes aldeı́dos e de uso mais comum é o metanal. Este gás com
odor irritante é comercializado dissolvido em água, em uma concentração máxima de 40%
em massa, com o nome formol. O formol é muito usado como germicida, desinfetante, fluido de embalsamamento e como conservante de peças anatômicas [Usberco e Usberco, 2001].
Metanal:
O
H
C
@
H
Etanal:
H
H
C
H
O
C
@
H
Propanal:
H
H
H
C
C
H
H
H
H
H
C
C
C
H
H
H
O
C
@
H
Butanal:
H
O
C
@
H
Cetonas
As cetonas apresentam o grupo carbonila sendo este carbono secundário.
grupof uncional :
O
C
A principal cetona é o lı́quido acetona. É um excelente solvente e por esse motivo é
usado na fabricação de tintas, vernizes e esmaltes [Usberco e Usberco, 2001].
32
Butanona:
H
H
O
H
H
C
C
C
C
H
H
H
H
2-Pentanona:
H
H
O
H
H
H
C
C
C
C
C
H
H
H
H
H
3-Pentanona:
H
H
H
O
H
H
C
C
C
C
C
H
H
H
H
H
O
H
C
C
C
H
Propanona:
H
H
H
H
Conhecendo os Hidrocarbonetos e Funções Oxigenadas que serão reconhecidos pelo
protótipo PROF QUIM, a seção 2.3 explicará como construir a nomenclatura de cada
função.
2.3
Nomenclatura dos Compostos Orgânicos
Em 1892, em Genebra, havia a necessidade do estabelecimento de regras internacionais, 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 reuniões de
Liége (1930), mas só finalmente fixadas com caráter definitivo, após muitas reuniões e
adiantamentos, em 1957[Rodrigues, 2001].
Em 1965, publicam as regras definitivas referentes à chamada ”Secção C”(Grupos caracterı́sticos que contêm os elementos C, H, O, N, Halogênios, S, Se e Te). Juntamente
com as normas constantes das Secções (A e B (1958)) anteriores, ficam então estabelecidos os nomes de centenas de milhares de estruturas que vão desde os hidrocarbonetos aos
33
sistemas heterocı́clicos, nomes esses que são utilizados na designação de todos os outros
grupos de compostos. Depois em 1973, são publicadas as regras respeitantes a Secção D e
Secção E (Nomenclatura Estereoquı́mica) e, finalmente, em 1978, às Secções F (Produtos
Naturais e Compostos Relacionados) e H (Compostos Modificados Isotopicamente). Só
então pode, enfim, ser editada (em 1979) a publicação IUPAC ”Nomenclature of Organie
Chemistry”(popularmente conhecida como ”Livro Azul”). No entanto, muitas situações
estão ainda por serem esclarecidas, e muitas das regras que foram ensaiadas continuam
a não ser aceitas pela generalidade dos quı́micos. A prova é que a primeira grande revisão 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 é o estabelecimento de nomes que correspondam
inequivocamente às estruturas a que se referem. A aplicação das regras necessárias a
esse objetivo deu origem à nomenclatura sistemática. Nota-se, no entanto, que as regras
da nomenclatura sistemática podem não conduzir a um único nome para cada composto
- devem é originar sempre um nome que não seja ambı́guo, isto é, a esse nome deverá
corresponder um único composto. De fato, um conjunto de regras que origina nomes
claros e lógicos para uma série de compostos pode gerar designações desnecessariamente
complicadas [Campos e Mourato, 1999].
Por outro lado, a preocupação com a maior clareza tem levado a IUPAC a aceitar, em
muitos casos, nomes semi-sistemáticos e nomes ”triviais”(ou populares) consagrados pelo
uso.
Portanto, as regras fundamentais da Nomenclatura de Quı́mica Orgânica com um conjunto de normas, procura regular o entendimento da única linguagem capaz de identificar
milhares de estruturas.
2.3.1
Regras de Nomenclatura
O princı́pio fundamental do sistema IUPAC de nomenclatura para compostos orgânicos
diz que cada composto diferente deve ter um nome não-ambı́guo5 . Assim, por meio de um
conjunto sistemático de regras a IUPAC fornece diferentes nomes para mais de milhões
de compostos orgânicos conhecidos e também utilizando suas regras, os nomes podem ser
deduzidos. Da mesma maneira, alguém pode também 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 substância é formado pela união de três componentes, cada um deles indicando uma caracterı́stica do composto. Os três componentes
são:
5
Termo que não traduz a ocorrência de mais do que um sentido em palavras[Ferreira, 1999]
34



 P ref ixo
- indica o número de átomos de carbono na cadeia;
Intermediário - indica o tipo de ligação entre os carbonos;


 Suf ixo
- indica a função a que pertence o composto orgânico.
Os nomes em geral, estão relacionados com o número de átomos de carbono presentes,
como os tipos de ligações entre os carbonos e com a função a que pertence o composto.
Essas caracterı́sticas são indicadas por meio de um prefixo, da parte central e do sufixo.
Há prefixos próprios para indicar a presença de um a quatro átomos de carbono nas
substâncias. Acima de quatro átomos os prefixos empregados são de origem grega ou
latina [Usberco e Usberco, 2001].
A parte central do nome indica se a cadeia é saturada6 ou insaturada7 e o número e
tipo de insaturações.
O sufixo, geralmente, indica a função orgânica a que pertence a substância. Veja com
mais detalhes na Tabela 2.1.
Prefixo
Intermediário
Sufixo
Número de Carbonos
Saturação da Cadeia
Função
1C → MET
Saturadas → AN
2C → ET
Hidrocarbonetos → O
3C → PROP
Insaturadas:
4C → BUT
1 dupla → EN
5C → PENT
2 duplas → DIEN
6C → HEX
3 duplas → TRIEN
Éter → ANO
8C → OCT
1 tripla → IN
Aldeı́do → AL
9C → NON
2 triplas → DIIN
10C → DEC
3 triplas → TRIIN
11C → UNDEC
1 dupla e 1 tripla → ENIN
Álcool → OL
7C → HEPT
Cetona → ONA
Tabela 2.1: Formação do nome quı́mico orgânico [Usberco e Usberco, 2001].
6
7
Apresenta somente ligações simples entre os átomos da cadeia [Usberco e Usberco, 2001].
Apresenta pelo menos uma dupla ou tripla ligação entre os átomos da
[Usberco e Usberco, 2001].
35
cadeia
Compostos de Cadeia Normal e Ramificada
Os compostos orgânicos podem ser divididos em dois grupos: os de cadeia normal e
os de cadeia ramificada.
• Compostos de Cadeia Normal → Os nomes em geral, estão relacionados com o
número de átomos de carbono presentes, como os tipos de ligações entre os carbonos
e com a função a que pertence o composto.
• Compostos de Cadeia Ramificada → Nesses compostos, deve-se inicialmente
identificar a cadeia carbônica principal (maior cadeia que contém o maior número
de ramificações, a insaturação e o grupo funcional).
A localização das ramificações resulta da numeração da cadeia carbônica principal,
iniciando-se pela extremidade mais próxima da insaturação 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 ligações simples (an), ao prefixo grego indicativo do número de
átomos da cadeia.
A partir do nome, pode-se determinar as estruturas:
H
H
H
H
C
C
C
H
H
H
H
Nomenclatura dos Alcenos
As regras da IUPAC para a nomenclatura dos alcenos são semelhantes, em muitos
aspectos, às dos alcanos. Mas quando um alceno apresenta quatro ou mais átomos de
carbono, torna-se necessário indicar a localização da dupla ligação através de um número.
Esse número é obtido numerando-se a cadeia a partir da extremidade mais próxima da
insaturação (dupla ligação). O número que indica a posição da dupla ligação 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
Nomenclatura dos Alcinos
As regras para estabelecer a nomenclatura dos alcinos são as mesmas utilizadas para
os alcenos. Como é apresentado abaixo:
Nomenclatura dos Alcadienos
Na nomenclatura dos alcadienos, como existem duas duplas ligações na cadeia, quando
necessário, seu nome é precedido de dois números, separados por vı́rgula indicando em
qual carbono se encontra tais ligações. A nomeclatura dos nomes dos compostos desse
hidrocarboneto é dada abaixo.
37
2.3.3
Nomenclatura dos Hidrocarbonetos Ramificados
Radicais
Radicais são átomos ou agrupamentos de átomos eletricamente neutros que apresentam
pelo menos um elétron não-compartilhado (valência livre). Podem ser representados,
genericamente, por R- [Campos e Mourato, 1999].
Os principais radicais ou grupos orgânicos monovalentes são obtidos, a partir de hidrocarbonetos, pela retirada de um átomo de hidrogênio (H). Veja Figura 2.4.
Figura 2.4: Radicais [Usberco e Usberco, 2001].
Os principais radicais são: metil, etil, propil, isopropril, butil, entre outros.
Alcanos
Para nomenclatura de alcanos ramificados, são usadas as seguintes regras da IUPAC:
1. Regra → Determinar a cadeia principal e seu nome. Onde, a cadeia principal é a
maior seqüência contı́nua de átomos de carbono, não necessariamente dispostos em
linha reta;
2. Regra → Verificar a quantidade de ramificações e dar nome a elas;
3. Regra → Numerar a cadeia principal de modo a obter os menores números possı́veis
para indicar as posições 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 alfabética. Não se devem considerar, para efeito de ordem
alfabética, os prefixos di, tri, sec, terc, etc.
A Figura 2.5 ilustra a aplicação das regras:
38
2-Metilpentano:
Figura 2.5: Os números em vermelho correspondem a cadeia principal e o traço significa
a localização da ramificação.
Com a aplicação da regra 1 (conhecida como regra da cadeia), acha-se a cadeia principal da estrutura quı́mica. Quando em uma estrutura, duas ou mais cadeias carbônicas
apresentarem o mesmo número máximo de carbonos, será considerada principal a cadeia
que tiver o maior número de ramificações.
De acordo com a regra 2, a estrutura possui uma ramificação do tipo metil. Em
seguida vem a aplicação da regra 3, em que a numeração da cadeia principal é realizada.
A regra 3 é executada da seguinte forma:
1. Verificação da esquerda para direita: número da posição da ramificação é 4.
2. Verificação da direita para esquerda: número da posição da ramificação é 2.
A orientação para a nomenclatura, portanto, é dada pela segunda verificação com o
resultado de número 2. Se por acaso, houvesse duas ou mais ramificações soma-se todas,
primeiramente da esquerda para direita e depois todas da direita para esquerda e utiliza-se
o menor número.
Por meio da regra 4, o nome do composto terá como prefixo 2-metil, pois existe apenas
uma ramificação na posição 2. Havendo duas ramificações do tipo metil, então tem-se o
número das localizações das ramificações seguido do radical dimetil.
Assim, o nome do composto, utilizado neste exemplo,cuja estrutura quı́mica é dada
pela figura 4, é 2-metilpentano, uma vez que não houve a necessidade da aplicação da
regra 5 devido ao fato de não haver ocorrência de outro radical.
No caso dos Alcenos, Alcinos e Alcadienos, a única diferença em relação aos Alcanos
é que as insaturações devem obrigatoriamente fazer parte da cadeia principal e devem
receber sempre os menores números possı́veis das localizações [Dias, 2006].
39
Alcenos
A cadeia principal deve conter a dupla ligação, caracterı́stica dos alcenos, e apresentar
o maior número possı́vel de carbonos. Veja o exemplo abaixo.
2-Metil-3-penteno:
Alcinos
A cadeia principal deve conter a tripla ligação e apresentar o maior número de átomos
de carbono. Veja o exemplo:
2-Metil-3-pentino:
Alcadienos
A cadeia principal deve conter as duas duplas ligações e apresentar o maior número
possı́vel de átomos de carbono. Veja exemplo abaixo:
40
2-Metil-1,3-pentadieno:
2.3.4
Nomenclatura das Funções Oxigenadas
Nomenclatura dos Álcoois
A nomenclatura oficial (IUPAC) dos álcoois segue as mesmas regras estabelecidas para
os hidrocarbonetos, a única diferença está na terminação (ol). Exemplos: H3 C − OH
(metanol); H3 C − CH2 − OH (etanol), etc.
Tem-se:
Monoálcool → Quando um álcool apresentar mais do que dois átomos de carbono, a
posição do OH é indicada numerando a cadeia a partir da extremidade mais próxima
do carbono que contém a hidroxila -OH [Usberco e Usberco, 2001].
2-Butanol:
Poliálcoois → Nesses álcoois as posições dos grupos OH são fornecidos pelos menores
números possı́veis. Essas quantidades são indicadas pelos sufixos diol, triol, etc.
41
1,3-Butanodiol:
Nomenclatura dos Éteres
A nomenclatura oficial para os éteres é descrita, abaixo:
• Identificar se existe um heteroátomo de Oxigênio na cadeia carbonica. Se existir
identificar o prefixo (antes ou depois do átomo de oxigênio) que indica o número de
carbonos do menor radical e colocar a terminação oxi.
• Depois o nome do hidrocarboneto correspondente ao maior radical. Veja exemplo
abaixo.
Metóxi-etano:
Nomenclatura dos Aldeı́dos
As regras fundamentais do sistema de nomenclatura da IUPAC para a designação dos
aldeı́dos são as seguintes: [Campos e Mourato, 1999]
1. A cadeia principal é a cadeia mais longa que contém o grupo aldeı́do.
grupof uncional :
O
C
@
H
2. Os nomes dos aldeı́dos derivam dos nomes dos hidrocarbonetos com igual número
de carbonos, substituindo o ”o”final pela terminação -al;
42
metanal:
O
H
C
@
H
3. Os aldeı́dos ramificados seguem as regras já vistas para os hidrocarbonetos insaturados e ramificados. Como o grupo funcional está sempre na extremidade, esse
carbono sempre será o número 1; portanto, sua posição não 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 função é ona. Seu
grupo funcional é:
grupof uncional :
C
O
A numeração da cadeia deve ser iniciada a partir da extremidade mais próxima do
grupo funcional, quando necessário. A nomenclatura da cetonas é parecida com a dos
aldeı́dos.
Butanona:
Esta teoria foi aplicada nas ferramentas apresentadas nas seções seguintes.
43
2.4
2.4.1
Linguagem de Programação Java
Introdução
Em 1991, um pequeno grupo de projetistas da Sun Microsystems fazia parte de
um projeto denominado Green, que pretendia criar uma nova geração de computadores
portáteis, inteligentes e capazes de se comunicar de muitas formas. Ampliando suas
potencialidades de uso, decidiram criar também uma nova plataforma para o desenvolvimento 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 programação para tal desenvolvimento foi C++, aproveitando suas caracterı́sticas e
a experiência dos integrantes do grupo no desenvolvimento de produtos. Mas, mesmo o
C++ não permitia realizar com facilidade tudo aquilo que o grupo visionava.
James Gosling, coordenador do projeto, decidiu então pela criação de uma nova linguagem de programação que pudesse conter tudo aquilo que era considerado importante
e que ainda sim fosse simples, portátil e fácil de programar. Surgiu assim a linguagem interpretada oak. Para dar suporte a linguagem, surgiu o Green OS e uma interface gráfica
padronizada [Junior, 2000].
Após dois anos de trabalho o grupo finaliza o Star7 8 , um avançado PDA (Personal
Digital Assistant) e em 1993 surge a primeira oportunidade de aplicação desta solução da
Sun em uma concorrência pública da Time-Warner para desenvolvimento de uma tecnologia para TV a cabo interativa, vencida pela SGI (Silicon Graphics Inc.)[Junior, 2000].
O Oak, então rebatizado Java, devido a problemas de copyright, continua sem uso
definido até 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 execução de código Java via Internet. Apresentado formalmente
pela Sun como o navegador HotJava e a linguagem Java no SunWorld’95. Poucos meses
depois a Netscape Corp. lança uma nova versão de seu navegador Navigator também
capaz de efetuar o download e a execução de pequenas aplicações Java então chamadas
applets. Iniciando o sucesso do Java [Junior, 2000].
A Sun decidiu disponibilizar o Java gratuitamente para a comunidade de desenvolvimento 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].
8
Star7 ou * 7 é 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
Atualmente a Sun vem liberando novas versões ou correções, bem como novas API
(Application Program Interface) para desenvolvimento de aplicações especı́ficas.
2.4.2
Caracterı́sticas Importantes
A linguagem Java exibe importantes caracterı́sticas que, em conjunto, diferenciam-na
de outras linguagens de programação:
• Orientação à Objetos: Java é uma linguagem orientada à objetos, pois com exceção
de seus tipos primitivos de dados, tudo em Java são classes ou instâncias de uma
classe. Atendendo todos os requisitos necessários para a linguagem ser considerada
orientada à objetos.
• Independente de Plataforma: Java é uma linguagem independente de plataforma
pois os programas Java são compilados para uma forma intermediária de código denominado bytecodes. Os bytecodes são como uma linguagem de máquina destinada a
uma única plataforma, a máquina virtual Java (JVM - Java Virtual Machine, um interpretador de bytecodes. Pode-se implementar uma JVM para qualquer plataforma
assim tem-se que um mesmo programa Java pode ser executado em qualquer arquitetura que disponha de uma JVM [Cesta, 2004].
• Sem Ponteiros: Java não permite a manipulação direta de endereços de memória
nem exige que os objetos criados seja distribuı́dos, livrando os programadores de
uma tarefa complexa. A JVM possui um mecanismo automático de gerenciamento
de memória conhecido como garbage colletor, que recupera a memória alocada para
objetos não mais referenciados pelo programa [Deitel, 2005].
• Performance: Java foi projetada para ser compacta, independente de plataforma
e para utilização em rede o que levou a decisão de ser interpretada através do
esquema bytecodes. Como uma linguagem interpretada a performance é razoável,
não podendo ser comparada a velocidade de execução de código nativo. Para superar
esta limitação, várias JVM dispõe de compiladores just in time (JIT) que compilam
os bytecodes para código nativo durante a execução otimizando-a. Nestes casos
melhora a performance de programas Java [Junior, 2000].
• Segurança: Considerando a possibilidade de aplicações obtidas através de uma rede,
a linguagem Java possui mecanismos de segurança que podem, no caso de applets,
evitar qualquer operação no sistema de arquivos da máquina-alvo, minimizando
problemas de segurança. Tal mecanismo é flexı́vel o suficiente para determinar se
uma applet é considerada segura, especificando nesta situação diferentes nı́veis de
acesso ao sistema-alvo [Junior, 2000].
45
• Permite Multithreading: Java oferece recursos para o desenvolvimento de aplicações
capazes de executar múltiplas rotinas concorrentemente e dispõe de elementos para
a sincronização destas várias rotinas. Cada um destes fluxos de execução é o que se
denomina thread [Deitel, 2005].
O Java é uma linguagem bastante robusta, oferece tipos inteiros e ponto flutuante
compatı́veis com as especificações IEEE, suporte para caracteres UNICODE, é extensı́vel
dinamicamente, além de ser naturalmente voltada para o desenvolvimento de aplicações
em rede ou aplicações distribuı́das. Tudo isso torna o Java uma linguagem de programação
única.
Além disso, a realização de uma análise léxica e uma análise sintática de uma determinada gramática torna-se menos complicada utilizando a linguagem Java, pois existem
programas para Java que auxiliam o programador nesta tarefa, como por exemplo: para
análise léxica temos JFlex, JLex e análise sintática temos BYacc/J, CUP, JavaCC, etc.
Nas próximas seções serão mostradas as ferramentas JFlex e CUP utilizadas neste trabalho.
2.5
Ferramenta JFlex
O JFlex é um gerador de Analisadores Léxicos para Java e implementado em Java
[Hornung e Matos, 2000]. O seu objetivo é gerar uma rotina em Java, ou seja, uma classe
que contenha as especificações léxicas válidas para a linguagem. Essa classe é gerada a
partir de um arquivo, criado pelo usuário, que contém as especificações léxicas válidas
para a linguagem que se deseja criar.
O tipo de analisador léxico gerado pelo JFlex realiza um conjunto de tarefas mais
avançadas do que simplesmente retornar uma série de sı́mbolos válidos ou não. Ele é
capaz de interagir com o analisador sintático, realizando as seguintes tarefas:
• reconhecer um token léxico e retornar ao analisador sintático um código que identifica o tipo de token;
• repassar ao analisador léxico informações relacionadas ao token, como o texto da
palavra reconhecida;
• ativar código pré-definido pelo programador do analisador léxico.
A definição dos tokens válidos que serão reconhecidos pelo analisador léxico é por
meio de uma linguagem regular. No caso do JFlex, será utilizado expressões regulares.
O arquivo que contém as definições das expressões regulares é um arquivo texto com a
extensão ”.flex”.
46
O arquivo de definição do JFlex possui basicamente três grandes seções (código do
usuário, opções e declarações, regras léxicas) separadas por ”%%”. A Figura 2.6, mostra
o esquema de um arquivo de definição de JFlex.
Figura 2.6: Arquivo de definição JFlex.
A seção de código do usuário contém código que será copiado sem alterações
para a classe gerada pelo JFlex. Comandos package e import são colocados nesta seção
[Machado, 2000].
A seção de opções e declarações contém opções de configuração do JFlex, declarações
de código utilitário para o analisador léxico e macros para expressões regulares. Cada
opção de configuração deve começar em uma nova linha e iniciar com o sı́mbolo ”%”.
Algumas configurações básicas [Machado, 2000]:
• ”%class (nome da classe)”permite configurar o nome da classe para o analisador
léxico; se o usuário não desejar colocar um nome, será gerada a classe ”Yylex”.
• ”%line”ativa a contagem de linhas; o valor atual pode ser obtido através da variável
yyline.
• ”%column”ativa a contagem de colunas; o valor atual pode ser obtido através da
variável yycolumn.
• ”%char”ativa a contagem de caracteres; o valor atual pode ser obtido através da
variável yychar.
• ”%full”entrada de dados em caracteres de 8bits.
• ”%unicode”entrada de dados em caracteres de 16bits Unicode.
• ”%debug”cria um método main para o teste do analisador léxico via arquivos texto
passados como parâmetros via linha de comando, retornando informações sobre o
processamento na tela.
47
• ”%cup”ativa o modo de compatibilidade com o gerador de analisadores sintáticos
CUP.
• ”%byacc”ativa o modo de compatibilidade com o gerador de analisadores sintáticos
BYACC.
• ”%state (nome do estado)”permite a definição de estados léxicos, os quais são utilizados para controlar com mais detalhe o funcionamento do analisador léxico. Um
estado léxico age como uma condição inicial, de tal maneira que somente expressões
regulares pertencentes ao estado atual serão reconhecidas. O estado ”YYINITIAL”é
pré-definido e já está incluso.
Código em Java pode ser incluı́do nessa seção através dos marcadores ”%”e ”%”, cada
um em uma nova linha. Usualmente são declarados novos atributos e métodos utilitários.
A segunda parte desta seção (opções e declarações) termina com a declaração de
macros para as expressões regulares. Macros são sinônimos utilizados para substituir
uma expressão regular por um identificador mais simples. Para construir uma macro,
utiliza-se ”identificador = expressao regular”.
São elementos válidos para expressões regulares:
• Um caracter qualquer;
– ”a”é a letra a;
– ”\n”é nova linha;
– ”\001”é um caractere ascii;
– ”\u0001”é um caractere unicode.
• Um conjunto de caracteres pré-definidos;
– ”[:digit:]”dı́gitos;
– ”[:letter:]”letras;
– ”[:uppercase:]”caracteres maiúsculos;
– ”[:lowercase:]”caracteres minúsculos.
• Um conjunto de caracteres definidos pelo usuário ”[ ]”;
– ”[0123456789]”é o conjunto de sı́mbolos 0,1,2,3,4,5,6,7,8,9;
– ”[0-9]”é o conjunto de sı́mbolos 0,1,2,3,4,5,6,7,8,9;
– ”[ ]”um espaço em branco.
48
• Complemento de um conjunto de caracteres definidos pelo usuário ”[ˆ]”.
– ”[ˆ]”qualquer caracter menos os dı́gitos de 0 a 9.
• Uma palavra entre aspas duplas ”.
– ”projeto”é a palavra projeto. Será alguma parte da gramática entre aspas
duplas que deseje que o programa reconheça com uma entrada do usuário.
• Uma macro de expressão regular ”{nome da macro}”.
Na Figura 2.7, tem-se as macros que definem um identificador válido na linguagem
como uma seqüência de sı́mbolos que inicia por uma letra e segue com várias letras
e dı́gitos.
Figura 2.7: Macros no JFlex.
A seção de regras léxicas contém um conjunto de expressões regulares juntamente
com código Java a ser executado toda vez que o analisador léxico reconhecer o token
léxico definido pela expressão. A forma geral de uma regra léxica é apresentada na Figura
2.8, e deve ser interpretada de tal maneira que ”expressão”é uma expressão regular que é
reconhecida quando o analisador se encontra no estado léxico ”estado condição”e, quando
reconhecida, dispara a execução do ”código”associado. Se não é apresentado um estado
na regra, então é pré-definido o estado como ”YYINITIAL”[Machado, 2000].
Figura 2.8: Forma geral de uma regra léxica.
Depois de especificar a gramática no arquivo ”.flex”, este arquivo é carregado na interface gráfica do JFlex, como é mostrado na Figura 2.9. Clicando na opção ”Generate”da
interface gráfica, será criado um arquivo com a extensão ”.java”que é o arquivo que contém
o analisador léxico. Esse arquivo ”.java”pode ser compilado através da linha de comando,
49
e então pode-se executar o analisador léxico sobre um arquivo de entrada com a extensão
”.txt”e verificar na tela a saı́da gerada.
Figura 2.9: Intercace do Gerador Léxico JFlex.
Além de ser considerado uma evolução do JLex (um gerador de análise lexical), mantendo alguma compatibilidade, apresenta a possibilidade de ligação com as ferramentas
de análise sintática CUP e BYacc/J [Santos, 2006].
Um analisador sintático pode processar qualquer linguagem regular, embora um analisador lexical não tenha capacidade de processar uma linguagem independente do contexto.
Assim, uma linguagem não regular só pode ser parcialmente processada por um analisador
lexical. Nomeadamente, aquelas partes da linguagem que conseguem ser expressas sob a
forma de expressões regulares.
Nestes casos usa-se um analisador lexical em conjunção com um analisador sintático
porque permite [Machado, 2000]:
modularidade: permite separar a sintaxe em duas fases distintas: análise lexical e
sintática.
Diversas alterações podem ser efetuadas em um analisador sem im-
plicações no outro;
legibilidade: expressões regulares são, em geral, mais legı́veis que regras gramaticais;
50
simplicidade: a separação em análise lexical e sintática permite que o analisador sintático
seja significativamente mais simples;
portabilidade: variações entre ambientes, dispositivos ou sistemas operativos podem
ficar contidos no analisador lexical.
Quando um analisador lexical é utilizado como pré-processador de um analidor sintático
as suas tarefas são essencialmente:
• Identificação de elementos lexicais (tokens): literais, palavras reservadas, identificadores, operadores, separadores e delimitadores;
• Tratamento de caracteres brancos e comentários;
• Manipulação dos atributos de alguns dos elementos lexicais;
• Utilização da tabela de sı́mbolos para classificar e guardar informação auxiliar de
alguns elementos lexicais;
• Análise 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 sintático que será utilizado e que permite a ligação com o analisador
léxico, JFlex, será o Java CUP, apresentado na seção 2.6.
2.6
Ferramenta Java CUP
A ferramenta JFlex foi utilizada na primeira fase da construção do código deste
protótipo. Esta fase é conhecida como Análise Léxica, e tem como objetivo reconhecer as
palavras contidas em um documento de entrada. Estas palavras são denominadas tokens
e são passadas para o analisador sintático (segunda fase da construção do protótipo). Ou
seja, o analisador léxico tem como objetivo identificar o grupo de uma determinada palavra
e passar o token que representa a palavra para o analisador sintático. Caso algum erro
lexical seja detectado, o erro é informado ao usuário. Estes erros podem ser, por exemplo,
caracteres inválidos, construções erradas de Strings e expressões incorretas. Para auxiliar
na geração do analisador léxico, o programa JFLEX foi empregado.
Análise sintática (parsing) é o processo de analisar uma sequência de entrada para
determinar sua estrutura gramatical segundo uma determinada gramática formal.
51
A análise sintática transforma um texto de entrada em uma estrutura de dados, em
geral uma árvore, o que é conveniente para o processamento posterior e a captura da
hierarquia implı́cita desta entrada. Por meio da análise léxica é obtido um grupo de
tokens, para que o analisador sintático use um conjunto de regras para construir uma
árvore sintática da estrutura.
O CUP (Constructor of Useful Parsers) é um gerador de análise sintática do tipo
LALR(1)(LookAhead Left-Right) para Java. O seu objetivo, assim como o JFlex, é gerar
uma rotina em Java a partir de um arquivo que contenha a gramática para o qual o
analisador sintático será 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 têm o potencial de fornecer a velocidade
mais rápida na análise sintática. No entanto, são consideradas impraticáveis devido ao
seu enorme tamanho. Já a análise LALR foi inventada por Frank DeRemer em 1969
no artigo, ”Practical LR (k) Tradutores”. A tabela LALR é frequentemente usada na
prática, pois as tabelas obtidas são consideravelmente menores do que as tabelas LR(1).
Além disso, a maioria das construções sintáticas comuns das linguagens de programação
podem ser expressas convenientemente por gramáticas LALR, onde há análise de sı́mbolos
posteriores.
O CUP analisa sintaticamente uma sequência de tokens, esses são gerados pelo analisador léxico e como o CUP não possui um analisador léxico, então os analisadores léxicos
usados frenquentemente com o CUP são os gerados pelo JFlex. Para o Jflex fazer ligação
com o CUP , basta declarar a diretiva %cup.
Uma especificação do CUP apresenta as seguintes seções [Santos, 2006]:
• Especificação do package e import: conterá declarações opcionais de package e import. A declaração package indica qual o nome do pacote que conterá as
classes sym e parser geradas pelo sistema. Qualquer declaração import que aparecer
na especificação também aparecerá no arquivo gerado para a classe parser. Essas
declarações contêm a mesma sintaxe e o mesmo papel como em qualquer pacote de
medidas e declarações de importação normal encontrado em um programa Java.;
• Componentes de Código do Usuário: pode inserir código do usuário por meio
de declarações, como:
– action code {: ... :}; : permite adicionar o código do usuário diretamente
dentro da declaração do tipo de uma classe privada de nome ”action”;
– parser code {: ... :}; : permite que sejam adicionados métodos e variáveis
na classe parser ;
52
– init with {: ... :}; : permite inserir código a ser executado pelo analisador
sintático antes que ele inicie o processamento do primeiro token;
– scan with {: ... :}; : indica como o parser pedirá o próximo token para o
analisador léxico.
• Listas de Sı́mbolos: declara todos os sı́mbolos terminais (contém os tokens que
serão retornados pelo scanner que foi gerado pelo JFlex.) e não-terminais (contém
os sı́mbolos que serão usados como auxiliares na construção da gramática), que
aparecem na gramática e o tipo desses sı́mbolos, podendo ter valores associados ou
não. Além disso, declara qual é o sı́mbolo inicial da gramática, então o sistema gera
uma classe de nome sym que conterá todos os sı́mbolos declarados e as definições
dos sı́mbolos terminais e não-terminais como constantes inteiras;
• Declarações de Precedência e Associativismo: é opcional, porém é bastante
útil para análise de gramáticas ambı́guas, pois especifica as precedencias e o associativismo de terminais, podendo assim reduzir problemas e conflitos. A ordem de
precedência para terminais na mesma linha é igual e irá aumentando de cima para
baixo. Existem três tipos de declarações, que são:
– 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 árvore de derivação contém duas derivações consecutivas na ocorrência
do terminal de comando.
• Gramática: a parte final de uma declaração CUP prevê a gramática juntamente
com as ações semânticas a serem realizadas quando ocorrer uma redução. Caso a
análise sintática seja bem sucedida, no fim do processo CUP um objeto do tipo java
cup.runtime.Symbol que contém o resultado da redução final será retornado.
Para utilizar o CUP, basta passar o arquivo de especificação como parâmetro:
java java_cup.Main < nome_arquivo.cup
Ou também pode utilizar este comando:
java -jar java-cup-11a-jar -parser nome_classe_execuç~
ao
nome_arquivo.cup
O sistema irá produzir dois arquivos Java contendo partes do analisador: na primeira
forma de utilização será obtido uma classe sym.java e outra parser.java. Já na segunda
53
maneira de utilização obteremos as classes sym.java e nome classe execução.java (um
nome dado a classe que seria denominada parser.java). O arquivo sym possui uma série
de declarações de constantes, uma para cada sı́mbolo terminal usado pelo scanner, e o
nome classe execução.java, possui o código de execução.
Com todas as regras de nomenclatura montadas no CUP e realizando a especificação
correta, a próxima técnica utilizada na construção do protótipo proposto é o SMILES,
que será exposto na seção 2.7.
2.7
SMILES
SMILES (Simplified Molecular Input Line Entry System), é uma notação linear de
organização de componentes que representa cadeias moleculares por meio de uma String.
Permite que o usuário através de uma notação quı́mica represente uma estrutura quı́mica
de forma a ser usada pelo computador [Sousa, 2002].
A especificação SMILES foi desenvolvido por David Weininger, no final de 1980. Alterada em 2007, foi desenvolvido um padrão aberto OpenSMILES chamado pela comunidade
de Obelisk Blue [Sousa, 2002].
Em agosto de 2006, a IUPAC introduziu esta notação como um padrão para a representação de estruturas moleculares. SMILES é considerado ser mais inteligı́vel para a
leitura humana de estruturas quı́micas, também tem uma ampla base de apoio de softwares
baseada na teoria dos grafos [Sousa, 2002].
Em sua forma mais concisa, átomos de hidrogênio não são representados, os demais
átomos são representados por seu sı́mbolo quı́mico, átomos vizinhos ficam um a seguir ao
outro, ligações duplas são representadas por =, ligações triplas por #, ramificações são
representadas por parênteses, anéis são representados atribuindo dı́gitos aos dois átomos
que fecham o anel e anéis aromáticos são representados com os átomos em minúsculas
[Salvador, 2003]. Por exemplo: A água é representada por O (fica implı́cito que tem 2
hidrogênios). Analogamente, metano, amônia, ácido sulfı́drico e ácido clorı́drico são representados, respectivamente, por C, N, S e Cl. Veja mais exemplos:
Etano:
H
SMILES:
H
H
C
C
H
H
CC
54
H
Eteno:
H
SMILES:
H
H
C
C
H
OH H
C
C
H
C=C
2-Propanol:
H
H
SMILES:
C
H
H
CC(O)C
2-Propanona:
H
H
O
H
C
C
C
H
SMILES:
H
H
CC(=O)C
2-Metilbutanol:
H
SMILES:
H
H
OH
C
C
C
H
CH3 H
H
CC(C)CC(O)
Propino:
H
H
C
C
C
H
H
SMILES:
C#CC
No capı́tulo 3 será abordado a construção do protótipo PROF QUIM, utilizando todas
essas ferramentas e técnicas aqui explicadas.
55
Capı́tulo 3
A Construção do Protótipo PROF
QUIM
Neste capı́tulo serão apresentadas a construção de todas as fases do protótipo de análise
de nomes da quı́mica orgânica (PROF QUIM) em detalhes, como por exemplo, a análise
léxica, a análise sintática, a análise semântica (significado do nome em representação
SMILE), interface e testes.
3.1
O PROF QUIM
O principal objetivo que o protótipo Analisador de Nomes da Quı́mica Orgânica PROF
QUIM deve realizar, é a função de facilitar o aprendizado dos alunos de ensino fundamental, ensino médio e universitários, além de auxiliar professores, pesquisadores e todos
aqueles interessados em nomenclatura e estrutura da quı́mica orgânica.
O protótipo funcionará da seguinte maneira: o usuário entrará com o nome, especificamente do idioma português do Brasil, do composto orgânico aceitando somente as
substâncias Alcano, Alceno, Alcino, Alcadieno, Álcool, Aldeı́do, Éter, e Cetona, se o
usuário digitar um nome diferente destas funções, o protótipo apontará um erro e a explicação do motivo do erro, senão o sistema irá analisar este nome retornando uma saı́da
visual de sua estrutura quı́mica (em representação SMILE). Caso o nome utilizado na
entrada for considerado pelo protótipo incorreto (por questões de ortografia, posições incorretas de ramificações, digitação incorreta da formação do nome, posições de ligações
e nomes inrreconhecı́veis de compostos da quı́mica), o sistema apresentará a explicação
do que foi considerado errado e o usuário terá a possibilidade de corrigir seu erro para a
obtenção do nome correto. O protótipo irá gerar somente a saı́da dos nomes dos compostos que se enquadram nos padrões das nomenclaturas oficiais da IUPAC1 (International
1
http://www.iupac.org
56
Union of Pure and Applied Chemistry).
Este protótipo foi implementado na linguagem de programação Java, utilizando as
ferramentas de análise JFlex e Java CUP. Para a representação das estruturas quı́micas
foi utilizada a técnica de representação SMILE.
Serão abordadas nas seções 3.2, 3.3, 3.4, 3.5, um detalhamento de cada parte do
processo de construção do protótipo PROF QUIM.
3.2
Linguagem de Programação
A linguagem de programação escolhida para a implementação do protótipo foi a linguagem Java no ambiente de desenolvimento NetBeans 6.1. O motivo principal para o
uso desta linguagem se deve ao fato de sua portabilidade, robustez, padronização forte,
por possuir uma biblioteca de interface gráfica consistente e por ter ferramentas que
geram códigos de análise tanto léxica como sintática (JFlex e Java CUP), facilitando a
implementação deste protótipo.
Uma das caracterı́sticas principais de Java é a simplicidade da linguagem. Acompanhada de um grande número de bibliotecas de classes já testadas e que proporcionam
várias funcionalidades (E/S, interface gráfica, multimı́dia, etc.). Foi projetada para criar
software altamente confiável. Além de prover verificações durante a compilação, Java
possui um segundo nı́vel de verificações (em tempo de execução). Possui caracterı́sticas
de segurança e a própria plataforma realiza verificações em tempo de execução. Assim,
aplicações escritas em Java estão ”seguras”contra códigos não autorizados que tentam
criar vı́rus ou invadir sistemas de arquivos [Pinto, 2003].
Esses motivos apresentados foram relevantes para o emprego desta linguagem e não
de outras como por exemplo, a linguagem Python(não existem muitos recursos para criar
uma interface gráfica bem elaborada e é uma linguagem em desenvolvimento constante e
ainda sem uma padronização forte [Rossum, 2005]).
Portanto, desenvolver aplicações em Java resulta em um software que é portável em
múltiplas plataformas de hardware e software (sistemas operacionais, interfaces gráficas),
seguro e de alto desempenho.
Na seção seguinte será mostrado como foi feita a geração de código Java para a análise
léxica e sintática utilizando as ferramentas JFlex e Java CUP.
3.3
Fases da Construção do Protótipo
A construção do protótipo pode ser dividida em 3 fases: análise léxica, análise sintática
e análise semântica. A Figura 3.1 mostra a ligação entre as fases para o correto funciona-
57
mento do protótipo PROF QUIM.
Figura 3.1: Diagrama de Atividades do PROF QUIM.
Temos em primeiro lugar, depois da entrada do usuário, a etapa da análise léxica (quebra a entrada em palavras conhecidas como tokens para o reconhecimento da gramática),
com as informações obtidas da análise léxica temos então a análise sintática (recebe uma
seqüência de tokens do analisador léxico e determina se a string pode ser gerada através
da gramática fornecida) e por fim a análise semântica (fornece o significado do nome).
Nas subseções 3.3.1 e 3.3.2 serão apresentadas cada etapa.
3.3.1
Análise Léxica
Para a realização da especificação léxica válida gerada pelo analisador léxico, foi utilizada a gramática que segue as regras de nomenclatura oficial da IUPAC voltada para
formação de nomes da quı́mica orgânica.
Neste protótipo não foi utilizada toda a gramática de todas as funções da quı́mica
orgânica, pois o objetivo do mesmo era prover ao estudante interessado na quı́mica
orgânica uma ferramenta de apoio ao aprendizado para algumas funções quı́micas a
princı́pio.
58
Para este protótipo trabalhou-se somente até 5 carbonos na cadeia principal, com
ligações simples, duplas, triplas e duas duplas, ramificações de radical do tipo metil,
dimetil, trimetil e etil, posições de 1 a 5 (incluindo os caracteres ”,”(vı́rgula) e -”(traço)),
funções como os Hidrocarbonetos (Alcano, Alceno, Alcino e Alcadieno) e funções Oxigenadas (Álcool, Aldeı́do, Cetonas e Éter). Os elementos que farão parte da gramática a
ser analisada nos nomes de compostos da quı́mica orgânica são:
• Número: 1, 2, 3, 4 e 5;
• Prefixo: met, et, prop, but e pent;
• Ligação: an, en, in e dien;
• Ramificação: metil, dimetil, trimetil e etil;
• Hidrocarboneto: o;
• Funções Oxigenadas: ol, al, ona e oxi.
Com a gramática estabelecida, o arquivo .flex (extensão utilizada no JFlex) para o
analisador léxico, é feito com:
• Seção de Código do Usuário, Figura 3.2 (utilizando import e package);
Figura 3.2: Seção Código do Usuário.
O package sintatico é o pacote que conterá todas as classes para serem compiladas.
Os imports são necessários para o funcionamento do programa.
• Seção Opções e Declarações, Figura 3.3 (contendo opções de configuração do JFlex,
declarações de código utilitário para o analisador léxico e macros para expressões
regulares);
O comando %public é utilizado para que as classes sejam públicas, %class quimica estabelece que o nome da classe gerada pelo JFlex se chamará ”quimica.java”e
o comando %cup possibilita a ligação com o analisador sintático CUP.
59
Figura 3.3: Seção de Opções e Declarações.
Figura 3.4: Seção de Regras Léxicas.
• Seção de Regras Léxicas, Figura 3.4 (gramática).
As regras da gramática serão listadas nesta seção da seguinte forma: ”met”{return
symbolsym.M ET ;}, onde a palavra ”met”(entre aspas) é a gramática e {return
symbolsym.M ET ;} será o sı́mbolo reconhecido no CUP que corresponde a palavra
met.
Este arquivo é carregado na interface gráfica do JFlex e optando pela opção Generator,
da interface, é gerado um arquivo .java (no caso quimica.java, pois o nome foi escolhido
no comando %class quimica). Este arquivo contém o analisador léxico. Observe que toda
a gramática especificado no JFlex (está entre (aspas) e letras minúsculas), portanto o
protótipo apenas reconhecerá nomes digitados em minúsculo.
Se um usuário digitar o nome propano, não será encontrado nenhum erro léxico, pois
na seção de regras léxicas será 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 então, mandar ao analisador
sintático o nome informado pelo usuário. Mas se o usuário tivesse entrado com um
nome que não correspondesse à gramática especificada no JFlex, então retornaria uma
mensagem de erro informando qual token não faz parte da gramática. Por exemplo:
60
usuário informa propanu. Este nome esta incorreto por apresentar o token u, pois este
token não está especificado na gramática informada.
O código de erro é executado:
.
{frame2.saida.setText("Erro Lexico: o sı́mbolo "+ yytext()+" n~
ao
faz parte da gramática");}
Onde o .(ponto) refere-se a um erro e a mensagem é enviada ao usuário com o token
inválido.
Terminada esta fase a próxima é a análise sintática, recebendo o nome reconhecido
pelo analisador léxico gerado pelo JFlex.
3.3.2
Análise Sintática e Semântica
A segunda fase deste protótipo, analisa a entrada do programa, recebendo uma sequência
de tokens do analisador léxico e determinando se a string pode ser gerada através da
gramática de nomes da quı́mica orgânica reconhecida pela IUPAC. É esperado que ele
reporte os erros, continuando a processar a entrada.
Uma lista de regras é feita utilizando a especificação do CUP, como:
• Declaração de Package e Import, Figura 3.5 (conterá declarações opcionais de package e import);
Figura 3.5: Declaração de Package e Import.
O package sintatico é o pacote que conterá todas as classes para serem compiladas.
Os imports são necessários para o funcionamento do programa.
• Componentes de Código do Usuário, Figura 3.6 (pode inserir código do usuário por
meio de declarações);
Este método irá informar que existe um erro e qual o token que esta causando o
erro da sintaxe, ou seja, que o token não se encontra em nenhuma regra construı́da.
61
Figura 3.6: Componentes de Código do Usuário.
Figura 3.7: Listas de Sı́mbolos.
• Listas de Sı́mbolos, Figura 3.7 (declara todos os sı́mbolos terminais (contém os
tokens que serão retornados pelo scanner que foi gerado pelo JFlex.) e não-terminais
(contém os sı́mbolos que serão usados como auxiliares na construção da gramática));
Temos os terminais O, OL, AL, entre outros, que são sı́mbolos que identificam a
gramática realizada no JFlex, por exemplo, o Terminal OL corresponde ao token
”ol”declarado no analisador léxico. Já os não terminais (non terminal) são sı́mbolos
auxiliares na construção da gramática. Exemplo:
non terminal String alcano;
Este não terminal receberá as regras referentes aos alcanos. Então quando o nome
informado for um alcano, este sı́mbolo não terminal será acessado com as regras do
hidrocarboneto alcano.
• Declarações de Precedência e Associativismo, Figura 3.8 (é opcional, porém é bastante útil para análise de gramáticas ambı́guas);
Com esta especificação, os tipos de ligações (an, en, in, dien) têm mais precedência
do que os sufixos (o, ol, al, ona, oxi). Portanto, os que estão mais embaixo possuem
mais precedência daqueles que estão em cima. Esta declaração é feita para evitar
conflitos e ambiguidades na gramática aplicada as regras.
62
Figura 3.8: Declarações de Precedência e Associativismo.
• Gramática, Figura 3.9 (prevê a gramática juntamente com as ações semânticas a
serem realizadas).
Figura 3.9: Gramática.
Esta é a regra do metano, pois temos o prefixo MET correspondente ao token
”met”do analisador léxico, o não terminal simples que corresponde a ligação simples
(an) e o não terminal hidrocarboneto que corresponde ao token (o), reconhecendo
desta maneira o nome metano.
A formação destas regras são para a geração correta dos nomes quı́micos orgânicos
seguindo as regras da IUPAC, especificados em um arquivo .cup (extensão do Java CUP).
Se o usuário entrar com o nome etano, nenhum erro será encontrado, pois na análise
léxica acontecerá o reconhecimento de todos os tokens que serão mandados para a análise
sintática que terá a tarefa de encaixar este nome com alguma regra estabelecida, no caso
seria ”ET simples:en hidrocarboneto:hi”. Retornando a parte semântica, ou seja, a explicação do nome junto com a representação SMILE da estrutura quı́mica, por exemplo: o
nome etano produzirá a representação SMILE ”CC”, por apresentar 2 carbonos (representado pelo prefixo et) na cadeia principal, possuir ligação simples e ser um hidrocarboneto.
A entrada e saı́da de dados (realizada pelas fases apresentadas) serão por meio de uma
interface, apresentada na próxima seção.
63
3.4
Interface
Nesta seção serão apresentadas algumas telas do protótipo para o melhor entendimento
de sua funcionalidade.
Caracterı́sticas Gerais
As caracterı́sticas gerais da interface são:
• A interface de usuário será simples, para facilitar o aprendizado da utilização do
produto por parte dos usuários;
• Não será disponibilizada ajuda on-line para o usuário. O próprio protótipo disponibiliza explicações detalhadas sobre o seu funcionamento e sobre as substâncias que
reconhece;
• Exibição de mensagens de erro e mensagens explicativas;
• O mecanismo de navegação é feito por meio do clique com o botão esquerdo do
mouse;
• Todo o visual da interface será baseado nas cores azul (com alguns tons diferenciados), branco e detalhes vermelho e preto, para realçar mais a visibilidade junto ao
usuário;
• Para sair do protótipo, o usuário deverá fechar a interface que estiver usando e voltar
à tela principal. Para sair do sistema, o usuário deverá fechar a tela principal.
Interface da Tela Principal
A Tela Principal do protótipo, Figura 3.10, contém algumas funcionalidades, através
da qual as demais interfaces são acessı́veis. Esta tela possui 4 botões (Nomenclatura,
Instruções, Informações, Sair). O botão Nomenclatura irá acessar a interface que é
reponsável pela análise de nomes da quı́mica orgânica, já o botão Instruções irá acessar a interface que conterá as explicações detalhadas do funcionamento do protótipo, o
botão Informações irá acessar a interface que possibilita ao usuário pesquisar sobre cada
substância que o protótipo reconhece e o botão Sair fecha o programa.
Interface da Tela Nomenclatura
Nesta interface, Figura 3.11, o usuário irá realizar as tarefas que o protótipo disponibiliza, ou seja, o usuário informa um nome quı́mico, é apresentada uma explicação e
64
Figura 3.10: Tela Principal do Protótipo.
por fim, a geração da estrutura quı́mica em SMILE é mostrada. Quando fechada volta
automaticamente à Tela Principal.
Temos um campo para informar o nome quı́mico e o botão Verificar, que envia o nome
para análise. O resultado é mostrado nos dois campos abaixo, um informa a explicação do
nome e o outro a representação da estrutura quı́mica em SMILE. Se o usuário desejar fazer
uma nova consulta, basta clicar no botão Limpar e fazer o mesmo processo explicado. Se
o usuário desejar sair, clica no botão Sair retornando à Tela Principal.
Interface da Tela Instruções
Nesta interface, Figura 3.12, o usuário irá realizar uma consulta sobre o funcionamento
do protótipo. O que o usuário deve fazer para obter o funcionamento correto do protótipo.
Quando fechada volta automaticamente à Tela Principal.
Interface da Tela Informações
Nesta interface , Figura 3.13, o usuário irá realizar uma consulta sobre as substâncias
que o protótipo reconhece e sobre a representação SMILE. Os assuntos funcionam como
um link, basta clicar em cima da palavra e a interface referente aquele assunto é acessada.
Quando fechada volta automaticamente a Tela Principal.
65
Figura 3.11: Tela Nomenclatura.
Figura 3.12: Tela Instruções.
66
Figura 3.13: Tela Informações.
Interface da Tela Alcano
Nesta interface, Figura 3.14, o usuário irá obter informações sobre o hidrocarnoneto
Alcano. Quando fechada volta automaticamente à Tela Informações.
Figura 3.14: Tela Alcano.
Todas as outras interfaces (tela alceno, tela alcino, tela alcadieno, tela álcool, tela
67
aldeı́do, tela cetona, tela éter e tela SMILE) que fazem parte da Tela Informações possuem
o mesmo estilo da interface alcano, mudando apenas o conteúdo e o nome.
Todas as interfaces possuem uma aparência amigável, com mensagens explicativas.
Testes foram feitos para verificar o funcionamento do protótipo junto com a interface
gráfica, seção 3.5.
3.5
Testes
O desenvolvimento de um software envolve várias atividades nas quais a possibilidade
de ocorrerem falhas humanas é enorme. E são por estas razões que o desenvolvimento de
um software deve ser sempre acompanhado por atividades de testes que visam garantir a
qualidade do software. Os testes são indispensáveis para remover defeitos e para avaliar
o grau de qualidade do software[Almeida, 2009].
Muitos tipos de testes são feitos antes da liberação do sistema ou protótipo, confiando
que ele funcione apropriadamente. Alguns testes dependem do que está sendo testado:
componentes, grupos de componentes, subsistemas, ou todo o sistema. Outros testes
dependem do que queremos saber: o sistema está funcionando de acordo com o projeto?
De acordo com os requisitos? E com as expectativas iniciais? [Pfleeger, 2004].
Os testes realizados no protótipo PROF QUIM serão: teste funcional, teste de aceitação
e teste de Instalação. Os chamados testes de caixa branca não serão realizados neste
protótipo, pois cada ferramenta das etapas da construção do protótipo (JFlex e Java
CUP), apontam erros na construção da especificação do código, por exemplo: No Java
CUP, será detectado se alguma regra especificada no arquivo é ambı́gua e irá mostrar qual
é esta regra para ser modificada. Também será detectado e informado se existe alguma
variável que não foi declarada e está sendo utilizada, e se existe algum erro na especificação do código. No JFlex, será detectado erros de variáveis duplicadas, de pontuações,
entre outros. O que nos resta verificar e testar, é se o dado fornecido na entrada será o
resultado esperado obtido na saı́da. Nas subseções 3.5.1, 3.5.2 e 3.5.3 serão apresentados
os testes realizados no protótipo PROF QUIM.
3.5.1
Teste Funcional
O Teste Funcional é uma técnica utilizada para se projetarem casos de testes na qual
o programa ou sistema é considerado uma caixa preta e para testá-lo, são fornecidas
entradas e avaliadas as saı́das geradas para verificar se estão em conformidade com os
objetivos especificados. Nessa técnica os detalhes de implementação não são considerados
e o software é avaliado segundo o ponto de vista do usuário [Delamaro e Jino, 2007].
Para a realização deste teste, os principais recursos utilizados foram: um microcom68
putador com sistema operacional Windows XP, Java (TM) SE Development Kit 6 Update
16 instalado, 512MB de memória RAM, Disco rı́gido com capacidade de 40GB e um processador AMD Sempron 2.1GHz 32Bits.
Foram utilizados 15 usuários para a realização do teste, sendo uma quantia razoável,
pois este número representa em média a metade de alunos de uma sala de aula de um
curso superior [Alves, 2009]. Os usuários tinham entre 16 e 35 anos de idade, incluindo
alunos (ensino médio e superior) e professores (ensino superior).
A observação da utilização do protótipo pelos usuários era avaliado individualmente
(para que um usuário não influenciasse o outro na utilização do protótipo, e assim pudesse
realmente indentificar alguma dificuldade encontrada pela usuário) em uma sala pelo
responsável pela construção do protótipo.
Observou-se com este teste que:
• somente um usuário conhecia e utilizava um software voltado para quı́mica orgânica
chamado Organic Chemistry, onde o usuário informava um nome quı́mico (tanto
alcano, alceno, alcadieno, álcool, amina, amida, cetona, éter e ácido carboxı́lico)
e se correto devolvia a fórmula quı́mica. Os outros usuários não conheciam e não
utilizavam softwares semelhantes ou com as funcionalidades do PROF QUIM. Mas
mesmo com esta falta de experiência em utilizar softwares com a finalidade de obter
estruturas quı́micas orgânicas, não houve nenhum problema e dificuldade em sua
utilização, pois os usuários acessavam as instruções de como utilizar o protótipo
PROF QUIM;
• apenas um usuário conhecia a notação SMILES, os outros usuários precisaram acessar as informações do PROF QUIM para compreender como faria a leitura da representação SMILE. Por esta representação ser simples os usuários não tinham dificuldades, depois das informações obtidas no PROF QUIM, em entender a representação
do nome quı́mico;
• os dados de entrada fornecidos pelos usuários correspondiam com os dados de saı́da
fornecido pelo protótipo. Ou seja, quando o usuário fornecia um dado incorreto o
protótipo informava um erro e explicava o que era aquele erro e quando o usuário
fornecia um dado correto o protótipo apresentava a estrutura quı́mica em SMILES
e a explicação do nome quı́mico;
• observou-se também que houve uma satisfação em relação ao uso do protótipo, o
layout das telas foram úteis para a locomoção dentro do software, as quantidades de
informações nas telas foram suficientes para o bom entendimento da utilização do
protótipo, as informações estavam bem organizadas, as mensagens que apareceram
nas telas foram relevantes para o momento da utilização, todas as funções do PROF
69
QUIM estavam corretas, o tempo para aprender a usar o sistema foi rápido entre 3
a 5 minutos, também houve a lembrança de nomes e uso de comandos pela interface
ser simples, poucos passos para executar uma tarefa e não ocorreram falhas no
protótipo em sua utilização.
Constatou-se que todas as funções do protótipo interagem e funcionam adequadamente, não causando danos ou erros em sua utilização. Depois deste teste foi realizado o
teste de aceitação, seção 3.5.2.
3.5.2
Teste de Aceitação
O Teste de Aceitação assegura aos usuários que o protótipo implementado é o que foi
planejado durante o projeto. Verifica se o protótipo atinge as expectativas dos usuários,
caso atinja as expectativas o protótipo é aceito [Pfleeger, 2004].
Um teste de aceitação foi realizado com o protótipo PROF QUIM utilizando os mesmos
usuários que realizaram o teste funcional (seção 3.5.1), pois já estavam familiarizados
com o protótipo e também foram informados pelo realizador dos testes as funções que o
protótipo deveria desempenhar de acordo com o projeto.
Depois do termino do teste de aceitação, o usuário informa quais requisitos não foram
satisfeitos e quais devem ser excluı́dos, revisados ou incluı́dos devido à necessidade de
modificações [Pfleeger, 2004]. Os usuários que realizaram o teste de aceitação verificaram
que o protótipo satisfazia o que foi proposto pelos desenvolvedores. Confirmando desta
maneira, que o protótipo PROF QUIM realiza todas as funções planejadas.
3.5.3
Teste de Instalação
O ciclo final dos testes consiste em instalar o sistema nos locais em que estão os
usuários. Se os testes de aceitação tiverem sido realizados no local, o teste de instalação
poderá ser dispensado. O Teste de Instalação é executado no ambiente real de funcionamento, para permitir que os usuários executem as funções do protótipo e documentem
problemas adicionais especı́ficos do verdadeiro local de operação [Delamaro e Jino, 2007].
O teste de instalação requer novamente a execução dos testes antes executados, para
verificar se o sistema foi instalado corretamente e se ”em campo”, ele funciona como nos
testes anteriores. Assegurando ao usuário que o sistema está completo e que todos os
arquivos e dispositivos necessários estão presentes. Enfocando aspectos de integridade
e verificação se alguma caracterı́stica funcional foi afetada pelas condições do local de
operação [Pfleeger, 2004].
Como este protótipo é um executável, implementado na linguagem Java, basta o
usuário ter em sua máquina instalado o JDK 1.6 ou qualquer versão não muito antiga do
70
JDK.
Todos os testes foram realizados de acordo com os critérios de aceitação e medidas de
qualidade na definição do projeto. Obtendo assim um protótipo consistente.
Concluindo desta forma todas as fases de construção do protótipo PROF QUIM.
71
Considerações Finais
Reconhecimento de nomes quı́micos orgânicos para a geração de suas estruturas não
é uma tarefa fácil de se realizar. Sendo assim, o PROF QUIM é 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 usuários, estes sendo
alunos e professores, 74% utilizam e aprovam softwares voltados para quı́mica, 16% não
sabem usar o computador e 8% não possuem tempo para aprender. Esta pesquisa nos
mostra que, este mundo atual impõe a educadores, crianças, jovens e adultos a tarefa
de absorver as novas tecnologias das mais diversas áreas do saber. Exigindo ferramentas educacionais abertas ao novo, ao dinâmico, ao interativo, atentas a uma realidade
que se transforma a cada momento. Este protótipo surge para facilitar a obtenção do
conhecimento para os usuários interessados em quı́mica orgânica.
Foi abordado um diferencial dos trabalhos aqui apresentados, como por exemplo, explicações de erros, interface amigável e aprendizado de cada parte do nome, para que este
protótipo tenha um atrativo sobre os usuários interessados por este assunto.
Este trabalho apresentou um estudo das técnicas e ferramentas para o reconhecimento
de nomes e geração de estruturas quı́micas. Houve um estudo aprofundado a respeito
da teoria da quı́mica orgânica, em relação às regras de nomenclatura especificada pela
IUPAC sobre os compostos alcanos, alcenos, alcinos, alcadienos, álcoois, aldeı́dos, cetonas
e éteres. Também houve um conhecimento de etapas de análises para a obtenção de um
resultado final. Apreciando as facilidades encontradas em ferramentas (JFlex, Java CUP,
SMILE) e da linguagem de programação (Java).
Este protótipo voltado para a quı́mica, está incluı́do em uma área conhecida popularmente como Quı́mica Computacional. Esta área vem crescendo gradativamente e ganhando espaço no mercado, havendo até reconhecimento, de técnicas computacionais
desenvolvidas utilizando a quı́mica, por meio do prêmio Nobel. O desenvolvimento deste
protótipo vem para consolidar ainda mais a importância tecnológica com a teoria e prática
da quı́mica.
Um ponto bastante positivo deste trabalho foi o fato da obtenção de bibliografia relacionada a regras de nomenclatura e ferramentas de fácil aprendizagem, como JFLEX e
72
Java CUP. Um ponto negativo é o fato deste protótipo não 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 orgânica. Outro ponto negativo foi o relatório dos testes,
por não ser bem detalhado.
As dificuldades encontradas no decorrer deste protótipo foram: A escolha da linguagem
de programação, pois este protótipo seria implementado na linguagem Python, mas por
esta linguagem estar em desenvolvimento constante e ainda sem uma padronização forte
houve problemas na utilização de combinadores de parser e também 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 dificuldade foi a capacidade de Memória, pois em Java temos uma certa quantidade de
memória, pelo código consumir toda a memória 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 memória, mas não conseguimos realizar esta tarefa. Então o
protótipo realiza a verificação 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 memória do Java e para aumentar a quantidade
de carbonos na cadeia principal das funções quı́micas.
Para trabalhos futuros têm-se a perspectiva de ampliação do protótipo PROF QUIM,
no intuito do sistema aceitar mais que 5 carbonos e reconhecer mais funções da quı́mica
orgânica. Um outro objetivo está na análise da estrutura para obtenção do nome quı́mico,
ou seja, o processo inverso tratado neste trabalho. Também a realização de um relatório
de testes bem mais detalhado.
Outro objetivo de trabalho futuro, é fazer o reconhecimento de nomes para estruturas
e estruturas para nomes com a quı́mica inorgânica e então juntar todas estas funcionalidades no protótipo PROF QUIM obtendo desta maneira um protótipo consistente com
várias opções de conhecimento e de grande auxı́lio para os usuários que se interessem por
nomenclatura de nomes de compostos quı́micos.
73
Referências
Almeida, C. B. G. (2009). Autenticação Segura Baseada em Biometria Voltada para
a Dinâmica da Digitação. Projeto Final de Curso, Universidade Federal de Goiás,
Campus Catalão, Curso de Bacharelado em Ciência da Computação.
Alves, L. P. (2009). A Pesquisa como Prática Pedagógica da Sala de Aula na Educação Superior. www.anped.org.br/reunioes/25/posteres/leonirpessatealvesp04.rtf, Centro Universitário de Jaraguá do Sul-SC.
Campos, S. L. e Mourato, P. M. (1999). Nomenclatura dos Compostos Orgânicos. Escolar
Editora.
Cesta, A. A. (2004). Tutorial: A linguagem de Programação 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. Edição.
Delamaro, E. M. e Jino, M. (2007). Introdução ao Teste de Software. Editora Campus.
Dias, S. M. (2006). Dissertação de Mestrado: Análise de Nomes da Quı́mica Orgânica
à luz da Teoria do Léxico Gerativo - Da Análise Sintático-Semântica à Geração das
Estruturas Quı́micas através dos Combinadores de Parser. Uberlândia, MG.
Eggert,
A. A.,
Middlecamp,
H. C.,
ing Chemical Formulas to Names:
e Jacob,
A. T. (1992).
An Expert Strategy.
Convert-
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.unitrier.de/ ley/db/journals/jcisd/jcisd32.html, UNICAMP.
Ferreira, H. B. A. (1999). Novo Dicionário Aurélio - Século XXI.
Freitas,
L. C. (1998).
Prêmio Nobel de Quı́mica 1998.
Disponı́vel em:
lqes.iqm.unicamp.br/lqes-cultural-culturaquimica3-3premionobel.pdf, Quı́mica Nova
na Escola, São Paulo n. 8, p. 3- 6,.
Herold, J. B. (2000). O papel dos professores e investigadores universitários na tradução
cientı́fica. Disponı́vel em: http://dtil.unilat.org/IXseminariofct-ul/bernardo-jeroschherold.htm, Instituto Superior Técnico, Universidade Técnica de Lisboa.
74
Hornung, R. e Matos, N. S. (2000). Aplicando o Processo Dirigido por Responsabilidades
para a Criação de um Subframework para Validação Sintática de Fórmulas. Disponı́vel
em: http://www.pg.cefetpr.br/coinf/nasser/?page-id=6.
Junior,
J.
P.
(2000).
Introdução
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 Computational Chemistry. Volume 21.
Machado,
J.
(2000).
Tutorial
JFlex.
Disponı́vel
em:
http://tutoriais.ccp.tripod.com/jflex/jflex.html.
Neto, F. R. J. e Júnior, P. M. W. (2000). A Utilização do Hot Potatoes no Ensino Médio
da Escola Municipal ”Machado de Assis”, Criando Palavras Cruzadas e Auxiliando a
Construção 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 prática. Prentice Hall.
Pinto,
S.
A.
(2003).
Introdução
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 evolução da quı́mica
computacional e sua contribuição para a educação 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 Orgânica: Compreendendo a Ciência da
Vida. Campinas-SP, Editora Átomo.
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). Recomendações da IUPAC para Nomenclatura de Moléculas
Orgânicas. 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 Validação de Editores Moleculares.
http://periodicos.uniso.br/index.php/reu/article/view/84/47.
75
Disponı́vel em:
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 Informática.
Sousa, A. J. (2002). Quimio-informática. Soquı́mica: Sociedade de Representações de
Quı́mica, LTDA.
Stefani, R., Nascimento, D. B. G. P., e Costa, B. F. (2007). Elucidação Estrutural de
Substâncias Orgânicas com Auxı́lio de Computador: Evoluções 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. São 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
Apêndice A
Código Fonte
A.1
1
Arquivo JFlex
/* Seç~
ao Código do Usuário */
2
3
package sintatico;
4
5
6
7
import java_cup.runtime.*;
import javax.swing.JOptionPane;
import sintatico.frame2;
8
9
%%
10
11
/* Seç~
ao de Opç~
oes e Declaraç~
oes */
12
13
14
15
16
17
18
19
%public
%class quimica
%line
%column
%unicode
%cup
%type Symbol
20
21
22
23
24
25
%{
String expr = "";
StringBuffer string = new StringBuffer();
26
private Symbol symbol(int type) {
return new Symbol(type, yyline, yycolumn);
27
28
}
29
30
private Symbol symbol(int type, Object value) {
return new Symbol(type, yyline, yycolumn, value);
}
31
32
33
34
35
36
%}
37
38
numero
=
[1-5]
39
40
41
%state STRING
42
43
%%
44
45
/* Seç~
ao de Regras Léxicas */
46
47
48
49
<YYINITIAL>{
/* Prefixo */
"met"
{return symbol(sym.MET);}
77
50
51
52
53
54
55
56
57
58
"et"
"prop"
"but"
"pent"
"hex"
"hept"
"oct"
"non"
"dec"
{return
{return
{return
{return
{return
{return
{return
{return
{return
symbol(sym.ET);}
symbol(sym.PROP);}
symbol(sym.BUT);}
symbol(sym.PENT);}
symbol(sym.HEX);}
symbol(sym.HEPT);}
symbol(sym.OCT);}
symbol(sym.NON);}
symbol(sym.DEC);}
/* Saturacao */
"an"
"en"
"in"
"adien"
"trien"
"diin"
"triin"
{return
{return
{return
{return
{return
{return
{return
symbol(sym.AN);}
symbol(sym.EN);}
symbol(sym.IN);}
symbol(sym.DIEN);}
symbol(sym.TRIEN);}
symbol(sym.DIIN);}
symbol(sym.TRIIN);}
/* Funcao */
"o"
"odiol"
"otriol"
"ol"
"al"
"odial"
"ona"
"oxi"
{return
{return
{return
{return
{return
{return
{return
{return
symbol(sym.O);}
symbol(sym.DIOL);}
symbol(sym.TRIOL);}
symbol(sym.OL);}
symbol(sym.AL);}
symbol(sym.DIAL);}
symbol(sym.ONA);}
symbol(sym.OXI);}
/* Radicais */
"metil"
"etil"
"propil"
"dipropil"
"butil"
"dimetil"
"trimetil"
"dietil"
"trietil"
"isopropil"
"vinil"
"isobutil"
{return
{return
{return
{return
{return
{return
{return
{return
{return
{return
{return
{return
symbol(sym.METIL);}
symbol(sym.ETIL);}
symbol(sym.PROPIL);}
symbol(sym.DIPROPIL);}
symbol(sym.BUTIL);}
symbol(sym.DIMETIL);}
symbol(sym.TRIMETIL);}
symbol(sym.DIETIL);}
symbol(sym.TRIETIL);}
symbol(sym.ISOPROPIL);}
symbol(sym.VINIL);}
symbol(sym.ISOBUTIL);}
"-"
","
{return symbol(sym.ESPACO);}
{return symbol(sym.VIRGULA);}
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
{numero}
{return symbol(sym.NUMERO, yytext());}
98
99
100
101
/* STRING */
\"
{string.setLength(0); yybegin(STRING);}
102
103
104
105
/*ERRO*/
.
106
{String s = "Erro Lexico:\n Este sı́mbolo ( "+yytext()+" )\n n~
ao pertence
a gramatica\n do PROF QUIM"; JOptionPane.showMessageDialog(null,s);}
107
108
}
109
110
111
112
113
114
<STRING> {
\"
[^\n\r\"\\]+
\\t
\\n
{yybegin(YYINITIAL);}
{string.append( yytext());}
{string.append( ’\t’ );}
{string.append( ’\n’ );}
\\r
\\\"
\\
{string.append( ’\r’ );}
{string.append( ’\"’ );}
{string.append( ’\"’ );}
/* Erro*/
.|\n
{throw new Error("Ilegal caracter "+yytext()+" "+yyline);}
115
116
117
118
119
120
121
122
123
}
78
A.2
1
Arquivo Java CUP
/* Declaraç~
ao de Package e Import */
2
3
4
5
6
7
package sintatico;
import java_cup.runtime.*;
import java.awt.Color;
import java.awt.Font;
import sintatico.frame2;
8
9
/* Componentes de Código do Usuário */
10
11
parser code {:
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
public void report_error(String message, Object info) {
StringBuffer m = new StringBuffer("Atenç~
ao \n ");
if (info instanceof java_cup.runtime.Symbol) {
java_cup.runtime.Symbol s = ((java_cup.runtime.Symbol) info);
if (s.right >= 0){
m.append("A formaç~
ao deste nome n~
ao se encaixa nas regras da IUPAC.
\n Verifique ramificaç~
oes e posiç~
oes, pois\n este nome torna a nomenclatura incorreta.");
}
}
m.append("\n "+message+" "+((quimica)getScanner()).expr);
frame2.saida.setFont(new Font("Arial", Font.PLAIN, 15));
frame2.saida.setForeground(Color.RED);
frame2.saida.setText("\n"+m);
}
27
28
29
30
31
public void syntax_error(Symbol cur_token){
report_error("Erro sintatico.", cur_token);
}
32
33
34
35
36
37
public void report_fatal_error(String message, Object info) {
//report_error(message, info);
// System.exit(1);
}
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
49
50
51
52
53
terminal
terminal
terminal
terminal
terminal
terminal
O, OL, DIOL, TRIOL, AL, DIAL, ONA, OXI;
AN, EN, IN, DIEN, TRIEN, DIIN, TRIIN;
MET, ET, PROP, BUT, PENT, HEX, HEPT, OCT, NON, DEC;
METIL, ETIL, PROPIL, DIPROPIL, BUTIL, DIMETIL, TRIMETIL, DIETIL, TRIETIL, ISOPROPIL, VINIL, ISOBUTIL;
ESPACO, VIRGULA;
String NUMERO;
54
55
56
/* N~
ao terminais usados na gramatica.*/
57
58
non terminal String nomenclatura;
59
60
61
62
63
non
non
non
non
terminal
terminal
terminal
terminal
String
String
String
String
alcano;
alcanoEt;
alcanoProp;
alcanoBut;
non
non
non
non
terminal
terminal
terminal
terminal
String
String
String
String
alceno;
alcenoEt;
alcenoProp;
alcenoBut;
64
65
66
67
68
69
70
71
72
non terminal String alcino;
non terminal String alcinoEt;
non terminal String alcinoProp;
79
73
non terminal String alcinoBut;
74
75
76
77
78
non
non
non
non
terminal
terminal
terminal
terminal
String
String
String
String
alcadieno;
alcadienoMet;
alcadienoProp;
alcadienoBut;
non
non
non
non
terminal
terminal
terminal
terminal
String
String
String
String
alcool;
alcoolMet;
alcoolEt;
alcoolProp;
non
non
non
non
terminal
terminal
terminal
terminal
String
String
String
String
aldeido;
aldeidoMet;
aldeidoEt;
aldeidoProp;
non
non
non
non
terminal
terminal
terminal
terminal
String
String
String
String
cetona;
cetonaMet;
cetonaEt;
cetonaProp;
non
non
non
non
terminal
terminal
terminal
terminal
String
String
String
String
eter;
eterMet;
eterMetEt;
eterMetProp;
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
non terminal String eterEt;
non terminal String eterEtProp;
102
103
non terminal String eterProp;
104
105
106
107
108
109
110
111
112
113
114
115
116
117
non
non
non
non
non
non
non
non
non
non
non
non
non
terminal
terminal
terminal
terminal
terminal
terminal
terminal
terminal
terminal
terminal
terminal
terminal
terminal
String
String
String
String
String
String
String
String
String
String
String
String
String
hidrocarboneto;
alcoois;
aldeidos;
cetonas;
simples;
dupla;
tripla;
dduplas;
prefixo;
sufixo;
central;
numero;
radical;
118
119
/* Declaraç~
ao de Precedencia e Associativismo */
120
121
122
123
124
125
126
/* ------------- Precedencia ----------- */
precedence left O, OL, DIOL, TRIOL, AL, DIAL, ONA, OXI;
precedence left AN, EN, IN, DIEN, TRIEN, DIIN, TRIIN;
precedence left MET, ET, PROP, BUT, PENT, HEX, HEPT, OCT, NON, DEC;
precedence left METIL, ETIL, PROPIL, DIPROPIL, BUTIL, DIMETIL, TRIMETIL, DIETIL, TRIETIL, ISOPROPIL, VINIL, ISOBUTIL;
precedence left NUMERO;
127
128
/* Gramatica */
129
130
/* ---------------------------- Gramatica -------------------- */
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
nomenclatura ::= alcano:al
{: RESULT
| alceno: ae
{: RESULT
| alcino: ai
{: RESULT
| alcadieno: die
{: RESULT
| alcool: ol
{: RESULT
| aldeido: dei
{: RESULT
| cetona: ce
{: RESULT
| eter: te
= al; :}
= ae; :}
= ai; :}
= die; :}
= ol; :}
= dei; :}
= ce; :}
80
{: RESULT = te; :}
147
148
;
149
150
151
/* ************* Alcano ************** */
152
153
154
155
156
157
158
159
alcano ::= alcanoEt: ae
{: RESULT = ae; :}
| alcanoProp: ap
{: RESULT = ap; :}
| alcanoBut : ab
{: RESULT = ab; :}
;
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
alcanoEt ::= MET simples:en hidrocarboneto:hi {:
frame2.saida.setFont(new Font("Arial", Font.PLAIN, 15));
frame2.saida.setForeground(Color.BLUE);
frame2.saida.setText(" Nome correto.\n \n Esta subst^
ancia é um Alcano \n Possuindo 1
carbono na cadeia principal (met), \n ligaç~
ao simples ("+en+") e \n pertencendo ao grupo hidrocarboneto ("+hi+")");
frame2.est.setText("\n \n
C ");
:}
| numero:nu radical:ra MET simples:en hidrocarboneto:hi {:
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Nome incorreto.\n\n N~
ao podemos ter ramificaç~
oes com o prefixo MET,
\n pois n~
ao será mais um met e\n sim outro prefixo maior que 1 carbono.");
:}
| ET simples:en hidrocarboneto: hi {:
frame2.saida.setForeground(Color.BLUE);
frame2.saida.setText(" Nome correto.\n \n Esta subst^
ancia é um Alcano \n Possuindo 2
carbonos na cadeia principal (et), \n ligaç~
ao simples ("+en+") e \n pertencendo ao grupo hidrocarboneto ("+hi+")");
frame2.est.setText("\n \n
CC ");
:}
| numero:nu radical:ra ET simples:en hidrocarboneto:hi {:
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Nome incorreto.\n\n N~
ao podemos ter ramificaç~
oes com o prefixo ET,
\n pois n~
ao será mais um et e\n sim outro prefixo maior que 2 carbonos.");
:}
;
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
alcanoProp ::= PROP simples:en hidrocarboneto:hi {:
frame2.saida.setFont(new Font("Arial", Font.PLAIN, 15));
frame2.saida.setForeground(Color.BLUE);
frame2.saida.setText(" Nome correto.\n\n Esta subst^
ancia é um Alcano\n Possuindo 3
carbonos na cadeia principal (prop),\n ligaç~
ao simples ("+en+") e \n pertencendo ao grupo hidrocarboneto ("+hi+")");
frame2.est.setText("\n\n
CCC ");
:}
| numero: num METIL PROP simples:en hidrocarboneto:hi {:
if(Integer.parseInt(num) == 1){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" \n Erro na posiç~
ao da ramificaç~
ao METIL.\n Se colocar a ramificaç~
ao
na posiç~
ao 1,\n seguindo a regra da cadeia, tornará um but n~
ao\n mais o prefixo prop");
}else{
if(Integer.parseInt(num) == 3){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" \n Erro na posiç~
ao da ramificaç~
ao METIL.\n Se colocar a ramificaç~
ao
na posiç~
ao 3,\n seguindo a regra da cadeia, tornará um but n~
ao\n mais o prefixo prop");
}else{
if(Integer.parseInt(num) > 3){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Numero da posiç~
ao esta incorreto.\n Com o prefixo PROP so
podemos ter 3\n carbonos na cadeia principal");
}else{
frame2.saida.setForeground(Color.BLUE);
frame2.saida.setText(" Nome correto.\n\n Esta subst^
ancia é um Alcano\n Possuindo 3
carbonos na cadeia principal (prop),\n ligaç~
ao simples ("+en+"),\n uma ramificaç~
ao metil na posiç~
ao: ("+num+")
e \n pertencendo ao grupo hidrocarboneto ("+hi+")");
frame2.est.setText("\n\n
CC(C)C ");
}
}
}
:}
| numero: num numero:nu DIMETIL PROP simples:en hidrocarboneto: hi {:
if(Integer.parseInt(num) == 1 || Integer.parseInt(nu) == 1){
frame2.saida.setForeground(Color.RED);
81
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
frame2.saida.setText(" Erro na posiç~
ao da ramificaç~
ao DIMETIL.\n Se colocar uma das
ramificaç~
oes na posiç~
ao 1,\n seguindo a regra da cadeia, tornará um but n~
ao\n mais o prefixo prop");
}else{
if(Integer.parseInt(num) == 3 || Integer.parseInt(nu) == 3){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Erro na posiç~
ao da ramificaç~
ao DIMETIL.\n Se colocar uma das
ramificaç~
oes na posiç~
ao 3,\n seguindo a regra da cadeia, tornará um but n~
ao\n mais o prefixo prop");
}else{
if(Integer.parseInt(num) > 3 || Integer.parseInt(nu) > 3){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Numero da posiç~
ao esta incorreto.\n Com o prefixo PROP so
podemos ter 3 carbonos na cadeia principal");
}else{
frame2.saida.setForeground(Color.BLUE);
frame2.saida.setText(" Nome correto.\n\n Esta subst^
ancia é um Alcano\n Possuindo 3
carbonos na cadeia principal (prop),\n ligaç~
ao simples ("+en+"),\n ramificaç~
ao dimetil na posiç~
ao:
("+num+","+nu+") e \n pertencendo ao grupo hidrocarboneto ("+hi+")");
frame2.est.setText("\n\n
CC(C)(C)C ");
}
}
}
:}
| numero:num numero:nu numero:ero TRIMETIL PROP simples:en hidrocarboneto: hi {:
frame2.saida.setFont(new Font("Arial", Font.PLAIN, 15));
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Nome incorreto.\n\n N~
ao podemos ter ramificaç~
ao TRIMETIL
com o prefixo PROP,\n pois n~
ao será mais um prop e\n sim outro prefixo maior que 3 carbonos.");
:}
;
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
alcanoBut ::= BUT simples:en hidrocarboneto:hi {:
frame2.saida.setFont(new Font("Arial", Font.PLAIN, 15));
frame2.saida.setForeground(Color.BLUE);
frame2.saida.setText(" Nome correto.\n\n Esta subst^
ancia é um Alcano\n
Possuindo 4 carbonos na cadeia principal (but),\n ligaç~
ao simples ("+en+") e \n pertencendo ao grupo
hidrocarboneto ("+hi+")");
frame2.est.setText("\n\n
CCCC ");
:}
| numero: num METIL BUT simples:en hidrocarboneto:hi {:
if(Integer.parseInt(num) == 1){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Erro na posiç~
ao da ramificaç~
ao METIL.\n Se colocar a ramificaç~
ao
na posiç~
ao 1,\n seguindo a regra da cadeia, tornará um pent n~
ao\n mais o prefixo but");
}else{
if(Integer.parseInt(num) == 4){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Erro na posiç~
ao da ramificaç~
ao METIL.\n Se colocar a ramificaç~
ao
na posiç~
ao 4,\n seguindo a regra da cadeia, tornará um pent n~
ao\n mais o prefixo but");
}else{
if(Integer.parseInt(num) > 4){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Numero da posiç~
ao esta incorreto.\n Com o prefixo BUT so podemos
ter 4\n carbonos na cadeia principal");
}else{
frame2.saida.setForeground(Color.BLUE);
frame2.saida.setText(" Nome correto.\n\n Esta subst^
ancia é um Alcano\n Possuindo 4
carbonos na cadeia principal (but),\n ligaç~
ao simples ("+en+"),\n uma ramificaç~
ao metil na posiç~
ao: ("+num+")
e \n pertencendo ao grupo hidrocarboneto ("+hi+")");
if(Integer.parseInt(num)==2){
frame2.est.setText("\n\n
CC(C)CC ");
}else{
frame2.est.setText("\n\n
CCC(C)C ");
283
}
284
}
285
}
286
287
288
289
290
291
292
293
294
}
:}
| numero:num numero:nu DIMETIL BUT simples:en hidrocarboneto: hi {:
if(Integer.parseInt(num) == 1 || Integer.parseInt(nu) == 1){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Erro na posiç~
ao da ramificaç~
ao DIMETIL.\n Se colocar uma das
ramificaç~
oes na posiç~
ao 1,\n seguindo a regra da cadeia, tornará um pent n~
ao\n mais o prefixo but");
}else{
82
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
if(Integer.parseInt(num) == 4 || Integer.parseInt(nu) == 4){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Erro na posiç~
ao da ramificaç~
ao DIMETIL.\n Se colocar uma das
ramificaç~
oes na posiç~
ao 4,\n seguindo a regra da cadeia, tornará um pent n~
ao\n mais o prefixo but");
}else{
if(Integer.parseInt(num) > 4 || Integer.parseInt(nu) > 4){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Numero da posiç~
ao esta incorreto.\n Com o prefixo BUT so podemos ter
4\n carbonos na cadeia principal");
}else{
frame2.saida.setForeground(Color.BLUE);
frame2.saida.setText(" Nome correto.\n\n Esta subst^
ancia é um Alcano\n Possuindo 4 carbonos
na cadeia principal (but),\n ligaç~
ao simples ("+en+"),\n ramificaç~
ao dimetil na posiç~
ao: ("+num+","+nu+") e
\n pertencendo ao grupo hidrocarboneto ("+hi+")");
if(Integer.parseInt(num)==2 && Integer.parseInt(nu)==2){
frame2.est.setText("\n\n
CC(C)(C)CC ");
}else{
if(Integer.parseInt(num)==2 && Integer.parseInt(nu)==3 || Integer.parseInt(num)==3 &&
Integer.parseInt(nu)==2){
frame2.est.setText("\n\n
CC(C)C(C)C ");
}else{
frame2.est.setText("\n\n
CCC(C)(C)C ");
}
}
}
}
}
:}
| numero:num numero:nu numero:numer TRIMETIL BUT simples:en hidrocarboneto: hi {:
if(Integer.parseInt(num) == 1 || Integer.parseInt(nu) == 1 || Integer.parseInt(numer) == 1){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Erro na posiç~
ao da ramificaç~
ao TRIMETIL.\n Se colocar uma das
ramificaç~
oes na posiç~
ao 1,\n seguindo a regra da cadeia, tornará um pent n~
ao\n mais o prefixo but");
}else{
if(Integer.parseInt(num) == 4 || Integer.parseInt(nu) == 4 || Integer.parseInt(numer) == 4){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Erro na posiç~
ao da ramificaç~
ao TRIMETIL.\n Se colocar uma das
ramificaç~
oes na posiç~
ao 4,\n seguindo a regra da cadeia, tornará um pent n~
ao\n mais o prefixo but");
}else{
if(Integer.parseInt(num) > 4 || Integer.parseInt(nu) > 4 || Integer.parseInt(numer) > 4){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Numero da posiç~
ao esta incorreto.\n Com o prefixo BUT so podemos
ter 4 carbonos na cadeia principal");
}else{
if(Integer.parseInt(num)==2 && Integer.parseInt(nu)==2 && Integer.parseInt(numer)==2 ||
Integer.parseInt(num)==3 && Integer.parseInt(nu)==3 && Integer.parseInt(numer)==3){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Atenç~
ao, as tr^
es posiç~
oes da ramificaç~
ao trimetil\n n~
ao podem ter
o mesmo número");
}else{
frame2.saida.setForeground(Color.BLUE);
frame2.saida.setText(" Nome correto.\n\n Esta subst^
ancia é um Alcano\n Possuindo 4 carbonos
na cadeia principal (but),\n ligaç~
ao simples ("+en+"),\n ramificaç~
ao trimetil na posiç~
ao:
("+num+","+nu+","+numer+") e \n pertencendo ao grupo hidrocarboneto ("+hi+")");
if(Integer.parseInt(num)==2 && Integer.parseInt(nu)==2 && Integer.parseInt(numer)==3 ||
Integer.parseInt(num)==3 && Integer.parseInt(nu)==2 && Integer.parseInt(numer)==2 ||
Integer.parseInt(num)==2 && Integer.parseInt(nu)==3 && Integer.parseInt(numer)==2){
frame2.est.setText("\n\n
CC(C)(C)C(C)C ");
}else{
frame2.est.setText("\n\n
CC(C)C(C)(C)C ");
}
}
}
}
}
:}
;
362
363
/* ************* Alceno ************** */
364
365
366
367
368
alceno ::=
alcenoEt: ae
{: RESULT = ae; :}
|alcenoProp: ap
{: RESULT = ap; :}
83
369
370
371
| alcenoBut : ab
{: RESULT = ab; :}
;
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
alcenoEt ::= numero: num ET dupla:en hidrocarboneto: hi {:
if(Integer.parseInt(num) > 2){
frame2.saida.setFont(new Font("Arial", Font.PLAIN, 15));
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Numero da posiç~
ao da ligaç~
ao esta incorreto.\n Com o prefixo ET so podemos ter 2
carbonos na cadeia principal");
}else{
if(Integer.parseInt(num)==2){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Nome incorreto.\n N~
ao é possivel colocar a ligaç~
ao neste carbono.");
}else{
frame2.saida.setFont(new Font("Arial", Font.PLAIN, 15));
frame2.saida.setForeground(Color.BLUE);
frame2.saida.setText(" Nome correto.\n \n Esta subst^
ancia é um Alceno \n Possuindo 2 carbonos na cadeia
principal (et), \n ligaç~
ao dupla ("+en+") na posiç~
ao ("+num+") e \n pertencendo ao grupo hidrocarboneto ("+hi+")");
frame2.est.setText("\n \n
C=C ");
}
}
:}
| numero:nu MET dupla:en hidrocarboneto:hi {:
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Nome incorreto.\n\n N~
ao podemos utilizar o prefixo MET,\n pois com o hidrocarboneto
alceno temos\n que ter um carbono se ligando ao outro\n com uma dupla ligaç~
ao.");
:}
| numero:nu METIL numero:num MET dupla:en hidrocarboneto:hi {:
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Nome incorreto.\n\n N~
ao podemos ter ramificaç~
oes com o prefixo MET,\n pois n~
ao
será mais um met e\n sim outro prefixo maior que 1 carbono.");
:}
| numero:nu METIL numero:num ET dupla:en hidrocarboneto:hi {:
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Nome incorreto.\n\n N~
ao podemos ter ramificaç~
oes com o prefixo ET,\n pois n~
ao
será mais um et e\n sim outro prefixo maior que 2 carbonos.");
:}
;
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
alcenoProp ::= numero:nume PROP dupla:en hidrocarboneto:hi {:
if(Integer.parseInt(nume) > 3){
frame2.saida.setFont(new Font("Arial", Font.PLAIN, 15));
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Numero da posiç~
ao da ligaç~
ao esta incorreto.\n Com o prefixo PROP so podemos
ter\n 3 carbonos na cadeia principal");
}else{
if(Integer.parseInt(nume)==3){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Nome incorreto.\n N~
ao é possivel colocar a ligaç~
ao neste carbono.");
}else{
frame2.saida.setForeground(Color.BLUE);
frame2.saida.setText(" Nome correto.\n\n Esta subst^
ancia é um Alceno\n Possuindo 3 carbonos na cadeia
principal (prop),\n ligaç~
ao dupla ("+en+") na posiç~
ao ("+nume+") e \n pertencendo ao grupo hidrocarboneto
("+hi+")");
if(Integer.parseInt(nume)==1){
frame2.est.setText("\n\n
C=CC ");
}else{
frame2.est.setText("\n\n
CC=C ");
}
}
}
:}
| numero:num METIL numero:nume PROP dupla:en hidrocarboneto:hi {:
if(Integer.parseInt(num) == 1){
frame2.saida.setFont(new Font("Arial", Font.PLAIN, 15));
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Erro na posiç~
ao da ramificaç~
ao METIL.\n Se colocar a ramificaç~
ao na posiç~
ao 1,
seguindo a regra da cadeia,\n tornará um but n~
ao mais o prefixo prop");
}else{
if(Integer.parseInt(num) == 3){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Erro na posiç~
ao da ramificaç~
ao METIL.\n Se colocar a ramificaç~
ao na posiç~
ao 3,
84
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
seguindo a regra da cadeia,\n tornará um but n~
ao mais o prefixo prop");
}else{
if(Integer.parseInt(num) > 3 || Integer.parseInt(nume) > 3){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Numero da posiç~
ao esta incorreto.\n Com o prefixo PROP so podemos ter 3
carbonos na cadeia principal");
}else{
if(Integer.parseInt(nume)==3){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Nome incorreto.\n N~
ao é possivel colocar a ligaç~
ao neste carbono.");
}else{
frame2.saida.setForeground(Color.BLUE);
frame2.saida.setText(" Nome correto.\n\n Esta subst^
ancia é um Alceno\n Possuindo 3 carbonos
na cadeia principal (prop),\n ligaç~
ao dupla ("+en+") na posiç~
ao ("+nume+"),\n uma ramificaç~
ao metil
na posiç~
ao: ("+num+") e \n pertencendo ao grupo hidrocarboneto ("+hi+")");
if(Integer.parseInt(nume)==1){
frame2.est.setText("\n\n
C=C(C)C ");
}else{
frame2.est.setText("\n\n
CC=(C)C ");
}
}
}
}
}
:}
| numero:num numero:numer DIMETIL numero:nume PROP dupla:en hidrocarboneto: hi {:
if(Integer.parseInt(num) == 1 || Integer.parseInt(numer) == 1){
frame2.saida.setFont(new Font("Arial", Font.PLAIN, 15));
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Erro na posiç~
ao da ramificaç~
ao DIMETIL.\n Se colocar a ramificaç~
ao na posiç~
ao 1,
seguindo a regra da cadeia,\n tornará um but n~
ao mais o prefixo prop");
}else{
if(Integer.parseInt(num) == 3 || Integer.parseInt(numer) == 3){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Erro na posiç~
ao da ramificaç~
ao DIMETIL.\n Se colocar a ramificaç~
ao na posiç~
ao 3,
seguindo a regra da cadeia,\n tornará um but n~
ao mais o prefixo prop");
}else{
if(Integer.parseInt(num) > 3 || Integer.parseInt(numer) > 3 || Integer.parseInt(nume) > 3){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Numero da posiç~
ao esta incorreto.\n Com o prefixo PROP so podemos ter 3\n
carbonos na cadeia principal");
}else{
if(Integer.parseInt(nume)==3){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Nome incorreto.\n N~
ao é possivel colocar a ligaç~
ao neste carbono.");
}else{
frame2.saida.setForeground(Color.BLUE);
frame2.saida.setText(" Nome correto.\n\n Esta subst^
ancia é um Alceno\n Possuindo 3 carbonos na cadeia
principal (prop),\n ligaç~
ao dupla ("+en+") na posiç~
ao ("+nume+"),\n ramificaç~
ao dimetil na posiç~
ao:
("+num+","+numer+") e \n pertencendo ao grupo hidrocarboneto ("+hi+")");
if(Integer.parseInt(nume)==1){
frame2.est.setText("\n\n
C=C(C)(C)C ");
}else{
frame2.est.setText("\n\n
CC=(C)(C)C ");
}
}
}
}
}
:}
| numero:num numero:nu numero:ero TRIMETIL numero:ro PROP dupla:en hidrocarboneto: hi {:
frame2.saida.setFont(new Font("Arial", Font.PLAIN, 15));
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Nome incorreto.\n\n N~
ao podemos ter ramificaç~
ao TRIMETIL com o prefixo PROP,\n
pois n~
ao será mais um prop e\n sim outro prefixo maior que 3 carbonos.");
:}
;
510
511
512
513
514
515
516
alcenoBut ::= numero:nume BUT dupla:en hidrocarboneto:hi {:
if(Integer.parseInt(nume) > 4){
frame2.saida.setFont(new Font("Arial", Font.PLAIN, 15));
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Numero da posiç~
ao da ligaç~
ao esta incorreto.\n Com o prefixo BUT so podemos ter
85
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
4 carbonos na cadeia principal");
}else{
if(Integer.parseInt(nume)==4){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Nome incorreto.\n N~
ao é possivel colocar a ligaç~
ao neste carbono.");
}else{
frame2.saida.setForeground(Color.BLUE);
frame2.saida.setText(" Nome correto.\n\n Esta subst^
ancia é um Alceno\n Possuindo 4 carbonos na
cadeia principal (but),\n ligaç~
ao dupla ("+en+") na posiç~
ao ("+nume+") e \n pertencendo ao grupo
hidrocarboneto ("+hi+")");
if(Integer.parseInt(nume)==1){
frame2.est.setText("\n\n
C=CCC ");
}else{
if(Integer.parseInt(nume)==2){
frame2.est.setText("\n\n
CC=CC ");
}else{
frame2.est.setText("\n\n
CCC=C ");
}
}
}
}
:}
| numero:num METIL numero:nume BUT dupla:en hidrocarboneto:hi {:
if(Integer.parseInt(num) == 1){
frame2.saida.setFont(new Font("Arial", Font.PLAIN, 15));
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Erro na posiç~
ao da ramificaç~
ao METIL.\n Se colocar a ramificaç~
ao na posiç~
ao
1, seguindo a regra da cadeia,\n tornará um pent n~
ao mais o prefixo but");
}else{
if(Integer.parseInt(num) == 4){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Erro na posiç~
ao da ramificaç~
ao METIL.\n Se colocar a ramificaç~
ao na posiç~
ao
4, seguindo a regra da cadeia,\n tornará um pent n~
ao mais o prefixo but");
}else{
if(Integer.parseInt(num) > 4 || Integer.parseInt(nume) > 4){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Numero da posiç~
ao esta incorreto.\n Com o prefixo BUT so podemos ter 4
carbonos na cadeia principal");
}else{
if(Integer.parseInt(nume)==4){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Nome incorreto.\n N~
ao é possivel colocar a ligaç~
ao neste carbono.");
}else{
frame2.saida.setForeground(Color.BLUE);
frame2.saida.setText(" Nome correto.\n\n Esta subst^
ancia é um Alceno\n Possuindo 4 carbonos
na cadeia principal (but),\n ligaç~
ao dupla ("+en+") na posiç~
ao ("+nume+"),\n uma ramificaç~
ao
metil na posiç~
ao: ("+num+") e \n pertencendo ao grupo hidrocarboneto ("+hi+")");
if(Integer.parseInt(nume)==1 && Integer.parseInt(num)==2){
frame2.est.setText("\n\n
C=C(C)CC ");
}else{
if(Integer.parseInt(nume)==1 && Integer.parseInt(num)==3){
frame2.est.setText("\n\n
C=CC(C)C ");
}else{
if(Integer.parseInt(nume)==2 && Integer.parseInt(num)==2){
frame2.est.setText("\n\n
CC=(C)CC ");
}else{
if(Integer.parseInt(nume)==2 && Integer.parseInt(num)==3){
frame2.est.setText("\n\n
CC=C(C)C ");
}else{
if(Integer.parseInt(nume)==3 && Integer.parseInt(num)==2){
frame2.est.setText("\n\n
CC=C(C)C ");
}else{
frame2.est.setText("\n\n
CCC=(C)C ");
}
}
}
}
}
}
}
}
}
:}
| numero:num numero:nu DIMETIL numero:nume BUT dupla:en hidrocarboneto: hi {:
86
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
if(Integer.parseInt(num) == 1 || Integer.parseInt(nu) == 1){
frame2.saida.setFont(new Font("Arial", Font.PLAIN, 15));
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Erro na posiç~
ao da ramificaç~
ao DIMETIL.\n Se colocar a ramificaç~
ao na
posiç~
ao 1, seguindo a regra da cadeia,\n tornará um pent n~
ao mais o prefixo but");
}else{
if(Integer.parseInt(num) == 4 || Integer.parseInt(nu) == 4 ){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Erro na posiç~
ao da ramificaç~
ao DIMETIL.\n Se colocar a ramificaç~
ao na
posiç~
ao 4, seguindo a regra da cadeia,\n tornará um pent n~
ao mais o prefixo but");
}else{
if(Integer.parseInt(num) > 4 || Integer.parseInt(nu) > 4 || Integer.parseInt(nume) > 4){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Numero da posiç~
ao esta incorreto.\n Com o prefixo BUT so podemos ter
4 carbonos na cadeia principal");
}else{
if(Integer.parseInt(nume)==4){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Nome incorreto.\n N~
ao é possivel colocar a ligaç~
ao neste carbono.");
}else{
frame2.saida.setForeground(Color.BLUE);
frame2.saida.setText(" Nome correto.\n\n Esta subst^
ancia é um Alceno\n Possuindo 4 carbonos
na cadeia principal (but),\n ligaç~
ao dupla ("+en+") na posiç~
ao ("+nume+"), \n ramificaç~
ao
dimetil na posiç~
ao ("+num+","+nu+") e \n pertencendo ao grupo hidrocarboneto ("+hi+")");
if(Integer.parseInt(nume)==1){
if(Integer.parseInt(num)==2 && Integer.parseInt(nu)==2){
frame2.est.setText("\n\n
C=C(C)(C)CC ");
}else{
if(Integer.parseInt(num)==2 && Integer.parseInt(nu)==3 || Integer.parseInt(num)==3 &&
Integer.parseInt(nu)==2){
frame2.est.setText("\n\n
C=C(C)C(C)C ");
}else{
frame2.est.setText("\n\n
C=CC(C)(C)C ");
}
}
}else{
if(Integer.parseInt(nume)==2){
if(Integer.parseInt(num)==2 && Integer.parseInt(nu)==2){
frame2.est.setText("\n\n
CC=(C)(C)CC ");
}else{
if(Integer.parseInt(num)==2 && Integer.parseInt(nu)==3 || Integer.parseInt(num)==3 &&
Integer.parseInt(nu)==2){
frame2.est.setText("\n\n
CC=(C)C(C)C ");
}else{
frame2.est.setText("\n\n
CC=C(C)(C)C ");
}
}
}else{
if(Integer.parseInt(nume)==3){
if(Integer.parseInt(num)==2 && Integer.parseInt(nu)==2){
frame2.est.setText("\n\n
CC(C)(C)C=C ");
}else{
if(Integer.parseInt(num)==2 && Integer.parseInt(nu)==3 || Integer.parseInt(num)==3 &&
Integer.parseInt(nu)==2){
frame2.est.setText("\n\n
CC(C)C=(C)C ");
}else{
frame2.est.setText("\n\n
CCC=(C)(C)C ");
}
}
}
}
}
}
}
}
}
:}
| numero:num numero:nu numero:numer TRIMETIL numero:nume BUT dupla:en hidrocarboneto: hi {:
if(Integer.parseInt(num) == 1 || Integer.parseInt(nu) == 1 || Integer.parseInt(numer) == 1){
frame2.saida.setFont(new Font("Arial", Font.PLAIN, 15));
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Erro na posiç~
ao da ramificaç~
ao TRIMETIL.\n Se colocar a ramificaç~
ao na
posiç~
ao 1, seguindo a regra da cadeia,\n tornará um pent n~
ao mais o prefixo but");
}else{
87
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
if(Integer.parseInt(num) == 4 || Integer.parseInt(nu) == 4 || Integer.parseInt(numer) == 4){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Erro na posiç~
ao da ramificaç~
ao TRIMETIL.\n Se colocar a ramificaç~
ao
na posiç~
ao 4, seguindo a regra da cadeia,\n tornará um pent n~
ao mais o prefixo but");
}else{
if(Integer.parseInt(num) > 4 || Integer.parseInt(nu) > 4 || Integer.parseInt(nume) > 4 ||
Integer.parseInt(numer) > 4){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Numero da posiç~
ao esta incorreto.\n Com o prefixo BUT so podemos
ter 4 carbonos na cadeia principal");
}else{
if(Integer.parseInt(nume)==4){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Nome incorreto.\n N~
ao é possivel colocar a ligaç~
ao neste carbono.");
}else{
if(Integer.parseInt(num)==2 && Integer.parseInt(nu)==2 && Integer.parseInt(numer)==2 ||
Integer.parseInt(num)==3 && Integer.parseInt(nu)==3 && Integer.parseInt(numer)==3){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Atenç~
ao, as tr^
es posiç~
oes da ramificaç~
ao trimetil\n n~
ao podem
ter o mesmo numero");
}else{
frame2.saida.setForeground(Color.BLUE);
frame2.saida.setText(" Nome correto.\n\n Esta subst^
ancia é um Alceno\n Possuindo 4
carbonos na cadeia principal (but),\n ligaç~
ao dupla ("+en+") na posiç~
ao ("+nume+"),\n
ramificaç~
ao trimetil na posiç~
ao ("+num+","+nu+","+numer+") e \n pertencendo ao grupo
hidrocarboneto ("+hi+")");
if(Integer.parseInt(nume)==1){
if(Integer.parseInt(num)==2 && Integer.parseInt(nu)==2 && Integer.parseInt(numer)==3
|| Integer.parseInt(num)==3 && Integer.parseInt(nu)==2 && Integer.parseInt(numer)==2 ||
Integer.parseInt(num)==2 && Integer.parseInt(nu)==3 && Integer.parseInt(numer)==2){
frame2.est.setText("\n\n
C=C(C)(C)C(C)C ");
}else{
frame2.est.setText("\n\n
C=C(C)C(C)(C)C ");
}
}else{
if(Integer.parseInt(nume)==2){
if(Integer.parseInt(num)==2 && Integer.parseInt(nu)==2 && Integer.parseInt(numer)==3 ||
Integer.parseInt(num)==3 && Integer.parseInt(nu)==2 && Integer.parseInt(numer)==2 ||
Integer.parseInt(num)==2 && Integer.parseInt(nu)==3 && Integer.parseInt(numer)==2){
frame2.est.setText("\n\n
CC=(C)(C)C(C)C ");
}else{
frame2.est.setText("\n\n
CC=(C)C(C)(C)C ");
}
}else{
if(Integer.parseInt(nume)==3){
if(Integer.parseInt(num)==2 && Integer.parseInt(nu)==2 && Integer.parseInt(numer)==3 ||
Integer.parseInt(num)==3 && Integer.parseInt(nu)==2 && Integer.parseInt(numer)==2 ||
Integer.parseInt(num)==2 && Integer.parseInt(nu)==3 && Integer.parseInt(numer)==2){
frame2.est.setText("\n\n
CC(C)(C)C=(C)C ");
}else{
frame2.est.setText("\n\n
CC(C)C=(C)(C)C ");
}
}
}
}
}
721
}
722
}
723
}
724
725
726
727
}
:}
;
728
729
/* ************* Alcino ************** */
730
731
732
733
734
735
736
737
alcino ::= alcinoEt: ae
{: RESULT = ae; :}
| alcinoProp: ap
{: RESULT = ap; :}
| alcinoBut : ab
{: RESULT = ab; :}
;
738
88
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
alcinoEt ::= numero:num ET tripla:en hidrocarboneto: hi {:
if(Integer.parseInt(num) > 2){
frame2.saida.setFont(new Font("Arial", Font.PLAIN, 15));
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Numero da posiç~
ao da ligaç~
ao esta incorreto.\n
Com o prefixo ET so podemos ter 2\n carbonos na cadeia principal");
}else{
if(Integer.parseInt(num)==2){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Nome incorreto.\n N~
ao é possivel colocar a ligaç~
ao neste carbono.");
}else{
frame2.saida.setForeground(Color.BLUE);
frame2.saida.setText(" Nome correto.\n \n Esta subst^
ancia é um Alcino \n Possuindo 2
carbonos na cadeia principal (et), \n ligaç~
ao tripla ("+en+") na posiç~
ao ("+num+") e \n
pertencendo ao grupo hidrocarboneto ("+hi+")");
frame2.est.setText("\n \n
C#C ");
}
}
:}
| numero:nu MET tripla:en hidrocarboneto:hi {:
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Nome incorreto.\n\n N~
ao podemos utilizar o prefixo MET,\n pois com
o hidrocarboneto alcino temos\n que ter um carbono se ligando ao outro\n com uma tripla ligaç~
ao.");
:}
| numero:nu METIL numero:num MET tripla:en hidrocarboneto:hi {:
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Nome incorreto.\n\n N~
ao podemos ter ramificaç~
oes com o prefixo MET,
\n pois n~
ao será mais um met e\n sim outro prefixo maior que 1 carbono.");
:}
| numero:nu METIL numero:num ET tripla:en hidrocarboneto:hi {:
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Nome incorreto.\n\n N~
ao podemos ter ramificaç~
oes com o prefixo ET,
\n pois n~
ao será mais um et e\n sim outro prefixo maior que 2 carbonos.");
:}
;
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
alcinoProp ::= numero:nume PROP tripla:en hidrocarboneto:hi {:
if(Integer.parseInt(nume) > 3){
frame2.saida.setFont(new Font("Arial", Font.PLAIN, 15));
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Numero da posiç~
ao da ligaç~
ao esta incorreto.\n Com o prefixo PROP
so podemos ter 3 carbonos na cadeia principal");
}else{
if(Integer.parseInt(nume)==3){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Nome incorreto.\n N~
ao é possivel colocar a ligaç~
ao neste carbono.");
}else{
frame2.saida.setForeground(Color.BLUE);
frame2.saida.setText(" Nome correto.\n\n Esta subst^
ancia é um Alcino\n Possuindo 3
carbonos na cadeia principal (prop),\n ligaç~
ao tripla ("+en+") na posiç~
ao ("+nume+") e \n
pertencendo ao grupo hidrocarboneto ("+hi+")");
if(Integer.parseInt(nume)==1){
frame2.est.setText("\n\n
C#CC ");
}else{
frame2.est.setText("\n\n
CC#C ");
}
}
}
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
:}
| numero:num METIL numero: nume PROP tripla:en hidrocarboneto:hi {:
if(Integer.parseInt(num) == 1){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Erro na posiç~
ao da ramificaç~
ao METIL.\n Se colocar a ramificaç~
ao
na posiç~
ao 1, seguindo a regra da cadeia,\n tornará um but n~
ao mais o prefixo prop");
}else{
if(Integer.parseInt(num) == 3){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Erro na posiç~
ao da ramificaç~
ao METIL.\n Se colocar a ramificaç~
ao
na posiç~
ao 3, seguindo a regra da cadeia,\n tornará um but n~
ao mais o prefixo prop");
}else{
if(Integer.parseInt(num) > 3 || Integer.parseInt(nume) > 3){
frame2.saida.setForeground(Color.RED);
89
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
frame2.saida.setText(" Numero da posiç~
ao esta incorreto.\n Com o prefixo PROP so
podemos ter 3\n carbonos na cadeia principal");
}else{
if(Integer.parseInt(nume)==3){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Nome incorreto.\n N~
ao é possivel colocar a ligaç~
ao neste carbono.");
}else{
frame2.saida.setForeground(Color.BLUE);
frame2.saida.setText(" Nome correto.\n\n Esta subst^
ancia é um Alcino\n Possuindo 3
carbonos na cadeia principal (prop),\n ligaç~
ao tripla ("+en+") na posiç~
ao ("+nume+"),
\n uma ramificaç~
ao metil na posiç~
ao: ("+num+") e \n pertencendo ao grupo hidrocarboneto ("+hi+")");
if(Integer.parseInt(nume)==1){
frame2.est.setText("\n\n
C#C(C)C ");
}else{
frame2.est.setText("\n\n
CC#(C)C ");
}
}
}
}
}
:}
| numero:num numero:numer DIMETIL numero:nume PROP tripla:en hidrocarboneto: hi {:
if(Integer.parseInt(num) == 1 || Integer.parseInt(numer) == 1){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Erro na posiç~
ao da ramificaç~
ao DIMETIL.\n Se colocar a ramificaç~
ao na
posiç~
ao 1, seguindo a regra da cadeia,\n tornará um but n~
ao mais o prefixo prop");
}else{
if(Integer.parseInt(num) == 3 || Integer.parseInt(numer) == 3){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Erro na posiç~
ao da ramificaç~
ao DIMETIL.\n Se colocar a ramificaç~
ao
na posiç~
ao 3, seguindo a regra da cadeia,\n tornará um but n~
ao mais o prefixo prop");
}else{
if(Integer.parseInt(num) > 3 || Integer.parseInt(numer) > 3 || Integer.parseInt(nume) > 3){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Numero da posiç~
ao esta incorreto.\n Com o prefixo PROP so podemos
ter 3\n carbonos na cadeia principal");
}else{
if(Integer.parseInt(nume)==3){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Nome incorreto.\n N~
ao é possivel colocar a ligaç~
ao neste carbono.");
}else{
frame2.saida.setForeground(Color.BLUE);
frame2.saida.setText(" Nome correto.\n\n Esta subst^
ancia é um Alcino\n Possuindo 3
carbonos na cadeia principal (prop),\n ligaç~
ao tripla ("+en+") na posiç~
ao ("+nume+"),
\n ramificaç~
ao dimetil na posiç~
ao: ("+num+","+numer+") e \n pertencendo ao grupo hidrocarboneto
("+hi+")");
if(Integer.parseInt(nume)==1){
frame2.est.setText("\n\n
C#C(C)(C)C ");
}else{
frame2.est.setText("\n\n
CC#(C)(C)C ");
}
}
}
}
}
:}
| numero:num numero:nu numero:ero TRIMETIL numero:ro PROP tripla:en hidrocarboneto: hi {:
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Nome incorreto.\n\n N~
ao podemos ter ramificaç~
ao TRIMETIL com
o prefixo PROP,\n pois n~
ao será mais um prop e\n sim outro prefixo maior que 3 carbonos.");
:}
;
875
876
877
878
879
880
881
882
883
884
885
886
alcinoBut ::= numero:nume BUT tripla:en hidrocarboneto:hi {:
if(Integer.parseInt(nume) > 4){
frame2.saida.setFont(new Font("Arial", Font.PLAIN, 15));
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Numero da posiç~
ao da ligacao esta incorreto.\n Com o prefixo BUT so
podemos ter 4 carbonos na cadeia principal");
}else{
if(Integer.parseInt(nume)==4){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Nome incorreto.\n N~
ao é possivel colocar a ligaç~
ao neste carbono.");
90
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
}else{
frame2.saida.setForeground(Color.BLUE);
frame2.saida.setText(" Nome correto.\n\n Esta subst^
ancia é um Alcino\n Possuindo 4
carbonos na cadeia principal (but),\n ligaç~
ao tripla ("+en+") na posiç~
ao ("+nume+") e \n
pertencendo ao grupo hidrocarboneto ("+hi+")");
if(Integer.parseInt(nume)==1){
frame2.est.setText("\n\n
C#CCC ");
}else{
if(Integer.parseInt(nume)==2){
frame2.est.setText("\n\n
CC#CC ");
}else{
frame2.est.setText("\n\n
CCC#C ");
}
}
}
}
:}
| numero:num METIL numero:nume BUT tripla:en hidrocarboneto:hi {:
if(Integer.parseInt(num) == 1){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Erro na posiç~
ao da ramificaç~
ao METIL.\n Se colocar a ramificaç~
ao
na posiç~
ao 1, seguindo a regra da cadeia,\n tornará um pent n~
ao mais o prefixo but");
}else{
if(Integer.parseInt(num) == 4){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Erro na posiç~
ao da ramificaç~
ao METIL.\n Se colocar a ramificaç~
ao
na posiç~
ao 4, seguindo a regra da cadeia,\n tornará um pent n~
ao mais o prefixo but");
}else{
if(Integer.parseInt(num) > 4 || Integer.parseInt(nume) > 4){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Numero da posiç~
ao esta incorreto.\n Com o prefixo BUT so podemos
ter 4\n carbonos na cadeia principal");
}else{
if(Integer.parseInt(nume)==4){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Nome incorreto.\n N~
ao é possivel colocar a ligaç~
ao neste carbono.");
}else{
frame2.saida.setForeground(Color.BLUE);
frame2.saida.setText(" Nome correto.\n\n Esta subst^
ancia é um Alcino\n Possuindo 4
carbonos na cadeia principal (but),\n ligaç~
ao tripla ("+en+") na posiç~
ao ("+nume+"),\n
uma ramificaç~
ao metil na posiç~
ao: ("+num+") e \n pertencendo ao grupo hidrocarboneto ("+hi+")");
if(Integer.parseInt(nume)==1 && Integer.parseInt(num)==2){
frame2.est.setText("\n\n
C#C(C)CC ");
}else{
if(Integer.parseInt(nume)==1 && Integer.parseInt(num)==3){
frame2.est.setText("\n\n
C#CC(C)C ");
}else{
if(Integer.parseInt(nume)==2 && Integer.parseInt(num)==2){
frame2.est.setText("\n\n
CC#(C)CC ");
}else{
if(Integer.parseInt(nume)==2 && Integer.parseInt(num)==3){
frame2.est.setText("\n\n
CC#C(C)C ");
}else{
if(Integer.parseInt(nume)==3 && Integer.parseInt(num)==2){
frame2.est.setText("\n\n
CC#C(C)C ");
}else{
frame2.est.setText("\n\n
CCC#(C)C ");
}
}
}
}
}
}
}
}
}
:}
954
955
956
957
958
959
960
| numero:num numero:nu DIMETIL numero:nume BUT tripla:en hidrocarboneto: hi {:
if(Integer.parseInt(num) == 1 || Integer.parseInt(nu) == 1){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Erro na posiç~
ao da ramificaç~
ao DIMETIL.\n Se colocar a ramificaç~
ao
na posiç~
ao 1, seguindo a regra da cadeia,\n tornará um pent n~
ao mais o prefixo but");
}else{
91
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
if(Integer.parseInt(num) == 4 || Integer.parseInt(nu) == 4 ){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Erro na posiç~
ao da ramificaç~
ao DIMETIL.\n Se colocar a ramificaç~
ao
na posiç~
ao 4, seguindo a regra da cadeia,\n tornará um pent n~
ao mais o prefixo but");
}else{
if(Integer.parseInt(num) > 4 || Integer.parseInt(nu) > 4 || Integer.parseInt(nume) > 4){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Numero da posiç~
ao esta incorreto.\n Com o prefixo BUT so podemos
ter 4\n carbonos na cadeia principal");
}else{
if(Integer.parseInt(nume)==4){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Nome incorreto.\n N~
ao é possivel colocar a ligaç~
ao neste carbono.");
}else{
frame2.saida.setForeground(Color.BLUE);
frame2.saida.setText(" Nome correto.\n\n Esta subst^
ancia é um Alcino\n Possuindo 4
carbonos na cadeia principal (but),\n ligaç~
ao tripla ("+en+") na posiç~
ao ("+nume+"),
\n ramificaç~
ao dimetil na posiç~
ao ("+num+","+nu+") e \n pertencendo ao grupo hidrocarboneto ("+hi+")");
if(Integer.parseInt(nume)==1){
if(Integer.parseInt(num)==2 && Integer.parseInt(nu)==2){
frame2.est.setText("\n\n
C#C(C)(C)CC ");
}else{
if(Integer.parseInt(num)==2 && Integer.parseInt(nu)==3 || Integer.parseInt(num)==3
&& Integer.parseInt(nu)==2){
frame2.est.setText("\n\n
C#C(C)C(C)C ");
}else{
frame2.est.setText("\n\n
C#CC(C)(C)C ");
}
}
}else{
if(Integer.parseInt(nume)==2){
if(Integer.parseInt(num)==2 && Integer.parseInt(nu)==2){
frame2.est.setText("\n\n
CC#(C)(C)CC ");
}else{
if(Integer.parseInt(num)==2 && Integer.parseInt(nu)==3 || Integer.parseInt(num)==3 &&
Integer.parseInt(nu)==2){
frame2.est.setText("\n\n
CC#(C)C(C)C ");
}else{
frame2.est.setText("\n\n
CC#C(C)(C)C ");
}
}
}else{
if(Integer.parseInt(nume)==3){
if(Integer.parseInt(num)==2 && Integer.parseInt(nu)==2){
frame2.est.setText("\n\n
CC(C)(C)C#C ");
}else{
if(Integer.parseInt(num)==2 && Integer.parseInt(nu)==3 || Integer.parseInt(num)==3 &&
Integer.parseInt(nu)==2){
frame2.est.setText("\n\n
CC(C)C#(C)C ");
}else{
frame2.est.setText("\n\n
CCC#(C)(C)C ");
}
}
}
}
}
}
}
}
}
:}
| numero:num numero:nu numero:numer TRIMETIL numero:nume BUT tripla:en hidrocarboneto: hi {:
if(Integer.parseInt(num) == 1 || Integer.parseInt(nu) == 1 || Integer.parseInt(numer) == 1){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Erro na posiç~
ao da ramificaç~
ao TRIMETIL.\n Se colocar a ramificaç~
ao
na posiç~
ao 1, seguindo a regra da cadeia,\n tornará um pent n~
ao mais o prefixo but");
}else{
if(Integer.parseInt(num) == 4 || Integer.parseInt(nu) == 4 || Integer.parseInt(numer) == 4){
frame2.saida.setText(" Erro na posiç~
ao da ramificaç~
ao TRIMETIL.\n Se colocar a ramificaç~
ao
na posiç~
ao 4, seguindo a regra da cadeia,\n tornará um pent n~
ao mais o prefixo but");
}else{
if(Integer.parseInt(num) > 4 || Integer.parseInt(nu) > 4 || Integer.parseInt(nume) > 4 ||
Integer.parseInt(numer) > 4){
frame2.saida.setText(" Numero da posiç~
ao esta incorreto.\n Com o prefixo BUT so podemos
92
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
ter 4\n carbonos na cadeia principal");
}else{
if(Integer.parseInt(nume)==4){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Nome incorreto.\n N~
ao é possivel colocar a ligaç~
ao neste carbono.");
}else{
if(Integer.parseInt(num)==2 && Integer.parseInt(nu)==2 && Integer.parseInt(numer)==2 ||
Integer.parseInt(num)==3 && Integer.parseInt(nu)==3 && Integer.parseInt(numer)==3){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Atenç~
ao, as tr^
es posiç~
oes da ramificaç~
ao trimetil\n n~
ao
podem ter o mesmo numero");
}else{
frame2.saida.setForeground(Color.BLUE);
frame2.saida.setText(" Nome correto.\n\n Esta subst^
ancia é um Alcino\n Possuindo 4
carbonos na cadeia principal (but),\n ligaç~
ao tripla ("+en+") na posiç~
ao ("+nume+"),\n
ramificaç~
ao trimetil na posiç~
ao ("+num+","+nu+","+numer+") e \n pertencendo ao grupo
hidrocarboneto ("+hi+")");
if(Integer.parseInt(nume)==1){
if(Integer.parseInt(num)==2 && Integer.parseInt(nu)==2 && Integer.parseInt(numer)==3 ||
Integer.parseInt(num)==3 && Integer.parseInt(nu)==2 && Integer.parseInt(numer)==2 ||
Integer.parseInt(num)==2 && Integer.parseInt(nu)==3 && Integer.parseInt(numer)==2){
frame2.est.setText("\n\n
C#C(C)(C)C(C)C ");
}else{
frame2.est.setText("\n\n
C#C(C)C(C)(C)C ");
}
}else{
if(Integer.parseInt(nume)==2){
if(Integer.parseInt(num)==2 && Integer.parseInt(nu)==2 && Integer.parseInt(numer)==3 ||
Integer.parseInt(num)==3 && Integer.parseInt(nu)==2 && Integer.parseInt(numer)==2 ||
Integer.parseInt(num)==2 && Integer.parseInt(nu)==3 && Integer.parseInt(numer)==2){
frame2.est.setText("\n\n
CC#(C)(C)C(C)C ");
}else{
frame2.est.setText("\n\n
CC#(C)C(C)(C)C ");
}
}else{
if(Integer.parseInt(nume)==3){
if(Integer.parseInt(num)==2 && Integer.parseInt(nu)==2 && Integer.parseInt(numer)==3 ||
Integer.parseInt(num)==3 && Integer.parseInt(nu)==2 && Integer.parseInt(numer)==2 ||
Integer.parseInt(num)==2 && Integer.parseInt(nu)==3 && Integer.parseInt(numer)==2){
frame2.est.setText("\n\n
CC(C)(C)C#(C)C ");
}else{
frame2.est.setText("\n\n
CC(C)C#(C)(C)C ");
}
}
}
}
1081
}
1082
}
1083
}
1084
}
1085
}
1086
1087
1088
:}
;
1089
1090
/* ************* Alcadieno ************** */
1091
1092
1093
1094
1095
1096
1097
1098
alcadieno ::= alcadienoMet: alm
{: RESULT = alm; :}
|alcadienoProp: ap
{: RESULT = ap; :}
| alcadienoBut : ab
{: RESULT = ab; :}
;
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
alcadienoMet ::= numero:nu numero:ro MET dduplas:en hidrocarboneto:hi {:
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Nome incorreto.\n\n N~
ao podemos utilizar o prefixo MET,\n
pois com o hidrocarboneto alcadieno temos\n que ter duas duplas ligaç~
oes entre os carbonos.");
:}
| numero:nu METIL numero:num numero:ro MET dduplas:en hidrocarboneto:hi {:
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Nome incorreto.\n\n N~
ao podemos ter ramificaç~
oes com o prefixo MET,\n
pois n~
ao será mais um met e\n sim outro prefixo maior que 1 carbono.");
93
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
:}
| numero:nu METIL numero:num numero:ro ET dduplas:en hidrocarboneto:hi {:
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Nome incorreto.\n\n N~
ao podemos ter ramificaç~
oes com o prefixo ET,\n
pois n~
ao será mais um et e\n sim outro prefixo maior que 2 carbonos.");
:}
|numero:nu numero:ro ET dduplas:en hidrocarboneto:hi {:
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Nome incorreto.\n\n N~
ao podemos utilizar o prefixo ET,\n
pois com o hidrocarboneto alcadieno temos\n que ter duas duplas ligaç~
oes entre os carbonos.");
:}
;
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
alcadienoProp ::= numero:ero numero:ro PROP dduplas:en hidrocarboneto:hi {:
if(Integer.parseInt(ero) > 3 || Integer.parseInt(ro) > 3){
frame2.saida.setFont(new Font("Arial", Font.PLAIN, 15));
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Numero da posiç~
ao da ligaç~
ao esta incorreto.\n Com o prefixo PROP
so podemos ter 3\n carbonos na cadeia principal");
}else{
if(Integer.parseInt(ero)==3 || Integer.parseInt(ro)==3){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Nome incorreto.\n N~
ao é possivel colocar a ligaç~
ao neste carbono.");
}else{
if(Integer.parseInt(ero)==1 && Integer.parseInt(ro)==1){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Nome incorreto.\n N~
ao é possivel colocar as duas ligaç~
oes neste carbono.");
}else{
if(Integer.parseInt(ero)==2 && Integer.parseInt(ro)==2){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Nome incorreto.\n N~
ao é possivel colocar as duas\n ligaç~
oes neste carbono.");
}else{
frame2.saida.setForeground(Color.BLUE);
frame2.saida.setText(" Nome correto.\n\n Esta subst^
ancia é um Alcadieno\n Possuindo 3
carbonos na cadeia principal (prop),\n duas duplas ligaç~
oes ("+en+") na posiç~
ao ("+ero+","+ro+")
e \n pertencendo ao grupo hidrocarboneto ("+hi+")");
frame2.est.setText("\n\n
C=C=C ");
}
}
}
}
:}
| numero:num METIL numero:ero numero:ro PROP dduplas:en hidrocarboneto:hi {:
if(Integer.parseInt(num) == 1){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Erro na posiç~
ao da ramificaç~
ao METIL.\n Se colocar a ramificaç~
ao
na posiç~
ao 1, seguindo a regra da cadeia,\n tornará um but n~
ao mais o prefixo prop");
}else{
if(Integer.parseInt(num) == 3){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Erro na posiç~
ao da ramificaç~
ao METIL.\n Se colocar a ramificaç~
ao
na posiç~
ao 3, seguindo a regra da cadeia,\n tornará um but n~
ao mais o prefixo prop");
}else{
if(Integer.parseInt(num) > 3 || Integer.parseInt(ero) > 3 || Integer.parseInt(ro) > 3){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Numero da posiç~
ao esta incorreto.\n Com o prefixo PROP so podemos
ter 3\n carbonos na cadeia principal");
}else{
if(Integer.parseInt(ero)==3 || Integer.parseInt(ro)==3){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Nome incorreto.\n N~
ao é possivel colocar a ligaç~
ao neste carbono.");
}else{
if(Integer.parseInt(ero)==1 && Integer.parseInt(ro)==1){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Nome incorreto.\n N~
ao é possivel colocar as duas ligaç~
oes neste carbono.");
}else{
if(Integer.parseInt(ero)==2 && Integer.parseInt(ro)==2){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Nome incorreto.\n N~
ao é possivel colocar as duas\n ligaç~
oes neste carbono.");
}else{
frame2.saida.setForeground(Color.BLUE);
frame2.saida.setText(" Nome correto.\n\n Esta subst^
ancia é um Alcadieno\n Possuindo 3
carbonos na cadeia principal (prop),\n duas duplas ligaç~
oes ("+en+") na posiç~
ao ("+ero+","+ro+"),
94
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
\n uma ramificaç~
ao metil na posiç~
ao: ("+num+") e \n pertencendo ao grupo hidrocarboneto ("+hi+")");
frame2.est.setText("\n\n
C=C=(C)C ");
}
}
}
}
}
}
:}
| numero:num numero:numer DIMETIL numero:ero numero:ro PROP dduplas:en hidrocarboneto: hi {:
if(Integer.parseInt(num) == 1 || Integer.parseInt(numer) == 1){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Erro na posiç~
ao da ramificaç~
ao DIMETIL.\n Se colocar a ramificaç~
ao
na posiç~
ao 1, seguindo a regra da cadeia,\n tornará um but n~
ao mais o prefixo prop");
}else{
if(Integer.parseInt(num) == 3 || Integer.parseInt(numer) == 3){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Erro na posiç~
ao da ramificaç~
ao DIMETIL.\n Se colocar a ramificaç~
ao
na posiç~
ao 3, seguindo a regra da cadeia,\n tornará um but n~
ao mais o prefixo prop");
}else{
if(Integer.parseInt(num) > 3 || Integer.parseInt(numer) > 3 || Integer.parseInt(ero) > 3 ||
Integer.parseInt(ro) > 3){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Numero da posiç~
ao esta incorreto.\n Com o prefixo PROP so podemos ter
3\n carbonos na cadeia principal");
}else{
if(Integer.parseInt(num)==3 || Integer.parseInt(numer)==3){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Nome incorreto.\n N~
ao é possivel colocar a ligaç~
ao neste carbono.");
}else{
if(Integer.parseInt(ero)==1 && Integer.parseInt(ro)==1){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Nome incorreto.\n N~
ao é possivel colocar as duas ligaç~
oes neste carbono.");
}else{
if(Integer.parseInt(ero)==2 && Integer.parseInt(ro)==2){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Nome incorreto.\n N~
ao é possivel colocar as duas\n ligaç~
oes neste carbono.");
}else{
frame2.saida.setForeground(Color.BLUE);
frame2.saida.setText(" Nome correto.\n\n Esta subst^
ancia é um Alcadieno\n Possuindo 3
carbonos na cadeia principal (prop),\n duas duplas ligaç~
oes ("+en+") na posiç~
ao ("+ero+","+ro+"),
\n ramificaç~
ao dimetil na posiç~
ao ("+num+","+numer+") e \n pertencendo ao grupo hidrocarboneto ("+hi+")");
frame2.est.setText("\n\n
C=C=(C)(C)C ");
}
}
}
}
}
}
:}
| numero:num numero:nu numero:ero TRIMETIL numero:ro numero:roo PROP dduplas:en hidrocarboneto: hi {:
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Nome incorreto.\n\n N~
ao podemos ter ramificaç~
ao TRIMETIL com o prefixo
PROP,\n pois n~
ao será mais um prop e\n sim outro prefixo maior que 3 carbonos.");
:}
;
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
alcadienoBut ::= numero:ero numero:ro BUT dduplas:en hidrocarboneto:hi {:
if(Integer.parseInt(ero) > 4 || Integer.parseInt(ro) > 4){
frame2.saida.setFont(new Font("Arial", Font.PLAIN, 15));
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Numero da posiç~
ao da ligaç~
ao esta incorreto.\n Com o prefixo BUT
so podemos ter 4\n carbonos na cadeia principal");
}else{
if(Integer.parseInt(ero)==4 || Integer.parseInt(ro)==4){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Nome incorreto.\n N~
ao é possivel colocar a ligaç~
ao neste carbono.");
}else{
if(Integer.parseInt(ero)==1 && Integer.parseInt(ro)==1){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Nome incorreto.\n N~
ao é possivel colocar as duas ligaç~
oes neste carbono.");
}else{
if(Integer.parseInt(ero)==2 && Integer.parseInt(ro)==2){
frame2.saida.setForeground(Color.RED);
95
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
frame2.saida.setText(" Nome incorreto.\n N~
ao é possivel colocar as duas\n ligaç~
oes neste carbono.");
}else{
if(Integer.parseInt(ero)==3 && Integer.parseInt(ro)==3){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Nome incorreto.\n N~
ao é possivel colocar as duas ligaç~
oes neste carbono.");
}else{
frame2.saida.setForeground(Color.BLUE);
frame2.saida.setText(" Nome correto.\n\n Esta subst^
ancia é um Alcadieno\n Possuindo 4
carbonos na cadeia principal (but),\n duas duplas ligaç~
oes ("+en+") na posiç~
ao ("+ero+","+ro+") e
\n pertencendo ao grupo hidrocarboneto ("+hi+")");
if(Integer.parseInt(ero)==1 && Integer.parseInt(ro)==2 ||Integer.parseInt(ero)==2 &&
Integer.parseInt(ro)==1){
frame2.est.setText("\n\n
C=C=CC ");
}else{
if(Integer.parseInt(ero)==1 && Integer.parseInt(ro)==3 ||Integer.parseInt(ero)==3 &&
Integer.parseInt(ro)==1){
frame2.est.setText("\n\n
C=CC=C ");
}else{
frame2.est.setText("\n\n
CC=C=C ");
}
}
}
}
}
}
}
:}
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
| numero:num METIL numero:ero numero:ro BUT dduplas:en hidrocarboneto:hi {:
if(Integer.parseInt(num) == 1){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Erro na posiç~
ao da ramificaç~
ao METIL.\n Se colocar a ramificaç~
ao na
posiç~
ao 1, seguindo a regra da cadeia,\n tornará um pent n~
ao mais o prefixo but");
}else{
if(Integer.parseInt(num) == 4){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Erro na posiç~
ao da ramificaç~
ao METIL.\n Se colocar a ramificaç~
ao
na posiç~
ao 4, seguindo a regra da cadeia,\n tornará um pent n~
ao mais o prefixo but");
}else{
if(Integer.parseInt(num) > 4 || Integer.parseInt(ero) > 4 || Integer.parseInt(ro) > 4){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Numero da posiç~
ao esta incorreto.\n Com o prefixo BUT so podemos
ter 4\n carbonos na cadeia principal");
}else{
if(Integer.parseInt(ero)==4 || Integer.parseInt(ro)==4){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Nome incorreto.\n N~
ao é possivel colocar a ligaç~
ao neste carbono.");
}else{
if(Integer.parseInt(ero)==1 && Integer.parseInt(ro)==1){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Nome incorreto.\n N~
ao é possivel colocar as duas ligaç~
oes neste carbono.");
}else{
if(Integer.parseInt(ero)==2 && Integer.parseInt(ro)==2){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Nome incorreto.\n N~
ao é possivel colocar as duas ligaç~
oes neste carbono.");
}else{
if(Integer.parseInt(ero)==3 && Integer.parseInt(ro)==3){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Nome incorreto.\n N~
ao é possivel colocar as duas\n ligaç~
oes neste carbono.");
}else{
frame2.saida.setForeground(Color.BLUE);
frame2.saida.setText(" Nome correto.\n\n Esta subst^
ancia é um Alcadieno\n Possuindo 4
carbonos na cadeia principal (but),\n duas duplas ligaç~
oes ("+en+") na posiç~
ao ("+ero+","+ro+"),
\n uma ramificaç~
ao metil na posiç~
ao ("+num+") e \n pertencendo ao grupo hidrocarboneto ("+hi+")");
if(Integer.parseInt(num) == 2){
if(Integer.parseInt(ero)==1 && Integer.parseInt(ro)==2 ||Integer.parseInt(ero)==2 &&
Integer.parseInt(ro)==1){
frame2.est.setText("\n\n
C=C=(C)CC ");
}else{
if(Integer.parseInt(ero)==1 && Integer.parseInt(ro)==3 ||Integer.parseInt(ero)==3 &&
Integer.parseInt(ro)==1){
frame2.est.setText("\n\n
C=C(C)C=C ");
}else{
frame2.est.setText("\n\n
CC=(C)C=C ");
96
}
1331
}
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
}else{
if(Integer.parseInt(num) == 3){
if(Integer.parseInt(ero)==1 && Integer.parseInt(ro)==2 ||Integer.parseInt(ero)==2 &&
Integer.parseInt(ro)==1){
frame2.est.setText("\n\n
C=C=C(C)C ");
}else{
if(Integer.parseInt(ero)==1 && Integer.parseInt(ro)==3 ||Integer.parseInt(ero)==3 &&
Integer.parseInt(ro)==1){
frame2.est.setText("\n\n
C=CC=(C)C ");
}else{
frame2.est.setText("\n\n
CC=C=(C)C ");
}
1344
}
1345
}
1346
}
1347
}
1348
}
1349
}
1350
}
1351
}
1352
}
1353
1354
1355
}
:}
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
|numero:num numero:nu DIMETIL numero:ero numero:ro BUT dduplas:en hidrocarboneto: hi {:
if(Integer.parseInt(num) == 1 || Integer.parseInt(nu) == 1){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Erro na posiç~
ao da ramificaç~
ao DIMETIL.\n Se colocar a ramificaç~
ao
na posiç~
ao 1, seguindo a regra da cadeia,\n tornará um pent n~
ao mais o prefixo but");
}else{
if(Integer.parseInt(num) == 4 || Integer.parseInt(nu) == 4 ){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Erro na posiç~
ao da ramificaç~
ao DIMETIL.\n Se colocar a ramificaç~
ao
na posiç~
ao 4, seguindo a regra da cadeia,\n tornará um pent n~
ao mais o prefixo but");
}else{
if(Integer.parseInt(num) > 4 || Integer.parseInt(nu) > 4 || Integer.parseInt(ero) > 4 ||
Integer.parseInt(ro) > 4){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Numero da posiç~
ao esta incorreto.\n Com o prefixo BUT
so podemos ter 4\n carbonos na cadeia principal");
}else{
if(Integer.parseInt(ero)==4 || Integer.parseInt(ro)==4){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Nome incorreto.\n N~
ao é possivel colocar a ligaç~
ao neste carbono.");
}else{
if(Integer.parseInt(ero)==1 && Integer.parseInt(ro)==1){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Nome incorreto.\n N~
ao é possivel colocar as duas ligaç~
oes neste carbono.");
}else{
if(Integer.parseInt(ero)==2 && Integer.parseInt(ro)==2){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Nome incorreto.\n N~
ao é possivel colocar as duas ligaç~
oes neste carbono.");
}else{
if(Integer.parseInt(ero)==3 && Integer.parseInt(ro)==3){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Nome incorreto.\n N~
ao é possivel colocar as duas ligaç~
oes neste carbono.");
}else{
frame2.saida.setForeground(Color.BLUE);
frame2.saida.setText(" Nome correto.\n\n Esta subst^
ancia é um Alcadieno\n Possuindo 4
carbonos na cadeia principal (but),\n duas duplas ligaç~
oes ("+en+") na posiç~
ao ("+ero+","+ro+"),
\n ramificaç~
ao dimetil na posiç~
ao ("+num+","+nu+") e \n pertencendo ao grupo hidrocarboneto ("+hi+")");
if(Integer.parseInt(num) == 2 && Integer.parseInt(nu) == 2){
if(Integer.parseInt(ero)==1 && Integer.parseInt(ro)==2 ||Integer.parseInt(ero)==2 &&
Integer.parseInt(ro)==1){
frame2.est.setText("\n\n
C=C=(C)(C)CC ");
}else{
if(Integer.parseInt(ero)==1 && Integer.parseInt(ro)==3 ||Integer.parseInt(ero)==3 &&
Integer.parseInt(ro)==1){
frame2.est.setText("\n\n
C=C(C)(C)C=C ");
}else{
frame2.est.setText("\n\n
CC=(C)(C)C=C ");
}
97
}
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
}else{
if(Integer.parseInt(num) ==
Integer.parseInt(nu) == 2){
if(Integer.parseInt(ero)==1
Integer.parseInt(ro)==1){
frame2.est.setText("\n\n
}else{
if(Integer.parseInt(ero)==1
Integer.parseInt(ro)==1){
frame2.est.setText("\n\n
}else{
frame2.est.setText("\n\n
}
}
}else{
if(Integer.parseInt(num) ==
if(Integer.parseInt(ero)==1
Integer.parseInt(ro)==1){
frame2.est.setText("\n\n
}else{
if(Integer.parseInt(ero)==1
Integer.parseInt(ro)==1){
frame2.est.setText("\n\n
}else{
frame2.est.setText("\n\n
2 && Integer.parseInt(nu) == 3 || Integer.parseInt(num) == 3 &&
&& Integer.parseInt(ro)==2 ||Integer.parseInt(ero)==2 &&
C=C=(C)C(C)C ");
&& Integer.parseInt(ro)==3 ||Integer.parseInt(ero)==3 &&
C=C(C)C=(C)C ");
CC=(C)C=(C)C ");
3 && Integer.parseInt(nu) == 3){
&& Integer.parseInt(ro)==2 ||Integer.parseInt(ero)==2 &&
C=C=C(C)(C)C ");
&& Integer.parseInt(ro)==3 ||Integer.parseInt(ero)==3 &&
C=CC=(C)(C)C ");
CC=C=(C)(C)C ");
}
1431
}
1432
}
1433
}
1434
}
1435
}
1436
}
1437
}
1438
}
1439
}
1440
}
1441
1442
}
1443
1444
:}
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
| numero:num numero:nu numero:numer TRIMETIL numero:ero numero:ro BUT dduplas:en hidrocarboneto: hi {:
if(Integer.parseInt(num) == 1 || Integer.parseInt(nu) == 1 || Integer.parseInt(numer) == 1){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Erro na posiç~
ao da ramificaç~
ao TRIMETIL.\n Se colocar a
ramificaç~
ao na posiç~
ao 1, seguindo a regra da cadeia,\n tornará um pent n~
ao mais o prefixo but");
}else{
if(Integer.parseInt(num) == 4 || Integer.parseInt(nu) == 4 || Integer.parseInt(numer) == 4){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Erro na posiç~
ao da ramificaç~
ao TRIMETIL.\n Se colocar a ramificaç~
ao
na posiç~
ao 4, seguindo a regra da cadeia,\n tornará um pent n~
ao mais o prefixo but");
}else{
if(Integer.parseInt(num) > 4 || Integer.parseInt(nu) > 4 || Integer.parseInt(ero) > 4 ||
Integer.parseInt(numer) > 4 || Integer.parseInt(ro) > 4 ){
frame2.saida.setForeground(Color.RED);frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Numero da posiç~
ao esta incorreto.\n Com o prefixo BUT so podemos ter
4 carbonos na cadeia principal");
}else{
if(Integer.parseInt(ero)==4 || Integer.parseInt(ro)==4){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Nome incorreto.\n N~
ao é possivel colocar a ligaç~
ao neste carbono.");
}else{
if(Integer.parseInt(ero)==1 && Integer.parseInt(ro)==1){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Nome incorreto.\n N~
ao é possivel colocar as duas ligaç~
oes neste carbono.");
}else{
if(Integer.parseInt(ero)==2 && Integer.parseInt(ro)==2){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Nome incorreto.\n N~
ao é possivel colocar as duas ligaç~
oes neste carbono.");
}else{
if(Integer.parseInt(ero)==3 && Integer.parseInt(ro)==3){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Nome incorreto.\n N~
ao é possivel colocar as duas ligaç~
oes neste carbono.");
}else{
98
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
if(Integer.parseInt(num)==2 && Integer.parseInt(nu)==2 && Integer.parseInt(numer)==2 ||
Integer.parseInt(num)==3 && Integer.parseInt(nu)==3 && Integer.parseInt(numer)==3){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Atenç~
ao, as tr^
es posiç~
oes da ramificaç~
ao trimetil\n n~
ao
podem ter o mesmo numero");
}else{
frame2.saida.setForeground(Color.BLUE);
frame2.saida.setText(" Nome correto.\n\n Esta subst^
ancia é um Alcadieno\n == Possuindo 4
carbonos na cadeia principal (but),\n duas duplas ligaç~
oes ("+en+") na posiç~
ao ("+ero+","+ro+"),
\n ramificaç~
ao trimetil na posiç~
ao ("+num+","+nu+","+numer+") e \n pertencendo ao grupo hidrocarboneto ("+hi+")");
if(Integer.parseInt(num) == 2 && Integer.parseInt(nu) == 2 && Integer.parseInt(numer) == 3 ||
Integer.parseInt(num) == 2 && Integer.parseInt(nu) == 3 && Integer.parseInt(numer) == 2){
if(Integer.parseInt(ero)==1 && Integer.parseInt(ro)==2 ||Integer.parseInt(ero)==2 &&
Integer.parseInt(ro)==1){
frame2.est.setText("\n\n
C=C=(C)(C)C(C)C ");
}else{
if(Integer.parseInt(ero)==1 && Integer.parseInt(ro)==3 ||Integer.parseInt(ero)==3 &&
Integer.parseInt(ro)==1){
frame2.est.setText("\n\n
C=C(C)(C)C=(C)C ");
}else{
frame2.est.setText("\n\n
CC=(C)(C)C=(C)C ");
}
}
}else{
if(Integer.parseInt(num) == 3 && Integer.parseInt(nu) == 3 && Integer.parseInt(numer) == 2
|| Integer.parseInt(num) == 3 && Integer.parseInt(nu) == 2 && Integer.parseInt(numer) == 3){
if(Integer.parseInt(ero)==1 && Integer.parseInt(ro)==2 ||Integer.parseInt(ero)==2 &&
Integer.parseInt(ro)==1){
frame2.est.setText("\n\n
C=C=(C)C(C)(C)C ");
}else{
if(Integer.parseInt(ero)==1 && Integer.parseInt(ro)==3 ||Integer.parseInt(ero)==3 &&
Integer.parseInt(ro)==1){
frame2.est.setText("\n\n
C=C(C)C=(C)(C)C ");
}else{
frame2.est.setText("\n\n
CC=(C)C=(C)(C)C ");
}
}
}
}
}
}
}
}
}
}
}
}
1526
1527
1528
:}
;
1529
1530
1531
/* ************* Álcool ************** */
1532
1533
1534
1535
1536
1537
1538
1539
alcool ::= alcoolMet:me
{: RESULT = me; :}
| alcoolEt: ae
{: RESULT = ae; :}
| alcoolProp: ap
{: RESULT = ap; :}
;
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
alcoolMet ::= MET central:en alcoois:al {:
if(! en.equals("an")){
frame2.saida.setFont(new Font("Arial", Font.PLAIN, 15));
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Com o prefixo MET só é aceito ligaç~
ao simples (an)");
}else{
frame2.saida.setForeground(Color.BLUE);
frame2.saida.setText(" Nome correto.\n \n Esta subst^
ancia é um Álcool \n Possuindo 1
carbono na cadeia principal (met), \n ligaç~
ao simples ("+en+") e \n pertencendo ao
grupo oxigenado ("+al+")");
frame2.est.setText("\n \n
C(O) ");
}
99
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
:}
| MET central:en numero:nu alcoois:al {:
if(! en.equals("an")){
frame2.saida.setFont(new Font("Arial", Font.PLAIN, 15));
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Com o prefixo MET só é aceito ligaç~
ao simples (an)");
}else{
if(Integer.parseInt(nu)>1){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Numero da posiç~
ao esta incorreto.\n Com o prefixo MET so
podemos ter 1 carbono na cadeia principal");
}else{
frame2.saida.setForeground(Color.BLUE);
frame2.saida.setText(" Nome correto.\n \n Esta subst^
ancia é um Álcool \n Possuindo 1
carbono na cadeia principal (met), \n ligaç~
ao simples ("+en+") e \n pertencendo
ao grupo oxigenado ("+al+")");
frame2.est.setText("\n \n
C(O) ");
}
}
:}
| numero:nu radical:ra MET central:en alcoois:hi {:
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Nome incorreto.\n\n N~
ao podemos ter ramificaç~
oes com o prefixo MET,\n
pois n~
ao será mais um met e\n sim outro prefixo maior que 1 carbono.");
:}
;
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
alcoolEt ::= numero:nume ET central:en alcoois:al {:
frame2.saida.setFont(new Font("Arial", Font.PLAIN, 15));
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Com o prefixo ET só é aceito ligaç~
ao simples (an),\n
pois a ligaç~
ao en, in n~
ao pode ser do mesmo carbono \n da hidroxila");
:}
| ET central:en alcoois:al {:
if(en.equals("en")||en.equals("in")||en.equals("adien")){
frame2.saida.setText(" Necessario informar o número da ligaç~
ao");
frame2.saida.setForeground(Color.RED);
}else{
frame2.saida.setForeground(Color.BLUE);
frame2.saida.setText(" Nome correto.\n \n Esta subst^
ancia é um Álcool \n Possuindo 2
carbonos na cadeia principal (et), \n ligaç~
ao simples ("+en+") e \n pertencendo
ao grupo oxigenado ("+al+")");
frame2.est.setText("\n \n
CC(O) ");
}
:}
| ET central:en numero:nu alcoois:al {:
if(en.equals("en")||en.equals("in")||en.equals("adien")){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Necessario informar o número da ligaç~
ao");
}else{
if(Integer.parseInt(nu)>1){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Numero da posiç~
ao esta incorreto.\n Com o prefixo ET
a posiç~
ao da hidroxila será 1.");
}else{
frame2.saida.setForeground(Color.BLUE);
frame2.saida.setText(" Nome correto.\n \n Esta subst^
ancia é um Álcool \n Possuindo 2
carbonos na cadeia principal (et), \n ligaç~
ao simples ("+en+") e \n pertencendo
ao grupo oxigenado ("+al+")");
frame2.est.setText("\n \n
CC(O) ");
}
}
:}
1616
1617
1618
1619
1620
1621
1622
| numero:nu radical:ra ET central:en alcoois:hi {:
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Nome incorreto.\n\n N~
ao podemos ter ramificaç~
oes com o prefixo ET,\n
pois n~
ao será mais um et e\n sim outro prefixo maior que 2 carbonos.");
:}
;
1623
1624
1625
1626
alcoolProp ::= numero:nume METIL numero:nu PROP central:en numero:num alcoois:al {:
if(Integer.parseInt(nume) > 3 || Integer.parseInt(num) > 3 || Integer.parseInt(nu) > 3){
100
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
frame2.saida.setFont(new Font("Arial", Font.PLAIN, 15));
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Numero da posiç~
ao esta incorreto.\n Com o prefixo PROP so podemos
ter 3 carbonos na cadeia principal");
}else{
if(Integer.parseInt(nume) != 2){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Nome incorreto,\n Pois se colocar a ramificaç~
ao na posiç~
ao 1
ou 3\n n~
ao será mais um prop e sim um but");
}else{
if(Integer.parseInt(num)==3){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" A regra da cadeia sempre começa pelo carbono da hidroxila, \n
portanto sua posiç~
ao seria 1 ou 2");
}else{
if(Integer.parseInt(nu)==3){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Nome incorreto.\n N~
ao é possivel colocar a ligaç~
ao neste carbono.");
}else{
if(en.equals("an")){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Nome incorreto.\n N~
ao é permitido colocar posiç~
ao em ligaç~
ao simples.");
}else{
if(en.equals("en")){
if(Integer.parseInt(num)==2 && Integer.parseInt(nu) != 1 ){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" N~
ao podemos colocar ligaç~
ao em um carbono \n que já
contenha uma hidroxila");
}else{
if(Integer.parseInt(num)==2 && Integer.parseInt(nu) == 1 ){
frame2.saida.setForeground(Color.BLUE);
frame2.saida.setText(" Nome correto.\n \n Esta subst^
ancia é um Álcool \n Possuindo 3
carbonos na cadeia principal (prop), \n ligaç~
ao dupla ("+en+") na posiç~
ao ("+nu+"),
com ramificaç~
ao metil na posiç~
ao ("+nume+") e \n pertencendo ao grupo oxigenado
("+al+") localizado na posiç~
ao ("+num+")");
frame2.est.setText("\n \n
C=C(O)(C)C ");
}
}
if(Integer.parseInt(num)==1 && Integer.parseInt(nu) != 2){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" N~
ao podemos colocar ligaç~
ao em um carbono \n que já contenha uma hidroxila");
}else{
if(Integer.parseInt(num)==1 && Integer.parseInt(nu) == 2){
frame2.saida.setForeground(Color.BLUE);
frame2.saida.setText(" Nome correto.\n \n Esta subst^
ancia é um Álcool \n Possuindo 3
carbonos na cadeia principal (prop), \n ligaç~
ao dupla ("+en+") na posiç~
ao ("+nu+"),
com ramificaç~
ao metil na posiç~
ao ("+nume+") e \n pertencendo ao grupo oxigenado ("+al+")
localizado na posiç~
ao ("+num+")");
frame2.est.setText("\n \n
C(C)=CC(O) ");
}
}
}else{
if(en.equals("in")){
if(Integer.parseInt(num)==2 && Integer.parseInt(nu) != 1){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" N~
ao podemos colocar ligaç~
ao em um carbono \n que já contenha uma hidroxila");
}else{
if(Integer.parseInt(num)==2 && Integer.parseInt(nu) == 1){
frame2.saida.setForeground(Color.BLUE);
frame2.saida.setText(" Nome correto.\n \n Esta subst^
ancia é um Álcool \n Possuindo 3
carbonos na cadeia principal (prop), \n ligaç~
ao tripla ("+en+") na posiç~
ao ("+nu+"),
com ramificaç~
ao metil na posiç~
ao ("+nume+") e \n pertencendo ao grupo oxigenado ("+al+")
localizado na posiç~
ao ("+num+")");
frame2.est.setText("\n \n
C#C(O)(C)C ");
}
}
if(Integer.parseInt(num)==1 && Integer.parseInt(nu) != 2){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" N~
ao podemos colocar ligaç~
ao em um carbono \n que já contenha uma hidroxila");
}else{
if(Integer.parseInt(num)==1 && Integer.parseInt(nu) == 2){
frame2.saida.setForeground(Color.BLUE);
frame2.saida.setText(" Nome correto.\n \n Esta subst^
ancia é um Álcool \n Possuindo 3
carbonos na cadeia principal (prop), \n ligaç~
ao tripla ("+en+") na posiç~
ao ("+nu+"),
101
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
com ramificaç~
ao metil na posiç~
ao ("+nume+") e \n pertencendo ao grupo oxigenado ("+al+")
localizado na posiç~
ao ("+num+")");
frame2.est.setText("\n \n
C(C)#CC(O) ");
}
}
}
}
}
}
}
}
}
:}
| numero:nume METIL numero:nu PROP central:en alcoois:al {:
if(Integer.parseInt(nume) > 3 || Integer.parseInt(nu) > 3){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Numero da posiç~
ao esta incorreto.\n Com o prefixo PROP so podemos ter 3
\n carbonos na cadeia principal");
}else{
if(Integer.parseInt(nume) == 1 || Integer.parseInt(nume) == 3){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Nome incorreto,\n Pois se colocar a ramificaç~
ao na posiç~
ao 1 ou 3
n~
ao será mais um prop e sim um but");
}else{
if(en.equals("an")){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Nome incorreto.\n N~
ao é permitido colocar posiç~
ao em ligaç~
ao simples.");
}else{
if(Integer.parseInt(nu)==3){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Nome incorreto.\n N~
ao é possivel colocar a ligaç~
ao neste carbono.");
}else{
if(en.equals("en")){
if(Integer.parseInt(nu)== 2){
frame2.saida.setForeground(Color.BLUE);
frame2.saida.setText(" Nome correto.\n \n Esta subst^
ancia é um Álcool \n Possuindo 3
carbonos na cadeia principal (prop), \n ligaç~
ao dupla ("+en+") na posiç~
ao ("+nu+"),
com ramificaç~
ao metil na posiç~
ao ("+nume+") e \n pertencendo ao grupo oxigenado ("+al+")");
frame2.est.setText("\n \n
C(C)=CC(O) ");
}else{
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" N~
ao podemos colocar ligaç~
ao em um carbono \n que já contenha uma hidroxila");
}
}else{
if(en.equals("in")){
if(Integer.parseInt(nu)== 2){
frame2.saida.setForeground(Color.BLUE);
frame2.saida.setText(" Nome correto.\n \n Esta subst^
ancia é um Álcool \n Possuindo 3
carbonos na cadeia principal (prop), \n ligaç~
ao tripla ("+en+") na posiç~
ao ("+nu+"),
com ramificaç~
ao metil na posiç~
ao ("+nume+") e \n pertencendo ao grupo oxigenado ("+al+")");
frame2.est.setText("\n \n
C(C)#CC(O) ");
}else{
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" N~
ao podemos colocar ligaç~
ao em um carbono \n que já contenha uma hidroxila");
}
}
}
}
}
}
}
:}
1763
1764
1765
1766
1767
1768
1769
1770
1771
1772
1773
1774
| numero:nume METIL numero:nu PROP simples:en alcoois:al {:
if(Integer.parseInt(nume) > 3 || Integer.parseInt(nu) > 3){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Numero da posiç~
ao esta incorreto.\n Com o prefixo PROP so podemos ter 3
carbonos na cadeia principal");
}else{
if(Integer.parseInt(nume) == 1 || Integer.parseInt(nume) == 3){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Nome incorreto.\n Pois se colocar a ramificaç~
ao na posiç~
ao 1 ou 3
\n n~
ao será mais um prop e sim um but");
}else{
102
1775
1776
1777
1778
1779
1780
1781
1782
1783
1784
1785
1786
1787
1788
1789
1790
1791
1792
1793
1794
1795
1796
if(Integer.parseInt(nu)==3){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" A regra da cadeia sempre começa pelo carbono da hidroxila, \n
portanto sua posiç~
ao seria 1 ou 2");
}else{
if(Integer.parseInt(nu) == 1){
frame2.saida.setForeground(Color.BLUE);
frame2.saida.setText(" Nome correto.\n \n Esta subst^
ancia é um Álcool \n Possuindo 3
carbonos na cadeia principal (prop), \n ligaç~
ao simples ("+en+"), \n ramificaç~
ao metil
na posiç~
ao ("+nume+") e \n pertencendo ao grupo oxigenado ("+al+") localizado na posiç~
ao ("+nu+")");
frame2.est.setText("\n \n
C(C)CC(O) ");
}else{
frame2.saida.setForeground(Color.BLUE);
frame2.saida.setText(" Nome correto.\n \n Esta subst^
ancia é um Álcool \n Possuindo 3
carbonos na cadeia principal (prop), \n ligaç~
ao simples ("+en+"), \n ramificaç~
ao metil na
posiç~
ao ("+nume+") e \n pertencendo ao grupo oxigenado ("+al+") localizado na posiç~
ao ("+nu+")");
frame2.est.setText("\n \n
CC(O)(C)C ");
}
}
}
}
:}
1797
1798
1799
1800
1801
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811
1812
1813
1814
1815
1816
1817
1818
1819
1820
1821
1822
1823
1824
1825
1826
1827
1828
1829
1830
1831
1832
1833
1834
1835
1836
1837
1838
1839
1840
1841
1842
1843
1844
1845
1846
1847
1848
| numero:nume METIL PROP simples:en alcoois:al {:
if(Integer.parseInt(nume) > 3){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Numero da posiç~
ao esta incorreto.\n Com o prefixo PROP so podemos
ter 3 carbonos na cadeia principal");
}else{
if(Integer.parseInt(nume) == 1 || Integer.parseInt(nume) == 3){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Nome incorreto.\n Pois se colocar a ramificaç~
ao na posiç~
ao 1 ou 3
\n n~
ao será mais um prop e sim um but");
}else{
frame2.saida.setForeground(Color.BLUE);
frame2.saida.setText(" Nome correto.\n \n Esta subst^
ancia é um Álcool \n Possuindo 3
carbonos na cadeia principal (prop), \n ligaç~
ao simples ("+en+"),\n ramificaç~
ao metil
com posiç~
ao ("+nume+") e \n pertencendo ao grupo oxigenado ("+al+")");
frame2.est.setText("\n \n
C(C)CC(O) ");
}
}
:}
| PROP central:en alcoois:al {:
if(en.equals("en")||en.equals("in")||en.equals("adien")){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Necessario informar o número da ligaç~
ao");
}else{
frame2.saida.setForeground(Color.BLUE);
frame2.saida.setText(" Nome correto.\n \n Esta subst^
ancia é um Álcool \n Possuindo 3
carbonos na cadeia principal (prop), \n ligaç~
ao simples ("+en+") e \n pertencendo ao
grupo oxigenado ("+al+")");
frame2.est.setText("\n \n
CCC(O) ");
}
:}
| numero:nu PROP central:en alcoois:al {:
if(Integer.parseInt(nu) > 3){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Numero da posiç~
ao esta incorreto.\n Com o prefixo PROP so
podemos ter 3 carbonos na cadeia principal");
}else{
if(en.equals("an")){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Nome incorreto.\n N~
ao é permitido colocar posiç~
ao em ligaç~
ao simples.");
}else{
if(Integer.parseInt(nu)==3){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Nome incorreto.\n N~
ao é possivel colocar a ligaç~
ao neste carbono.");
}else{
if(en.equals("en")){
if(Integer.parseInt(nu)== 2){
frame2.saida.setForeground(Color.BLUE);
frame2.saida.setText(" Nome correto.\n \n Esta subst^
ancia é um Álcool \n Possuindo 2
carbonos na cadeia principal (prop), \n ligaç~
ao dupla ("+en+") na posiç~
ao ("+nu+") e
103
1849
1850
1851
1852
1853
1854
1855
1856
1857
1858
1859
1860
1861
1862
1863
1864
1865
1866
1867
1868
1869
1870
1871
1872
\n pertencendo ao grupo oxigenado ("+al+")");
frame2.est.setText("\n \n
C=CC(O) ");
}else{
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" N~
ao podemos colocar ligaç~
ao em um carbono \n que já contenha uma hidroxila");
}
}else{
if(en.equals("in")){
if(Integer.parseInt(nu)== 2){
frame2.saida.setForeground(Color.BLUE);
frame2.saida.setText(" Nome correto.\n \n Esta subst^
ancia é um Álcool \n Possuindo 2
carbonos na cadeia principal (prop), \n ligaç~
ao tripla ("+en+") na posiç~
ao ("+nu+") e
\n pertencendo ao grupo oxigenado ("+al+")");
frame2.est.setText("\n \n
C#CC(O) ");
}else{
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" N~
ao podemos colocar ligaç~
ao em um carbono \n que já contenha uma hidroxila");
}
}
}
}
}
}
:}
1873
1874
1875
1876
1877
1878
1879
1880
1881
1882
1883
1884
1885
1886
1887
1888
1889
1890
1891
1892
1893
1894
1895
1896
1897
1898
1899
1900
1901
1902
1903
1904
1905
1906
1907
1908
1909
1910
1911
1912
1913
1914
1915
1916
1917
1918
1919
1920
1921
1922
| numero:nu PROP central:en numero:num alcoois:al {:
if(Integer.parseInt(num) > 3 || Integer.parseInt(nu) > 3){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Numero da posiç~
ao esta incorreto.\n Com o prefixo PROP so
podemos ter 3 carbonos na cadeia principal");
}else{
if(Integer.parseInt(num)==3){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" A regra da cadeia sempre começa pelo carbono da hidroxila,
\n portanto sua posiç~
ao seria 1 ou 2");
}else{
if(Integer.parseInt(nu)==3){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Nome incorreto.\n N~
ao é possivel colocar a ligaç~
ao neste carbono.");
}else{
if(en.equals("an")){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Nome incorreto.\n N~
ao é permitido colocar posiç~
ao em ligaç~
ao simples.");
}else{
if(en.equals("en")){
if(Integer.parseInt(num)==2 && Integer.parseInt(nu) != 1){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" N~
ao podemos colocar ligaç~
ao em um carbono \n que já contenha uma hidroxila");
}else{
if(Integer.parseInt(num)==2 && Integer.parseInt(nu) == 1){
frame2.saida.setForeground(Color.BLUE);
frame2.saida.setText(" Nome correto.\n \n Esta subst^
ancia é um Álcool \n Possuindo 2
carbonos na cadeia principal (prop), \n ligaç~
ao dupla ("+en+") na posiç~
ao ("+nu+") e
\n pertencendo ao grupo oxigenado ("+al+") localizado na posiç~
ao ("+num+")");
frame2.est.setText("\n \n
C=C(O)C ");
}
}
if(Integer.parseInt(num)==1 && Integer.parseInt(nu) != 2){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" N~
ao podemos colocar ligaç~
ao em um carbono \n que já contenha uma hidroxila");
}else{
if(Integer.parseInt(num)==1 && Integer.parseInt(nu) == 2){
frame2.saida.setForeground(Color.BLUE);
frame2.saida.setText(" Nome correto.\n \n Esta subst^
ancia é um Álcool \n Possuindo 2
carbonos na cadeia principal (prop), \n ligaç~
ao dupla ("+en+") na posiç~
ao ("+nu+") e
\n pertencendo ao grupo oxigenado ("+al+") localizado na posiç~
ao ("+num+")");
frame2.est.setText("\n \n
C=CC(O) ");
}
}
}else{
if(en.equals("in")){
if(Integer.parseInt(num)==2 && Integer.parseInt(nu) != 1){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" N~
ao podemos colocar ligaç~
ao em um carbono \n que já contenha uma hidroxila");
104
1923
1924
1925
1926
1927
1928
1929
1930
1931
1932
1933
1934
1935
1936
1937
1938
1939
1940
1941
1942
1943
1944
1945
1946
1947
1948
1949
1950
}else{
if(Integer.parseInt(num)==2 && Integer.parseInt(nu) == 1){
frame2.saida.setForeground(Color.BLUE);
frame2.saida.setText(" Nome correto.\n \n Esta subst^
ancia é um Álcool \n Possuindo 3
carbonos na cadeia principal (prop), \n ligaç~
ao tripla ("+en+") na posiç~
ao ("+nu+") e
\n pertencendo ao grupo oxigenado ("+al+") localizado na posiç~
ao ("+num+")");
frame2.est.setText("\n \n
C#C(O)C ");
}
}
if(Integer.parseInt(num)==1 && Integer.parseInt(nu) != 2){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" N~
ao podemos colocar ligaç~
ao em um carbono \n que já contenha uma hidroxila");
}else{
if(Integer.parseInt(num)==1 && Integer.parseInt(nu) == 2){
frame2.saida.setForeground(Color.BLUE);
frame2.saida.setText(" Nome correto.\n \n Esta subst^
ancia é um Álcool \n Possuindo 3
carbonos na cadeia principal (prop), \n ligaç~
ao tripla ("+en+") na posiç~
ao ("+nu+") e
\n pertencendo ao grupo oxigenado ("+al+") localizado na posiç~
ao ("+num+")");
frame2.est.setText("\n \n
C#CC(O) ");
}
}
}
}
}
}
}
}
:}
1951
1952
1953
1954
1955
1956
1957
1958
1959
1960
1961
1962
1963
1964
1965
1966
1967
1968
1969
1970
1971
1972
1973
1974
1975
1976
1977
1978
| numero:num PROP simples:en alcoois:al {:
if(Integer.parseInt(num) > 3){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Numero da posiç~
ao esta incorreto.\n Com o prefixo PROP so
podemos ter 3 carbonos na cadeia principal");
}else{
if(Integer.parseInt(num)==3){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" A regra da cadeia sempre começa pelo carbono da hidroxila,
\n portanto sua posiç~
ao seria 1 ou 2");
}else{
if(Integer.parseInt(num) == 1){
frame2.saida.setForeground(Color.BLUE);
frame2.saida.setText(" Nome correto.\n \n Esta subst^
ancia é um Álcool \n Possuindo 3
carbonos na cadeia principal (prop), \n ligaç~
ao simples ("+en+") e \n pertencendo ao
grupo oxigenado ("+al+") localizado na posiç~
ao ("+num+")");
frame2.est.setText("\n \n
CCC(O) ");
}else{
frame2.saida.setForeground(Color.BLUE);
frame2.saida.setText(" Nome correto.\n \n Esta subst^
ancia é um Álcool \n Possuindo 3
carbonos na cadeia principal (prop), \n ligaç~
ao simples ("+en+") e \n pertencendo ao
grupo oxigenado ("+al+") localizado na posiç~
ao ("+num+")");
frame2.est.setText("\n \n
CC(O)C ");
}
}
}
:}
1979
1980
1981
1982
1983
1984
1985
1986
1987
1988
1989
1990
1991
1992
1993
1994
1995
1996
|numero:nume numero:ero DIMETIL numero:nu PROP central:en numero:num alcoois:al {:
if(Integer.parseInt(nume) > 3 || Integer.parseInt(num) > 3 || Integer.parseInt(nu) > 3
|| Integer.parseInt(ero) > 3){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Numero da posiç~
ao esta incorreto.\n Com o prefixo PROP so podemos
ter 3 carbonos na cadeia principal");
}else{
if(Integer.parseInt(nume) != 2 || Integer.parseInt(ero) != 2){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Nome incorreto.\n Pois se colocar a ramificaç~
ao na posiç~
ao 1
ou 3\n n~
ao será mais um prop e sim um but");
}else{
if(Integer.parseInt(num)==3){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" A regra da cadeia sempre começa pelo carbono da hidroxila,
\n portanto sua posiç~
ao seria 1 ou 2");
}else{
105
1997
1998
1999
2000
2001
2002
2003
2004
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
2027
2028
2029
2030
2031
2032
2033
2034
2035
2036
2037
2038
2039
2040
2041
2042
2043
2044
2045
2046
2047
2048
2049
2050
2051
2052
2053
2054
2055
2056
2057
2058
2059
2060
2061
2062
2063
2064
2065
2066
2067
2068
2069
2070
if(Integer.parseInt(nume)==2 && Integer.parseInt(ero)==2 && Integer.parseInt(num)==2){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" N~
ao podemos ter o carbono 2 ligado a tr^
es ramificaç~
oes");
}else{
if(Integer.parseInt(nu)==3){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Nome incorreto.\n N~
ao é possivel colocar a ligaç~
ao neste carbono.");
}else{
if(en.equals("an")){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Nome incorreto.\n N~
ao é permitido colocar posiç~
ao em ligaç~
ao simples.");
}else{
if(en.equals("en")){
if(Integer.parseInt(num)==1 && Integer.parseInt(nu) != 2){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" N~
ao podemos colocar ligaç~
ao em um carbono \n que já contenha uma hidroxila");
}else{
if(Integer.parseInt(num)==1 && Integer.parseInt(nu) == 2){
frame2.saida.setForeground(Color.BLUE);
frame2.saida.setText(" Nome correto.\n \n Esta subst^
ancia é um Álcool \n Possuindo 3
carbonos na cadeia principal (prop), \n ligaç~
ao dupla ("+en+") na posiç~
ao ("+nu+"),
com ramificaç~
ao dimetil na posiç~
ao ("+nume+","+ero+") e \n pertencendo ao grupo oxigenado
("+al+") localizado na posiç~
ao ("+num+")");
frame2.est.setText("\n \n
C(C)(C)=CC(O) ");
}
}
}else{
if(en.equals("in")){
if(Integer.parseInt(num)==1 && Integer.parseInt(nu) != 2){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" N~
ao podemos colocar ligaç~
ao em um carbono \n que já contenha uma hidroxila");
}else{
if(Integer.parseInt(num)==1 && Integer.parseInt(nu) == 2){
frame2.saida.setForeground(Color.BLUE);
frame2.saida.setText(" Nome correto.\n \n Esta subst^
ancia é um Álcool \n Possuindo 3
carbonos na cadeia principal (prop), \n ligaç~
ao tripla ("+en+") na posiç~
ao ("+nu+"),
com ramificaç~
ao dimetil na posiç~
ao ("+nume+","+ero+") e \n pertencendo ao grupo oxigenado
("+al+") localizado na posiç~
ao ("+num+")");
frame2.est.setText("\n \n
C(C)(C)#CC(O) ");
}
}
}
}
}
}
}
}
}
}
:}
| numero:nume numero:ero DIMETIL numero:nu PROP central:en alcoois:al {:
if(Integer.parseInt(nume) > 3 || Integer.parseInt(nu) > 3 || Integer.parseInt(ero) > 3){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Numero da posiç~
ao esta incorreto.\n Com o prefixo PROP so
podemos ter 3 carbonos na cadeia principal");
}else{
if(Integer.parseInt(nume) == 1 || Integer.parseInt(nume) == 3 || Integer.parseInt(ero) == 1
|| Integer.parseInt(ero) == 3){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Nome incorreto.\n Pois se colocar a ramificaç~
ao na posiç~
ao 1 ou 3
\n n~
ao será mais um prop e sim um but");
}else{
if(en.equals("an")){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Nome incorreto.\n N~
ao é permitido colocar posiç~
ao em ligaç~
ao simples.");
}else{
if(Integer.parseInt(nu)==3){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Nome incorreto.\n N~
ao é possivel colocar a ligaç~
ao neste carbono.");
}else{
if(en.equals("en")){
if(Integer.parseInt(nu)== 2){
frame2.saida.setForeground(Color.BLUE);
frame2.saida.setText(" Nome correto.\n \n Esta subst^
ancia é um Álcool \n Possuindo 2
106
2071
2072
2073
2074
2075
2076
2077
2078
2079
2080
2081
2082
2083
2084
2085
2086
2087
2088
2089
2090
2091
2092
2093
2094
2095
2096
carbonos na cadeia principal (prop), \n ligaç~
ao dupla ("+en+") na posiç~
ao ("+nu+"),
com ramificaç~
ao dimetil na posiç~
ao ("+nume+","+ero+") e \n pertencendo ao grupo oxigenado ("+al+")");
frame2.est.setText("\n \n
C(C)(C)=CC(O) ");
}else{
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" N~
ao podemos colocar ligaç~
ao em um carbono \n que já contenha uma hidroxila");
}
}else{
if(en.equals("in")){
if(Integer.parseInt(nu)== 2){
frame2.saida.setForeground(Color.BLUE);
frame2.saida.setText(" Nome correto.\n \n Esta subst^
ancia é um Álcool \n Possuindo 2
carbonos na cadeia principal (prop), \n ligaç~
ao tripla ("+en+") na posiç~
ao ("+nu+"),
com ramificaç~
ao dimetil na posiç~
ao ("+nume+","+ero+") e \n pertencendo ao grupo oxigenado ("+al+")");
frame2.est.setText("\n \n
C(C)(C)#CC(O) ");
}else{
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" N~
ao podemos colocar ligaç~
ao em um carbono \n que já contenha uma hidroxila");
}
}
}
}
}
}
}
:}
2097
2098
2099
2100
2101
2102
2103
2104
2105
2106
2107
2108
2109
2110
2111
2112
2113
2114
2115
2116
2117
2118
2119
2120
2121
2122
2123
2124
2125
2126
2127
2128
2129
| numero:nume numero:ero DIMETIL numero:nu PROP simples:en alcoois:al {:
if(Integer.parseInt(nume) > 3 || Integer.parseInt(nu) > 3 || Integer.parseInt(ero) > 3){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Numero da posiç~
ao esta incorreto.\n Com o prefixo PROP so
podemos ter 3 carbonos na cadeia principal");
}else{
if(Integer.parseInt(nume) == 1 || Integer.parseInt(nume) == 3 || Integer.parseInt(ero) == 1
|| Integer.parseInt(ero) == 3){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Nome incorreto.\n Pois se colocar a ramificaç~
ao na posiç~
ao 1 ou 3
\n n~
ao será mais um prop e sim um but");
}else{
if(Integer.parseInt(nu)==3){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" A regra da cadeia sempre começa pelo carbono da hidroxila, \n
portanto sua posiç~
ao seria 1 ou 2");
}else{
if(Integer.parseInt(nu) == 1){
frame2.saida.setForeground(Color.BLUE);
frame2.saida.setText(" Nome correto.\n \n Esta subst^
ancia é um Álcool \n Possuindo 3
carbonos na cadeia principal (prop), \n ligaç~
ao simples ("+en+"), \n ramificaç~
ao
dimetil na posiç~
ao ("+nume+","+ero+") e \n pertencendo ao grupo oxigenado ("+al+")
localizado na posiç~
ao ("+nu+")");
frame2.est.setText("\n \n
C(C)(C)CC(O) ");
}else{
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" N~
ao podemos ter o carbono 2 ligado a tr^
es ramificaç~
oes");
}
}
}
}
:}
2130
2131
2132
2133
2134
2135
2136
2137
2138
2139
2140
2141
2142
2143
2144
| numero:nume numero:ero DIMETIL PROP simples:en alcoois:al {:
if(Integer.parseInt(nume) > 3 || Integer.parseInt(ero) > 3){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Numero da posiç~
ao esta incorreto.\n Com o prefixo PROP so
podemos ter 3 carbonos na cadeia principal");
}else{
if(Integer.parseInt(nume) == 1 || Integer.parseInt(nume) == 3 || Integer.parseInt(ero) == 1
|| Integer.parseInt(ero) == 3){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Nome incorreto.\n Pois se colocar a ramificaç~
ao na posiç~
ao 1
ou 3 n~
ao será mais um prop e sim um but");
}else{
frame2.saida.setForeground(Color.BLUE);
107
2145
2146
2147
2148
2149
2150
2151
frame2.saida.setText(" Nome correto.\n \n Esta subst^
ancia é um Álcool \n Possuindo 3
carbonos na cadeia principal (prop), \n ligaç~
ao simples ("+en+"),\n ramificaç~
ao dimetil
com posiç~
ao ("+nume+","+ero+") e \n pertencendo ao grupo oxigenado ("+al+")");
frame2.est.setText("\n \n
C(C)(C)CC(O) ");
}
}
:}
2152
2153
2154
2155
2156
2157
2158
2159
2160
2161
2162
2163
2164
2165
2166
2167
2168
2169
2170
2171
2172
2173
|numero:nume numero:ero numero:me TRIMETIL numero:nu PROP central:en numero:num alcoois:al {:
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Nome incorreto.\n Com o prefixo PROP n~
ao podemos\n utilizar
da ramificaç~
ao TRIMETIL, pois\n n~
ao podemos ter mais que 3 carbonos");
:}
| numero:nume numero:ero numero:me TRIMETIL numero:nu PROP central:en alcoois:al {:
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Nome incorreto.\n Com o prefixo PROP n~
ao podemos\n utilizar
da ramificaç~
ao TRIMETIL, pois\n n~
ao podemos ter mais que 3 carbonos");
:}
| numero:nume numero:ero numero:me TRIMETIL numero:nu PROP simples:en alcoois:al {:
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Nome incorreto.\n Com o prefixo PROP n~
ao podemos\n utilizar
da ramificaç~
ao TRIMETIL, pois\n n~
ao podemos ter mais que 3 carbonos");
:}
| numero:nume numero:ero numero:me TRIMETIL PROP simples:en alcoois:al {:
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Nome incorreto.\n Com o prefixo PROP n~
ao podemos\n utilizar
da ramificaç~
ao TRIMETIL, pois\n n~
ao podemos ter mais que 3 carbonos");
:}
;
2174
2175
2176
/* ************* Aldeı́do ************** */
2177
2178
2179
2180
2181
2182
2183
2184
aldeido ::= aldeidoMet:me
{: RESULT = me; :}
| aldeidoEt: ae
{: RESULT = ae; :}
| aldeidoProp: ap
{: RESULT = ap; :}
;
2185
2186
2187
2188
2189
2190
2191
2192
2193
2194
2195
2196
2197
2198
2199
2200
2201
2202
2203
2204
2205
2206
aldeidoMet ::= MET central:en aldeidos:al {:
if(! en.equals("an")){
frame2.saida.setFont(new Font("Arial", Font.PLAIN, 15));
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Com o prefixo MET só é aceito ligaç~
ao simples (an)");
}else{
frame2.saida.setForeground(Color.BLUE);
frame2.saida.setText(" Nome correto.\n \n Esta subst^
ancia é um Aldeı́do \n
Possuindo 1 carbono na cadeia principal (met), \n ligaç~
ao simples ("+en+")
e \n pertencendo ao grupo oxigenado ("+al+")");
frame2.est.setText("\n \n
C(=O) ");
}
:}
| numero:nu radical:ra MET central:en aldeidos:hi {:
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Nome incorreto.\n\n N~
ao podemos ter ramificaç~
oes
com o prefixo MET,\n pois n~
ao será mais um met e\n sim outro prefixo
maior que 1 carbono.");
:}
;
2207
2208
2209
2210
2211
2212
2213
2214
2215
2216
2217
2218
aldeidoEt ::= numero:nume ET central:en aldeidos:al {:
frame2.saida.setFont(new Font("Arial", Font.PLAIN, 15));
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Com o prefixo et n~
ao utilizamos ligaç~
oes en,
in ou dien,\n pois o carbono que contem a carbonila é saturado.");
:}
| ET central:en aldeidos:al {:
if(en.equals("en")||en.equals("in")||en.equals("adien")){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Necessario informar o número da ligaç~
ao");
108
2219
2220
2221
2222
2223
2224
2225
2226
2227
2228
2229
2230
2231
2232
}else{
frame2.saida.setForeground(Color.BLUE);
frame2.saida.setText(" Nome correto.\n \n Esta subst^
ancia é um Aldeı́do \n Possuindo 2
carbonos na cadeia principal (et), \n ligaç~
ao simples ("+en+") e \n pertencendo
ao grupo oxigenado ("+al+")");
frame2.est.setText("\n \n
CC(=O) ");
}
:}
| numero:nu radical:ra ET central:en aldeidos:hi {:
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Nome incorreto.\n\n N~
ao podemos ter ramificaç~
oes com o
prefixo ET,\n pois n~
ao será mais um et e\n sim outro prefixo maior que 2 carbonos.");
:}
;
2233
2234
2235
2236
2237
2238
2239
2240
2241
2242
2243
2244
2245
2246
2247
2248
2249
2250
2251
2252
2253
2254
2255
2256
2257
2258
2259
2260
2261
2262
2263
2264
2265
2266
2267
2268
2269
2270
2271
2272
2273
2274
2275
2276
2277
2278
2279
2280
2281
2282
2283
aldeidoProp ::= numero:nume METIL numero:nu PROP central:en numero:num aldeidos:al {:
frame2.saida.setFont(new Font("Arial", Font.PLAIN, 15));
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Atenç~
ao, como o grupo funcional está sempre na extremidade,
\n esse carbono sempre será o número 1.\n Portanto, sua posiç~
ao n~
ao precisa ser indicada");
:}
| numero:nume METIL numero:nu PROP central:en aldeidos:al {:
if(Integer.parseInt(nume) > 3 || Integer.parseInt(nu) > 3){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Numero da posiç~
ao esta incorreto.\n Com o prefixo PROP
so podemos ter 3 carbonos na cadeia principal");
}else{
if(Integer.parseInt(nume) == 1 || Integer.parseInt(nume) == 3){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Nome incorreto.\n Pois se colocar a ramificaç~
ao na
posiç~
ao 1 ou 3 n~
ao será mais um prop e sim um but");
}else{
if(en.equals("an")){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Nome incorreto.\n N~
ao é permitido colocar posiç~
ao em ligaç~
ao simples.");
}else{
if(Integer.parseInt(nu) == 1){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Nome incorreto. \n N~
ao é permitido colocar ligaç~
ao no
carbono\n que possui o grupo funcional.");
}else{
if(Integer.parseInt(nu) == 3){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Nome incorreto. \n N~
ao é permitido colocar ligaç~
ao no último carbono.");
}else{
if(en.equals("en")){
frame2.saida.setForeground(Color.BLUE);
frame2.saida.setText(" Nome correto.\n \n Esta subst^
ancia é um Aldeı́do \n Possuindo 3
carbonos na cadeia principal (prop), \n ligaç~
ao dupla ("+en+") na posiç~
ao ("+nu+"),
\n com ramificaç~
ao metil na posiç~
ao ("+nume+") e \n pertencendo ao grupo oxigenado ("+al+")");
frame2.est.setText("\n \n
C(C)=CC(=O) ");
}else{
frame2.saida.setForeground(Color.BLUE);
frame2.saida.setText(" Nome correto.\n \n Esta subst^
ancia é um Aldeı́do \n Possuindo 3
carbonos na cadeia principal (prop), \n ligaç~
ao tripla ("+en+") na posiç~
ao ("+nu+"),
\n com ramificaç~
ao metil na posiç~
ao ("+nume+") e \n pertencendo ao grupo oxigenado ("+al+")");
frame2.est.setText("\n \n
C(C)#CC(=O) ");
}
}
}
}
}
}
:}
2284
2285
2286
2287
2288
2289
2290
2291
2292
| numero:nume METIL PROP simples:en aldeidos:al {:
if(Integer.parseInt(nume) > 3){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Numero da posiç~
ao esta incorreto.\n Com o prefixo PROP
so podemos ter 3 carbonos na cadeia principal");
}else{
if(Integer.parseInt(nume) == 1 || Integer.parseInt(nume) == 3){
frame2.saida.setForeground(Color.RED);
109
2293
2294
2295
2296
2297
2298
2299
2300
2301
2302
2303
2304
2305
2306
2307
2308
2309
2310
2311
2312
2313
2314
2315
2316
2317
2318
2319
2320
2321
2322
2323
2324
2325
2326
2327
2328
2329
2330
2331
2332
2333
2334
2335
2336
2337
2338
2339
2340
2341
2342
2343
2344
2345
2346
2347
2348
2349
2350
2351
2352
2353
2354
2355
2356
2357
2358
2359
2360
2361
2362
2363
2364
2365
2366
frame2.saida.setText(" Nome incorreto.\n Pois se colocar a ramificaç~
ao na
posiç~
ao 1 ou 3\n n~
ao será mais um prop e sim um but");
}else{
frame2.saida.setForeground(Color.BLUE);
frame2.saida.setText(" Nome correto.\n \n Esta subst^
ancia é um Aldeı́do \n
Possuindo 3 carbonos na cadeia principal (prop), \n ligaç~
ao simples ("+en+"),
\n com ramificaç~
ao metil na posiç~
ao ("+nume+") e \n pertencendo ao grupo oxigenado ("+al+")");
frame2.est.setText("\n \n
C(C)CC(=O) ");
}
}
:}
| PROP central:en aldeidos:al {:
if(en.equals("en")||en.equals("in")||en.equals("adien")){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Necessario informar o número da ligaç~
ao");
}else{
frame2.saida.setForeground(Color.BLUE);
frame2.saida.setText(" Nome correto.\n \n Esta subst^
ancia é um Aldeı́do \n Possuindo 3
carbonos na cadeia principal (prop) e \n pertencendo ao grupo oxigenado ("+al+")");
frame2.est.setText("\n \n
CCC(=O) ");
}
:}
| numero:nu PROP central:en aldeidos:al {:
if(Integer.parseInt(nu) > 3){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Numero da posiç~
ao esta incorreto.\n Com o prefixo PROP so
podemos ter 3 carbonos na cadeia principal");
}else{
if(en.equals("an")){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Nome incorreto.\n N~
ao é permitido colocar posiç~
ao em ligaç~
ao simples.");
}else{
if(Integer.parseInt(nu) == 1){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Nome incorreto. \n N~
ao é permitido colocar ligaç~
ao no
carbono que possui o grupo funcional.");
}else{
if(Integer.parseInt(nu) == 3){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Nome incorreto. \n N~
ao é permitido colocar ligaç~
ao no último carbono.");
}else{
if(en.equals("en")){
frame2.saida.setForeground(Color.BLUE);
frame2.saida.setText(" Nome correto.\n \n Esta subst^
ancia é um Aldeı́do \n
Possuindo 3 carbonos na cadeia principal (prop), \n ligaç~
ao dupla ("+en+") na
posiç~
ao ("+nu+") e \n pertencendo ao grupo oxigenado ("+al+")");
frame2.est.setText("\n \n
C=CC(=O) ");
}else{
frame2.saida.setForeground(Color.BLUE);
frame2.saida.setText(" Nome correto.\n \n Esta subst^
ancia é um Aldeı́do \n
Possuindo 3 carbonos na cadeia principal (prop), \n ligaç~
ao tripla ("+en+") na
posiç~
ao ("+nu+") e \n pertencendo ao grupo oxigenado ("+al+")");
frame2.est.setText("\n \n
C#CC(=O) ");
}
}
}
}
}
:}
| numero:nu PROP central:en numero:num aldeidos:al {:
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Atenç~
ao, como o grupo funcional está sempre na extremidade,
\n esse carbono sempre será o número 1.\n Portanto, sua posiç~
ao n~
ao precisa ser indicada");
:}
| numero:nume numero:ero DIMETIL numero:nu PROP central:en numero:num aldeidos:al {:
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Atenç~
ao, como o grupo funcional está sempre na extremidade,
\n esse carbono sempre será o número 1.\n Portanto, sua posiç~
ao n~
ao precisa ser indicada");
:}
| numero:nume numero:ero DIMETIL numero:nu PROP central:en aldeidos:al {:
if(Integer.parseInt(nume) > 3 || Integer.parseInt(nu) > 3 || Integer.parseInt(ero) > 3){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Numero da posiç~
ao esta incorreto.\n Com o prefixo PROP so
podemos ter 3 carbonos na cadeia principal");
110
2367
2368
2369
2370
2371
2372
2373
2374
2375
2376
2377
2378
2379
2380
2381
2382
2383
2384
2385
2386
2387
2388
2389
2390
2391
2392
2393
2394
2395
2396
2397
2398
2399
2400
2401
2402
2403
2404
2405
2406
2407
}else{
if(Integer.parseInt(nume) == 1 || Integer.parseInt(nume) == 3 || Integer.parseInt(ero) == 1
|| Integer.parseInt(ero) == 3) {
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Nome incorreto.\n Pois se colocar a ramificaç~
ao na posiç~
ao 1 ou 3
\n n~
ao será mais um prop e sim um but");
}else{
if(en.equals("an")){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Nome incorreto.\n N~
ao é permitido colocar posiç~
ao em ligaç~
ao simples.");
}else{
if(Integer.parseInt(nu) == 1){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Nome incorreto. \n N~
ao é permitido colocar ligaç~
ao no carbono
que possui o grupo funcional.");
}else{
if(Integer.parseInt(nu) == 3){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Nome incorreto. \n N~
ao é permitido colocar ligaç~
ao no último carbono.");
}else{
if(en.equals("en")){
frame2.saida.setForeground(Color.BLUE);
frame2.saida.setText(" Nome correto.\n \n Esta subst^
ancia é um Aldeı́do \n
Possuindo 3 carbonos na cadeia principal (prop), \n ligaç~
ao dupla ("+en+") na
posiç~
ao ("+nu+"), \n com ramificaç~
ao dimetil na posiç~
ao ("+nume+","+ero+") e
\n pertencendo ao grupo oxigenado ("+al+")");
frame2.est.setText("\n \n
C(C)(C)=CC(=O) ");
}else{
frame2.saida.setForeground(Color.BLUE);
frame2.saida.setText(" Nome correto.\n \n Esta subst^
ancia é um Aldeı́do \n
Possuindo 3 carbonos na cadeia principal (prop), \n ligaç~
ao tripla ("+en+")
na posiç~
ao ("+nu+"), \n com ramificaç~
ao dimetil na posiç~
ao ("+nume+","+ero+")
e \n pertencendo ao grupo oxigenado ("+al+")");
frame2.est.setText("\n \n
C(C)(C)#CC(=O) ");
}
}
}
}
}
}
:}
2408
2409
2410
2411
2412
2413
2414
2415
2416
2417
2418
2419
2420
2421
2422
2423
2424
2425
2426
2427
| numero:nume numero:ero DIMETIL PROP simples:en aldeidos:al {:
if(Integer.parseInt(nume) > 3 || Integer.parseInt(ero) > 3){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Numero da posiç~
ao esta incorreto.\n Com o prefixo PROP
so podemos ter 3 carbonos na cadeia principal");
}else{
if(Integer.parseInt(nume) == 1 || Integer.parseInt(nume) == 3 ||
Integer.parseInt(ero) == 1 || Integer.parseInt(ero) == 3){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Nome incorreto.\n Pois se colocar a ramificaç~
ao na posiç~
ao 1
ou 3\n n~
ao será mais um prop e sim um but");
}else{
frame2.saida.setForeground(Color.BLUE);
frame2.saida.setText(" Nome correto.\n \n Esta subst^
ancia é um Aldeı́do \n Possuindo
3 carbonos na cadeia principal (prop), \n ligaç~
ao simples ("+en+"),\n com ramificaç~
ao
dimetil na posiç~
ao ("+nume+","+ero+") e \n pertencendo ao grupo oxigenado ("+al+")");
frame2.est.setText("\n \n
C(C)(C)CC(=O) ");
}
}
2428
2429
2430
2431
2432
2433
2434
:}
| numero:nume numero:ero numero:b TRIMETIL numero:nu PROP central:en numero:num aldeidos:al {:
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Nome incorreto.\n Com o prefixo PROP n~
ao podemos\n
utilizar da ramificaç~
ao TRIMETIL, pois\n n~
ao podemos ter mais que 3 carbonos");
:}
2435
2436
2437
2438
2439
2440
| numero:nume numero:ero numero:b TRIMETIL numero:nu PROP central:en aldeidos:al {:
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Nome incorreto.\n Com o prefixo PROP n~
ao podemos\n utilizar
da ramificaç~
ao TRIMETIL, pois\n n~
ao podemos ter mais que 3 carbonos");
:}
111
2441
2442
2443
2444
2445
2446
| numero:nume numero:ero numero:b TRIMETIL PROP simples:en aldeidos:al {:
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Nome incorreto.\n Com o prefixo PROP n~
ao podemos\n utilizar
da ramificaç~
ao TRIMETIL, pois\n n~
ao podemos ter mais que 3 carbonos");
:}
;
2447
2448
/* ************* Cetona ************** */
2449
2450
2451
2452
2453
2454
2455
2456
cetona ::= cetonaMet:me
{: RESULT = me; :}
| cetonaEt: ae
{: RESULT = ae; :}
| cetonaProp: ap
{: RESULT = ap; :}
;
2457
2458
2459
2460
2461
2462
2463
2464
2465
2466
2467
2468
2469
2470
cetonaMet ::= MET central:en cetonas:al {:
frame2.saida.setFont(new Font("Arial", Font.PLAIN, 15));
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Atenç~
ao, as cetonas apresentam o grupo funcional
carbonila,\n sendo este carbono secundário.\n Portanto prefixo met n~
ao se encaixa nas cetonas.");
:}
| numero:nu radical:ra MET central:en cetonas:hi {:
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Nome incorreto.\n\n N~
ao podemos ter ramificaç~
oes
com o prefixo MET,\n pois n~
ao será mais um met e\n sim outro prefixo maior que 1 carbono.");
:}
;
2471
2472
2473
2474
2475
2476
2477
2478
2479
2480
2481
2482
2483
2484
2485
2486
2487
2488
2489
2490
cetonaEt ::= numero:nume ET central:en cetonas:al {:
frame2.saida.setFont(new Font("Arial", Font.PLAIN, 15));
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Atenç~
ao, as cetonas apresentam o grupo funcional carbonila,
\n sendo este carbono secundário.\n Portanto prefixo et n~
ao se encaixa nas cetonas.");
:}
| ET central:en cetonas:al {:
frame2.saida.setFont(new Font("Arial", Font.PLAIN, 15));
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Atenç~
ao, as cetonas apresentam o grupo funcional carbonila,\n
sendo este carbono secundário.\n Portanto prefixo met n~
ao se encaixa nas cetonas.");
:}
| numero:nu radical:ra ET central:en cetonas:hi {:
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Nome incorreto.\n\n N~
ao podemos ter ramificaç~
oes com o
prefixo ET,\n pois n~
ao será mais um et e\n sim outro prefixo maior que 2 carbonos.");
:}
;
2491
2492
2493
2494
2495
2496
2497
2498
2499
2500
2501
2502
2503
2504
2505
2506
2507
2508
2509
2510
2511
2512
2513
2514
cetonaProp ::= numero:nume METIL numero:nu PROP central:en numero:num cetonas:al {:
frame2.saida.setFont(new Font("Arial", Font.PLAIN, 15));
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Com o prefixo prop n~
ao podemos utilizar\n a ramificaç~
ao metil,
pois se colocarmos em suas\n extremidades n~
ao será mais um prop e sim um but. \n E
no carbono 2 n~
ao podemos colocar,\n pois o grupo funcional da cetona é secundário.");
:}
| numero:nume METIL numero:nu PROP central:en cetonas:al {:
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Com o prefixo prop n~
ao podemos utilizar\n a ramificaç~
ao metil,
pois se colocarmos em suas\n extremidades n~
ao será mais um prop e sim um but. \n E
no carbono 2 n~
ao podemos colocar,\n pois o grupo funcional da cetona é secundário.");
:}
| numero:nume METIL PROP central:en cetonas:al {:
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Com o prefixo prop n~
ao podemos utilizar\n a ramificaç~
ao metil,
pois se colocarmos em suas\n extremidades n~
ao será mais um prop e sim um but. \n E
no carbono 2 n~
ao podemos colocar,\n pois o grupo funcional da cetona é secundário.");
:}
| PROP central:en cetonas:al {:
if(en.equals("en")||en.equals("in")||en.equals("adien")){
frame2.saida.setForeground(Color.RED);
112
2515
2516
2517
2518
2519
2520
2521
2522
2523
2524
2525
2526
2527
2528
2529
2530
2531
2532
2533
2534
2535
2536
2537
2538
2539
2540
2541
2542
2543
2544
2545
2546
2547
2548
2549
2550
2551
2552
2553
2554
2555
2556
2557
2558
2559
2560
2561
2562
2563
2564
2565
2566
2567
2568
2569
2570
2571
2572
2573
2574
2575
2576
2577
2578
2579
2580
2581
2582
2583
2584
2585
2586
2587
2588
frame2.saida.setText(" Com o prefixo prop n~
ao se usa ligaç~
oes triplas,\n duplas ou
duas duplas");
}else{
frame2.saida.setForeground(Color.BLUE);
frame2.saida.setText(" Nome correto.\n \n Esta subst^
ancia é uma Cetona \n Possuindo
3 carbonos na cadeia principal (prop), \n ligaç~
ao simples ("+en+") e \n pertencendo
ao grupo oxigenado ("+al+")");
frame2.est.setText("\n \n
CC(=O)C ");
}
:}
| numero:nu PROP simples:en cetonas:al {:
if(Integer.parseInt(nu)>3){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Numero da posiç~
ao esta incorreto.\n Com o prefixo PROP
so podemos ter 3 carbonos na cadeia principal");
}else{
if(Integer.parseInt(nu)==2){
frame2.saida.setForeground(Color.BLUE);
frame2.saida.setText(" Nome correto.\n \n Esta subst^
ancia é uma Cetona
\n Possuindo 3 carbonos na cadeia principal (prop), \n ligaç~
ao simples
("+en+") e \n pertencendo ao grupo oxigenado ("+al+") localizado na posiç~
ao ("+nu+")");
frame2.est.setText("\n \n
CC(=O)C ");
}else{
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Nome incorreto.\n \n O grupo funcional é secundário
\n e com o prefixo prop só temos 3 carbonos\n portanto a posiç~
ao será a segunda.");
}
}
:}
| numero:nu PROP central:en cetonas:al {:
if(en.equals("an")){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Nome incorreto.\n \n Com ligaç~
ao simples n~
ao é necessário
informar posiç~
ao.");
}else{
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Com o prefixo prop n~
ao podemos utilizar as ligaç~
oes en, in, dien");
}
:}
| numero:num PROP central:en numero:nu cetonas:al {:
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Com o prefixo prop n~
ao podemos utilizar a ligaç~
oes en, in, dien");
:}
| numero:nume numero:b DIMETIL numero:nu PROP central:en numero:num cetonas:al {:
frame2.saida.setFont(new Font("Arial", Font.PLAIN, 15));
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Com o prefixo prop n~
ao podemos utilizar\n a ramificaç~
ao
dimetil, pois se colocarmos em suas\n extremidades n~
ao será mais um prop e sim
um pent. \n E no carbono 2 n~
ao podemos colocar,\n pois o grupo funcional da cetona é secundário.");
:}
| numero:nume numero:b DIMETIL numero:nu PROP central:en cetonas:al {:
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Com o prefixo prop n~
ao podemos utilizar\n a ramificaç~
ao
dimetil, pois se colocarmos em suas\n extremidades n~
ao será mais um prop e sim um
pent. \n E no carbono 2 n~
ao podemos colocar,\n pois o grupo funcional da cetona é secundário.");
:}
| numero:nume numero:b DIMETIL PROP central:en cetonas:al {:
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Com o prefixo prop n~
ao podemos utilizar\n a ramificaç~
ao dimetil,
pois se colocarmos em suas\n extremidades n~
ao será mais um prop e sim um pent. \n E
no carbono 2 n~
ao podemos colocar,\n pois o grupo funcional da cetona é secundário.");
:}
| numero:nume numero:b numero:c TRIMETIL numero:nu PROP central:en numero:num cetonas:al {:
frame2.saida.setFont(new Font("Arial", Font.PLAIN, 15));
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Nome incorreto.\n Com o prefixo PROP n~
ao podemos\n utilizar
da ramificaç~
ao TRIMETIL, pois\n n~
ao podemos ter mais que 3 carbonos");
:}
| numero:nume numero:b numero:c TRIMETIL numero:nu PROP central:en cetonas:al {:
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Nome incorreto.\n Com o prefixo PROP n~
ao podemos\n utilizar
da ramificaç~
ao TRIMETIL, pois\n n~
ao podemos ter mais que 3 carbonos");
:}
| numero:nume numero:b numero:c TRIMETIL PROP central:en cetonas:al {:
113
2589
2590
2591
2592
2593
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Nome incorreto.\n Com o prefixo PROP n~
ao podemos\n utilizar
da ramificaç~
ao TRIMETIL, pois\n n~
ao podemos ter mais que 3 carbonos");
:}
;
2594
2595
/* ************** Eteres **************** */
2596
2597
2598
2599
2600
2601
2602
2603
2604
2605
2606
2607
2608
2609
eter ::= eterMet:me
{: RESULT
| eterMetEt:mt
{: RESULT
| eterMetProp:mp
{: RESULT
| eterEt: ae
{: RESULT
| eterEtProp: ep
{: RESULT
| eterProp: ap
{: RESULT
;
= me; :}
= mt; :}
= mp; :}
= ae; :}
= ep; :}
= ap; :}
2610
2611
2612
2613
2614
2615
2616
2617
2618
2619
2620
2621
2622
2623
2624
2625
2626
eterMet ::= MET OXI ESPACO MET central:en hidrocarboneto:al {:
if(en.equals("in") || en.equals("en") || en.equals("adien")){
frame2.saida.setFont(new Font("Arial", Font.PLAIN, 15));
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Atenç~
ao, com o prefixo met n~
ao podemos utilizar este tipo de ligaç~
ao.");
}else{
frame2.saida.setForeground(Color.BLUE);
frame2.saida.setText(" Nome correto.\n \n Esta subst^
ancia é um Éter \n Possuindo 1
carbono (met) representando o carnono de menor radical,\n recebendo o radical (oxi)
\n e recebendo o nome do hidrocarboneto de maior radical \n com prefixo (met), ligaç~
ao
simples ("+en+") e \n pertencendo ao grupo hidrocarboneto ("+al+")");
frame2.est.setText("\n \n
C(O)C ");
}
:}
;
2627
2628
2629
2630
2631
2632
2633
2634
2635
2636
2637
2638
2639
2640
2641
2642
2643
2644
2645
2646
2647
2648
2649
2650
2651
2652
2653
2654
2655
2656
2657
2658
2659
2660
2661
2662
eterMetEt ::= MET OXI ESPACO numero:num ET central:en hidrocarboneto:al {:
if(Integer.parseInt(num) > 2){
frame2.saida.setFont(new Font("Arial", Font.PLAIN, 15));
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Numero da posiç~
ao esta incorreto.\n Com o prefixo ET so
podemos ter 2 carbonos na cadeia principal");
}else{
if(en.equals("an")){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Nome incorreto.\n N~
ao é permitido colocar posiç~
ao em ligaç~
ao simples.");
}else{
if(en.equals("adien")){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Nome incorreto.\n N~
ao é permitido este tipo de ligaç~
ao com prefixo et.");
}else{
if(Integer.parseInt(num) == 2){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Numero da ligaç~
ao esta incorreto.\n N~
ao podemos colocar a
ligaç~
ao neste carbono");
}else{
if(en.equals("en")){
frame2.saida.setForeground(Color.BLUE);
frame2.saida.setText(" Nome correto.\n \n Esta subst^
ancia é um Éter \n Possuindo 1
carbono (met) representando o carnono de menor radical,\n recebendo o radical (oxi)
\n e recebendo o nome do hidrocarboneto de maior radical \n com prefixo (met), ligaç~
ao
dupla ("+en+") e \n pertencendo ao grupo hidrocarboneto ("+al+")");
frame2.est.setText("\n \n
C(O)C=C ");
}else{
frame2.saida.setForeground(Color.BLUE);
frame2.saida.setText(" Nome correto.\n \n Esta subst^
ancia é um Éter \n Possuindo 1
carbono (met) representando o carnono de menor radical,\n recebendo o radical (oxi)
\n e recebendo o nome do hidrocarboneto de maior radical \n com prefixo (met), ligaç~
ao
tripla ("+en+") e \n pertencendo ao grupo hidrocarboneto ("+al+")");
frame2.est.setText("\n \n
C(O)C#C ");
}
114
}
2663
2664
2665
2666
2667
2668
2669
2670
2671
2672
2673
2674
2675
2676
2677
2678
2679
2680
2681
2682
2683
2684
2685
2686
2687
}
}
}
:}
| MET OXI ESPACO ET central:en hidrocarboneto:al {:
if(en.equals("in")|| en.equals("en")){
frame2.saida.setFont(new Font("Arial", Font.PLAIN, 15));
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Atenç~
ao, é necessario informar a posiç~
ao da ligaç~
ao.");
}else{
if(en.equals("adien")){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Nome incorreto.\n N~
ao é permitido este tipo de ligaç~
ao com prefixo et.");
}else{
frame2.saida.setForeground(Color.BLUE);
frame2.saida.setText(" Nome correto.\n \n Esta subst^
ancia é um Éter \n Possuindo 1
carbono (met) representando o carbono de menor radical,\n recebendo o radical (oxi)
\n e recebendo o nome do hidrocarboneto de maior radical \n com prefixo (met), ligaç~
ao
simples ("+en+") e \n pertencendo ao grupo hidrocarboneto ("+al+")");
frame2.est.setText("\n \n
C(O)CC ");
}
}
:}
;
2688
2689
2690
2691
2692
2693
2694
2695
2696
2697
2698
2699
2700
2701
2702
2703
2704
2705
2706
2707
2708
2709
2710
2711
2712
2713
2714
2715
2716
2717
2718
2719
2720
2721
2722
2723
2724
2725
2726
2727
2728
2729
2730
2731
2732
2733
2734
2735
2736
eterMetProp ::= MET OXI ESPACO numero:num PROP central:en hidrocarboneto:al {:
if(Integer.parseInt(num) > 3){
frame2.saida.setFont(new Font("Arial", Font.PLAIN, 15));
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Numero da posiç~
ao esta incorreto.\n Com o prefixo PROP so
podemos ter 3 carbonos na cadeia principal");
}else{
if(en.equals("an")){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Nome incorreto. \n N~
ao é permitido colocar posiç~
ao em ligaç~
ao simples.");
}else{
if(en.equals("adien")){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Nome incorreto.\n É nesessário informar duas posiç~
oes.");
}else{
if(Integer.parseInt(num) == 3){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Nome incorreto. \n N~
ao é permitido colocar ligaç~
ao neste carbono.");
}else{
if(en.equals("en")){
if(Integer.parseInt(num)==1){
frame2.saida.setForeground(Color.BLUE);
frame2.saida.setText(" Nome correto.\n \n Esta subst^
ancia é um Éter \n Possuindo 1
carbono (met) representando o carbono de menor radical,\n recebendo o radical (oxi)
\n e recebendo o nome do hidrocarboneto de maior radical \n com prefixo (prop), ligaç~
ao
dupla ("+en+") e \n pertencendo ao grupo hidrocarboneto ("+al+")");
frame2.est.setText("\n \n
C(O)C=CC ");
}else{
if(Integer.parseInt(num)==2){
frame2.saida.setForeground(Color.BLUE);
frame2.saida.setText(" Nome correto.\n \n Esta subst^
ancia é um Éter \n Possuindo 1
carbono (met) representando o carbono de menor radical,\n recebendo o radical (oxi)
\n e recebendo o nome do hidrocarboneto de maior radical \n com prefixo (prop), ligaç~
ao
dupla ("+en+") e \n pertencendo ao grupo hidrocarboneto ("+al+")");
frame2.est.setText("\n \n
C(O)CC=C ");
}
}
}else{
if(en.equals("in")){
if(Integer.parseInt(num)==1){
frame2.saida.setForeground(Color.BLUE);
frame2.saida.setText(" Nome correto.\n \n Esta subst^
ancia é um Éter \n Possuindo 1
carbono (met) representando o carbono de menor radical,\n recebendo o radical (oxi)
\n e recebendo o nome do hidrocarboneto de maior radical \n com prefixo (prop), ligaç~
ao
tripla ("+en+") e \n pertencendo ao grupo hidrocarboneto ("+al+")");
frame2.est.setText("\n \n
C(O)C#CC ");
}else{
if(Integer.parseInt(num)==2){
115
2737
2738
2739
2740
2741
2742
2743
2744
2745
2746
2747
2748
2749
2750
2751
2752
2753
2754
2755
2756
2757
2758
2759
2760
2761
2762
2763
2764
2765
2766
2767
2768
2769
2770
2771
2772
2773
2774
2775
2776
2777
2778
2779
2780
2781
2782
2783
2784
2785
2786
2787
2788
2789
2790
2791
2792
2793
2794
2795
2796
2797
2798
2799
2800
2801
2802
2803
2804
2805
2806
2807
2808
2809
2810
frame2.saida.setForeground(Color.BLUE);
frame2.saida.setText(" Nome correto.\n \n Esta subst^
ancia é um Éter \n Possuindo 1
carbono (met) representando o carbono de menor radical,\n recebendo o radical (oxi)
\n e recebendo o nome do hidrocarboneto de maior radical \n com prefixo (prop), ligaç~
ao
tripla ("+en+") e \n pertencendo ao grupo hidrocarboneto ("+al+")");
frame2.est.setText("\n \n
C(O)CC#C ");
}
}
}
}
}
}
}
}
:}
| MET OXI ESPACO PROP central:en hidrocarboneto:al {:
if(en.equals("in")|| en.equals("en")|| en.equals("adien")){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Atenç~
ao, é necessario informar a posiç~
ao da ligaç~
ao.");
}else{
frame2.saida.setForeground(Color.BLUE);
frame2.saida.setText(" Nome correto.\n \n Esta subst^
ancia é um Éter \n Possuindo 1
carbono (met) representando o carbono de menor radical,\n recebendo o radical (oxi)
\n e recebendo o nome do hidrocarboneto de maior radical \n com prefixo (prop), ligaç~
ao
simples ("+en+") e \n pertencendo ao grupo hidrocarboneto ("+al+")");
frame2.est.setText("\n \n
C(O)CCC ");
}
:}
| MET OXI ESPACO numero:nu numero:me PROP central:en hidrocarboneto:al {:
if(Integer.parseInt(nu)>3 || Integer.parseInt(me)>3){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Numero da posiç~
ao esta incorreto.\n Com o prefixo PROP so
podemos ter 3 carbonos na cadeia principal");
}else{
if(en.equals("in")|| en.equals("en")){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Nome incorreto.\n É necessario informar a posiç~
ao da
ligaç~
ao com apenas 1 posiç~
ao.");
}else{
if(en.equals("an")){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Nome incorreto.\n N~
ao é permitido colocar posiç~
ao em ligaç~
ao simples.");
}else{
if(Integer.parseInt(nu) == 3 || Integer.parseInt(me) == 3){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Nome incorreto. \n N~
ao é permitido colocar ligaç~
ao neste carbono.");
}else{
if(Integer.parseInt(nu)==1 && Integer.parseInt(me)==1){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Nome incorreto.\n N~
ao é possivel colocar as duas ligaç~
oes neste carbono.");
}else{
if(Integer.parseInt(nu)==2 && Integer.parseInt(me)==2){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Nome incorreto.\n N~
ao é possivel colocar as duas\n ligaç~
oes neste carbono.");
}else{
frame2.saida.setForeground(Color.BLUE);
frame2.saida.setText(" Nome correto.\n \n Esta subst^
ancia é um Éter \n Possuindo 1
carbono (met) representando o carbono de menor radical,\n recebendo o radical (oxi)
\n e recebendo o nome do hidrocarboneto de maior radical \n com prefixo (prop), duas
duplas ligaç~
oes ("+en+") e \n pertencendo ao grupo hidrocarboneto ("+al+")");
frame2.est.setText("\n \n
C(O)C=C=C ");
}
}
}
}
}
}
:}
| MET OXI ESPACO numero:ero METIL numero:num PROP central:en hidrocarboneto:al {:
if(Integer.parseInt(num) > 3 || Integer.parseInt(ero) > 3){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Numero da posiç~
ao esta incorreto.\n Com o prefixo PROP so
podemos ter 3 carbonos na cadeia principal");
}else{
116
2811
2812
2813
2814
2815
2816
2817
2818
2819
2820
2821
2822
2823
2824
2825
2826
2827
2828
2829
2830
2831
2832
2833
2834
2835
2836
2837
2838
2839
2840
2841
2842
2843
2844
2845
2846
2847
2848
2849
2850
2851
2852
2853
2854
2855
2856
2857
2858
2859
2860
2861
2862
2863
2864
2865
2866
2867
2868
2869
2870
2871
2872
2873
2874
2875
2876
2877
2878
2879
2880
2881
2882
2883
2884
if(Integer.parseInt(ero) == 1 || Integer.parseInt(ero) == 3){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Nome incorreto.\n Pois se colocar a ramificaç~
ao METIL na
posiç~
ao 1 ou 3\n n~
ao será mais um prop e sim um but");
}else{
if(en.equals("an")){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Nome incorreto. \n N~
ao é permitido colocar posiç~
ao em ligaç~
ao simples.");
}else{
if(en.equals("adien")){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Nome incorreto.\n É nesessário informar duas posiç~
oes.");
}else{
if(Integer.parseInt(num) == 3){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Nome incorreto. \n N~
ao é permitido colocar ligaç~
ao neste carbono.");
}else{
if(en.equals("en")){
if(Integer.parseInt(num)==1){
frame2.saida.setForeground(Color.BLUE);
frame2.saida.setText(" Nome correto.\n \n Esta subst^
ancia é um Éter \n Possuindo 1
carbono (met) representando o carbono de menor radical,\n recebendo o radical (oxi)
\n e recebendo o nome do hidrocarboneto de maior radical \n com prefixo (prop), ligaç~
ao
dupla ("+en+"), \n com ramificaç~
ao metil na posiç~
ao ("+ero+") e \n pertencendo ao grupo
hidrocarboneto ("+al+")");
frame2.est.setText("\n \n
C(O)C=C(C)C ");
}else{
if(Integer.parseInt(num)==2){
frame2.saida.setForeground(Color.BLUE);
frame2.saida.setText(" Nome correto.\n \n Esta subst^
ancia é um Éter \n Possuindo 1
carbono (met) representando o carbono de menor radical,\n recebendo o radical (oxi)
\n e recebendo o nome do hidrocarboneto de maior radical \n com prefixo (prop), ligaç~
ao
dupla ("+en+"), \n com ramificaç~
ao metil na posiç~
ao ("+ero+") e \n pertencendo ao grupo
hidrocarboneto ("+al+")");
frame2.est.setText("\n \n
C(O)CC=(C)C ");
}
}
}else{
if(en.equals("in")){
if(Integer.parseInt(num)==1){
frame2.saida.setForeground(Color.BLUE);
frame2.saida.setText(" Nome correto.\n \n Esta subst^
ancia é um Éter \n Possuindo 1
carbono (met) representando o carbono de menor radical,\n recebendo o radical (oxi)
\n e recebendo o nome do hidrocarboneto de maior radical \n com prefixo (prop), ligaç~
ao
tripla ("+en+"), \n com ramificaç~
ao metil na posiç~
ao ("+ero+") e \n pertencendo ao
grupo hidrocarboneto ("+al+")");
frame2.est.setText("\n \n
C(O)C#C(C)C ");
}else{
if(Integer.parseInt(num)==2){
frame2.saida.setForeground(Color.BLUE);
frame2.saida.setText(" Nome correto.\n \n Esta subst^
ancia é um Éter \n Possuindo 1
carbono (met) representando o carbono de menor radical,\n recebendo o radical (oxi)
\n e recebendo o nome do hidrocarboneto de maior radical \n com prefixo (prop), ligaç~
ao
tripla ("+en+"),\n com ramificaç~
ao metil na posiç~
ao ("+ero+") e \n pertencendo ao
grupo hidrocarboneto ("+al+")");
frame2.est.setText("\n \n
C(O)CC#(C)C ");
}
}
}
}
}
}
}
}
}
:}
| MET OXI ESPACO numero:ero METIL PROP central:en hidrocarboneto:al {:
if(Integer.parseInt(ero)>3){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Numero da posiç~
ao esta incorreto.\n Com o prefixo PROP
so podemos ter 3 carbonos na cadeia principal");
}else{
if(en.equals("in")|| en.equals("en")|| en.equals("adien")){
frame2.saida.setForeground(Color.RED);
117
2885
2886
2887
2888
2889
2890
2891
2892
2893
2894
2895
2896
2897
2898
2899
2900
2901
2902
2903
2904
2905
2906
2907
2908
2909
2910
2911
2912
2913
2914
2915
2916
2917
2918
2919
2920
2921
2922
2923
2924
2925
2926
2927
2928
2929
2930
2931
2932
2933
2934
2935
2936
2937
2938
2939
2940
2941
2942
2943
2944
2945
2946
2947
2948
2949
2950
frame2.saida.setText(" Atenç~
ao, é necessario informar a posiç~
ao da ligaç~
ao.");
}else{
if(Integer.parseInt(ero) == 1 || Integer.parseInt(ero) == 3){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Nome incorreto,\n Pois se colocar a ramificaç~
ao METIL na
posiç~
ao 1 ou 3\n n~
ao será mais um prop e sim um but");
}else{
frame2.saida.setForeground(Color.BLUE);
frame2.saida.setText(" Nome correto.\n \n Esta subst^
ancia é um Éter \n Possuindo 1
carbono (met) representando o carbono de menor radical,\n recebendo o radical (oxi)
\n e recebendo o nome do hidrocarboneto de maior radical \n com prefixo (prop), ligaç~
ao
simples ("+en+"),\n com ramificaç~
ao metil na posiç~
ao ("+ero+") e \n pertencendo ao
grupo hidrocarboneto ("+al+")");
frame2.est.setText("\n \n
C(O)CC(C)C ");
}
}
}
:}
| MET OXI ESPACO numero:ero METIL numero:nu numero:me PROP central:en hidrocarboneto:al {:
if(Integer.parseInt(nu)>3 || Integer.parseInt(me)>3 || Integer.parseInt(ero)>3){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Numero da posiç~
ao esta incorreto.\n Com o prefixo PROP
so podemos ter 3 carbonos na cadeia principal");
}else{
if(en.equals("in")|| en.equals("en")){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Nome incorreto.\n É necessario informar a posiç~
ao da
ligaç~
ao com apenas 1 posiç~
ao.");
}else{
if(Integer.parseInt(ero) == 1 || Integer.parseInt(ero) == 3){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Nome incorreto.\n Pois se colocar a ramificaç~
ao METIL na
posiç~
ao 1 ou 3\n n~
ao será mais um prop e sim um but");
}else{
if(en.equals("an")){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Nome incorreto.\n N~
ao é permitido colocar posiç~
ao em ligaç~
ao simples.");
}else{
if(Integer.parseInt(nu) == 3 || Integer.parseInt(me) == 3){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Nome incorreto. \n N~
ao é permitido colocar ligaç~
ao neste carbono.");
}else{
if(Integer.parseInt(nu)==1 && Integer.parseInt(me)==1){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Nome incorreto.\n N~
ao é possivel colocar as duas ligaç~
oes neste carbono.");
}else{
if(Integer.parseInt(nu)==2 && Integer.parseInt(me)==2){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Nome incorreto.\n N~
ao é possivel colocar as duas\n ligaç~
oes neste carbono.");
}else{
frame2.saida.setForeground(Color.BLUE);
frame2.saida.setText(" Nome correto.\n \n Esta subst^
ancia é um Éter \n Possuindo 1
carbono (met) representando o carbono de menor radical,\n recebendo o radical (oxi)
\n e recebendo o nome do hidrocarboneto de maior radical \n com prefixo (prop), duas
duplas ligaç~
oes ("+en+") na posiç~
ao ("+nu+","+me+"),\n com ramificaç~
ao metil na posiç~
ao
("+ero+") e \n pertencendo ao grupo hidrocarboneto ("+al+")");
frame2.est.setText("\n \n
C(O)C=C=(C)C ");
}
}
}
}
}
}
}
:}
;
2951
2952
2953
2954
2955
2956
2957
2958
eterEt ::= ET OXI ESPACO numero:num ET central:en hidrocarboneto:al {:
if(Integer.parseInt(num) > 2){
frame2.saida.setFont(new Font("Arial", Font.PLAIN, 15));
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Numero da posiç~
ao esta incorreto.\n Com o prefixo ET
so podemos ter 2 carbonos na cadeia principal");
118
2959
2960
2961
2962
2963
2964
2965
2966
2967
2968
2969
2970
2971
2972
2973
2974
2975
2976
2977
2978
2979
2980
2981
2982
2983
2984
2985
2986
2987
2988
2989
2990
2991
2992
2993
2994
2995
2996
2997
2998
2999
3000
3001
3002
3003
3004
3005
3006
3007
3008
3009
3010
3011
3012
3013
3014
3015
3016
3017
}else{
if(en.equals("an")){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Nome incorreto.\n N~
ao é permitido colocar posiç~
ao em ligaç~
ao simples.");
}else{
if(en.equals("adien")){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Nome incorreto.\n N~
ao é permitido este tipo de ligaç~
ao com prefixo et.");
}else{
if(Integer.parseInt(num) == 2){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Numero da ligaç~
ao esta incorreto.\n N~
ao podemos colocar
a ligaç~
ao neste carbono");
}else{
if(en.equals("en")){
frame2.saida.setForeground(Color.BLUE);
frame2.saida.setText(" Nome correto.\n \n Esta subst^
ancia é um Éter \n Possuindo 2
carbonos (et) representando o carnono de menor radical,\n recebendo o radical (oxi)
\n e recebendo o nome do hidrocarboneto de maior radical \n com prefixo (met), ligaç~
ao
dupla ("+en+") e \n pertencendo ao grupo hidrocarboneto ("+al+")");
frame2.est.setText("\n \n
CC(O)C=C ");
}else{
frame2.saida.setForeground(Color.BLUE);
frame2.saida.setText(" Nome correto.\n \n Esta subst^
ancia é um Éter \n Possuindo 2
carbonos (et) representando o carnono de menor radical,\n recebendo o radical (oxi)
\n e recebendo o nome do hidrocarboneto de maior radical \n com prefixo (met), ligaç~
ao
tripla ("+en+") e \n pertencendo ao grupo hidrocarboneto ("+al+")");
frame2.est.setText("\n \n
CC(O)C#C ");
}
}
}
}
}
:}
| ET OXI ESPACO ET central:en hidrocarboneto:al {:
if(en.equals("in")|| en.equals("en")){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Atenç~
ao, é necessario informar a posiç~
ao da ligaç~
ao.");
}else{
if(en.equals("adien")){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Nome incorreto.\n N~
ao é permitido este tipo de ligaç~
ao com prefixo et.");
}else{
frame2.saida.setForeground(Color.BLUE);
frame2.saida.setText(" Nome correto.\n \n Esta subst^
ancia é um Éter \n Possuindo 2
carbonos (et) representando o carbono de menor radical,\n recebendo o radical (oxi)
\n e recebendo o nome do hidrocarboneto de maior radical \n com prefixo (met), ligaç~
ao
simples ("+en+") e \n pertencendo ao grupo hidrocarboneto ("+al+")");
frame2.est.setText("\n \n
CC(O)CC ");
}
}
:}
| ET OXI ESPACO MET central:en hidrocarboneto:al {:
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Atenç~
ao,\n É necessario informar primeiro o prefixo\n que
indica o número de carbonos \n do menor radical e depois o nome do \n hidrocarboneto
correspondente \n ao maior radical.");
:}
;
3018
3019
3020
3021
3022
3023
3024
3025
3026
3027
3028
3029
3030
3031
3032
eterEtProp ::= ET OXI ESPACO numero:num PROP central:en hidrocarboneto:al {:
if(Integer.parseInt(num) > 3){
frame2.saida.setFont(new Font("Arial", Font.PLAIN, 15));
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Numero da posiç~
ao esta incorreto.\n Com o prefixo PROP so podemos
ter 3 carbonos na cadeia principal");
}else{
if(en.equals("an")){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Nome incorreto, \n N~
ao é permitido colocar posiç~
ao em ligaç~
ao simples.");
}else{
if(en.equals("adien")){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Nome incorreto,\n É nesessário informar duas posiç~
oes.");
119
3033
3034
3035
3036
3037
3038
3039
3040
3041
3042
3043
3044
3045
3046
3047
3048
3049
3050
3051
3052
3053
3054
3055
3056
3057
3058
3059
3060
3061
3062
3063
3064
3065
3066
3067
3068
3069
3070
3071
3072
3073
3074
3075
3076
3077
3078
3079
3080
3081
3082
3083
3084
3085
3086
3087
3088
3089
3090
3091
3092
3093
3094
3095
3096
3097
3098
3099
3100
3101
3102
3103
3104
3105
3106
}else{
if(Integer.parseInt(num) == 3){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Nome incorreto. \n N~
ao é permitido colocar ligaç~
ao neste carbono.");
}else{
if(en.equals("en")){
if(Integer.parseInt(num)==1){
frame2.saida.setForeground(Color.BLUE);
frame2.saida.setText(" Nome correto.\n \n Esta subst^
ancia é um Éter \n Possuindo 2
carbonos (et) representando o carbono de menor radical,\n recebendo o radical (oxi)
\n e recebendo o nome do hidrocarboneto de maior radical \n com prefixo (prop), ligaç~
ao
dupla ("+en+") e \n pertencendo ao grupo hidrocarboneto ("+al+")");
frame2.est.setText("\n \n
CC(O)C=CC ");
}else{
if(Integer.parseInt(num)==2){
frame2.saida.setForeground(Color.BLUE);
frame2.saida.setText(" Nome correto.\n \n Esta subst^
ancia é um Éter \n Possuindo 2
carbonos (et) representando o carbono de menor radical,\n recebendo o radical (oxi)
\n e recebendo o nome do hidrocarboneto de maior radical \n com prefixo (prop), ligaç~
ao
dupla ("+en+") e \n pertencendo ao grupo hidrocarboneto ("+al+")");
frame2.est.setText("\n \n
CC(O)CC=C ");
}
}
}else{
if(en.equals("in")){
if(Integer.parseInt(num)==1){
frame2.saida.setForeground(Color.BLUE);
frame2.saida.setText(" Nome correto.\n \n Esta subst^
ancia é um Éter \n Possuindo 2
carbonos (et) representando o carbono de menor radical,\n recebendo o radical (oxi)
\n e recebendo o nome do hidrocarboneto de maior radical \n com prefixo (prop), ligaç~
ao
tripla ("+en+") e \n pertencendo ao grupo hidrocarboneto ("+al+")");
frame2.est.setText("\n \n
CC(O)C#CC ");
}else{
if(Integer.parseInt(num)==2){
frame2.saida.setForeground(Color.BLUE);
frame2.saida.setText(" Nome correto.\n \n Esta subst^
ancia é um Éter \n Possuindo 2
carbonos (et) representando o carbono de menor radical,\n recebendo o radical (oxi)
\n e recebendo o nome do hidrocarboneto de maior radical \n com prefixo (prop), ligaç~
ao
tripla ("+en+") e \n pertencendo ao grupo hidrocarboneto ("+al+")");
frame2.est.setText("\n \n
CC(O)CC#C ");
}
}
}
}
}
}
}
}
:}
| ET OXI ESPACO PROP central:en hidrocarboneto:al {:
if(en.equals("in")|| en.equals("en")|| en.equals("adien")){
frame2.saida.setForeground(Color.BLUE);
frame2.saida.setText(" Atenç~
ao, é necessario informar a posiç~
ao da ligaç~
ao.");
}else{
frame2.saida.setForeground(Color.BLUE);
frame2.saida.setText(" Nome correto.\n \n Esta subst^
ancia é um Éter \n Possuindo 2
carbonos (et) representando o carbono de menor radical,\n recebendo o radical (oxi)
\n e recebendo o nome do hidrocarboneto de maior radical \n com prefixo (prop), ligaç~
ao
simples ("+en+") e \n pertencendo ao grupo hidrocarboneto ("+al+")");
frame2.est.setText("\n \n
CC(O)CCC ");
}
:}
| ET OXI ESPACO numero:nu numero:me PROP central:en hidrocarboneto:al {:
if(Integer.parseInt(nu)>3 || Integer.parseInt(me)>3){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Numero da posiç~
ao esta incorreto.\n Com o prefixo PROP so podemos
ter 3 carbonos na cadeia principal");
}else{
if(en.equals("in")|| en.equals("en")){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Nome incorreto.\n É necessario informar a posiç~
ao da ligaç~
ao
com apenas 1 posiç~
ao.");
}else{
if(en.equals("an")){
120
3107
3108
3109
3110
3111
3112
3113
3114
3115
3116
3117
3118
3119
3120
3121
3122
3123
3124
3125
3126
3127
3128
3129
3130
3131
3132
3133
3134
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Nome incorreto.\n N~
ao é permitido colocar posiç~
ao em ligaç~
ao simples.");
}else{
if(Integer.parseInt(nu) == 3 || Integer.parseInt(me) == 3){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Nome incorreto. \n N~
ao é permitido colocar ligaç~
ao neste carbono.");
}else{
if(Integer.parseInt(nu)==1 && Integer.parseInt(me)==1){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Nome incorreto.\n N~
ao é possivel colocar as duas ligaç~
oes neste carbono.");
}else{
if(Integer.parseInt(nu)==2 && Integer.parseInt(me)==2){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Nome incorreto.\n N~
ao é possivel colocar as duas\n ligaç~
oes neste carbono.");
}else{
frame2.saida.setForeground(Color.BLUE);
frame2.saida.setText(" Nome correto.\n \n Esta subst^
ancia é um Éter \n Possuindo 1
carbono (met) representando o carbono de menor radical,\n recebendo o radical (oxi)
\n e recebendo o nome do hidrocarboneto de maior radical \n com prefixo (prop), duas
duplas ligaç~
oes ("+en+") e \n pertencendo ao grupo hidrocarboneto ("+al+")");
frame2.est.setText("\n \n
CC(O)C=C=C ");
}
}
}
}
}
}
:}
3135
3136
3137
3138
3139
3140
3141
3142
3143
3144
3145
3146
3147
3148
3149
3150
3151
3152
3153
3154
3155
3156
3157
3158
3159
3160
3161
3162
3163
3164
3165
3166
3167
3168
3169
3170
3171
3172
3173
3174
3175
3176
3177
3178
3179
3180
| ET OXI ESPACO numero:ero METIL numero:num PROP central:en hidrocarboneto:al {:
if(Integer.parseInt(num) > 3 || Integer.parseInt(ero) > 3){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Numero da posiç~
ao esta incorreto.\n Com o prefixo PROP
so podemos ter 3 carbonos na cadeia principal");
}else{
if(Integer.parseInt(ero) == 1 || Integer.parseInt(ero) == 3){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Nome incorreto.\n Pois se colocar a ramificaç~
ao METIL na
posiç~
ao 1 ou 3\n n~
ao será mais um prop e sim um but");
}else{
if(en.equals("an")){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Nome incorreto, \n N~
ao é permitido colocar posiç~
ao em ligaç~
ao simples.");
}else{
if(en.equals("adien")){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Nome incorreto,\n É nesessário informar duas posiç~
oes.");
}else{
if(Integer.parseInt(num) == 3){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Nome incorreto. \n N~
ao é permitido colocar ligaç~
ao neste carbono.");
}else{
if(en.equals("en")){
if(Integer.parseInt(num)==1){
frame2.saida.setForeground(Color.BLUE);
frame2.saida.setText(" Nome correto.\n \n Esta subst^
ancia é um Éter \n Possuindo 2
carbonos (et) representando o carbono de menor radical,\n recebendo o radical (oxi)
\n e recebendo o nome do hidrocarboneto de maior radical \n com prefixo (prop), ligaç~
ao
dupla ("+en+"), \n com ramificaç~
ao metil na posiç~
ao ("+ero+") e \n pertencendo ao
grupo hidrocarboneto ("+al+")");
frame2.est.setText("\n \n
CC(O)C=C(C)C ");
}else{
if(Integer.parseInt(num)==2){
frame2.saida.setForeground(Color.BLUE);
frame2.saida.setText(" Nome correto.\n \n Esta subst^
ancia é um Éter \n Possuindo 2
carbonos (et) representando o carbono de menor radical,\n recebendo o radical (oxi)
\n e recebendo o nome do hidrocarboneto de maior radical \n com prefixo (prop), ligaç~
ao
dupla ("+en+"), \n com ramificaç~
ao metil na posiç~
ao ("+ero+") e \n pertencendo ao
grupo hidrocarboneto ("+al+")");
frame2.est.setText("\n \n
CC(O)CC=(C)C ");
}
}
}else{
if(en.equals("in")){
121
3181
3182
3183
3184
3185
3186
3187
3188
3189
3190
3191
3192
3193
3194
3195
3196
3197
3198
3199
3200
3201
3202
3203
3204
3205
3206
3207
3208
3209
3210
3211
3212
3213
3214
3215
3216
3217
3218
3219
3220
3221
3222
3223
3224
3225
3226
3227
3228
3229
3230
3231
3232
3233
3234
3235
3236
3237
3238
3239
3240
3241
3242
3243
3244
3245
3246
3247
3248
3249
3250
3251
3252
3253
3254
if(Integer.parseInt(num)==1){
frame2.saida.setForeground(Color.BLUE);
frame2.saida.setText(" Nome correto.\n \n Esta subst^
ancia é um Éter \n Possuindo 2
carbonos (et) representando o carbono de menor radical,\n recebendo o radical (oxi)
\n e recebendo o nome do hidrocarboneto de maior radical \n com prefixo (prop), ligaç~
ao
tripla ("+en+"), \n com ramificaç~
ao metil na posiç~
ao ("+ero+") e \n pertencendo ao
grupo hidrocarboneto ("+al+")");
frame2.est.setText("\n \n
CC(O)C#C(C)C ");
}else{
if(Integer.parseInt(num)==2){
frame2.saida.setForeground(Color.BLUE);
frame2.saida.setText(" Nome correto.\n \n Esta subst^
ancia é um Éter \n Possuindo 2
carbonos (et) representando o carbono de menor radical,\n recebendo o radical (oxi)
\n e recebendo o nome do hidrocarboneto de maior radical \n com prefixo (prop), ligaç~
ao
tripla ("+en+"),\n com ramificaç~
ao metil na posiç~
ao ("+ero+") e \n pertencendo ao
grupo hidrocarboneto ("+al+")");
frame2.est.setText("\n \n
CC(O)CC#(C)C ");
}
}
}
}
}
}
}
}
}
:}
| ET OXI ESPACO numero:ero METIL PROP central:en hidrocarboneto:al {:
if(Integer.parseInt(ero)>3){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Numero da posiç~
ao esta incorreto.\n Com o prefixo PROP
so podemos ter 3 carbonos na cadeia principal");
}else{
if(en.equals("in")|| en.equals("en")|| en.equals("adien")){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Atenç~
ao, é necessario informar a posiç~
ao da ligaç~
ao.");
}else{
if(Integer.parseInt(ero) == 1 || Integer.parseInt(ero) == 3){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Nome incorreto.\n Pois se colocar a ramificaç~
ao METIL na posiç~
ao
1 ou 3\n n~
ao será mais um prop e sim um but");
}else{
frame2.saida.setForeground(Color.BLUE);
frame2.saida.setText(" Nome correto.\n \n Esta subst^
ancia é um Éter \n Possuindo 2
carbonos (et) representando o carbono de menor radical,\n recebendo o radical (oxi)
\n e recebendo o nome do hidrocarboneto de maior radical \n com prefixo (prop), ligaç~
ao
simples ("+en+"),\n com ramificaç~
ao metil na posiç~
ao ("+ero+") e \n pertencendo ao
grupo hidrocarboneto ("+al+")");
frame2.est.setText("\n \n
CC(O)CC(C)C ");
}
}
}
:}
| ET OXI ESPACO numero:ero METIL numero:nu numero:me PROP central:en hidrocarboneto:al {:
if(Integer.parseInt(nu)>3 || Integer.parseInt(me)>3 || Integer.parseInt(ero)>3){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Numero da posiç~
ao esta incorreto.\n Com o prefixo PROP
so podemos ter 3 carbonos na cadeia principal");
}else{
if(en.equals("in")|| en.equals("en")){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Nome incorreto.\n É necessario informar a posiç~
ao da
ligaç~
ao com apenas 1 posiç~
ao.");
}else{
if(Integer.parseInt(ero) == 1 || Integer.parseInt(ero) == 3){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Nome incorreto.\n Pois se colocar a ramificaç~
ao METIL
na posiç~
ao 1 ou 3\n n~
ao será mais um prop e sim um but");
}else{
if(en.equals("an")){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Nome incorreto.\n N~
ao é permitido colocar posiç~
ao em ligaç~
ao simples.");
}else{
if(Integer.parseInt(nu) == 3 || Integer.parseInt(me) == 3){
122
3255
3256
3257
3258
3259
3260
3261
3262
3263
3264
3265
3266
3267
3268
3269
3270
3271
3272
3273
3274
3275
3276
3277
3278
3279
3280
3281
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Nome incorreto. \n N~
ao é permitido colocar ligaç~
ao neste carbono.");
}else{
if(Integer.parseInt(nu)==1 && Integer.parseInt(me)==1){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Nome incorreto.\n N~
ao é possivel colocar as duas ligaç~
oes neste carbono.");
}else{
if(Integer.parseInt(nu)==2 && Integer.parseInt(me)==2){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Nome incorreto.\n N~
ao é possivel colocar as duas\n ligaç~
oes neste carbono.");
}else{
frame2.saida.setForeground(Color.BLUE);
frame2.saida.setText(" Nome correto.\n \n Esta subst^
ancia é um Éter \n Possuindo 2
carbonos (et) representando o carbono de menor radical,\n recebendo o radical (oxi)
\n e recebendo o nome do hidrocarboneto de maior radical \n com prefixo (prop), duas
duplas ligaç~
oes ("+en+") na posiç~
ao ("+nu+","+me+"),\n com ramificaç~
ao metil na posiç~
ao
("+ero+") e \n pertencendo ao grupo hidrocarboneto ("+al+")");
frame2.est.setText("\n \n
CC(O)C=C=(C)C ");
}
}
}
}
}
}
}
:}
;
3282
3283
3284
3285
3286
3287
3288
3289
3290
3291
3292
3293
3294
3295
3296
3297
3298
3299
3300
3301
3302
3303
3304
3305
3306
3307
3308
3309
3310
3311
3312
3313
3314
3315
3316
3317
3318
3319
3320
3321
3322
3323
3324
3325
3326
3327
3328
eterProp ::= PROP OXI ESPACO numero:num PROP central:en hidrocarboneto:al {:
if(Integer.parseInt(num) > 3){
frame2.saida.setFont(new Font("Arial", Font.PLAIN, 15));
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Numero da posiç~
ao esta incorreto.\n Com o prefixo PROP
so podemos ter 3 carbonos na cadeia principal");
}else{
if(en.equals("an")){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Nome incorreto, \n N~
ao é permitido colocar posiç~
ao em ligaç~
ao simples.");
}else{
if(en.equals("adien")){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Nome incorreto,\n É nesessário informar duas posiç~
oes.");
}else{
if(Integer.parseInt(num) == 3){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Nome incorreto. \n N~
ao é permitido colocar ligaç~
ao neste carbono.");
}else{
if(en.equals("en")){
if(Integer.parseInt(num)==1){
frame2.saida.setForeground(Color.BLUE);
frame2.saida.setText(" Nome correto.\n \n Esta subst^
ancia é um Éter \n Possuindo 3
carbonos (prop) representando o carbono de menor radical,\n recebendo o radical (oxi)
\n e recebendo o nome do hidrocarboneto de maior radical \n com prefixo (prop), ligaç~
ao
dupla ("+en+") e \n pertencendo ao grupo hidrocarboneto ("+al+")");
frame2.est.setText("\n \n
CCC(O)C=CC ");
}else{
if(Integer.parseInt(num)==2){
frame2.saida.setForeground(Color.BLUE);
frame2.saida.setText(" Nome correto.\n \n Esta subst^
ancia é um Éter \n Possuindo 3
carbonos (prop) representando o carbono de menor radical,\n recebendo o radical (oxi)
\n e recebendo o nome do hidrocarboneto de maior radical \n com prefixo (prop), ligaç~
ao
dupla ("+en+") e \n pertencendo ao grupo hidrocarboneto ("+al+")");
frame2.est.setText("\n \n
CCC(O)CC=C ");
}
}
}else{
if(en.equals("in")){
if(Integer.parseInt(num)==1){
frame2.saida.setForeground(Color.BLUE);
frame2.saida.setText(" Nome correto.\n \n Esta subst^
ancia é um Éter \n Possuindo 3
carbonos (prop) representando o carbono de menor radical,\n recebendo o radical (oxi)
\n e recebendo o nome do hidrocarboneto de maior radical \n com prefixo (prop), ligaç~
ao
tripla ("+en+") e \n pertencendo ao grupo hidrocarboneto ("+al+")");
frame2.est.setText("\n \n
CCC(O)C#CC ");
123
3329
3330
3331
3332
3333
3334
3335
3336
3337
3338
3339
3340
3341
3342
3343
3344
3345
}else{
if(Integer.parseInt(num)==2){
frame2.saida.setForeground(Color.BLUE);
frame2.saida.setText(" Nome correto.\n \n Esta subst^
ancia é um Éter \n Possuindo 3
carbonos (prop) representando o carbono de menor radical,\n recebendo o radical (oxi)
\n e recebendo o nome do hidrocarboneto de maior radical \n com prefixo (prop), ligaç~
ao
tripla ("+en+") e \n pertencendo ao grupo hidrocarboneto ("+al+")");
frame2.est.setText("\n \n
CCC(O)CC#C ");
}
}
}
}
}
}
}
}
:}
3346
3347
3348
3349
3350
3351
3352
3353
3354
3355
3356
3357
3358
3359
3360
3361
3362
3363
3364
3365
3366
3367
3368
3369
3370
3371
3372
3373
3374
3375
3376
3377
3378
3379
3380
3381
3382
3383
3384
3385
3386
3387
3388
3389
3390
3391
3392
3393
3394
3395
3396
3397
3398
3399
3400
3401
3402
| PROP OXI ESPACO PROP central:en hidrocarboneto:al {:
if(en.equals("in")|| en.equals("en")|| en.equals("adien")){
frame2.saida.setForeground(Color.BLUE);
frame2.saida.setText(" Atenç~
ao, é necessario informar a posiç~
ao da ligaç~
ao.");
}else{
frame2.saida.setForeground(Color.BLUE);
frame2.saida.setText(" Nome correto.\n \n Esta subst^
ancia é um Éter \n
Possuindo 3 carbonos (prop) representando o carbono de menor radical,\n
recebendo o radical (oxi) \n e recebendo o nome do hidrocarboneto de maior
radical \n com prefixo (prop), ligaç~
ao simples ("+en+") e \n pertencendo ao
grupo hidrocarboneto ("+al+")");
frame2.est.setText("\n \n
CCC(O)CCC ");
}
:}
| PROP OXI ESPACO MET central:en hidrocarboneto:al {:
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Atenç~
ao,\n É necessario informar primeiro o prefixo\n
que indica o número de carbonos \n do menor radical e depois o nome do \n
hidrocarboneto correspondente \n ao maior radical.");
:}
| PROP OXI ESPACO ET central:en hidrocarboneto:al {:
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Atenç~
ao,\n É necessario informar primeiro o prefixo\n
que indica o número de carbonos \n do menor radical e depois o nome do \n
hidrocarboneto correspondente \n ao maior radical.");
:}
| PROP OXI ESPACO numero:nu numero:me PROP central:en hidrocarboneto:al {:
if(Integer.parseInt(nu)>3 || Integer.parseInt(me)>3){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Numero da posiç~
ao esta incorreto.\n Com o prefixo
PROP so podemos ter 3 carbonos na cadeia principal");
}else{
if(en.equals("in")|| en.equals("en")){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Nome incorreto.\n É necessario informar a posiç~
ao
da ligaç~
ao com apenas 1 posiç~
ao.");
}else{
if(en.equals("an")){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Nome incorreto.\n N~
ao é permitido colocar posiç~
ao
em ligaç~
ao simples.");
}else{
if(Integer.parseInt(nu) == 3 || Integer.parseInt(me) == 3){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Nome incorreto. \n N~
ao é permitido colocar ligaç~
ao neste carbono.");
}else{
frame2.saida.setForeground(Color.BLUE);
frame2.saida.setText(" Nome correto.\n \n Esta subst^
ancia é um Éter \n Possuindo 3
carbonos (prop) representando o carbono de menor radical,\n recebendo o radical (oxi)
\n e recebendo o nome do hidrocarboneto de maior radical \n com prefixo (prop), duas
duplas ligaç~
oes ("+en+") e \n pertencendo ao grupo hidrocarboneto ("+al+")");
frame2.est.setText("\n \n
CCC(O)C=C=C ");
}
}
}
}
124
3403
:}
3404
3405
3406
3407
3408
3409
3410
3411
3412
3413
3414
3415
3416
3417
3418
3419
3420
3421
3422
3423
3424
3425
3426
3427
3428
3429
3430
3431
3432
3433
3434
3435
3436
3437
3438
3439
3440
3441
3442
3443
3444
3445
3446
3447
3448
3449
3450
3451
3452
3453
3454
3455
3456
3457
3458
3459
3460
3461
3462
3463
3464
3465
3466
3467
3468
3469
3470
3471
3472
3473
3474
3475
3476
| PROP OXI ESPACO numero:ero METIL numero:num PROP central:en hidrocarboneto:al {:
if(Integer.parseInt(num) > 3 || Integer.parseInt(ero) > 3){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Numero da posiç~
ao esta incorreto.\n Com o prefixo PROP
so podemos ter 3 carbonos na cadeia principal");
}else{
if(Integer.parseInt(ero) == 1 || Integer.parseInt(ero) == 3){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Nome incorreto,\n Pois se colocar a ramificaç~
ao METIL na
posiç~
ao 1 ou 3\n n~
ao será mais um prop e sim um but");
}else{
if(en.equals("an")){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Nome incorreto, \n N~
ao é permitido colocar posiç~
ao em ligaç~
ao simples.");
}else{
if(en.equals("adien")){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Nome incorreto,\n É nesessário informar duas posiç~
oes.");
}else{
if(Integer.parseInt(num) == 3){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Nome incorreto. \n N~
ao é permitido colocar ligaç~
ao neste carbono.");
}else{
if(en.equals("en")){
if(Integer.parseInt(num)==1){
frame2.saida.setForeground(Color.BLUE);
frame2.saida.setText(" Nome correto.\n \n Esta subst^
ancia é um Éter \n Possuindo 3
carbonos (prop) representando o carbono de menor radical,\n recebendo o radical (oxi)
\n e recebendo o nome do hidrocarboneto de maior radical \n com prefixo (prop), ligaç~
ao
dupla ("+en+"), \n com ramificaç~
ao metil na posiç~
ao ("+ero+") e \n pertencendo ao
grupo hidrocarboneto ("+al+")");
frame2.est.setText("\n \n
CCC(O)C=C(C)C ");
}else{
if(Integer.parseInt(num)==2){
frame2.saida.setForeground(Color.BLUE);
frame2.saida.setText(" Nome correto.\n \n Esta subst^
ancia é um Éter \n Possuindo 3
carbonos (prop) representando o carbono de menor radical,\n recebendo o radical (oxi)
\n e recebendo o nome do hidrocarboneto de maior radical \n com prefixo (prop), ligaç~
ao
dupla ("+en+"), \n com ramificaç~
ao metil na posiç~
ao ("+ero+") e \n pertencendo ao
grupo hidrocarboneto ("+al+")");
frame2.est.setText("\n \n
CCC(O)CC=(C)C ");
}
}
}else{
if(en.equals("in")){
if(Integer.parseInt(num)==1){
frame2.saida.setForeground(Color.BLUE);
frame2.saida.setText(" Nome correto.\n \n Esta subst^
ancia é um Éter \n Possuindo 3
carbonos (prop) representando o carbono de menor radical,\n recebendo o radical (oxi)
\n e recebendo o nome do hidrocarboneto de maior radical \n com prefixo (prop), ligaç~
ao
tripla ("+en+"), \n com ramificaç~
ao metil na posiç~
ao ("+ero+") e \n pertencendo ao
grupo hidrocarboneto ("+al+")");
frame2.est.setText("\n \n
CCC(O)C#C(C)C ");
}else{
if(Integer.parseInt(num)==2){
frame2.saida.setForeground(Color.BLUE);
frame2.saida.setText(" Nome correto.\n \n Esta subst^
ancia é um Éter \n Possuindo 3
carbonos (prop) representando o carbono de menor radical,\n recebendo o radical (oxi)
\n e recebendo o nome do hidrocarboneto de maior radical \n com prefixo (prop), ligaç~
ao
tripla ("+en+"),\n com ramificaç~
ao metil na posiç~
ao ("+ero+") e \n pertencendo ao
grupo hidrocarboneto ("+al+")");
frame2.est.setText("\n \n
CCC(O)CC#(C)C ");
}
}
}
}
}
}
}
}
}
:}
125
3477
3478
3479
3480
3481
3482
3483
3484
3485
3486
3487
3488
3489
3490
3491
3492
3493
3494
3495
3496
3497
3498
3499
3500
3501
3502
3503
3504
3505
3506
3507
3508
3509
3510
3511
3512
3513
3514
3515
3516
3517
3518
3519
3520
3521
3522
3523
3524
3525
3526
3527
3528
3529
3530
3531
3532
3533
3534
3535
3536
3537
3538
3539
3540
| PROP OXI ESPACO numero:ero METIL PROP central:en hidrocarboneto:al {:
if(Integer.parseInt(ero)>3){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Numero da posiç~
ao esta incorreto.\n Com o prefixo PROP
so podemos ter 3 carbonos na cadeia principal");
}else{
if(en.equals("in")|| en.equals("en")|| en.equals("adien")){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Atenç~
ao, é necessario informar a posiç~
ao da ligaç~
ao.");
}else{
if(Integer.parseInt(ero) == 1 || Integer.parseInt(ero) == 3){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Nome incorreto,\n Pois se colocar a ramificaç~
ao METIL na
posiç~
ao 1 ou 3\n n~
ao será mais um prop e sim um but");
}else{
frame2.saida.setForeground(Color.BLUE);
frame2.saida.setText(" Nome correto.\n \n Esta subst^
ancia é um Éter \n Possuindo 3
carbonos (prop) representando o carbono de menor radical,\n recebendo o radical (oxi)
\n e recebendo o nome do hidrocarboneto de maior radical \n com prefixo (prop), ligaç~
ao
simples ("+en+"),\n com ramificaç~
ao metil na posiç~
ao ("+ero+") e \n pertencendo ao
grupo hidrocarboneto ("+al+")");
frame2.est.setText("\n \n
CCC(O)CC(C)C ");
}
}
}
:}
| PROP OXI ESPACO numero:ero METIL numero:nu numero:me PROP central:en hidrocarboneto:al {:
if(Integer.parseInt(nu)>3 || Integer.parseInt(me)>3 || Integer.parseInt(ero)>3){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Numero da posiç~
ao esta incorreto.\n Com o prefixo PROP
so podemos ter 3 carbonos na cadeia principal");
}else{
if(en.equals("in")|| en.equals("en")){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Nome incorreto.\n É necessario informar a posiç~
ao da
ligaç~
ao com apenas 1 posiç~
ao.");
}else{
if(Integer.parseInt(ero) == 1 || Integer.parseInt(ero) == 3){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Nome incorreto,\n Pois se colocar a ramificaç~
ao METIL na
posiç~
ao 1 ou 3\n n~
ao será mais um prop e sim um but");
}else{
if(en.equals("an")){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Nome incorreto.\n N~
ao é permitido colocar posiç~
ao em ligaç~
ao simples.");
}else{
if(Integer.parseInt(nu) == 3 || Integer.parseInt(me) == 3){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Nome incorreto. \n N~
ao é permitido colocar ligaç~
ao neste carbono.");
}else{
frame2.saida.setForeground(Color.BLUE);
frame2.saida.setText(" Nome correto.\n \n Esta subst^
ancia é um Éter \n Possuindo 3
carbonos (prop) representando o carbono de menor radical,\n recebendo o radical (oxi)
\n e recebendo o nome do hidrocarboneto de maior radical \n com prefixo (prop), duas duplas
ligaç~
oes ("+en+") na posiç~
ao ("+nu+","+me+"),\n com ramificaç~
ao metil na posiç~
ao ("+ero+")
e \n pertencendo ao grupo hidrocarboneto ("+al+")");
frame2.est.setText("\n \n
CCC(O)C=C=(C)C ");
}
}
}
}
}
:}
3541
3542
3543
3544
3545
3546
3547
3548
3549
3550
| numero:eroo METIL PROP OXI ESPACO numero:num PROP central:en hidrocarboneto:al {:
if(Integer.parseInt(num) > 3 || Integer.parseInt(eroo) > 3){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Numero da posiç~
ao esta incorreto.\n Com o prefixo PROP
so podemos ter 3 carbonos na cadeia principal");
}else{
if(en.equals("an")){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Nome incorreto, \n N~
ao é permitido colocar posiç~
ao em ligaç~
ao simples.");
126
3551
3552
3553
3554
3555
3556
3557
3558
3559
3560
3561
3562
3563
3564
3565
3566
3567
3568
3569
3570
3571
3572
3573
3574
3575
3576
3577
3578
3579
3580
3581
3582
3583
3584
3585
3586
3587
3588
3589
3590
3591
3592
3593
3594
3595
3596
3597
3598
3599
3600
3601
3602
3603
3604
3605
3606
3607
3608
3609
3610
3611
3612
3613
3614
3615
3616
3617
3618
3619
3620
3621
3622
3623
3624
}else{
if(en.equals("adien")){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Nome incorreto,\n É nesessário informar duas posiç~
oes.");
}else{
if(Integer.parseInt(num) == 3){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Nome incorreto. \n N~
ao é permitido colocar ligaç~
ao neste carbono.");
}else{
if(Integer.parseInt(eroo) == 1 || Integer.parseInt(eroo) == 3){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Nome incorreto.\n Pois se colocar a ramificaç~
ao METIL na
posiç~
ao 1 ou 3\n n~
ao será mais um prop e sim um but");
}else{
if(en.equals("en")){
if(Integer.parseInt(num)==1){
frame2.saida.setForeground(Color.BLUE);
frame2.saida.setText(" Nome correto.\n \n Esta subst^
ancia é um Éter \n Possuindo 3
carbonos (prop) representando o carbono de menor radical\n recebendo o radical (oxi),
\n contendo uma ramificaç~
ao metil na posiç~
ao("+eroo+"), \n e recebendo o nome do
hidrocarboneto de maior radical \n com prefixo (prop), ligaç~
ao dupla ("+en+") e \n
pertencendo ao grupo hidrocarboneto ("+al+")");
frame2.est.setText("\n \n
CC(C)C(O)C=CC ");
}else{
if(Integer.parseInt(num)==2){
frame2.saida.setForeground(Color.BLUE);
frame2.saida.setText(" Nome correto.\n \n Esta subst^
ancia é um Éter \n Possuindo 3
carbonos (prop) representando o carbono de menor radical,\n recebendo o radical (oxi),
\n contendo uma ramificaç~
ao metil na posiç~
ao("+eroo+"), \n e recebendo o nome do
hidrocarboneto de maior radical \n com prefixo (prop), ligaç~
ao dupla ("+en+") e \n
pertencendo ao grupo hidrocarboneto ("+al+")");
frame2.est.setText("\n \n
CC(C)C(O)CC=C ");
}
}
}else{
if(en.equals("in")){
if(Integer.parseInt(num)==1){
frame2.saida.setForeground(Color.BLUE);
frame2.saida.setText(" Nome correto.\n \n Esta subst^
ancia é um Éter \n Possuindo 3
carbonos (prop) representando o carbono de menor radical,\n recebendo o radical (oxi),
\n contendo uma ramificaç~
ao metil na posiç~
ao("+eroo+"), \n e recebendo o nome do
hidrocarboneto de maior radical \n com prefixo (prop), ligaç~
ao tripla ("+en+") e \n
pertencendo ao grupo hidrocarboneto ("+al+")");
frame2.est.setText("\n \n
CC(C)C(O)C#CC ");
}else{
if(Integer.parseInt(num)==2){
frame2.saida.setForeground(Color.BLUE);
frame2.saida.setText(" Nome correto.\n \n Esta subst^
ancia é um Éter \n Possuindo 3
carbonos (prop) representando o carbono de menor radical,\n recebendo o radical (oxi),
\n contendo uma ramificaç~
ao metil na posiç~
ao("+eroo+"), \n e recebendo o nome do
hidrocarboneto de maior radical \n com prefixo (prop), ligaç~
ao tripla ("+en+") e \n
pertencendo ao grupo hidrocarboneto ("+al+")");
frame2.est.setText("\n \n
CC(C)C(O)CC#C ");
}
}
}
}
}
}
}
}
}
:}
| numero:eroo METIL PROP OXI ESPACO PROP central:en hidrocarboneto:al {:
if(en.equals("in")|| en.equals("en")|| en.equals("adien")){
frame2.saida.setForeground(Color.BLUE);
frame2.saida.setText(" Atenç~
ao, é necessario informar a posiç~
ao da ligaç~
ao.");
}else{
if(Integer.parseInt(eroo) == 1 || Integer.parseInt(eroo) == 3){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Nome incorreto.\n Pois se colocar a ramificaç~
ao METIL na
posiç~
ao 1 ou 3\n n~
ao será mais um prop e sim um but");
}else{
frame2.saida.setForeground(Color.BLUE);
127
3625
3626
3627
3628
3629
3630
3631
3632
3633
3634
3635
3636
3637
3638
3639
3640
3641
3642
3643
3644
3645
3646
3647
3648
3649
3650
3651
3652
3653
3654
3655
3656
3657
3658
3659
3660
3661
3662
3663
3664
3665
3666
3667
3668
3669
3670
3671
3672
3673
3674
3675
3676
3677
3678
3679
3680
3681
3682
3683
3684
3685
3686
3687
3688
3689
3690
3691
3692
3693
3694
3695
3696
3697
3698
frame2.saida.setText(" Nome correto.\n \n Esta subst^
ancia é um Éter \n Possuindo 3
carbonos (prop) representando o carbono de menor radical,\n recebendo o radical (oxi),
\n contendo uma ramificaç~
ao metil na posiç~
ao("+eroo+"), \n e recebendo o nome do
hidrocarboneto de maior radical \n com prefixo (prop), ligaç~
ao simples ("+en+") e
\n pertencendo ao grupo hidrocarboneto ("+al+")");
frame2.est.setText("\n \n
CC(C)C(O)CCC ");
}
}
:}
| numero:eroo METIL PROP OXI ESPACO numero:nu numero:me PROP central:en hidrocarboneto:al {:
if(Integer.parseInt(nu)>3 || Integer.parseInt(me)>3 || Integer.parseInt(eroo) >3){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Numero da posiç~
ao esta incorreto.\n Com o prefixo PROP
so podemos ter 3 carbonos na cadeia principal");
}else{
if(en.equals("in")|| en.equals("en")){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Nome incorreto.\n É necessario informar a posiç~
ao da
ligaç~
ao com apenas 1 posiç~
ao.");
}else{
if(en.equals("an")){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Nome incorreto.\n N~
ao é permitido colocar posiç~
ao em ligaç~
ao simples.");
}else{
if(Integer.parseInt(eroo) == 1 || Integer.parseInt(eroo) == 3){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Nome incorreto.\n Pois se colocar a ramificaç~
ao METIL na
posiç~
ao 1 ou 3\n n~
ao será mais um prop e sim um but");
}else{
if(Integer.parseInt(nu) == 3 || Integer.parseInt(me) == 3){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Nome incorreto. \n N~
ao é permitido colocar ligaç~
ao neste carbono.");
}else{
frame2.saida.setForeground(Color.BLUE);
frame2.saida.setText(" Nome correto.\n \n Esta subst^
ancia é um Éter \n Possuindo 3
carbonos (prop) representando o carbono de menor radical,\n recebendo o radical (oxi),
\n contendo uma ramificaç~
ao metil na posiç~
ao("+eroo+"), \n e recebendo o nome do
hidrocarboneto de maior radical \n com prefixo (prop), duas duplas ligaç~
oes ("+nu+","+me+")
e \n pertencendo ao grupo hidrocarboneto ("+al+")");
frame2.est.setText("\n \n
CC(C)C(O)C=C=C ");
}
}
}
}
}
:}
| numero: eroo METIL PROP OXI ESPACO numero:ero METIL numero:num PROP central:en hidrocarboneto:al {:
if(Integer.parseInt(num) > 3 || Integer.parseInt(ero) > 3||Integer.parseInt(eroo) > 3){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Numero da posiç~
ao esta incorreto.\n Com o prefixo PROP
so podemos ter 3 carbonos na cadeia principal");
}else{
if(Integer.parseInt(ero) == 1 || Integer.parseInt(ero) == 3){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Nome incorreto.\n Pois se colocar a ramificaç~
ao METIL
na posiç~
ao 1 ou 3\n n~
ao será mais um prop e sim um but");
}else{
if(Integer.parseInt(eroo) == 1 || Integer.parseInt(eroo) == 3){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Nome incorreto.\n Pois se colocar a ramificaç~
ao METIL
na posiç~
ao 1 ou 3\n n~
ao será mais um prop e sim um but");
}else{
if(en.equals("an")){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Nome incorreto. \n N~
ao é permitido colocar posiç~
ao em ligaç~
ao simples.");
}else{
if(en.equals("adien")){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Nome incorreto.\n É nesessário informar duas posiç~
oes.");
}else{
if(Integer.parseInt(num) == 3){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Nome incorreto. \n N~
ao é permitido colocar ligaç~
ao neste carbono.");
}else{
128
3699
3700
3701
3702
3703
3704
3705
3706
3707
3708
3709
3710
3711
3712
3713
3714
3715
3716
3717
3718
3719
3720
3721
3722
3723
3724
3725
3726
3727
3728
3729
3730
3731
3732
3733
3734
3735
3736
3737
3738
3739
3740
3741
3742
3743
3744
3745
3746
3747
3748
3749
3750
3751
3752
3753
3754
3755
3756
3757
3758
3759
3760
3761
3762
3763
3764
3765
3766
3767
3768
3769
3770
3771
3772
if(en.equals("en")){
if(Integer.parseInt(num)==1){
frame2.saida.setForeground(Color.BLUE);
frame2.saida.setText(" Nome correto.\n \n Esta subst^
ancia é um Éter \n Possuindo 3
carbonos (prop) representando o carbono de menor radical,\n recebendo o radical (oxi),
\n com ramificaç~
ao metil na posiç~
ao ("+eroo+") \n e recebendo o nome do hidrocarboneto
de maior radical \n com prefixo (prop), ligaç~
ao dupla ("+en+"), \n com ramificaç~
ao metil
na posiç~
ao ("+ero+") e \n pertencendo ao grupo hidrocarboneto ("+al+")");
frame2.est.setText("\n \n
CC(C)C(O)C=C(C)C ");
}else{
if(Integer.parseInt(num)==2){
frame2.saida.setForeground(Color.BLUE);
frame2.saida.setText(" Nome correto.\n \n Esta subst^
ancia é um Éter \n Possuindo 3
carbonos (prop) representando o carbono de menor radical,\n recebendo o radical (oxi),
\n com ramificaç~
ao metil na posiç~
ao ("+eroo+") \n e recebendo o nome do hidrocarboneto
de maior radical \n com prefixo (prop), ligaç~
ao dupla ("+en+"), \n com ramificaç~
ao metil
na posiç~
ao ("+ero+") e \n pertencendo ao grupo hidrocarboneto ("+al+")");
frame2.est.setText("\n \n
CC(C)C(O)CC=(C)C ");
}
}
}else{
if(en.equals("in")){
if(Integer.parseInt(num)==1){
frame2.saida.setForeground(Color.BLUE);
frame2.saida.setText(" Nome correto.\n \n Esta subst^
ancia é um Éter \n Possuindo 2
carbonos (prop) representando o carbono de menor radical,\n recebendo o radical (oxi),
\n com ramificaç~
ao metil na posiç~
ao ("+eroo+") \n e recebendo o nome do hidrocarboneto
de maior radical \n com prefixo (prop), ligaç~
ao tripla ("+en+"), \n com ramificaç~
ao metil
na posiç~
ao ("+ero+") e \n pertencendo ao grupo hidrocarboneto ("+al+")");
frame2.est.setText("\n \n
CC(C)C(O)C#C(C)C ");
}else{
if(Integer.parseInt(num)==2){
frame2.saida.setForeground(Color.BLUE);
frame2.saida.setText(" Nome correto.\n \n Esta subst^
ancia é um Éter \n Possuindo 2
carbonos (prop) representando o carbono de menor radical,\n recebendo o radical (oxi),
\n com ramificaç~
ao metil na posiç~
ao ("+eroo+") \n e recebendo o nome do hidrocarboneto
de maior radical \n com prefixo (prop), ligaç~
ao tripla ("+en+"),\n com ramificaç~
ao metil
na posiç~
ao ("+ero+") e \n pertencendo ao grupo hidrocarboneto ("+al+")");
frame2.est.setText("\n \n
CC(C)C(O)CC#(C)C ");
}
}
}
}
}
}
}
}
}
}
:}
| numero:eroo METIL PROP OXI ESPACO numero:ero METIL PROP central:en hidrocarboneto:al {:
if(Integer.parseInt(ero)>3 || Integer.parseInt(eroo)>3){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Numero da posiç~
ao esta incorreto.\n Com o prefixo PROP
so podemos ter 3 carbonos na cadeia principal");
}else{
if(en.equals("in")|| en.equals("en")|| en.equals("adien")){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Atenç~
ao, é necessario informar a posiç~
ao da ligaç~
ao.");
}else{
if(Integer.parseInt(ero) == 1 || Integer.parseInt(ero) == 3){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Nome incorreto.\n Pois se colocar a ramificaç~
ao METIL na
posiç~
ao 1 ou 3\n n~
ao será mais um prop e sim um but");
}else{
if(Integer.parseInt(eroo) == 1 || Integer.parseInt(eroo) == 3){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Nome incorreto.\n Pois se colocar a ramificaç~
ao METIL na
posiç~
ao 1 ou 3\n n~
ao será mais um prop e sim um but");
}else{
frame2.saida.setForeground(Color.BLUE);
frame2.saida.setText(" Nome correto.\n \n Esta subst^
ancia é um Éter \n Possuindo 3
carbonos (prop) representando o carbono de menor radical,\n recebendo o radical (oxi),
\n com ramificaç~
ao metil na posiç~
ao ("+ero+") \n e recebendo o nome do hidrocarboneto
129
3773
3774
3775
3776
3777
3778
3779
3780
3781
3782
3783
3784
3785
3786
3787
3788
3789
3790
3791
3792
3793
3794
3795
3796
3797
3798
3799
3800
3801
3802
3803
3804
3805
3806
3807
3808
3809
3810
3811
3812
3813
3814
3815
3816
3817
3818
3819
3820
3821
3822
3823
de maior radical \n com prefixo (prop), ligaç~
ao simples ("+en+"),\n com ramificaç~
ao
metil na posiç~
ao ("+ero+") e \n pertencendo ao grupo hidrocarboneto ("+al+")");
frame2.est.setText("\n \n
CC(C)C(O)CC(C)C ");
}
}
}
}
:}
| numero:eroo METIL PROP OXI ESPACO numero:ero METIL numero:nu numero:me PROP central:en hidrocarboneto:al {:
if(Integer.parseInt(nu)>3 || Integer.parseInt(me)>3 || Integer.parseInt(ero)>3 || Integer.parseInt(eroo)>3){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Numero da posiç~
ao esta incorreto.\n Com o prefixo PROP
so podemos ter 3 carbonos na cadeia principal");
}else{
if(en.equals("in")|| en.equals("en")){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Nome incorreto.\n É necessario informar a posiç~
ao da ligaç~
ao com apenas 1 posiç~
ao.");
}else{
if(Integer.parseInt(ero) == 1 || Integer.parseInt(ero) == 3){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Nome incorreto.\n Pois se colocar a ramificaç~
ao METIL na
posiç~
ao 1 ou 3\n n~
ao será mais um prop e sim um but");
}else{
if(Integer.parseInt(eroo) == 1 || Integer.parseInt(eroo) == 3){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Nome incorreto,\n Pois se colocar a ramificaç~
ao METIL na
posiç~
ao 1 ou 3\n n~
ao será mais um prop e sim um but");
}else{
if(en.equals("an")){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Nome incorreto.\n N~
ao é permitido colocar posiç~
ao em ligaç~
ao simples.");
}else{
if(Integer.parseInt(nu) == 3 || Integer.parseInt(me) == 3){
frame2.saida.setForeground(Color.RED);
frame2.saida.setText(" Nome incorreto. \n N~
ao é permitido colocar ligaç~
ao neste carbono.");
}else{
frame2.saida.setForeground(Color.BLUE);
frame2.saida.setText(" Nome correto.\n \n Esta subst^
ancia é um Éter \n Possuindo 3
carbonos (prop) representando o carbono de menor radical,\n recebendo o radical (oxi),
\n com ramificaç~
ao metil na posiç~
ao ("+eroo+") \n e recebendo o nome do hidrocarboneto
de maior radical \n com prefixo (prop), duas duplas ligaç~
oes ("+en+") na posiç~
ao ("+nu+","+me+"),
\n com ramificaç~
ao metil na posiç~
ao ("+ero+") e \n pertencendo ao grupo hidrocarboneto ("+al+")");
frame2.est.setText("\n \n
CC(C)C(O)C=C=(C)C ");
}
}
}
}
}
}
:}
;
3824
3825
3826
3827
3828
3829
3830
3831
3832
3833
numero ::= NUMERO:le ESPACO
{: RESULT = le; :}
| ESPACO NUMERO:le ESPACO
{: RESULT = le; :}
| NUMERO:ll VIRGULA
{: RESULT = ll; :}
| ESPACO NUMERO:ll VIRGULA
{: RESULT = ll; :}
;
3834
3835
3836
3837
3838
3839
3840
3841
3842
3843
3844
3845
3846
radical ::= METIL
{:
| ETIL
{:
| PROPIL
{:
| BUTIL
{:
| DIMETIL
{:
| TRIMETIL
{:
RESULT = "metil"; :}
RESULT ="etil"; :}
RESULT = "propil"; :}
RESULT = "butil"; :}
RESULT = "dimetil"; :}
RESULT = "trimetil"; :}
130
3847
3848
3849
3850
3851
3852
3853
3854
| DIETIL
{: RESULT
| TRIETIL
{: RESULT
| ISOPROPIL
{: RESULT
| DIPROPIL
{: RESULT
="dietil"; :}
= "trietil"; :}
= "isopropil"; :}
= "dipropil"; :}
3855
3856
| VINIL
3857
{: RESULT = "vinil"; :}
| ISOBUTIL
{: RESULT = "isobutil"; :}
;
3858
3859
3860
3861
3862
prefixo ::= MET
{: RESULT = "met"; :}
3863
3864
| ET
{: RESULT ="et"; :}
3865
3866
| PROP
{: RESULT = "prop"; :}
3867
3868
| BUT
{: RESULT = "but"; :}
3869
3870
| PENT
{: RESULT = "pent"; :}
3871
3872
| HEX
{: RESULT = "hex"; :}
3873
3874
| HEPT
{: RESULT = "hept"; :}
3875
3876
| OCT
{: RESULT = "oct"; :}
3877
3878
| NON
{: RESULT = "non"; :}
3879
3880
| DEC
{: RESULT = "dec"; :}
3881
3882
;
3883
3884
3885
3886
3887
3888
3889
3890
3891
3892
3893
3894
3895
3896
3897
3898
3899
3900
3901
3902
central ::= simples: ls
{: RESULT = ls; :}
| dupla: dl
{: RESULT = dl; :}
| tripla: tri
{: RESULT = tri; :}
| dduplas: dd
{: RESULT = dd; :}
| TRIEN
{: RESULT = "trien";
frame2.saida.setText("central = trien"); :}
| DIIN
{: RESULT = "diin";
frame2.saida.setText("central = diin"); :}
| TRIIN
{: RESULT = "triin";
frame2.saida.setText("central = triin"); :}
;
3903
3904
3905
3906
3907
simples ::= AN
{: RESULT = "an"; :}
;
3908
3909
3910
3911
dupla ::= EN
{: RESULT = "en"; :}
;
3912
3913
3914
3915
tripla ::= IN
{: RESULT = "in"; :}
;
3916
3917
3918
3919
dduplas ::= DIEN
{: RESULT = "adien"; :}
;
3920
131
3921
3922
3923
3924
3925
3926
3927
3928
3929
sufixo ::= hidrocarboneto: hd
{: RESULT = hd;
| alcoois: al
{: RESULT = al;
| aldeidos: ad
{: RESULT = ad;
| cetonas: ct
{: RESULT = ct;
;
:}
:}
:}
:}
3930
3931
3932
3933
hidrocarboneto ::= O
{: RESULT = "o"; :}
;
3934
3935
3936
3937
alcoois ::= OL
{: RESULT = "ol"; :}
;
3938
3939
3940
3941
aldeidos ::= AL
{: RESULT = "al"; :}
;
3942
3943
3944
3945
cetonas ::= ONA
{: RESULT = "ona"; :}
;
A.3
1
2
3
4
5
Arquivo Interface - Tela Principal
/*
* Esta classe corresponde a tela principal
* contendo 4 bot~
oes: nomenclatura, instruç~
oes,
* informaç~
oes e sair.
*/
6
7
8
9
10
package sintatico;
import javax.swing.ImageIcon;
import javax.swing.JLabel;
import javax.swing.SwingConstants;
11
12
13
14
15
/**
*
* @author
*/
Rosangela
16
17
public class frame extends javax.swing.JFrame {
18
19
20
21
22
public frame() {
initComponents();
}
23
24
25
26
27
28
29
30
31
32
33
34
35
/** This method is called from within the constructor to
* initialize the form.
* WARNING: Do NOT modify this code. The content of this method is
* always regenerated by the Form Editor.
*/
// <editor-fold defaultstate="collapsed" desc=" Código Gerado ">//GEN-BEGIN:initComponents
private void initComponents() {
buttonSair = new javax.swing.JButton();
buttonInformacao = new javax.swing.JButton();
buttonInstrucao = new javax.swing.JButton();
buttonNomenclatura = new javax.swing.JButton();
jLabel1 = new JLabel(new ImageIcon(getClass().getResource("interface.gif")), SwingConstants.CENTER);
36
37
getContentPane().setLayout(null);
38
39
40
41
42
43
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
setTitle("Analisador de Nomes da Qu\u00edmica Org\u00e2nica");
setResizable(false);
buttonSair.setText("Sair");
buttonSair.addActionListener(new java.awt.event.ActionListener() {
132
public void actionPerformed(java.awt.event.ActionEvent evt) {
buttonSairActionPerformed(evt);
}
44
45
46
47
});
48
49
50
getContentPane().add(buttonSair);
buttonSair.setBounds(240, 270, 120, 30);
51
52
53
54
55
56
57
buttonInformacao.setText("Informa\u00e7\u00f5es");
buttonInformacao.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
buttonInformacaoActionPerformed(evt);
}
});
58
59
60
getContentPane().add(buttonInformacao);
buttonInformacao.setBounds(90, 270, 120, 30);
61
62
63
64
65
66
67
buttonInstrucao.setText("Instru\u00e7\u00f5es");
buttonInstrucao.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
buttonInstrucaoActionPerformed(evt);
}
});
68
69
70
getContentPane().add(buttonInstrucao);
buttonInstrucao.setBounds(240, 220, 120, 30);
71
72
73
74
75
76
77
buttonNomenclatura.setText("Nomenclatura");
buttonNomenclatura.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
buttonNomenclaturaActionPerformed(evt);
}
});
78
79
80
getContentPane().add(buttonNomenclatura);
buttonNomenclatura.setBounds(90, 220, 120, 30);
81
82
83
84
jLabel1.setBorder(javax.swing.BorderFactory.createEtchedBorder());
getContentPane().add(jLabel1);
jLabel1.setBounds(0, 0, 452, 370);
85
86
87
88
java.awt.Dimension screenSize = java.awt.Toolkit.getDefaultToolkit().getScreenSize();
setBounds((screenSize.width-457)/2, (screenSize.height-400)/2, 457, 400);
}// </editor-fold>//GEN-END:initComponents
89
90
91
92
93
private void buttonInstrucaoActionPerformed(java.awt.event.ActionEvent evt) {
//GEN-FIRST:event_buttonInstrucaoActionPerformed
janelaInstrucoes();
}//GEN-LAST:event_buttonInstrucaoActionPerformed
94
95
96
97
98
private void buttonInformacaoActionPerformed(java.awt.event.ActionEvent evt) {
//GEN-FIRST:event_buttonInformacaoActionPerformed
janelaInformacoes();
}//GEN-LAST:event_buttonInformacaoActionPerformed
99
100
101
102
103
104
private void buttonSairActionPerformed(java.awt.event.ActionEvent evt) {
//GEN-FIRST:event_buttonSairActionPerformed
this.setVisible(false);
this.dispose();
}//GEN-LAST:event_buttonSairActionPerformed
105
106
107
108
109
private void buttonNomenclaturaActionPerformed(java.awt.event.ActionEvent evt) {
//GEN-FIRST:event_buttonNomenclaturaActionPerformed
janelaAnalise();
}//GEN-LAST:event_buttonNomenclaturaActionPerformed
110
111
/* Comandos para acessar os bot~
oes */
112
113
114
115
116
117
private void janelaAnalise(){
frame2 a = new frame2(this);
buttonNomenclatura.setEnabled(false);
buttonInformacao.setEnabled(false);
buttonInstrucao.setEnabled(false);
133
a.setVisible(true);
118
}
119
120
private void janelaInformacoes(){
informacoes aa = new informacoes(this);
buttonNomenclatura.setEnabled(false);
buttonInformacao.setEnabled(false);
buttonInstrucao.setEnabled(false);
aa.setVisible(true);
}
121
122
123
124
125
126
127
128
private void janelaInstrucoes(){
instrucoes aaa = new instrucoes(this);
buttonNomenclatura.setEnabled(false);
buttonInformacao.setEnabled(false);
buttonInstrucao.setEnabled(false);
aaa.setVisible(true);
}
129
130
131
132
133
134
135
136
/**
* @param args the command line arguments
*/
public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new frame().setVisible(true);
}
});
}
137
138
139
140
141
142
143
144
145
146
147
// Declaraç~
ao de variáveis - n~
ao modifique//GEN-BEGIN:variables
public javax.swing.JButton buttonInformacao;
public javax.swing.JButton buttonInstrucao;
public javax.swing.JButton buttonNomenclatura;
public javax.swing.JButton buttonSair;
public javax.swing.JLabel jLabel1;
// Fim da declaraç~
ao de variáveis//GEN-END:variables
148
149
150
151
152
153
154
155
156
}
157
A.4
1
2
3
4
5
6
7
8
/*
*
*
*
*
*
*
*/
Arquivo Interface - Tela Nomenclatura
Esta classe contem a funç~
ao de realizar
a entrada e saı́da dos dados do PROF QUIM,
contendo um campo para digitaç~
ao, 3 bot~
oes
(limpar, sair e verificar), um campo para mostrar
as explicaç~
oes do nome e outro campo para mostrar
a estrutura do nome quı́mico.
9
10
package sintatico;
11
12
13
14
15
16
17
18
19
import
import
import
import
import
import
import
import
javax.swing.ImageIcon;
javax.swing.JLabel;
javax.swing.SwingConstants;
java.io.FileNotFoundException;
java.io.IOException;
sintatico.parser;
sintatico.quimica;
sintatico.sym;
20
21
22
23
24
/**
*
* @author
*/
Rosangela
25
26
27
public class frame2 extends javax.swing.JFrame {
private frame fra;
28
134
29
30
31
/** Creates new form frame2 */
public frame2(frame f) {
initComponents();
32
fra = f;
33
34
}
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
/** This method is called from within the constructor to
* initialize the form.
* WARNING: Do NOT modify this code. The content of this method is
* always regenerated by the Form Editor.
*/
// <editor-fold defaultstate="collapsed" desc=" Código Gerado ">//GEN-BEGIN:initComponents
private void initComponents() {
jButton1 = new javax.swing.JButton();
jScrollPane2 = new javax.swing.JScrollPane();
saida = new javax.swing.JTextArea();
jButton2 = new javax.swing.JButton();
entrada = new javax.swing.JTextField();
buttonSair = new javax.swing.JButton();
jScrollPane1 = new javax.swing.JScrollPane();
est = new javax.swing.JTextArea();
jLabel1 = new JLabel(new ImageIcon(getClass().getResource("interfaceAtualizada.gif")),
SwingConstants.CENTER);
54
55
getContentPane().setLayout(null);
56
57
58
59
60
61
62
63
64
65
66
67
68
setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
setTitle("Nomenclatura - Qu\u00edmica Org\u00e2nica");
setBackground(new java.awt.Color(255, 255, 255));
setResizable(false);
addWindowListener(new java.awt.event.WindowAdapter() {
public void windowClosed(java.awt.event.WindowEvent evt) {
formWindowClosed(evt);
}
public void windowOpened(java.awt.event.WindowEvent evt) {
formWindowOpened(evt);
}
});
69
70
71
72
73
74
75
jButton1.setText("Verificar");
jButton1.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jButton1ActionPerformed(evt);
}
});
76
77
78
getContentPane().add(jButton1);
jButton1.setBounds(380, 140, 120, 40);
79
80
81
82
83
84
85
86
87
jScrollPane2.setBorder(new javax.swing.border.SoftBevelBorder(javax.swing.border.BevelBorder.RAISED));
saida.setColumns(20);
saida.setFont(new java.awt.Font("Arial", 0, 15));
saida.setRows(5);
saida.setBorder(javax.swing.BorderFactory.createTitledBorder(null,
"Verifica\u00e7\u00e3o", javax.swing.border.TitledBorder.CENTER, javax.swing.border.TitledBorder.
DEFAULT_POSITION, new java.awt.Font("Tahoma", 1, 12), new java.awt.Color(0, 0, 204)));
jScrollPane2.setViewportView(saida);
88
89
90
getContentPane().add(jScrollPane2);
jScrollPane2.setBounds(60, 200, 470, 230);
91
92
93
94
95
96
97
jButton2.setText("Limpar");
jButton2.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jButton2ActionPerformed(evt);
}
});
98
99
100
getContentPane().add(jButton2);
jButton2.setBounds(450, 470, 90, 30);
101
102
entrada.setFont(new java.awt.Font("Arial", 1, 14));
135
103
104
105
106
107
entrada.setBorder(javax.swing.BorderFactory.createTitledBorder(null, "Digite o nome qu\u00edmico",
javax.swing.border.TitledBorder.DEFAULT_JUSTIFICATION, javax.swing.border.TitledBorder.DEFAULT_POSITION,
new java.awt.Font("Tahoma", 1, 12), new java.awt.Color(0, 0, 204)));
getContentPane().add(entrada);
entrada.setBounds(140, 130, 210, 60);
108
109
110
111
112
113
114
buttonSair.setText("Sair");
buttonSair.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
buttonSairActionPerformed(evt);
}
});
115
116
117
getContentPane().add(buttonSair);
buttonSair.setBounds(450, 520, 90, 30);
118
119
120
121
122
123
124
125
126
jScrollPane1.setBorder(new javax.swing.border.SoftBevelBorder(javax.swing.border.BevelBorder.RAISED));
est.setColumns(20);
est.setFont(new java.awt.Font("Arial", 1, 16));
est.setRows(5);
est.setBorder(javax.swing.BorderFactory.createTitledBorder(null, "Estrutura Qu\u00edmica em SMILES",
javax.swing.border.TitledBorder.CENTER, javax.swing.border.TitledBorder.DEFAULT_POSITION, new java.awt.Font
("Tahoma", 1, 12), new java.awt.Color(0, 0, 204)));
jScrollPane1.setViewportView(est);
127
128
129
getContentPane().add(jScrollPane1);
jScrollPane1.setBounds(110, 450, 310, 150);
130
131
132
133
jLabel1.setBorder(javax.swing.BorderFactory.createEtchedBorder());
getContentPane().add(jLabel1);
jLabel1.setBounds(0, 0, 580, 640);
134
135
136
137
java.awt.Dimension screenSize = java.awt.Toolkit.getDefaultToolkit().getScreenSize();
setBounds((screenSize.width-585)/2, (screenSize.height-672)/2, 585, 672);
}// </editor-fold>//GEN-END:initComponents
138
139
140
141
142
143
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
//GEN-FIRST:event_jButton1ActionPerformed
Arquivo arq = new Arquivo();
String text = entrada.getText();
try {
144
145
146
147
148
arq.salvar("teste.txt", text, false);
} catch (IOException ex) {
ex.printStackTrace();
}
149
150
try {
151
152
153
154
155
156
157
158
new parser(new quimica(new java.io.FileReader("teste.txt"))).parse();
} catch (FileNotFoundException ex) {
ex.printStackTrace();
} catch (Exception ex) {
ex.printStackTrace();
}
}//GEN-LAST:event_jButton1ActionPerformed
159
160
161
162
163
private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {
//GEN-FIRST:event_jButton2ActionPerformed
limpaCampos();
}//GEN-LAST:event_jButton2ActionPerformed
164
165
166
167
168
169
private void buttonSairActionPerformed(java.awt.event.ActionEvent evt) {
//GEN-FIRST:event_buttonSairActionPerformed
this.setVisible(false);
this.dispose();
}//GEN-LAST:event_buttonSairActionPerformed
170
171
172
private void formWindowOpened(java.awt.event.WindowEvent evt) {
//GEN-FIRST:event_formWindowOpened
173
174
entrada.requestFocus();
175
176
}//GEN-LAST:event_formWindowOpened
136
177
178
179
private void formWindowClosed(java.awt.event.WindowEvent evt) {
//GEN-FIRST:event_formWindowClosed
180
habilitaMenu();
181
182
}//GEN-LAST:event_formWindowClosed
183
184
185
/* Habilita o menu da tela principal */
186
private void habilitaMenu(){
fra.buttonNomenclatura.setEnabled(true);
fra.buttonInformacao.setEnabled(true);
fra.buttonInstrucao.setEnabled(true);
fra.buttonSair.setEnabled(true);
}
187
188
189
190
191
192
193
194
/* Limpa os ccampos para proxima consulta */
195
private void limpaCampos(){
entrada.setText("");
saida.setText("");
est.setText("");
entrada.requestFocus();
}
196
197
198
199
200
201
202
203
204
// Declaraç~
ao de variáveis - n~
ao modifique//GEN-BEGIN:variables
private javax.swing.JButton buttonSair;
public javax.swing.JTextField entrada;
public static javax.swing.JTextArea est;
private javax.swing.JButton jButton1;
private javax.swing.JButton jButton2;
private javax.swing.JLabel jLabel1;
public static javax.swing.JScrollPane jScrollPane1;
private javax.swing.JScrollPane jScrollPane2;
public static javax.swing.JTextArea saida;
// Fim da declaraç~
ao de variáveis//GEN-END:variables
205
206
207
208
209
210
211
212
213
214
215
216
217
}
218
A.5
1
2
3
4
5
Arquivo Interface - Tela Instruções
/*
* Esta classe contem um campo informando
* ao usuário as instruç~
oes de como utilizar
* o protótipo PROF QUIM.
*/
6
7
package sintatico;
8
9
10
11
import javax.swing.ImageIcon;
import javax.swing.JLabel;
import javax.swing.SwingConstants;
12
13
14
15
16
/**
*
* @author
*/
Rosangela
17
18
19
20
21
22
23
24
public class instrucoes extends javax.swing.JFrame {
private frame fra;
/** Creates new form instrucoes */
public instrucoes(frame f) {
initComponents();
fra = f;
}
25
26
/** This method is called from within the constructor to
137
27
28
29
30
31
32
33
34
35
36
* initialize the form.
* WARNING: Do NOT modify this code. The content of this method is
* always regenerated by the Form Editor.
*/
// <editor-fold defaultstate="collapsed" desc=" Código Gerado ">//GEN-BEGIN:initComponents
private void initComponents() {
jScrollPane1 = new javax.swing.JScrollPane();
jTextArea1 = new javax.swing.JTextArea();
jLabel1 = new JLabel(new ImageIcon(getClass().getResource("interfaceInstrucoes.gif")),
SwingConstants.CENTER);
37
38
getContentPane().setLayout(null);
39
40
41
42
43
44
45
46
47
setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
setTitle("Instru\u00e7\u00f5es - PROF QUIM");
setResizable(false);
addWindowListener(new java.awt.event.WindowAdapter() {
public void windowClosed(java.awt.event.WindowEvent evt) {
formWindowClosed(evt);
}
});
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
jScrollPane1.setBorder(new javax.swing.border.LineBorder(java.awt.SystemColor.
inactiveCaptionText, 2, true));
jScrollPane1.setEnabled(false);
jTextArea1.setColumns(20);
jTextArea1.setEditable(false);
jTextArea1.setFont(new java.awt.Font("Arial", 1, 14));
jTextArea1.setForeground(java.awt.SystemColor.desktop);
jTextArea1.setRows(5);
jTextArea1.setText("
Para acessar o analisador de nomes da \nqu\u00edmica org\u00e2nica
\u00e9 necess\u00e1rio clicar no bot\u00e3o \n\"Nomenclatura\", onde ter\u00e1 um campo para digitar\
no nome da subst\u00e2ncia, por exemplo:\n\t* propano\n\t* 1-metilbutano\n\t* 2,3-dimetilpentanal\n\t*
2,3,4-trimetilpenteno\n\t* 3-etilpentano\n\t* 3-etil-4-metilpentano\n\n
Para que o analisador
reconhe\u00e7a o nome, o \nusu\u00e1rio precisar\u00e1 digitar em letra minuscula\nsem espa\u00e7o e
as ramifica\u00e7\u00f5es com v\u00edrgula \ne tra\u00e7o, como o exemplo acima.\n
Depois que o usu\u00e1rio informar o nome e \nclicar no bot\u00e3o \"Enviar\", ir\u00e1 aparecer
no \nsegundo campo (Verifica\u00e7\u00e3o) as informa\u00e7\u00f5es\nsobre aquele determinado nome.
Se por acaso o \nnome estiver incorreto, o analisador ir\u00e1 \nexplicar o que esta considerando errado.
Se o \nusu\u00e1rio desejar tentar novamente basta clicar\nno bot\u00e3o \"Limpar\" e digitar o nome.\n
Por fim, se o nome informado pelo usu\u00e1rio\nestiver correto ir\u00e1 gerar no terceiro campo
a\nrepresenta\u00e7\u00e3o em SMILE da cadeia carb\u00f4nica \ncorrespondente ao nome.\n
Se o usu\u00e1rio tiver d\u00favidas em rela\u00e7\u00e3o as\nsubst\u00e2ncias que o analisador
reconhece ou\nsobre a representa\u00e7\u00e3o SMILE, basta clicar\nno bot\u00e3o \"Informa\u00e7\u00f5es\"
da tela principal.\nOnde conter\u00e1 todas as explica\u00e7\u00f5es necess\u00e1rias\nsobre cada
subst\u00e2ncia e SMILE.\n
Se o usu\u00e1rio desejar fechar o programa,\n basta clicar no
bot\u00e3o \"Sair\".
");
jTextArea1.setBorder(new javax.swing.border.LineBorder(java.awt.SystemColor.inactiveCaptionText, 5,
true));
jScrollPane1.setViewportView(jTextArea1);
77
78
79
getContentPane().add(jScrollPane1);
jScrollPane1.setBounds(80, 160, 390, 350);
80
81
82
getContentPane().add(jLabel1);
jLabel1.setBounds(0, 0, 530, 580);
83
84
85
86
java.awt.Dimension screenSize = java.awt.Toolkit.getDefaultToolkit().getScreenSize();
setBounds((screenSize.width-539)/2, (screenSize.height-614)/2, 539, 614);
}// </editor-fold>//GEN-END:initComponents
87
88
89
90
private void formWindowClosed(java.awt.event.WindowEvent evt) {//GEN-FIRST:event_formWindowClosed
habilitaMenu();
}//GEN-LAST:event_formWindowClosed
91
92
93
94
/**
* @param args the command line arguments
*/
95
96
/* Habilita os campos da tela nomenclatura quando acessada */
97
98
99
100
private void habilitaMenu(){
fra.buttonNomenclatura.setEnabled(true);
fra.buttonInformacao.setEnabled(true);
138
fra.buttonInstrucao.setEnabled(true);
101
}
102
103
104
// Declaraç~
ao de variáveis - n~
ao modifique//GEN-BEGIN:variables
public javax.swing.JLabel jLabel1;
private javax.swing.JScrollPane jScrollPane1;
private javax.swing.JTextArea jTextArea1;
// Fim da declaraç~
ao de variáveis//GEN-END:variables
105
106
107
108
109
110
111
}
112
A.6
1
2
3
4
5
6
7
/*
*
*
*
*
*
*/
Arquivo Interface - Tela Informações
Esta classe contem um link para as
explicaç~
oes de todas as funç~
oes que o
PROF QUIM reconhece (alcano, alceno, alcino,
alcadieno, álcool, éter, aldeı́do e cetona), além
da explicaç~
ao sobre a representaç~
ao de string SMILES.
8
9
package sintatico;
10
11
12
13
14
import
import
import
import
java.awt.Color;
javax.swing.ImageIcon;
javax.swing.JLabel;
javax.swing.SwingConstants;
15
16
17
18
19
/**
*
* @author
*/
Rosangela
20
21
22
public class informacoes extends javax.swing.JFrame {
private frame ffra;
23
24
25
26
/** Creates new form informacoes */
public informacoes(frame ff) {
initComponents();
27
ffra = ff;
28
29
}
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
/** This method is called from within the constructor to
* initialize the form.
* WARNING: Do NOT modify this code. The content of this method is
* always regenerated by the Form Editor.
*/
// <editor-fold defaultstate="collapsed" desc=" Código Gerado ">//GEN-BEGIN:initComponents
private void initComponents() {
jPanel4 = new javax.swing.JPanel();
jLabel9 = new javax.swing.JLabel();
jLabel1 = new javax.swing.JLabel();
jLabel2 = new javax.swing.JLabel();
jLabel3 = new javax.swing.JLabel();
jLabel4 = new javax.swing.JLabel();
jLabel5 = new javax.swing.JLabel();
jLabel6 = new javax.swing.JLabel();
jLabel7 = new javax.swing.JLabel();
jLabel8 = new javax.swing.JLabel();
jSeparator1 = new javax.swing.JSeparator();
jPanel2 = new javax.swing.JPanel();
jLabel10 = new JLabel(new ImageIcon(getClass().getResource("intefaceInfo.gif")),
SwingConstants.CENTER);
52
53
getContentPane().setLayout(null);
54
55
56
setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
setTitle("Instru\u00e7\u00f5es - Subst\u00e2ncias");
139
57
58
59
60
61
62
setResizable(false);
addWindowListener(new java.awt.event.WindowAdapter() {
public void windowClosed(java.awt.event.WindowEvent evt) {
formWindowClosed(evt);
}
});
63
64
jPanel4.setLayout(null);
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
jPanel4.setBackground(new java.awt.Color(255, 255, 255));
jPanel4.setBorder(new javax.swing.border.SoftBevelBorder(javax.swing.border.BevelBorder.RAISED));
jLabel9.setFont(new java.awt.Font("Arial", 1, 16));
jLabel9.setForeground(new java.awt.Color(7, 7, 171));
jLabel9.setText("Representa\u00e7\u00e3o SMILE");
jLabel9.addMouseListener(new java.awt.event.MouseAdapter() {
public void mouseClicked(java.awt.event.MouseEvent evt) {
jLabel9MouseClicked(evt);
}
public void mouseExited(java.awt.event.MouseEvent evt) {
jLabel9MouseExited(evt);
}
});
jLabel9.addMouseMotionListener(new java.awt.event.MouseMotionAdapter() {
public void mouseMoved(java.awt.event.MouseEvent evt) {
jLabel9MouseMoved(evt);
}
});
84
85
86
jPanel4.add(jLabel9);
jLabel9.setBounds(40, 230, 190, 30);
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
jLabel1.setFont(new java.awt.Font("Arial", 1, 16));
jLabel1.setForeground(new java.awt.Color(7, 7, 171));
jLabel1.setText("Alcano");
jLabel1.addMouseListener(new java.awt.event.MouseAdapter() {
public void mouseClicked(java.awt.event.MouseEvent evt) {
jLabel1MouseClicked(evt);
}
public void mouseExited(java.awt.event.MouseEvent evt) {
jLabel1MouseExited(evt);
}
});
jLabel1.addMouseMotionListener(new java.awt.event.MouseMotionAdapter() {
public void mouseMoved(java.awt.event.MouseEvent evt) {
jLabel1MouseMoved(evt);
}
});
104
105
106
jPanel4.add(jLabel1);
jLabel1.setBounds(30, 20, 60, 14);
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
jLabel2.setFont(new java.awt.Font("Arial", 1, 16));
jLabel2.setForeground(new java.awt.Color(7, 7, 171));
jLabel2.setText("Alceno");
jLabel2.addMouseListener(new java.awt.event.MouseAdapter() {
public void mouseClicked(java.awt.event.MouseEvent evt) {
jLabel2MouseClicked(evt);
}
public void mouseExited(java.awt.event.MouseEvent evt) {
jLabel2MouseExited(evt);
}
});
jLabel2.addMouseMotionListener(new java.awt.event.MouseMotionAdapter() {
public void mouseMoved(java.awt.event.MouseEvent evt) {
jLabel2MouseMoved(evt);
}
});
124
125
126
jPanel4.add(jLabel2);
jLabel2.setBounds(30, 50, 60, 14);
127
128
129
130
jLabel3.setFont(new java.awt.Font("Arial", 1, 16));
jLabel3.setForeground(new java.awt.Color(7, 7, 171));
jLabel3.setText("Alcino");
140
131
132
133
134
135
136
137
138
139
140
141
142
143
jLabel3.addMouseListener(new java.awt.event.MouseAdapter() {
public void mouseClicked(java.awt.event.MouseEvent evt) {
jLabel3MouseClicked(evt);
}
public void mouseExited(java.awt.event.MouseEvent evt) {
jLabel3MouseExited(evt);
}
});
jLabel3.addMouseMotionListener(new java.awt.event.MouseMotionAdapter() {
public void mouseMoved(java.awt.event.MouseEvent evt) {
jLabel3MouseMoved(evt);
}
});
144
145
146
jPanel4.add(jLabel3);
jLabel3.setBounds(30, 80, 60, 14);
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
jLabel4.setFont(new java.awt.Font("Arial", 1, 16));
jLabel4.setForeground(new java.awt.Color(7, 7, 171));
jLabel4.setText("Alcadieno");
jLabel4.addMouseListener(new java.awt.event.MouseAdapter() {
public void mouseClicked(java.awt.event.MouseEvent evt) {
jLabel4MouseClicked(evt);
}
public void mouseExited(java.awt.event.MouseEvent evt) {
jLabel4MouseExited(evt);
}
});
jLabel4.addMouseMotionListener(new java.awt.event.MouseMotionAdapter() {
public void mouseMoved(java.awt.event.MouseEvent evt) {
jLabel4MouseMoved(evt);
}
});
164
165
166
jPanel4.add(jLabel4);
jLabel4.setBounds(30, 110, 90, 14);
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
jLabel5.setFont(new java.awt.Font("Arial", 1, 16));
jLabel5.setForeground(new java.awt.Color(7, 7, 171));
jLabel5.setText("\u00c1lcool");
jLabel5.addMouseListener(new java.awt.event.MouseAdapter() {
public void mouseClicked(java.awt.event.MouseEvent evt) {
jLabel5MouseClicked(evt);
}
public void mouseExited(java.awt.event.MouseEvent evt) {
jLabel5MouseExited(evt);
}
});
jLabel5.addMouseMotionListener(new java.awt.event.MouseMotionAdapter() {
public void mouseMoved(java.awt.event.MouseEvent evt) {
jLabel5MouseMoved(evt);
}
});
184
185
186
jPanel4.add(jLabel5);
jLabel5.setBounds(180, 80, 60, 20);
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
jLabel6.setFont(new java.awt.Font("Arial", 1, 16));
jLabel6.setForeground(new java.awt.Color(7, 7, 171));
jLabel6.setText("Alde\u00eddo");
jLabel6.addMouseListener(new java.awt.event.MouseAdapter() {
public void mouseClicked(java.awt.event.MouseEvent evt) {
jLabel6MouseClicked(evt);
}
public void mouseExited(java.awt.event.MouseEvent evt) {
jLabel6MouseExited(evt);
}
});
jLabel6.addMouseMotionListener(new java.awt.event.MouseMotionAdapter() {
public void mouseMoved(java.awt.event.MouseEvent evt) {
jLabel6MouseMoved(evt);
}
});
204
141
205
206
jPanel4.add(jLabel6);
jLabel6.setBounds(180, 120, 60, 14);
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
jLabel7.setFont(new java.awt.Font("Arial", 1, 16));
jLabel7.setForeground(new java.awt.Color(7, 7, 171));
jLabel7.setText("Cetona");
jLabel7.addMouseListener(new java.awt.event.MouseAdapter() {
public void mouseClicked(java.awt.event.MouseEvent evt) {
jLabel7MouseClicked(evt);
}
public void mouseExited(java.awt.event.MouseEvent evt) {
jLabel7MouseExited(evt);
}
});
jLabel7.addMouseMotionListener(new java.awt.event.MouseMotionAdapter() {
public void mouseMoved(java.awt.event.MouseEvent evt) {
jLabel7MouseMoved(evt);
}
});
224
225
226
jPanel4.add(jLabel7);
jLabel7.setBounds(180, 150, 60, 14);
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
jLabel8.setFont(new java.awt.Font("Arial", 1, 16));
jLabel8.setForeground(new java.awt.Color(7, 7, 171));
jLabel8.setText("\u00c9ter");
jLabel8.addMouseListener(new java.awt.event.MouseAdapter() {
public void mouseClicked(java.awt.event.MouseEvent evt) {
jLabel8MouseClicked(evt);
}
public void mouseExited(java.awt.event.MouseEvent evt) {
jLabel8MouseExited(evt);
}
});
jLabel8.addMouseMotionListener(new java.awt.event.MouseMotionAdapter() {
public void mouseMoved(java.awt.event.MouseEvent evt) {
jLabel8MouseMoved(evt);
}
});
244
245
246
jPanel4.add(jLabel8);
jLabel8.setBounds(180, 180, 60, 20);
247
248
249
250
251
jSeparator1.setForeground(java.awt.SystemColor.inactiveCaptionText);
jSeparator1.setOrientation(javax.swing.SwingConstants.VERTICAL);
jPanel4.add(jSeparator1);
jSeparator1.setBounds(130, 60, 30, 130);
252
253
254
getContentPane().add(jPanel4);
jPanel4.setBounds(140, 170, 270, 270);
255
256
jPanel2.setLayout(null);
257
258
259
260
261
262
jPanel2.setBackground(java.awt.SystemColor.inactiveCaptionText);
jPanel2.setBorder(new javax.swing.border.LineBorder
(java.awt.SystemColor.desktop, 3, true));
getContentPane().add(jPanel2);
jPanel2.setBounds(120, 170, 60, 270);
263
264
265
getContentPane().add(jLabel10);
jLabel10.setBounds(0, 0, 500, 520);
266
267
268
269
java.awt.Dimension screenSize = java.awt.Toolkit.getDefaultToolkit().getScreenSize();
setBounds((screenSize.width-507)/2, (screenSize.height-553)/2, 507, 553);
}// </editor-fold>//GEN-END:initComponents
270
271
272
273
274
private void jLabel9MouseMoved(java.awt.event.MouseEvent evt) {
//GEN-FIRST:event_jLabel9MouseMoved
jLabel9.setForeground(Color.RED);
}//GEN-LAST:event_jLabel9MouseMoved
275
276
277
278
private void jLabel9MouseExited(java.awt.event.MouseEvent evt) {
//GEN-FIRST:event_jLabel9MouseExited
jLabel9.setForeground(new Color(7,7,171));
142
279
}//GEN-LAST:event_jLabel9MouseExited
280
281
282
283
284
285
private void jLabel9MouseClicked(java.awt.event.MouseEvent evt) {
//GEN-FIRST:event_jLabel9MouseClicked
smile ol = new smile(this);
ol.setVisible(true);
}//GEN-LAST:event_jLabel9MouseClicked
286
287
288
289
290
private void jLabel8MouseMoved(java.awt.event.MouseEvent evt) {
//GEN-FIRST:event_jLabel8MouseMoved
jLabel8.setForeground(Color.RED);
}//GEN-LAST:event_jLabel8MouseMoved
291
292
293
294
295
private void jLabel8MouseExited(java.awt.event.MouseEvent evt) {
//GEN-FIRST:event_jLabel8MouseExited
jLabel8.setForeground(new Color(7,7,171));
}//GEN-LAST:event_jLabel8MouseExited
296
297
298
299
300
301
private void jLabel8MouseClicked(java.awt.event.MouseEvent evt) {
//GEN-FIRST:event_jLabel8MouseClicked
eter ol = new eter(this);
ol.setVisible(true);
}//GEN-LAST:event_jLabel8MouseClicked
302
303
304
305
306
private void jLabel7MouseMoved(java.awt.event.MouseEvent evt) {
//GEN-FIRST:event_jLabel7MouseMoved
jLabel7.setForeground(Color.RED);
}//GEN-LAST:event_jLabel7MouseMoved
307
308
309
310
311
private void jLabel7MouseExited(java.awt.event.MouseEvent evt) {
//GEN-FIRST:event_jLabel7MouseExited
jLabel7.setForeground(new Color(7,7,171));
}//GEN-LAST:event_jLabel7MouseExited
312
313
314
315
316
317
private void jLabel7MouseClicked(java.awt.event.MouseEvent evt) {
//GEN-FIRST:event_jLabel7MouseClicked
cetona ol = new cetona(this);
ol.setVisible(true);
}//GEN-LAST:event_jLabel7MouseClicked
318
319
320
321
322
private void jLabel6MouseMoved(java.awt.event.MouseEvent evt) {
//GEN-FIRST:event_jLabel6MouseMoved
jLabel6.setForeground(Color.RED);
}//GEN-LAST:event_jLabel6MouseMoved
323
324
325
326
327
private void jLabel6MouseExited(java.awt.event.MouseEvent evt) {
//GEN-FIRST:event_jLabel6MouseExited
jLabel6.setForeground(new Color(7,7,171));
}//GEN-LAST:event_jLabel6MouseExited
328
329
330
331
332
333
private void jLabel6MouseClicked(java.awt.event.MouseEvent evt) {
//GEN-FIRST:event_jLabel6MouseClicked
aldeido ol = new aldeido(this);
ol.setVisible(true);
}//GEN-LAST:event_jLabel6MouseClicked
334
335
336
337
338
private void jLabel5MouseExited(java.awt.event.MouseEvent evt) {
//GEN-FIRST:event_jLabel5MouseExited
jLabel5.setForeground(new Color(7,7,171));
}//GEN-LAST:event_jLabel5MouseExited
339
340
341
342
343
344
private void jLabel5MouseClicked(java.awt.event.MouseEvent evt) {
//GEN-FIRST:event_jLabel5MouseClicked
alcool ol = new alcool(this);
ol.setVisible(true);
}//GEN-LAST:event_jLabel5MouseClicked
345
346
347
348
349
private void jLabel5MouseMoved(java.awt.event.MouseEvent evt) {
//GEN-FIRST:event_jLabel5MouseMoved
jLabel5.setForeground(Color.RED);
}//GEN-LAST:event_jLabel5MouseMoved
350
351
352
private void jLabel4MouseMoved(java.awt.event.MouseEvent evt) {
//GEN-FIRST:event_jLabel4MouseMoved
143
353
354
jLabel4.setForeground(Color.RED);
}//GEN-LAST:event_jLabel4MouseMoved
355
356
357
358
359
private void jLabel4MouseExited(java.awt.event.MouseEvent evt) {
//GEN-FIRST:event_jLabel4MouseExited
jLabel4.setForeground(new Color(7,7,171));
}//GEN-LAST:event_jLabel4MouseExited
360
361
362
363
364
365
private void jLabel4MouseClicked(java.awt.event.MouseEvent evt) {
//GEN-FIRST:event_jLabel4MouseClicked
alcadieno as = new alcadieno(this);
as.setVisible(true);
}//GEN-LAST:event_jLabel4MouseClicked
366
367
368
369
370
private void jLabel3MouseExited(java.awt.event.MouseEvent evt) {
//GEN-FIRST:event_jLabel3MouseExited
jLabel3.setForeground(new Color(7,7,171));
}//GEN-LAST:event_jLabel3MouseExited
371
372
373
374
375
private void jLabel3MouseMoved(java.awt.event.MouseEvent evt) {
//GEN-FIRST:event_jLabel3MouseMoved
jLabel3.setForeground(Color.RED);
}//GEN-LAST:event_jLabel3MouseMoved
376
377
378
379
380
381
private void jLabel3MouseClicked(java.awt.event.MouseEvent evt) {
//GEN-FIRST:event_jLabel3MouseClicked
alcino as = new alcino(this);
as.setVisible(true);
}//GEN-LAST:event_jLabel3MouseClicked
382
383
384
385
386
private void jLabel2MouseMoved(java.awt.event.MouseEvent evt) {
//GEN-FIRST:event_jLabel2MouseMoved
jLabel2.setForeground(Color.RED);
}//GEN-LAST:event_jLabel2MouseMoved
387
388
389
390
391
private void jLabel2MouseExited(java.awt.event.MouseEvent evt) {
//GEN-FIRST:event_jLabel2MouseExited
jLabel2.setForeground(new Color(7,7,171));
}//GEN-LAST:event_jLabel2MouseExited
392
393
394
395
396
397
private void jLabel2MouseClicked(java.awt.event.MouseEvent evt) {
//GEN-FIRST:event_jLabel2MouseClicked
alceno as = new alceno(this);
as.setVisible(true);
}//GEN-LAST:event_jLabel2MouseClicked
398
399
400
401
402
private void jLabel1MouseClicked(java.awt.event.MouseEvent evt) {
//GEN-FIRST:event_jLabel1MouseClicked
alcano al = new alcano(this);
al.setVisible(true);
403
404
}//GEN-LAST:event_jLabel1MouseClicked
405
406
407
408
private void jLabel1MouseExited(java.awt.event.MouseEvent evt) {
//GEN-FIRST:event_jLabel1MouseExited
jLabel1.setForeground(new Color(7,7,171));
409
410
}//GEN-LAST:event_jLabel1MouseExited
411
412
413
414
private void jLabel1MouseMoved(java.awt.event.MouseEvent evt) {
//GEN-FIRST:event_jLabel1MouseMoved
jLabel1.setForeground(Color.RED);
415
416
}//GEN-LAST:event_jLabel1MouseMoved
417
418
419
420
421
private void formWindowClosed(java.awt.event.WindowEvent evt) {
//GEN-FIRST:event_formWindowClosed
habilitaMenu();
}//GEN-LAST:event_formWindowClosed
422
423
424
425
/**
* @param args the command line arguments
*/
426
144
427
/* Habilita os bot~
oes da tela principal */
428
private void habilitaMenu(){
ffra.buttonNomenclatura.setEnabled(true);
ffra.buttonInformacao.setEnabled(true);
ffra.buttonInstrucao.setEnabled(true);
ffra.buttonSair.setEnabled(true);
}
429
430
431
432
433
434
435
// Declaraç~
ao de variáveis - n~
ao modifique//GEN-BEGIN:variables
private javax.swing.JLabel jLabel1;
private javax.swing.JLabel jLabel10;
private javax.swing.JLabel jLabel2;
private javax.swing.JLabel jLabel3;
private javax.swing.JLabel jLabel4;
private javax.swing.JLabel jLabel5;
private javax.swing.JLabel jLabel6;
private javax.swing.JLabel jLabel7;
private javax.swing.JLabel jLabel8;
private javax.swing.JLabel jLabel9;
private javax.swing.JPanel jPanel2;
private javax.swing.JPanel jPanel4;
private javax.swing.JSeparator jSeparator1;
// Fim da declaraç~
ao de variáveis//GEN-END:variables
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
}
453
A.7
1
2
3
4
5
6
7
8
9
/*
*
*
*
*
*
*
*
*/
Arquivo Interface - Tela Alcano
Esta classe contem a explicaç~
ao sobre
alcano e um exemplo de como escrever
o nome no protótipo PROF QUIM.
Todas as telas de explicaç~
ao (tela alceno, tela alcino,
tela alcadieno, tela alcool, tela aldeido, tela eter,
tela cetona e tela SMILE) utilizam o mesmo código,
só muda a explicaç~
ao da funç~
ao.
10
11
12
package sintatico;
13
14
15
16
import javax.swing.ImageIcon;
import javax.swing.JLabel;
import javax.swing.SwingConstants;
17
18
19
20
21
/**
*
* @author
*/
Rosangela
22
23
24
25
26
27
28
29
public class alcano extends javax.swing.JFrame {
private informacoes inf;
/** Creates new form alcano */
public alcano(informacoes infor) {
initComponents();
inf = infor;
}
30
31
32
33
34
35
36
37
38
39
40
41
/** This method is called from within the constructor to
* initialize the form.
* WARNING: Do NOT modify this code. The content of this method is
* always regenerated by the Form Editor.
*/
// <editor-fold defaultstate="collapsed" desc=" Código Gerado ">//GEN-BEGIN:initComponents
private void initComponents() {
jPanel1 = new javax.swing.JPanel();
jScrollPane1 = new javax.swing.JScrollPane();
jTextArea1 = new javax.swing.JTextArea();
jLabel1 = new JLabel(new ImageIcon(getClass().getResource("alcano.gif")),
145
42
SwingConstants.CENTER);
43
getContentPane().setLayout(null);
44
45
setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
setTitle("Informa\u00e7\u00f5es - Alcano");
setResizable(false);
jPanel1.setLayout(null);
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
jPanel1.setBackground(new java.awt.Color(255, 255, 255));
jPanel1.setBorder(javax.swing.BorderFactory.createBevelBorder
(javax.swing.border.BevelBorder.RAISED));
jScrollPane1.setBorder(new javax.swing.border.LineBorder
(java.awt.SystemColor.inactiveCaption, 1, true));
jTextArea1.setColumns(20);
jTextArea1.setEditable(false);
jTextArea1.setFont(new java.awt.Font("Arial", 1, 14));
jTextArea1.setRows(5);
jTextArea1.setText("\tAlcanos \n
S\u00e3o hidrocarbonetos alif\u00e1ticos\nsaturados,
ou seja, apresentam cadeia\naberta com simples liga\u00e7\u00f5es apenas.\n
Exemplo:\n\n\tbutano\n
but = 4 carbonos\n
an = liga\u00e7\u00e3o simples\n
o
= hidrocarboneto");
jTextArea1.setBorder(new javax.swing.border.LineBorder(java.awt.SystemColor.inactiveCaptionText,
3, true));
jScrollPane1.setViewportView(jTextArea1);
67
jPanel1.add(jScrollPane1);
jScrollPane1.setBounds(20, 20, 280, 180);
68
69
70
getContentPane().add(jPanel1);
jPanel1.setBounds(50, 140, 320, 220);
71
72
73
getContentPane().add(jLabel1);
jLabel1.setBounds(0, 0, 420, 450);
74
75
76
java.awt.Dimension screenSize = java.awt.Toolkit.getDefaultToolkit().getScreenSize();
setBounds((screenSize.width-428)/2, (screenSize.height-483)/2, 428, 483);
}// </editor-fold>//GEN-END:initComponents
77
78
79
80
/**
* @param args the command line arguments
*/
81
82
83
84
85
// Declaraç~
ao de variáveis - n~
ao modifique//GEN-BEGIN:variables
private javax.swing.JLabel jLabel1;
private javax.swing.JPanel jPanel1;
private javax.swing.JScrollPane jScrollPane1;
private javax.swing.JTextArea jTextArea1;
// Fim da declaraç~
ao de variáveis//GEN-END:variables
86
87
88
89
90
91
92
93
}
94
146
Download