Análise Semântica
A análise semantica foi feita através da classe Codigo
criada pelos próprios integrantes do grupo. A classe Codigo
é responsável por uma série de verificações.
Funções da classe Codigo
Adição de tokens a uma lista de tokens
- Descrição: adiciona os tokens encontrados pelo analisador sintático à uma lista de tokens.
- Utilização: utilizado a todos os tokens encontrados pelo analisador sintático com exceção da importação, a qual é adicionada os tokens do arquivo importado no lugar da impórtação.
- Função:
void add(Token t)
Adição de variáveis a uma lista de variáveis
- Descrição: adiciona um identificador no momento de sua declaração à uma lista de variaveis.
- Utilização: utilizado a todos os identificadores encontrados na declaração de variáveis e criação de funções.
- Função:
Variable addDVarList(String id, int type, Token t)
- Erro: lança
ParseException
em caso da variável ja tenha sido declarada.
Verifica se uma variável foi declarada
- Descrição: verifica se uma indentificador faz parte da lista de variáveis. Também verifica se este identificador é ou não um vetor.
- Utilização: utilizado a todos os identificadores encontrados fora da declaração de variáveis, excluindo funções.
- Função:
Variable verifyVarList(Token t)
evoid Variable.checkVet(boolean vet, Token t, String file)
. - Erro: lança
ParseException
em caso da variável não tenha sido declarada.
Verifica se uma função foi declarada
- Descrição: verifica se uma função faz parte da lista de variáveis.
- Utilização: utilizado a todos os identificadores encontrados na chamada de funções.
- Função:
Variable verifyVarList(Token t, boolean isFunc)
- Erro: lança
ParseException
em caso da variável ser uma função declarada porem não ser chamada como função, ou em caso da variável não ser uma função declarada e ser chamada como função. Recursivamente lança erros deverifyVarList(Token t)
da classe Codigo.
Verifica os parâmetros de uma função fornecida
- Descrição: verifica se o parâmetro fornecido pelo usuário está na ordem correta na lista de parâmetros de uma função. Verifica se os tipos funcionam similar.
- Utilização: utilizado na chamada de todos os parâmetros de uma chamada de função.
- Função:
void openChamaFunc(Token t)
,int getNextParam(Token name)
, evoid checkParameters(Token name)
. - Erro: lança
ParseException
recursivamente das funçõesverifyVarList
da classe Codigo egetNextParam
da classe Variable.
Verifica se a função principal ja foi chamada
- Descrição: verifica se uma função principal ja foi chamado antes, evitando dois first no mesmo programa.
- Utilização: utilizado na chamada de todos os tokens first.
- Função:
void verificaFirst(Token t)
- Erro: lança
ParseException
caso a função principal ja tenha sido chamada.
Verifica se uma expressão é do tipo esperado
- Descrição: verifica o tipo que uma expressão se forma e verificia se este tipo era o esperado para o momento. Essa verificação é feito em pilha de pilha, sendo a primeira pilha para o caso de recursão de expressões, como por exemplo a expressão de um parâmetro de uma função não faz parte da expressão que a chamada de função se encontra. A segunda pilha é para trabalhar com pareênteses, adicionando espressões com parenteses em pilhas e calculando as expressões de mais baixo nível primeiro.
- Utilização: utilizado na chamada de todas as expressão, com exceção das chamadas recursivamente pela própria expressão.
- Função:
void openExpressao(int kind)
,void addToExp(Token t)
,void addToExp(int type)
,void openParExp(Token t)
,void closeParExp(Token t)
,void addOpToExp(Token t)
,void closeExpressao(Token t)
. - Erro: lança
ParseException
em caso de um operador esteja sendo utilizado com os tipos errados, em caso de uma expressão que chama uma função do tipo void e em caso da expressão não ser do tipo esperado.
Verifica se uma variável foi inicializada
- Descrição: verifica na lista de variáveis se um identificador chamado pelo usuário foi inicializado. Vetores são considerados inicializados por padrão.
- Utilização: utilizado na chamada de todas as variáveis. Também é utilizado quando uma variavel recebe uma atribuição, inicializando a mesma.
- Função:
void initializeVar(Token a)
evoid checkInitVar(Token a)
. - Erro: lança
ParseException
em caso da variavel não ter sido inicializada. Também lança recursivamente erros deverifyVarList
.
Verifica está utilizando um container no foreach
- Descrição: verifica na lista de variáveis se a variável do foreach foi declara e é um container.
- Utilização: utilizado na chamada de todos os foreach.
- Função:
void checkForeach(Token input, Token container)
. - Erro: lança
ParseException
em caso da variável não ser um container. Também lança recursivamente erros deverifyVarList
.
Verifica se uma função possui um return
- Descrição: verifica se uma função não void tenha um return com uma expressão que se comporte como o tipo da função. Verifica se funções void não possuem return com alguma expressão.
- Utilização: utilizado na criação de todas as funções.
- Função:
void openFunc()
,void setHasReturn(boolean hasReturn)
,void closeFunc(Token t)
. - Erro: lança
ParseException
em caso da função não ter um return quando esperado um. Também lança recursivamente erros ao verificar o tipo de return.
Abre a possibilidade de variaveis locais
- Descrição: conta o numero de variáveis locais declaradas em um escopo para depois remove-las da lista. Essa contagem é feita em pilha para casos de escopos dentro de escopos.
- Utilização: utilizado no começo e no fim de um escopo.
- Função:
void openBloco()
evoid closeBloco()
.
As classes Variable e ExpressionOp
A classe Variable guarda informações de variaveis como seu identificador, seu tipo, se é vetor, se é uma função, se tem parâmetros, quais os parâmetros e se foi inicializada. Possui métodos que verificam os parâmetros de uma função e se uma variavel é um vetor ou não.
A classe ExpressionOp guarda informações de expressões como as tabelas da sessão Variáveis, que mostram quais os tipos que se comportam iguais, e qual o retorno de cada operador para cada tipo de operando fornecido. Possui métodos que verificam qual o tipo de uma expressão e se dois tipos se comportam parecidos.