/GCC130-compiladores

Trabalho desenvolvindo em ANTLR para a disciplina de Compiladores 2023/02

Primary LanguageJava

logo

PATO - Pseudo-Algoritmos Tontos e Ordenados

Trabalho da disciplina GCC130 - Compiladores

Membros do grupo:

1. Visão geral: Nome da linguagem e exemplos de algoritmos escritos na linguagem:

Nome da linguagem: PATO (PSEUDO-ALGORITMOS TONTOS E ORDENADOS)

Exemplos de algoritmos escritos:

    qvoid fib(qint n)<quack>
        if(n<>0) queck 0;
        if(n<>1) queck 1;
        else<quack>
          queck(fib (n-1) + fib(n-2))  
        </quack>
    </quack>
    qbool itsPar(qint n)<quack>
        if(n % 2 <> 0) queck true;
        else queck false;
    </quack>
    qint maxElement(qint arr[], qint tam)<quack>
        qint maior <- 0;
        for(int i <- 0; i < tam; i++)<quack>
            if(maior < arr[i])<quack>
                maior <- arr[i];
            </quack>
        </quack>
        queck maior;
    </quack>
    qdouble arithmeticMean(qint arr[], qint tam)<quack>
        qdouble soma  <- 0;
        qint i <- 0;
        while(i < tam)<quack> 
            soma <- soma + arr[i];
            i <- i + 1;
        </quack>
        queck soma/tam;
    </quack>

2. Definição Léxica: lexemas aceitos, classes de lexemas e seus padrões de identificação:

padrão classes lexemas
Os próprios lexemas Palavra-chave = qint, qbool, qdouble, qchar, if, else Tipo
Os próprios lexemas Repetição: while, for Rep
Os próprios lexemas Atribuição: <- Art
Os próprios lexemas Operadores aritméticos = + , -, /, *, % OpArit
Os próprios lexemas Operadores relacionais = <, <>, <!>, > OpRel
Os próprios lexemas Operadores booleanos = E, OU OpBool
Os próprios lexemas Chaves = , AQ / FQ
Os próprios lexemas Parênteses = (,) AP /FP
Squências de caracteres e números que começam com letra Variável Var
Sequência de digítos (sem vírgula) Número Inteiro NumI
Sequência de digitos (com vírgula) Número Real NumR

3. Implementação do Analisador Léxico: Detalhes da implementação do analisador léxico semântico (incluir capturas de tela com descrição de tudo que foi gerado tanto pela equipe, quanto pelo ANTLR);

OK

4. Definição Sintática: Especificação da gramática livre de contexto prevendo toda a estrutura gramatical da linguagem;

Tipo        -> 'qint' | 'qbool' | 'qdouble' | 'qchar' | 'qvoid' | 'if' | 'else'
Rep         ->  'while' | 'for';
Atr         ->  '<-';
OpArit      ->  '+' | '-' | '*' | '/' | '%';
AQ          ->  '<quack>'
FQ          ->  '</quack>'
AP          ->  '('
FP          ->  ')'
OpRel       ->  '<' |  '<>' | '<!>' |  '>' |  '>=' |  '<=';
OpBool      ->  'E' | 'OU';

5. Implementação do Analisador Sintático: Detalhes da implementação do analisador sintático semântico (incluir capturas de tela com descrição de tudo que foi gerado tanto pela equipe, quanto pelo ANTLR);

OK

6. Definição Semântica: Especificação das ações semânticas ( Checagem de tipo, Checagem de variáveis não declaradas, checagem de declarações duplicadas de variáveis, checagem de escopo de variáveis);

  1. Checagem de tipo Não é permitido atribuir valores de tipo diferente ao tipo da variável. Exemplo:
qint main() <quack>
	qint variavelExemplo1;
	qdouble variavelExemplo2 <- 2.0;
	variavelExemplo1 <- variavelExemplo2;
</quack>

Esse código gerará a seguinte mensagem de erro:

└──ERRO 406 - O VALOR ATRIBUIDO A [ variavelExemplo1 ] NÃO É DO TIPO [ qint ]
  1. Variável não declarada (e checagem de escopo) Não é permitido atribuir valores ou realizar operações com variáveis que não foram definidas ou que estão em um escopo diferente. Exemplo:
qint main() <quack>
	qbool variavelExemplo1 <- True;
	if(variavelExemplo <> True) <quack>
		qint variavelExemplo <- 1;
	</quack> else <quack>
		qint variavelExemplo <- 0;
	</quack>
	quackout << variavelExemplo;
</quack>

Esse código gerará mensagens de erro do tipo:

└──ERRO 403 - VARIAVEL [ variavelExemplo ] NÃO DECLARADA!
  1. Checagem de escopo É permitido declarações de variáveis iguais sem que haja conflito desde que sejam em escopos diferentes. Exemplo:
qint main() <quack>
	qbool variavelExemplo1 <- True;
	if(variavelExemplo1 <> True) <quack>
		qint variavelExemplo <- 1;
	</quack> else <quack>
		qint variavelExemplo <- 0;
	</quack>
	quackout << variavelExemplo1;
</quack>

Caso haja tentativa de atribuir valores ou realizar operações com variáveis de outros escopos, será mostrado erro de variável inexistente.

└──ERRO 404 - VARIAVEL [ variavelExemplo ] NÃO DECLARADA!
  1. Checagem de declaração duplicada Não é permitido definição de uma mesma variável no mesmo escopo. Exemplo:
qint main()<quack>
	qint variavelExemplo <- 1;
	if(variavelExemplo<!>0) <quack>
		qint variavelExemplo;
	</quack>
	qint variavelExemplo;
	qint u;
	u <- 0;
</quack>

Caso isso ocorra, será mostrado erro do tipo:

└──ERRO 409 - Declaração duplicada! Variável variavelExemplo já declarada