Ferramenta YACC

 

  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. ( o que está entre os %%  )
    3. Elimine os conflitos da especificação sintáctica apresentada, alterando EXCLUSIVAMENTE a gramática.
  2. Pretende-se determinar se os parênteses (curvos e rectos) e as chavetas de um programa em   Java estão devidamente aninhados e emparelhados, utilizando a ferramenta YACC. 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 pertinentes para resolver o problema. Todas as rotinas auxiliares deverão ser codificadas.
  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.