Tópicos

Ferramenta YACC.

Exercício 1

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(); }

  1. A especificação sintáctica apresenta conflitos. Identifique esses conflitos e a sua origem.
  2. Elimine os conflitos da especificação sintáctica apresentada, SEM ALTERAR A GRAMÁTICA (i.e., o que está entre os %%).
  3. 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.