Tópicos
Ferramenta YACC.
Considere a seguinte especificação sintáctica:
%token NUM %union { int i; } %type <i> NUM cnvl %% cnvl : NUM { $$ = $1; } | cnvl '-' cnvl { $$ = $1 - $3; } | cnvl '!' { $$ = printf("%d\n", $1); } ; %% int yyerror(char *s) { printf("%s\n", s); return 0; } int main() { return yyparse(); }
- A especificação sintáctica apresenta conflitos. Identifique esses conflitos e a sua origem.
- Elimine os conflitos da especificação sintáctica apresentada, SEM ALTERAR A GRAMÁTICA (i.e., o que está entre os %%).
- Elimine os conflitos da especificação sintáctica apresentada, alterando EXCLUSIVAMENTE a gramática.
Exercício 2
Pretende-se determinar, utilizando a ferramenta YACC, se os parênteses (curvos e rectos) e as chavetas de um programa Java estão devidamente aninhados e emparelhados. Considere que em Java não pode haver chavetas dentro de parênteses. Assuma que o analisador lexical já retirou os comentários, cadeias de caracteres e todos os restantes caracteres com a excepção dos 6 (seis) delimitadores relevantes para a solução do problema. Todas as rotinas auxiliares deverão ser codificadas.
Exercício 3
Pretende-se fazer uma calculadora de expressões lógicas usando a interpretação dirigida pela sintaxe. A calculadora utiliza 10 variáveis designadas pelos números 0 a 9 da variável ival associada ao token VAR. Os literais verdadeiro e falso são designados pelos tokens VERD e FALS, respectivamente. O cálculo é efectuado através de uma sequência de expressões terminadas por ';' ou ',' consoante o resultado da expressão deva ser impresso ou não, respectivamente. A atribuição de uma expressão a uma variável é efectuada pelo operador '=', não associativo. As expressões utilizam os seguintes operadores, por ordem decrescente de prioridade:
- negação lógica:
- operador unário pré-fixado, não associativo, designado por '!'.
- E lógico:
- operador binário, associativo à esquerda, designado por '&'.
- OU inclusivo lógico:
- operador binário, associativo à esquerda, designado por '|'.
- OU exclusivo lógico:
- operador binário, associativo à direita, designado por ' ~ '.
- comparação:
- operadores binários, associativos à esquerda, designados por '>', '<', EQ e NE.
A prioridade dos operadores pode ser alterada utilizando parenteses curvos '(' e ')'. No início todos os registos têm o valor lógico falso.
Todas as rotinas auxiliares deverão ser codificadas.
Resoluções
As soluções destes e de outros exercícios relacionados com estes tópicos estão disponíveis no wiki da disciplina.