Compiladores

Implementação de um analisador léxico com PLY

Última ocorrência: 2024-1 em Universidade Lasalle Canoas

Objetivo

Experimentar sobre a implementação de um componente do processo de compilação, a análise léxica, utilizando uma ferramenta para criação dos automatos finitos para realização da tarefa.

Para esse experimento, será implementado um analisador léxico para um subconjunto da linguagem de programação Pascal.

Pré-requisitos

Tarefas

  1. Criar um fork do projeto compiladores_2024_t1
  2. Deve ser criado um “módulo” com o nome lexer com uma função lexer que irá retornar um objeto que realizará as operações da análise léxica.
  3. O analisador léxico deve ser capaz de reconhecer diversos tokens. A lista a seguir mostra as construções que devem ser reconhecidas, associadas com o tipo do token:
    • identificadores (ID), por exemplo, nomes de funções e variáveis, devem começar com uma letra ou o carectere de “sublinhado” (_), seguidos de um número qualquer de letras, números ou “sublinhado”.
    • Apenas caracteres alfanuméricos no conjunto ASCII-7 são aceitos na definição de identificadores.
    • Literais:
      • números inteiros (123), com tipo LIT_INT
      • números de ponto flutuante (3.1425) e números de ponto flutuante em notação científica (1.24e-14), com tipo LIT_REAL
      • As cadeias de caracteres (strings) devem estar entre aspas (") ou apóstrofes('), por exemplo, 'palavra' e "A" são cadeias de caracteres, com tipo LIT_STRING.
    • Palavras reservadas da linguagem incluem:
      • Diretivas:
          program (DIR_PROGRAM)
          var (DIR_VAR)
          procedure (DIR_PROC)
          function (DIR_FUNC)
          begin (DIR_BEGIN)
          end (DIR_END)
          type (DIR_TYPE)
          of (DIR_OF)
          const  (DIR_CONST)
          with (DIR_WITH)
        
      • Comandos:
          if (STMT_IF)
          then (STMT_THEN)
          else (STMT_ELSE)
          while (STMT_WHILE)
          repeat (STMT_REPEAT)
          for (STMT_FOR)
          do (STMT_DO)
          until (STMT_UNTIL)
          to (STMT_TO)
          downto (STMT_DOWNTO)
          case (STMT_CASE)
        
      • Tipos de dados:
          array (TYPE_ARRAY)
          set (TYPE_SET)
          record (TYPE_RECORD)
          file (TYPE_FILE)
          integer (TYPE_INT)
          real (TYPE_REAL)
          character (TYPE_CHAR)
          boolean (TYPE_BOOL)
          string (TYPE_STRING)
        
      • Funções built-in:
          read    (FN_READ)
          readln  (FN_READLN)
          write   (FN_WRITE)
          writeln (FN_WRITELN)
        
      • Representação de valor nulo: nil (OP_NIL)
    • Operadores:
      • Atribuição: := (OP_ATRIB)
      • Aritméticos: + - (OP_SUM) * / div mod (OP_MUL)
      • Relacionais: = <> <= >= > < (OP_REL)
      • Lógicos: and or not (OP_LOGIC)
      • Range: .. (OP_RANGE)
      • Comentários: (COMMENT)
        • Multi-linha: { } ou (* *)
        • Fim de Linha: //
      • Outros operadores:
        • ( (OP_OPAR)
        • ) (OP_CPAR)
        • [ (OP_OBRA)
        • ] (OP_CBRA)
        • , (OP_COMMA)
        • ; (OP_EOC)
        • . (OP_PERIOD)
        • : (OP_COLON)
  4. O analisador léxico implementado deve controlar também o número da linha sendo processada no arquivo.
  5. Os tokens retornados pelo analisazdor léxico devem conter:
    • A string extraída
    • O tipo do token (de acordo com as tabelas anteriores)
    • A linha em que o token foi encontrado
    • E a representação do valor do token quando for adequado.
  6. No caso do processamento encontrar um erro léxico, deve ser gerada uma exceção com o caracter que gerou o erro, o número da linha onde ocorreu o erro, e a posição do caracter na linha onde ocorreu o erro.
  7. Serão fornecidos testes automatizados para a avaliação do trabalho. Os testes podem ser executadosu utilizando o utilitário behave ou o utilitário tox, que podem ser instalados em um ambiente virtual do Python.

Entrega do trabalho

Um único aluno do grupo de alunos que trabalhou na execução do trabalho deverá criar um pull request contra o repositório original do trabalho. O título do pull request é livre, porém o corpo deve conter os nomes completos de todos os alunos do grupo.

Uma vez criado o pull request ele pode ser atualizado a qualquer momento, até a data limite de entrega.

Na data limite, o pull request receberá um label de AVALIADO, um comentário com o resultado da avaliação, será fechado, e não poderá mais ser alterado.

No LEX, todos os alunos do grupo devem inserir, até a data limite, o link para o pull request de entrega do trabalho.

A data máxima de entrega é dia 1 de maio de 2024.

Observações

Referências