Diferenças entre edições de "E-folioA 2017/2018"
(Adicionadas 4 linhas no início das linhas do código em "LittleC" para o código ficar devidamente formatado numa "caixa") |
(Inseridos "bullets" e "sub-bullets" nesta página do Enunciado do "e-fólio A" de "2017-2018" da UC de "Compilação") |
||
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) | |
− | + | * 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! | Bom trabalho! |
Edição atual desde as 15h51min 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.