Diferenças entre edições de "E-folioA 2017/2018"

Da wiki Wiki Universidade Aberta
(Criou a página com "E-fólio A: máximo 4 valores Pretende-se construir um compilador da linguagem LittleC. No e-fólio A, reportar-nos-emos apenas às análises léxica e sintática. O progra...")
 
(Inseridos "bullets" e "sub-bullets" nesta página do Enunciado do "e-fólio A" de "2017-2018" da UC de "Compilação")
 
(Há uma edição intermédia do mesmo utilizador que não está a ser apresentada)
Linha 5: Linha 5:
  
 
Assim, deve começar por construir um analisador léxico, em flex, com as seguintes características:
 
Assim, deve começar por construir um analisador léxico, em flex, com as seguintes características:
Deve reconhecer números nos seguintes formatos:
+
* Deve reconhecer números nos seguintes formatos:
números inteiros (positivos, negativos e zero);
+
** números inteiros (positivos, negativos e zero);
números com casas decimais (separadas por um ponto);
+
** números com casas decimais (separadas por um ponto);
números em notação científica (ex: 5e-10);
+
** números em notação científica (ex: 5e-10);
Deve reconhecer as seguintes palavras-chave da linguagem: if, else, while, for.
+
* Deve reconhecer as seguintes palavras-chave da linguagem: if, else, while, for.
Deve reconhecer os operadores condicionais e aritmáticos: ==,!=,>,<,>=,<=,+,-,*,/.
+
* Deve reconhecer os operadores condicionais e aritmáticos: ==,!=,>,<,>=,<=,+,-,*,/.
Deve reconhecer o operador de atribuição: =
+
* Deve reconhecer o operador de atribuição: =
Deve reconhecer identificadores (variáveis e nomes de funções), que podem começar por uma letra ou pelo caráter '_', seguido de letras, dígitos ou '_'.
+
* Deve reconhecer identificadores (variáveis e nomes de funções), que podem começar por uma letra ou pelo caráter '_', seguido de letras, dígitos ou '_'.
Deve reconhecer os outros símbolos usados na linguagem: ;,(,),{,}.
+
* Deve reconhecer os outros símbolos usados na linguagem: ;,(,),{,}.
Deve reconhecer os espaços em branco, isto é, os carateres ' ' (espaço), a tabulação e a mudança de linha.
+
* Deve reconhecer os espaços em branco, isto é, os carateres ' ' (espaço), a tabulação e a mudança de linha.
 +
 
  
 
Após a conclusão do analisador léxico, pode iniciar a construção de um analisador sintáctico (bison ou C) que reconheça a linguagem LittleC, onde:
 
Após a conclusão do analisador léxico, pode iniciar a construção de um analisador sintáctico (bison ou C) que reconheça a linguagem LittleC, onde:
- a instrução condicional if-else tem a forma if(condição){bloco de instruções} else {bloco de instruções} (NOTA: o else é sempre obrigatório, bem como as chavetas, podendo o bloco de instruções ser vazio)
+
* a instrução condicional if-else tem a forma if(condição){bloco de instruções} else {bloco de instruções} (NOTA: o else é sempre obrigatório, bem como as chavetas, podendo o bloco de instruções ser vazio)
- o ciclo while tem a forma while(condição){bloco de instruções}
+
* o ciclo while tem a forma while(condição){bloco de instruções}
- o ciclo for tem a forma para(atribuição do valor inicial;condição;incremento na forma de atribuição) {bloco de instruções}
+
* o ciclo for tem a forma para(atribuição do valor inicial;condição;incremento na forma de atribuição) {bloco de instruções}
- todas as instruções de atribuição terminam com ';'
+
* todas as instruções de atribuição terminam com ';'
- qualquer identificador que não seja uma palavra chave será uma variável e não precisa ser declarada;
+
* qualquer identificador que não seja uma palavra chave será uma variável e não precisa ser declarada;
- o programa correrá sequencialmente a partir da primeira instrução, não sendo precisa nenhuma função (como a função main no C) para iniciar o programa.
+
* o programa correrá sequencialmente a partir da primeira instrução, não sendo precisa nenhuma função (como a função main no C) para iniciar o programa.
 +
 
  
 
Bom trabalho!
 
Bom trabalho!
Linha 30: Linha 32:
 
Exemplo de um programa em LittleC:
 
Exemplo de um programa em LittleC:
  
i=0;
+
    i=0;
x=0;
+
    x=0;
 
+
   
while(i<10){
+
    while(i<10){
  x=x+i;
+
        x=x+i;
  i=i+1;
+
        i=i+1;
}
+
    }
 
+
   
if(x<50){
+
    if(x<50){
  x=50;
+
        x=50;
}
+
    }
else{}
+
    else{}
 
+
   
y=0;
+
    y=0;
for(j=0;j<5;j=j+1){
+
    for(j=0;j<5;j=j+1){
  y = y + x - j;
+
        y = y + x - j;
}
+
    }
  
 
Formato de entrega: o trabalho deve ser enviado com todos os ficheiro contidos num ficheiro ZIP, incluindo os analisadores léxicos e sintáticos, bem como um pequeno relatório (não mais de 3 páginas) a explicar as opções tomadas, e um ficheiro readme.txt a explicar como devem ser compilados os ficheiros de modo a obter o compilador, bem como a explicar os argumentos do mesmo.
 
Formato de entrega: o trabalho deve ser enviado com todos os ficheiro contidos num ficheiro ZIP, incluindo os analisadores léxicos e sintáticos, bem como um pequeno relatório (não mais de 3 páginas) a explicar as opções tomadas, e um ficheiro readme.txt a explicar como devem ser compilados os ficheiros de modo a obter o compilador, bem como a explicar os argumentos do mesmo.

Edição atual desde as 16h51min de 21 de janeiro de 2019

E-fólio A: máximo 4 valores

Pretende-se construir um compilador da linguagem LittleC. No e-fólio A, reportar-nos-emos apenas às análises léxica e sintática. O programa deve ler um ficheiro de entrada, detectar eventuais erros e no fim escrever uma mensagem a dizer se o reconhecimento foi feito com sucesso ou não.

Assim, deve começar por construir um analisador léxico, em flex, com as seguintes características:

  • Deve reconhecer números nos seguintes formatos:
    • números inteiros (positivos, negativos e zero);
    • números com casas decimais (separadas por um ponto);
    • números em notação científica (ex: 5e-10);
  • Deve reconhecer as seguintes palavras-chave da linguagem: if, else, while, for.
  • Deve reconhecer os operadores condicionais e aritmáticos: ==,!=,>,<,>=,<=,+,-,*,/.
  • Deve reconhecer o operador de atribuição: =
  • Deve reconhecer identificadores (variáveis e nomes de funções), que podem começar por uma letra ou pelo caráter '_', seguido de letras, dígitos ou '_'.
  • Deve reconhecer os outros símbolos usados na linguagem: ;,(,),{,}.
  • Deve reconhecer os espaços em branco, isto é, os carateres ' ' (espaço), a tabulação e a mudança de linha.


Após a conclusão do analisador léxico, pode iniciar a construção de um analisador sintáctico (bison ou C) que reconheça a linguagem LittleC, onde:

  • a instrução condicional if-else tem a forma if(condição){bloco de instruções} else {bloco de instruções} (NOTA: o else é sempre obrigatório, bem como as chavetas, podendo o bloco de instruções ser vazio)
  • o ciclo while tem a forma while(condição){bloco de instruções}
  • o ciclo for tem a forma para(atribuição do valor inicial;condição;incremento na forma de atribuição) {bloco de instruções}
  • todas as instruções de atribuição terminam com ';'
  • qualquer identificador que não seja uma palavra chave será uma variável e não precisa ser declarada;
  • o programa correrá sequencialmente a partir da primeira instrução, não sendo precisa nenhuma função (como a função main no C) para iniciar o programa.


Bom trabalho!

Nota: se tiver alguma dúvida ou verificar alguma falha no enunciado, coloque essa questão no fórum.

Exemplo de um programa em LittleC:

   i=0;
   x=0;
   
   while(i<10){
       x=x+i;
       i=i+1;
   }
   
   if(x<50){
       x=50;
   }
   else{}
   
   y=0;
   for(j=0;j<5;j=j+1){
       y = y + x - j;
   }

Formato de entrega: o trabalho deve ser enviado com todos os ficheiro contidos num ficheiro ZIP, incluindo os analisadores léxicos e sintáticos, bem como um pequeno relatório (não mais de 3 páginas) a explicar as opções tomadas, e um ficheiro readme.txt a explicar como devem ser compilados os ficheiros de modo a obter o compilador, bem como a explicar os argumentos do mesmo.