Trabalhos Práticos - PLI 2002


Trabalho Prático 1


Trabalho Prático 2

Este trabalho irá ser composto por 3 ou 4 fases distintas. O aluno deverá ir desenvolvendo o trabalho à medida que os enunciados começarem a ser publicados nesta página. Há uma data limite para a conclusão de cada uma das etapas. No fim de cada etapa será feita a entrega dum "deliverable" específico que será solicitado no enunciado de cada fase.

Após uma data limite, poderá ser-te solicitada pelo docente uma demonstração do estado actual do protótipo, durante uma aula prática, pelo que deverás fazer-te sempre acompanhar por uma diskette com a versão actual do trabalho. 

 

Descrição geral do trabalho

O trabalho, no seu todo, consistirá num gerador de parsers para gramáticas LL(1). 

Durante as várias etapas o aluno terá que:


Etapa 1 (Data limite - 5 de Abril)

Visualização dos realatórios submetidos

Nesta etapa, terás que definir uma linguagem para a especificação de gramáticas independentes de contexto.

Uma gramática independente de contexto é um quádruplo:

Usa a tua imaginação e criatividade e discute com os docentes e os colegas as tuas ideias.

Assim que tiveres uma definição estável da linguagem implementa um reconhecedor para essa linguagem usando a tecnologia leccionada na disciplina até agora: lex para o analisador léxico e C+recursivo descendente para o analisador sintático.

Deliverables

Pequeno relatório em LaTeX contendo:


Etapa 2 (Data limite - 19 de Abril)

Tendo o reconhecedor terminado há que acrescentar-lhe as acções semânticas para a construção da representação abstracta. Para isso, vais extrair a sintaxe abstracta da linguagem concreta que definiste na etapa1 e vais usar as regras introduzidas nas aulas teóricas para derivar os tipos de dados em C e as respectivas funções de construção em C.

Uma vez construída a representação abstracta deverás implementar em C os algoritmos que permitam verificar se a gramática que foi especificada na tua linguagem é LL(1): first, follow, firstN, lookahead.

No fim desta fase, o teu compilador deverá aceitar a especificação duma gramática e indicar ao utilizador se a gramática é LL(1) ou não. No caso de não ser, deverá indicar quais as situações de conflito.

Extra: sugerir as transformações a aplicar nas situações de conflito.

Em alternativa, para quem não conseguir implementar os algoritmos referidos no ponto anterior, poderás fazer as seguintes validações/tarefas:

  1. Não há produções com identificadores idênticos, ou seja, o identificador da produção é único.
  2. Todos os Símbolos terminais e não terminais estão devidamente declarados.
  3. O axioma é um símbolo não terminal devidamente declarado e que aparece pelo menos uma vez do lado esquerdo duma produção.
  4. Quem não conseguiu implementar o cálculo de lookaheads deve fazer um acrescento à linguagem: para cada produção deverá ser possível especificar a lista de símbolos terminais pertencentes ao lookahead da produção.

Deliverables

Pequeno relatório em LaTeX contendo:


Etapa 3 (Data limite - 3 de Maio)

Nesta etapa, vais fazer a geração de código.

Terás que gerar código para os seguintes módulos:

  1. Analisador léxico: especificação em lex, como vem sendo hábito poderás gerar também o ficheiro tokens.h
  2. Analisador sintáctico: utilizando o método recursivo descendente
  3. Tratamento de erros: deverão ser detectados erros léxicos e sintácticos

Deliverables

Pequeno relatório em LaTeX contendo:


Etapa 4 (Data limite - 17 de Maio) - entrega final

Nesta etapa, apenas terás de substituir o parser recursivo descendente pelo parser LALR gerado pelo yacc. Para isso, terás que especificar a gramática da tua linguagem no yacc e transpor as acções semânticas do recursivo descendente (é provável que a gramática sofra alterações tornando-se mais simples).

Deliverables


16-04-2002 16:13 by jcr