title | date |
---|---|
Implementação de um analisador léxico com PLY |
2024-05-01 |
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.
- Todos os alunos necessitarão de contas no site Github
- Para o desenvolvimento serão utilizados os seguintes componentes:
git
python
ply
behave
- Criar um fork do projeto
compiladores_2024_t1
- Deve ser criado um "módulo" com o nome
lexer
com uma funçãolexer
que irá retornar um objeto que realizará as operações da análise léxica. - 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 tipoLIT_INT
- números de ponto flutuante (
3.1425
) e números de ponto flutuante em notação científica (1.24e-14
), com tipoLIT_REAL
- As cadeias de caracteres (strings) devem estar entre aspas (
"
) ou apóstrofes('
), por exemplo,'palavra'
e"A"
são cadeias de caracteres, com tipoLIT_STRING
.
- números inteiros (
- 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)
- Diretivas:
- identificadores (
* Comandos:
```nohl
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:
```nohl
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_:
```nohl
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`)
- O analisador léxico implementado deve controlar também o número da linha sendo processada no arquivo.
- 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.
- 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.
- Serão fornecidos testes automatizados para a avaliação do trabalho. Os testes podem ser executadosu utilizando o utilitário
behave
ou o utilitáriotox
, que podem ser instalados em um ambiente virtual do Python.
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.
- Nenhum arquivo fora do diretório
src
pode ser modificado. - O trabalho pode ser realizado em dupla.
- Todo código fornecido em aula pode ser utilizado no trabalho.
- Em caso de plágio, a nota atribuída ao trabalho será 0 (zero).