****************************** ********** COM - P3 ********** ****************************** Data : 05/12/2003 a 06/12/2003 Versão : 04/07/2007 Professor: Fabrício Jailson Barth Autor : Leandro Salvador ( leandrosalvador.com.br ) * Prova 1) Defina os átomos desta linguagem: NUM = [0-9]+ VAR = [a-z]+ SOM = "+" MUL = "*" DIV = "/" SUB = "-" LPAREN = "(" RPAREN = ")" IGUAL = "=" FUNCAO = f 2) Construa um AFD, de acordo com a definição utilizada nesta disciplina, correspondente ao analisador léxico desta linguagem: -->(1)----- + ---->((2)) SOM | |------ * ---->((3)) MUL | |------ / ---->((4)) DIV | |------ - ---->((5)) SUB | |------ ( ---->((6)) LPAREN | |------ ) ---->((7)) RPAREN | |------ = ---->((8)) IGUAL | |------ f ---->((9)) FUNCAO | | | '-------. | | | v |------ [a-e,g-z] ---->((10)) VAR | |__^ | [a-z] | |------ [0-9] -------->((11)) NUM |__^ [0-9] 3) Construa um BNF para esta linguagem sem recursão à esquerda: ::= | T ::= FUNCAO LPAREN VAR RPAREN IGUAL ::= ::= (SOM | SUB) | T ::= ::= (MULT | DIV) | T ::= NUM | VAR 4) Explique porque é necessário eliminar a recursão à esquerda em uma BNF quando o analisador sintático implementado é do tipo descendente recursivo: - a eliminação da recursão à esquerda é importante porque quando o analisador sintático implementado é do tipo recursivo, corre-se o risco de a mesma função ser chamada infinitamente, em loop, de forma recursiva, inviabilizando a análise sintática, pois nesse caso o analisador ficará "travado" no loop recursivo - uma vez eliminada a recursão à esquerda, não corre-se mais o risco de uma função ser chamada por ela própria infinitas vezes, permitindo que o analisador sintático termine corretamente sua análise 5) Quais são as ações semânticas para esta linguagem? - o analisador semântico desta linguagem deverá verificar se o identificador utilizado no início da função (antes da atribuição) é o mesmo utilizado em toda a expressão (após a atribuição) - em outras palavras, o ID utilizado em f(x) é 'x' - seja qual for a expressão utilizada, o ID deverá ser sempre o mesmo 'x', por exemplo 6) Utilizando os códigos de máquina Load x Add x Sub x Mult x Div x Store x Gere código objeto linear para as seguintes funções (não precisa ser código otimizado): a) f(x) = 2 * x + 4 - x load x mult 2 store t1 load t1 add 4 store t2 load t2 sub x store t3 S --> F = T T --> E + 4 - V E --> 2 * V S F = T f(x) E + 4 - V 2 * V x x b) f(x) = x / 2 - x / 4 + 10 load x div 2 store t1 load x div 4 store t2 load t1 sub t2 store t3 load t3 add 10 store t4 S --> F = T T --> E - E + 10 E --> V / 2 E --> V / 4 S F = T f(x) E - E + 10 V / 2 V / 4 x x ----------//----------