·

Ciência da Computação ·

Compiladores

Send your question to AI and receive an answer instantly

Ask Question

Preview text

Compilador fase 1 Análise léxica e sintática O objetivo desse trabalho é implementar as fases de análise léxica e sintática de um compilador para uma linguagem baseada na linguagem Pascal denominada Pascal O compilador para Pascal restringe a linguagem Pascal para ter apenas tipos inteiros integer e lógicos boolean comandos condicionais if e repetição for e não implementa a declaração e chamadas de funções a exceção se faz para as funções de entrada read e saída write Na implementação do compilador o analisador léxico deve atender as demandas do analisador sintático A interação entre o analisador léxico e o analisador sintático se dá por meio da função consome analisador sintático que realizará chamadas à função obteratomo analisador léxico O nome do arquivo fonte é informado por linha de comando ao compilador Figura 1 Interação entre Analisador Léxico e Sintático A seguir são apresentadas a gramática da linguagem Pascal que deve ser seguida rigorosamente e as especificações léxicas da linguagem onde são definidos os átomos da linguagem Gramática da linguagem Pascal A sintaxe da linguagem Pascal está descrita na notação EBNF os nãoterminais da gramática são nomes entre parênteses angulares e e os símbolos terminais átomos do analisador léxico estão em negrito ou entre aspas Ex A notação denotará a repetição da cadeia zero uma ou mais vezes e a construção β é equivalente a βλ ou seja indica que a cadeia β é opcional Considere que o símbolo inicial da gramática é programa programa program identificador bloco bloco declaracaodevariaveis comandocomposto declaracaodevariaveis tipo listavariavel tipo integer boolean listavariavel identificador identificador comandocomposto begin comando comando end comando comandoatribuicao comandocondicional comandorepeticao comandoentrada comandosaida comandocomposto comandoatribuicao set identificador to expressao comandocondicional if expressao comando elif comando TInfoAtomo solicita átomo Analisador sintático char lookahead consome soliciata Arquivo fonte if a b a a 1 writea Analisador léxico char buffer obteratomo comandorepeticao for identificador of expressão to expressão comando comandoentrada read listavariavel comandosaida write expressao expressao expressao expressaologica or expressaologica expressaologica expressaorelacional and expressaorelacional expressãorelacional expressaosimples oprelacional expressaosimples oprelacional expressaosimples termo termo termo fator fator fator identificador numero true false not fator expressao Especificação Léxica Caracteres Delimitadores Os caracteres delimitadores espaços em branco quebra de linhas tabulação e retorno de carro r deverão ser eliminados ignorados pelo analisador léxico mas o controle de linha contagem de linha deverá ser mantido Comentários Existem dois tipos de comentário um começando com e indo até o final da linha 1 linha com o finalizador do comentário o caractere O outro começando com e terminando com várias linhas nesse comentário é importante que a contagem de linha seja mantida Importante Os comentários devem ser repassados para o analisador sintático para serem reportados e descartados Identificadores Os identificadores começam com uma letra em minúsculo em seguida pode vir zero ou mais letras minúsculas underline ou dígitos limitados a 15 caracteres Caso seja encontrado um identificador com mais de 15 caracteres deve ser retornado ERRO pelo analisador léxico A seguir a definição regular para identificadores letra abz digito 019 identificador letraletradigito Importante Na saída do compilador para átomo identificador deverá ser impresso o lexema que gerou o átomo ou seja a sequência de caracteres reconhecida Palavras reservadas As palavras reservadas na linguagem Pascal são lexemas em minúsculo and begin boolean elif end false for if integer not of or program read set to true write Importante Uma sugestão é que as palavras reservadas sejam reconhecidas na mesma função que reconhece os identificadores e deve ser retornado um átomo específico para cada palavra reservada reconhecida Números No compilador teremos somente números inteiros na notação binária com seguinte definição regular abaixo numero 0b01 Importante Na saída do compilador para átomo numero deverá ser impresso o valor numérico na notação decimal do atributo do átomo ou seja o lexema que gerou o átomo convertido para notação decimal Execução do Compilador O compilador deve ler o arquivo fonte com o nome informado por linha de comando e informar na tela do computador cada um dos átomos reconhecidos no arquivo o número de linhas analisadas e que o programa está sintaticamente correto Caso seja detectado um erro léxico ou sintático o compilador devese emitir uma mensagem de erro explicativa e terminar a execução do programa A mensagem explicativa deve informar a linha do erro o tipo do erro léxico ou sintático e caso seja um erro sintático devese informar qual era o átomo esperado e qual foi o átomo encontrado na análise veja abaixo um exemplo de saída da execução do compilador para o programa exemplo1 Arquivo fonte de entrada 1 2 3 4 program exemplo1 begin writemaior end Saída do compilador na tela 1program 1identificador exemplo1 1pontovirgula 2begin 3write 3abrepar 3identificador maior 3erro sintatico esperado encontrado end A seguir temos um outro programa em Pascal que lê uma dois números e encontra o maior o programa a seguir está correto léxico e sintático Arquivo fonte de entrada 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 programa le dois numeros inteiros e encontra o maior program exemplo2 integer num1 num2 integer maior begin readnum1 readnum2 if num1 num2 set maior to num1 elif set maior to num2 writemaior imprime o maior valor end Para o exemplo2 o compilador deverá ter a seguinte saída cada um dos átomos reconhecidos no arquivo o número de linhas analisadas e que o programa está sintaticamente correto Saída do compilador na tela 1comentario 4program 4identificador exemplo2 4pontovirgula 5integer 5identificador num1 5virgula 5identificador num2 5pontovirgula 6integer 6identificador maior 6pontovirgula 7begin e por ai vai 16 linhas analisadas programa sintaticamente correto Observações importantes O programa deve estar bem documentado e pode ser feito em grupo de até 2 alunos não esqueçam de colocar o nome dos integrantes do grupo no início do arquivo fonte do trabalho e sigam as Orientações para Desenvolvimento de Trabalhos Práticos disponível no Moodle O trabalho será avaliado de acordo com os seguintes critérios Funcionamento do programa Caso o programa não compile ou não execute será atribuída a nota 0 ao trabalho Caso programa apresentarem warning a ser compilado ou não finalize com retorno igual a 0 será descontado 10 um ponto por warning relatado O trabalho deve ser desenvolvido na linguagem C e será testado usando o compilador do MinGW com VSCode para configurar sua máquina no Windows acesse httpswwwdougdevbr2022InstalacoeseconfiguracoesparaprogramaremCusandooVS Code Compile seu programa com o seguinte comando abaixo considere que o programa fonte do seu compilador seja compiladorc gcc g Og Wall compiladorc o compilador Atendimento a especificação do enunciado O quão fiel é o programa quanto à descrição do enunciado o seu programa deve seguir a gramática descrita acima e fazer leitura de programa fonte armazenado em arquivo com o nome informado por linha de comando Clareza e organização programas com código confuso linhas longas variáveis com nomes não significativos e desorganizado sem indentação sem comentários também serão penalizados Entrega de um arquivo Readmetxt explicando até a parte do trabalho que foi feito