• Nenhum resultado encontrado

Paradigmas de Linguagem de Programação

N/A
N/A
Protected

Academic year: 2021

Share "Paradigmas de Linguagem de Programação"

Copied!
64
0
0

Texto

(1)

Paradigmas de Linguagem

de Programação

Sintaxe

Introdução

▪ Sintaxe: conjunto de regras que definem a forma da linguagem;

▪ Como as sentenças podem ser formadas como sequências de componentes básicos – palavras;

▪ A sintaxe não revela nada sobre o significado da sentença; ▪ Exemplo:

▪ Em C, palavras chaves como while, do, for, if, são palavras da linguagem;

▪ Palavras não são elementares, elas são construídas com caracteres que pertencem a um alfabeto;

▪ Assim, a sintaxe de uma linguagem é definida por dois conjuntos de regras: regras léxicas e regras sintáticas.

(2)

▪ Será apresentado nos próximos slides a definição de compilador e suas fases de análise léxica, sintática e semântica

▪ Compreender a sintaxe e o comportamento de um compilador é essencial para o bom programador

Professor Ariel da Silva Dias - www.arieldias.com - Obra Gratuita, proibida reprodução e venda

Contexto de um compilador

▪ Aquilo que é usualmente designado por um compilador é de fato um conjunto de programas que no seu conjunto formam o compilador;

(3)

Contexto de um compilador

Professor Ariel da Silva Dias - www.arieldias.com - Obra Gratuita, proibida reprodução e venda

▪ Componentes

▪ Pré-Processador: processa diretivas; retira os comentários; entre outras tarefas. ▪ Compilador: faz a análise do texto escrito na linguagem fonte e faz a sua transcrição

para a linguagem destino;

▪ Assembler: faz a transcrição da linguagem intermediária para a linguagem final (máquina);

▪ Loder/Linker: no caso de que se querer um programa executável os “loader/linker” fazem a junção do código máquina produzido pelas anteriores fases a um conjunto de serviços (“run-time routines”) que permitem a criação de um programa independente

Contexto de um compilador

Código Fonte Tokens e Lexemas Árvore Sintática Abstrata AST Decorada A b str aç ão eme n taç ão

(4)

▪ 1) Análise

▪ 1.1) Análise léxica

▪ Organiza caracteres de entrada em grupos, chamados tokens ▪ Erros: tamanho máximo da variável excedido, caracteres inválidos.

Professor Ariel da Silva Dias - www.arieldias.com - Obra Gratuita, proibida reprodução e venda

Processo de compilação

▪ 1) Análise

▪ 1.2) Análise sintática

▪ Organiza tokens em uma estrutura hierárquica ▪ Erros: falta de (, ), =, identificador inválido...

(5)

Processo de compilação

▪ 1) Análise

▪ 1.3) Análise semântica

▪ Checa se o programa respeita regras básicas de consistência

▪ Erro: tipos inconsistentes ➔ atribuir uma string em uma variável inteira

Professor Ariel da Silva Dias - www.arieldias.com - Obra Gratuita, proibida reprodução e venda

Processo de compilação

▪ Vejamos um exemplo, seja a seguinte instrução de atribuição:

▪ posicao = inicial + incremento * 60

▪ Na análise léxica é separada em uma lista de palavras:

(6)

▪ Vejamos um exemplo, seja a seguinte instrução de atribuição:

▪ posicao = inicial + incremento * 60

▪ Na análise sintática tenta-se construir uma frase correta com a lista de palavras produzidas pela fase anterior. É usual construir uma estrutura em árvore para representar a frase obtida.

Professor Ariel da Silva Dias - www.arieldias.com - Obra Gratuita, proibida reprodução e venda

Processo de compilação

▪ Vejamos um exemplo, seja a seguinte instrução de atribuição:

▪ posicao = inicial + incremento * 60

▪ Na análise semântica verifica a validade da frase no que diz respeito aos tipos das entidades utilizadas. Por exemplo, se um dos identificadores presentes na expressão é do tipo real, então é necessário converter 60 para a sua representação real:

(7)

Tabela de símbolos

▪ A informação acerca das palavras que o programa contém tem de fluir entre as várias fases do compilador;

▪ A tabela de símbolos vai conter uma entrada para cada uma das palavras que foram identificadas pelo analisador léxico;

Professor Ariel da Silva Dias - www.arieldias.com - Obra Gratuita, proibida reprodução e venda

Gestão de erros

▪ Trata-se de detectar os erros enviando uma mensagem apropriada para o utilizador: local do erro; tipo do erro; causa provável;

▪ É importante tentar recuperar do erro automaticamente de forma a poder continuar a tarefa de compilação até ao máximo possível;

(8)

Professor Ariel da Silva Dias - www.arieldias.com - Obra Gratuita, proibida reprodução e venda

Definição de linguagem

▪ Linguagens Formais

▪ Alfabeto: Um conjunto finito e não vazio de símbolos arbitrários é designado por um alfabeto, e é denotado por Σ;

▪ Um símbolo de um alfabeto é uma entidade abstrata básica, podendo representar números, letras, desenhos, etc, por exemplo: 1,2,a,b,c.

▪ Um alfabeto é representado por: Σ (sigma)

Σ = {0,1} Σ = {a,b}

(9)

Definição de linguagem

▪ Linguagens Formais

▪ Palavra (ou cadeia de caracteres): As sequências finitas de símbolos (do alfabeto) justapostos;

▪ O conjunto de todas as palavras sobre Σ é denotado por Σ ∗; ▪ A palavra vazia, não contém nenhuma letra, e é denotada por ɛ; ▪ Seja Σ = {a,b}

▪ Então as cadeias possíveis são:

▪ w = ɛ ▪ w = a ▪ w = b ▪ w = ab

Professor Ariel da Silva Dias - www.arieldias.com - Obra Gratuita, proibida reprodução e venda

Definição de linguagem

▪ Linguagens Formais

▪ Linguagem: Um conjunto arbitrário de palavras de Σ∗ é designado por uma linguagem e é usualmente denotado por L;

▪ Se Σ representa um alfabeto,

▪ Então Σ* representa o conjunto de todas as palavras possíveis sobre Σ; ▪ Σ+ representa o conjunto de todas as palavras excetuando a palavra vazia.

(10)

▪ Linguagens Formais

▪ Linguagem

▪ Assim podemos dizer que:

▪ Σ* = {ɛ, a, b, ab, ba, aab, abb, aaaa, ...} ▪ Σ+ = Σ* - ɛ = {a, b, ab, ba, aab, abb, aaaa, ...}

▪ Uma linguagem L é geralmente definida como um subconjunto de Σ*;

▪ Uma sentença é geralmente definida como uma cadeia pertencente à linguagem L.

Professor Ariel da Silva Dias - www.arieldias.com - Obra Gratuita, proibida reprodução e venda

Definição de linguagem

▪ Linguagens Formais

▪ Tamanho ou Comprimento

▪ O tamanho ou comprimento de uma cadeia w, representado por |w|, é o número de símbolos que compõem a cadeia;

▪ w = ɛ |w| = 0 ▪ w = a |w| = 1 ▪ w = ab |w| = 2 ▪ w = abb |w| = 3

(11)

Definição de linguagem

▪ Linguagens Formais

▪ Concatenação de Palavras: a concatenação de w e v é a cadeia obtida pela adição dos símbolos de v no final de w. Nenhum símbolo pode ser mudado de lugar; ▪ Se w = a1, a2,...,an e v = b1, b2, ... ,bn

Então a concatenação, w o v = a1a2...anb1b2...bn Por exemplo: seja w = ababa e v = cdcdcd Então w o v = ababacdcdcd

Professor Ariel da Silva Dias - www.arieldias.com - Obra Gratuita, proibida reprodução e venda

Definição de linguagem

▪ Linguagens Formais

▪ Concatenação de Palavras

▪ A operação de concatenação satisfaz as seguintes propriedades:

▪ a) associatividade

(12)

▪ Linguagens Formais

▪ Concatenação de Palavras

▪ A operação de concatenação também vale para as linguagens

▪ L1 o L2 = {x o y | x Є L1 e y Є L2}

▪ Exemplo:

▪ L1 = {a, bc} e L2 = {aa, cb, bb} ▪ L1 o L2 = {x o y | x Є L1 e y Є L2} = { ▪ L1 o L2 = {

Professor Ariel da Silva Dias - www.arieldias.com - Obra Gratuita, proibida reprodução e venda

Definição de linguagem

▪ Linguagens Formais

(13)

Definição de linguagem

▪ Linguagens Formais

▪ União, Intersecção e Diferença

▪ União: L1 U L2 = {w: w Є L1 ou w Є L2} ▪ Intersecção: L1 ∩ L2 = {w: w Є L1 e w Є L2} ▪ Diferença: L1 - L2 = {w: w Є L1 e w Ɇ L2}

▪ Exemplo:

▪ L1={a, b, aa, ab, abb, aab, aaa} e L2={a, aa, aaa, aaaa} ▪ União: L1 U L2 =

▪ Intersecção: L1 ∩ L2 = ▪ Diferença: L1 - L2 =

Professor Ariel da Silva Dias - www.arieldias.com - Obra Gratuita, proibida reprodução e venda

Definição de linguagem

▪ Linguagens Formais

▪ A imagem inversa de P, denotada por P−1é a palavra que se obtém de P por inversão

da ordem das letras. Por exemplo: se P = abcd, então ▪ P−1= dcba;

(14)

▪ Regras Léxicas

▪ Especificam o conjunto de caracteres que constituem o alfabeto da linguagem, bem como a maneira que eles podem ser combinados;

▪ Exemplo

▪ Pascal: letras maiúsculas e minúsculas são idênticas; ▪ C e ADA: letras maiúsculas e minúsculas são diferenciadas; ▪ Pascal: sinal de diferente → <>

▪ C: sinal de diferente → != ▪ ADA: sinal de diferente → /=:

Professor Ariel da Silva Dias - www.arieldias.com - Obra Gratuita, proibida reprodução e venda

Análise léxica

▪ Seu objetivo é analisar a entrada dada (programa fonte) e dividi-la em sequências considerando os tokens da linguagem, definidos por expressões regulares; ▪ Cada token é normalmente formado por seu tipo (se é um operador lógico, um

(15)

Análise léxica

▪ Este valor vai depender do tipo do token e normalmente corresponde à sequência de caracteres realmente lida da entrada.

Professor Ariel da Silva Dias - www.arieldias.com - Obra Gratuita, proibida reprodução e venda

Análise léxica

▪ Tarefa principal

▪ Ler o arquivo onde se encontra o programa-fonte

▪ Produzir como saída uma sequência de tokens com seus respectivos códigos que o Analisador Sintático usará para validar regras da gramática;

(16)

▪ Primeira fase do compilador;

▪ Lê a sequência de caracteres do canal de entrada e produz uma sequência de palavras (lexemas);

▪ Expressões regulares e as gramáticas regulares

▪ Descrevem a sintaxe das linguagens de programação ▪ Dado uma palavra

▪ Trata-se agora de, dado uma linguagem, ser capaz de reconhecer de forma automática se uma dada frase pertence a essa linguagem.

Professor Ariel da Silva Dias - www.arieldias.com - Obra Gratuita, proibida reprodução e venda

Análise léxica

▪ Lê os caracteres de entrada (scanner) e os agrupa em sequências chamadas lexemas (tokens);

▪ Os tokens são consumidos na fase seguinte (análise sintática);

Analisador Léxico (scanner) token GetToken() Programa Fonte Para Análise semântica Analisador sintático (parser) Tabela de Símbolos (identificadores e constantes)

(17)

Análise léxica

▪ A tabela de símbolos é utilizada para diferenciar palavras e símbolos reservados da linguagem (while, for, =, >, <) de identificadores definidos pelo usuário

Professor Ariel da Silva Dias - www.arieldias.com - Obra Gratuita, proibida reprodução e venda

Lexema (lido) Token (Tipo)

; <PONTO_VIRGULA>

aux <IDENTIFICADOR> while <PALAVRA_RESERVADA>

Análise léxica

▪ A tabela de símbolos também é utilizada para armazenar o tipo e o valor das variáveis e o seu escopo

Lexema (lido) Token (Tipo) Valor

; <PONTO_VIRGULA> -aux <IDENTIFICADOR> 10 while <PALAVRA_RESERVADA>

(18)

-▪ Classes de tokens mais comuns:

▪ identificadores; ▪ palavras reservadas; ▪ números inteiros sem sinal; ▪ números reais;

▪ cadeias de caracteres;

▪ sinais de pontuação e de operação; ▪ caracteres especiais;

▪ símbolos compostos de dois ou mais caracteres especiais; ▪ comentários;

▪ etc.

Professor Ariel da Silva Dias - www.arieldias.com - Obra Gratuita, proibida reprodução e venda

Análise léxica

▪ Exemplos de tokens que podem ser reconhecidos em uma linguagem de programação como C:

(19)

Análise léxica

▪ O analisador léxico desconsidera o trecho do código fonte que encontra-se entre delimitadores de comentários.

▪ Além disso, ele desconsidera espaços em branco colocados pelos programadores a fim de melhorar a legibilidade do código fonte (endentação).

Professor Ariel da Silva Dias - www.arieldias.com - Obra Gratuita, proibida reprodução e venda

Análise léxica

(20)

Professor Ariel da Silva Dias - www.arieldias.com - Obra Gratuita, proibida reprodução e venda Expressão Regular a corresponde a a abc abc [abc] a, b ou c [a-f] a,b,c,d,e ou f [0-9] qualquer digito de 0 a 9 X+ um ou mais elemento de X

X* zero ou mais elemento de X

[0-9]+ qualquer inteiro

(...) agrupamento de expressão

| alternância OU

(a|b|c)* equivale a [a-c]*

Análise léxica

▪ Exemplo: Expressão para reconhecer números reais (0, 27, .12, 2.19)

(21)

Análise sintática

▪ Regras Sintáticas

▪ Especificam as sequências de símbolos que constituem estruturas sintáticas válidas; ▪ Estas regras permitem o reconhecimento de expressões e comandos;

▪ Exemplo:

▪ Pascal: atribuição → a:=b; ▪ C: atribuição → a=b;

Professor Ariel da Silva Dias - www.arieldias.com - Obra Gratuita, proibida reprodução e venda

Análise sintática

As linguagens de programação possuem regras precisas para descrever a estrutura sintática de programas bem formados;

Exemplo: Linguagem C

Funções ➔ declaração e comando Comando ➔ expressões

A estrutura sintática das construções de uma linguagem de programação é especificada pelas regras gramaticais de uma gramática livre de contexto

(22)

Benefícios para projetistas de linguagens:

▪ Uma gramática provê uma especificação sintática precisa e fácil de entender para as linguagens de programação;

▪ A partir de determinadas classes gramaticais, podemos construir automaticamente um analisador sintático eficiente;

▪ Durante o processo de construção do analisador, podem ser detectadas ambiguidades sintáticas;

▪ Uma gramática permite o desenvolvimento de uma linguagem iterativamente, possibilitando lhe acrescentar novas construções para realizar novas tarefas;

Professor Ariel da Silva Dias - www.arieldias.com - Obra Gratuita, proibida reprodução e venda

Análise sintática

▪ Utiliza os tokens produzidos pela análise léxica e verifica a formação do programa com o uso de GLC (Gramáticas Livres de Contexto)

▪ A partir dos tokens é criada uma representação intermediária da árvore sintática ➔ mostra a estrutura gramatical da sequência de tokens;

(23)

Análise sintática

expr = a + b * 60 <identificador, 1>, < = >, <identificador, 2>, <+>, <identificador, 3>, < * >, <numero, 60>

Professor Ariel da Silva Dias - www.arieldias.com - Obra Gratuita, proibida reprodução e venda Percorrendo a árvore e consultando a GLC é possível verificar se a expressão pertence à linguagem. = <id,1> + <id,2> * <id,3> 60

Análise sintática

▪ O analisador sintático recebe do analisador léxico uma cadeia de tokens

representando o programa fonte e verifica se essa cadeia de tokens

pertence à linguagem gerada pela gramática.

(24)

O analisador sintático constrói uma árvore de derivação e a passa ao

restante do front-end do compilador para processamento.

Obs: na prática não é necessário construir a árvore de derivação

explicitamente, pois a ações de verificação e tradução podem ser

implementados em um único módulo.

Professor Ariel da Silva Dias - www.arieldias.com - Obra Gratuita, proibida reprodução e venda

Análise sintática

Existem 3 estratégias gerais de análise sintática para o processamento de gramáticas: Universal, Descendente (Top –Down) e Ascendente (Bottom –Up). Em ambas as estratégias a entrada do analisador sintático é consumida da esquerda para a direita, um símbolo de cada vez

Os analisadores criados à mão normalmente utilizam gramáticas LL

Os analisadores sintáticos para a maioria de gramáticas LR geralmente são construídos utilizando ferramentas automatizadas

(25)

Análise sintática

▪ Para descrever uma linguagem é necessário uma série de regras gramaticais; ▪ As regras são formadas por uma única estrutura do lado esquerdo seguida do

metasímbolo “::=“ e por uma sequência de itens do lado direito (símbolos ou estruturas);

▪ Estruturas entre <> são chamadas de não terminais;

▪ Símbolos como garota e cachorro são chamadas de terminais; ▪ As regras gramaticais são as produções.

Professor Ariel da Silva Dias - www.arieldias.com - Obra Gratuita, proibida reprodução e venda

Análise sintática

▪ Exemplo de uma gramática para expressões aritméticas de adição e multiplicação:

▪ <exp>::= <exp>+<exp> | <exp>*<exp> | (exp) | <num> ▪ <num> ::= <num><digito> | <digito>

(26)

▪ BNF

▪ Sentenças simples consistem de uma frase nominal e de uma frase verbal seguida de um ponto, da seguinte maneira:

▪ <sentence> ::= <frase_nominal><frase_verbal>.

▪ Deve-se saber descrever a estrutura de uma frase nominal e de uma frase verbal:

▪ <frase_nominal> ::= <artigo><substantivo> ▪ <artigo> ::= um | a

▪ <substantivo> ::= garota | cachorro ▪ <frase_verbal> ::= <verbo> <frase_nominal> ▪ <verbo> ::= viu | abraça

Professor Ariel da Silva Dias - www.arieldias.com - Obra Gratuita, proibida reprodução e venda

Análise sintática

▪ Cada regra gramatical apresentada consiste de uma string colocada entre “<“ e “>”, esta string é o nome da estrutura que está sendo descrita;

▪ O símbolo ::= pode ser lido como “consiste de” ou “é o mesmo que”; ▪ Após o símbolo ::=, temos uma sequência de outros nomes e símbolos;

(27)

Análise sintática

▪ Construção de uma sentença legal:

▪ Inicia-se com o símbolo <sentença> e prossegue-se trocando o lado esquerdo por alternativas do lado direito nas regras;

▪ Este processo criará uma derivação na linguagem;

▪ Desta forma, podemos construir a sentença: “A garota viu um cachorro”;

Professor Ariel da Silva Dias - www.arieldias.com - Obra Gratuita, proibida reprodução e venda

Análise sintática

▪ Montando a derivação da sentença: “a garota viu um cachorro” ▪ <sentença> →<frase_nominal><frase_verbal>.

▪ →<artigo><substantivo><frase_verbal>. ▪ →a <substantivo><frase_verbal>. ▪ →a garota <frase_verbal>.

▪ →a garota <verbo><frase_nominal>. ▪ →a garota viu <frase_nominal>. ▪ →a garota viu <artigo><substantivo>. ▪ →a garota viu um <substantivo>. ▪ →a garota viu um cachorro.

▪ Pode-se começar com a sentença “a garota viu um cachorro”, e voltar até <sentença> para provar que é uma sentença válida da linguagem.

(28)

Professor Ariel da Silva Dias - www.arieldias.com - Obra Gratuita, proibida reprodução e venda

Definição EBNF para uma linguagem de programação simples

Definição EBNF para uma calculadora Definição de sintaxe para uma linguagem

Análise sintática – Recursão a Esquerda

Na gramática a seguir, o não-terminal E representa expressões consistindo em termos separados pelo operador +; T representa termos consistindo em fatores separados pelo operador *; e F representa fatores que podem ser expressos entre parênteses ou identificadores.

Essa gramática não pode ser usada com o método de análise descendente pois é recursiva a esquerda.

(29)

Análise sintática – Recursão a Esquerda

Gramáticas são recursivas à esquerda se possui um não-terminal A para o qual existam derivações do tipo A➔Aα para uma cadeia α.

Para o par de produções recursivas à esquerda A ➔ Aα|β

A substituição abaixo elimina a recursão imediata à esquerda:

A ➔ βA’ A’ ➔ αA’ | ε

Nenhuma outra modificação é requerida a partir de A.

Professor Ariel da Silva Dias - www.arieldias.com - Obra Gratuita, proibida reprodução e venda

Análise sintática – Recursão a Esquerda

Gramática para expressões simples:

E → E + T | T T → T * F | F F → ( E ) | id

Aplicando transformação na Primeira Regra E →E+ T| Té do tipo A ➔ | β Obtemos: A ➔ βA’ E ➔TE’ A’ ➔ αA’ | ε E’ ➔ +TE’ | ε

(30)

Gramática para expressões simples:

E → E + T | T T → T * F | F F → ( E ) | id

Aplicando transformação na Segunda Regra E →T* F| Fé do tipo A ➔ | β Obtemos: A ➔ βA’ T ➔FT’ A’ ➔ αA’ | ε E’ ➔ *FT’ | ε

Professor Ariel da Silva Dias - www.arieldias.com - Obra Gratuita, proibida reprodução e venda

Análise sintática – Recursão a Esquerda

Assim, obtemos a partir

de:

E → E + T | T

T → T * F | F

F → ( E ) | id

A gramática equivalente sem recursão à

esquerda:

E → TE’

E’ → +TE’

T → FT’

T’ → *FT’ | ε

F → (E) | id

(31)

Análise sintática – Recursão a Esquerda

Exemplo 2: A→ Aa | b Exemplo 3: S → SS+ | SS* | a Exemplo 4: S → Sa | B B → Bb | c

Para o par de produções recursivas à esquerda A ➔ Aα|β

Considere para eliminar a recursão A ➔ βA’

A’ ➔ αA’ | ε

Professor Ariel da Silva Dias - www.arieldias.com - Obra Gratuita, proibida reprodução e venda

Análise sintática – Recuperação de erro

O recuperador de erros em um analisador sintático possui objetivos simples, mas desafiadores:

▪ Informar a presença de erros de forma clara e precisa;

▪ Recuperar-se de cada erro com rapidez suficiente para detectar erros subsequentes;

▪ Acrescentar um custo mínimo no processamento de programas corretos. Como um recuperador de erro deve informar a presença de um erro? No mínimo ele precisa informar o local no programa fonte onde o erro foi detectado, pois existe uma boa chance de que o local exato do erro seja em um dos tokens anteriores.

(32)

Recuperação em nível de frase

Ao detectar um erro, o analisador sintático pode realizar a correção local

sobre o restante da entrada.

Uma correção local típica compreende a substituição de uma vírgula por um

ponto-e-vírgula, exclusão de um ponto-e-vírgula desnecessário.

A escolha da correção local fica a critério do projetista do compilador.

Professor Ariel da Silva Dias - www.arieldias.com - Obra Gratuita, proibida reprodução e venda

Análise sintática – Recuperação de erro

Produções de Erro

Nesta estratégia de recuperação de erro podemos estender a gramática da

linguagem em mãos com produções que geram construções erradas,

antecipando assim os erros mais comuns.

(33)

Análise sintática

▪ Não é possível enumerar a sintaxe de todos os programas das mais diferentes linguagens;

▪ É necessário uma maneira de definir um conjunto infinito usando uma descrição finita:

▪ A sintaxe de uma linguagem é definida através de uma gramática;

▪ Gramática: conjunto de regras que definem todos os construtores que podem ser aceitos na linguagem.

Professor Ariel da Silva Dias - www.arieldias.com - Obra Gratuita, proibida reprodução e venda

Análise sintática

▪ Fortran foi definido através da especificação de algumas regras em inglês;

▪ Algol 60 foi definido através de uma gramática livre de contexto desenvolvida por Jonh Backus;

▪ Essa gramática ficou conhecida como BNF (Backus-Naur Form);

▪ BNF foi utilizada posteriormente na definição de várias linguagens como C, Pascal e Ada;

▪ BNF é uma metalinguagem pois consiste numa linguagem para descrição de outras linguagens.

(34)

▪ Observe os dois trechos de código a seguir, sendo o códigoa.em C e o códigob.em Pascal

a. b.

while(x!=y) while x<>y do

{ begin

... ...

} end

▪ Ambas possuem a mesma estrutura conceitual, porém, diferem na aparência léxica;

▪ Quando duas construções diferem apenas no nível léxico, se diz que elas seguem a mesma

sintaxe abstrata e diferem na sintaxe contreta.

Professor Ariel da Silva Dias - www.arieldias.com - Obra Gratuita, proibida reprodução e venda

Análise sintática

▪ Com tudo isso, é possível concluir que a descrição sintática de uma linguagem:

▪ Ajuda o programador a saber como escrever um programa sintaticamente correto; ▪ Pode ser usada para determinar se um programa está sintaticamente correto ➔ este

(35)

Análise sintática - Análise Top-Down

▪ Como reconhecer se uma sentença está de acordo com uma gramática?

▪ Pode-se implementar reconhecedores de sentença

▪ Recursivamente, com retrocesso ▪ Com mecanismo preditivo

▪ First e Follow

▪ Para usar os reconhecedores, primeiramente deve-se transformar a Gramática Livre de Contexto

▪ Eliminação de produções vazias ▪ Eliminação de recursividade a esquerda ▪ Fatoração de uma gramática

Professor Ariel da Silva Dias - www.arieldias.com - Obra Gratuita, proibida reprodução e venda

Análise sintática – Conjuntos First

▪ First(α)

▪ Definição informal: conjunto de todos os terminais que começam com qualquer sequência derivável de α

▪ Definição formal

▪ Se existe um t ∈ T e um β ∈ V* tal que α ⇒* t β então t ∈ First(α) ▪ Se α ⇒* ε então ε ∈ First(α)

A → B | C | D first(A) = {b, c, d} B → b first(B)= {b} C → c first(C)= {c} D → d first(D)= {d}

(36)

▪ Para determinar o FIRST(A):

▪ Se a é terminal, então o first(a) = a;

▪ Se A é não terminal e A→aα é uma produção, então se acrescenta a ao conjunto de first de A, logo: first(A)=a;

▪ Se A→ε é uma produção ε, logo first(A)=ε;

▪ Se A→Y1Y2...Yk é uma produção, então todo i tal que todos Y1...Yi-1 são não terminais e FIRST(Yj) contém ε, onde j=1,2...i-1. acrescente todo símbolo diferente de ε de FIRST(Yj) a FIRST(A). Se ε ∈ FIRST(A), para todo i=1,2..k. então acrescente ε a FIRST(A).

Professor Ariel da Silva Dias - www.arieldias.com - Obra Gratuita, proibida reprodução e venda

Análise sintática – Conjuntos First

E → TE’ E’ → +TE’ | ε T → FT’ T’ → *FT’ | ε F → (E) | id First(E) = { ? } First(E’) = { ? } First(T) = { ? } First(T’) = { ? } First(F) = { ? }

(37)

Análise sintática – Conjuntos First

E → TE’ E’ → +TE’ | ε T → FT’ T’ → *FT’ | ε F → (E) | id

First(E) = First(T) = First(F) ={ (,id } First(E’) = { +, ε}

First(T) = First(F) = { (, id } First(T’) = { *, ε }

First(F) = { (, id }

Professor Ariel da Silva Dias - www.arieldias.com - Obra Gratuita, proibida reprodução e venda

Análise sintática – Conjuntos First

E → TE’ E’ → +TE’ | ε T → FT’ T’ → *FT’ | ε F → (E) | id

First(E) = First(T) = First(F) ={ (,id } First(E’) = { +, ε}

First(T) = First(F) = { (, id } First(T’) = { *, ε }

First(F) = { (, id }

Se F derivasse em ε seria

preciso incluir o first(T’)

(38)

E → TE’ E’ → +TE’ | ε T → FT’ H → E’T T’ → *FT’ | ε F → (E) | id

First(E) = First(T) = First(F) ={ (,id } First(E’) = { +, ε}

First(T) = First(F) = { (, id } First(H) = { ? }

First(T’) = { *, ε } First(F) = { (, id }

Professor Ariel da Silva Dias - www.arieldias.com - Obra Gratuita, proibida reprodução e venda

Análise sintática – Conjuntos First

E → TE’ E’ → +TE’ | ε T → FT’ H → E’T T’ → *FT’ | ε F → (E) | id

First(E) = First(T) = First(F) ={ (,id } First(E’) = { +, ε}

First(T) = First(F) = { (, id } First(H) = { First(E’) U First(T) } First(T’) = { *, ε }

(39)

Análise sintática – Conjuntos First

E → TE’ E’ → +TE’ | ε T → FT’ H → E’T T’ → *FT’ | ε F → (E) | id

First(E) = First(T) = First(F) ={ (,id } First(E’) = { +, ε}

First(T) = First(F) = { (, id } First(H) = { +, (, id } First(T’) = { *, ε } First(F) = { (, id }

Professor Ariel da Silva Dias - www.arieldias.com - Obra Gratuita, proibida reprodução e venda

Análise sintática – Conjuntos Follow

▪ Se A é um não-terminal, o follow(A) é o conjunto de terminais imediatamente seguintes (à direita) de A

(40)

▪ Para determinar follow(A)

1. Colocar $ em follow(S) se S é o símbolo de partida. $ é o marcador de fim de entrada durante análise

2. Se existe uma produção A→αBβ e β ∉ ε então tudo que estiver em first(β), exceto ε, deve ser adicionado em follow(B)

3. Se existe uma produção A→ αB ou A→ αBβ onde first(β) contem ε (β → ε), então tudo que está em follow(A) está em follow(B)

Professor Ariel da Silva Dias - www.arieldias.com - Obra Gratuita, proibida reprodução e venda

Análise sintática – Conjuntos Follow

E → TE’ E’ → +TE’ | ε T → FT’ T’ → *FT’ | ε F → (E) | id

First(E) = First(T) = First(F) ={ (,id } First(E’) = { +, ε} First(T) = First(F) = { (, id } First(T’) = { *, ε } First(F) = { (, id } Follow(E) = { ), $ } Follow(E’) = Follow(E) = { ), $ } Follow(T) = First(E’) U Follow(E) U Follow(E’) = { +, ), $}

Follow(T’) = Follow(T) = {+, ), $} Follow(F) = First(T’) U Follow(T) U Follow(T’) = { *, +, ), $}

(41)

Análise sintática – Conjuntos Follow

E → TE’ E’ → +TE’ | ε T → FT’ T’ → *FT’ | ε F → (E) | id

Professor Ariel da Silva Dias - www.arieldias.com - Obra Gratuita, proibida reprodução e venda

First(E) = First(T) = First(F) ={ (,id } First(E’) = { +, ε} First(T) = First(F) = { (, id } First(T’) = { *, ε } First(F) = { (, id } Follow(E) = { ), $ } Follow(E’) = Follow(E) = { ), $ } Follow(T) = First(E’) U Follow(E) U Follow(E’) = { +, ), $}

Follow(T’) = Follow(T) = {+, ), $} Follow(F) = First(T’) U Follow(T) U Follow(T’) = { *, +, ), $}

Regra 2 e regra 1

Análise sintática – Conjuntos Follow

E → TE’ E’ → +TE’ | ε T → FT’ T’ → *FT’ | ε F → (E) | id

First(E) = First(T) = First(F) ={ (,id } First(E’) = { +, ε} First(T) = First(F) = { (, id } First(T’) = { *, ε } First(F) = { (, id } Follow(E) = { ), $ } Follow(E’) = Follow(E) = { ), $ } Follow(T) = First(E’) U Follow(E) U Follow(E’) = { +, ), $}

Follow(T’) = Follow(T) = {+, ), $} Follow(F) = First(T’) U Follow(T) U Follow(T’) = { *, +, ), $}

(42)

E → TE’ E’ → +TE’ | ε T → FT’ T’ → *FT’ | ε F → (E) | id

Professor Ariel da Silva Dias - www.arieldias.com - Obra Gratuita, proibida reprodução e venda

First(E) = First(T) = First(F) ={ (,id } First(E’) = { +, ε} First(T) = First(F) = { (, id } First(T’) = { *, ε } First(F) = { (, id } Follow(E) = { ), $ } Follow(E’) = Follow(E) = { ), $ } Follow(T) = First(E’) U Follow(E) U Follow(E’) = { +, ), $}

Follow(T’) = Follow(T) = {+, ), $} Follow(F) = First(T’) U Follow(T) U Follow(T’) = { *, +, ), $}

Análise sintática – Conjuntos Follow

E → TE’ E’ → +TE’ | ε T → FT’ T’ → *FT’ | ε F → (E) | id

First(E) = First(T) = First(F) ={ (,id } First(E’) = { +, ε} First(T) = First(F) = { (, id } First(T’) = { *, ε } First(F) = { (, id } Follow(E) = { ), $ } Follow(E’) = Follow(E) = { ), $ } Follow(T) = First(E’) U Follow(E) U Follow(E’) = { +, ), $}

Follow(T’) = Follow(T) = {+, ), $} Follow(F) = First(T’) U Follow(T) U Follow(T’) = { *, +, ), $}

(43)

Análise sintática – Conjuntos Follow

E → TE’ E’ → +TE’ | ε T → FT’ T’ → *FT’ | ε F → (E) | id

Professor Ariel da Silva Dias - www.arieldias.com - Obra Gratuita, proibida reprodução e venda

First(E) = First(T) = First(F) ={ (,id } First(E’) = { +, ε} First(T) = First(F) = { (, id } First(T’) = { *, ε } First(F) = { (, id } Follow(E) = { ), $ } Follow(E’) = Follow(E) = { ), $ } Follow(T) = First(E’) U Follow(E) U Follow(E’) = { +, ), $}

Follow(T’) = Follow(T) = {+, ), $} Follow(F) = First(T’) U Follow(T) U Follow(T’) = { *, +, ), $}

Regra 2 e Regra 3

Análise sintática – First Follow

S→AB first(S)={c} follow(S)={ $ } A→c | ε first(A)={c, ε} follow(A)={ c } B→ cbB | ca first(B)={c} follow(B)={ $ }

(44)

▪ A análise top-down é realizada da raiz para as folhas

▪ Parte-se de um não-terminal que é o símbolo inicial da gramática em direção aos terminais

Professor Ariel da Silva Dias - www.arieldias.com - Obra Gratuita, proibida reprodução e venda

Análise sintática preditiva não-recursiva

▪ O símbolo da cadeia de entrada, em análise, é suficiente para determinar qual regra de produção deve ser escolhida

▪ São construídos utilizando gramáticas LL ( 1 )

▪ Cadeia de entrada é analisada da esquerda para a direita ( Left-toright) ▪ A derivação das produções é feita mais a esquerda ( Leftmost)

▪ A cada passo é observado um ( 1) símbolo a frente para determinar que ação deve ser tomada

(45)

Análise sintática preditiva não-recursiva

▪ Condições

▪ Eliminar a recursividade a esquerda ▪ Fatorar a gramática

▪ Construir o conjunto first e follow

Professor Ariel da Silva Dias - www.arieldias.com - Obra Gratuita, proibida reprodução e venda

Análise sintática preditiva não-recursiva

▪ Construção da tabela preditiva

▪ Dimensão1: não terminal X

▪ Dimensão2: símbolo de entrada (terminal) t

▪ A entrada (X, t) contém a regra da produção a aplicar → obtida a partir dos conjuntos first e follow

Não Terminal Símbolo de Entrada

a b c

S erro erro S→ cAa

A A→B A→B A→cB

B B→ε B→bcB erro S→cAa first(S)={c} follow(S)={ $ }

A→cB | B first(A)={b, c, ε} follow(A)={ a } B→ bcB | ε first(B)={b, ε} follow(B)={ a }

(46)

Pilha Entrada Ação

S$ cbca$

Professor Ariel da Silva Dias - www.arieldias.com - Obra Gratuita, proibida reprodução e venda

Não Terminal Símbolo de Entrada

a b c

S erro erro S→ cAa

A A→B A→B A→cB

B B→ε B→bcB erro Entrada: cbca

Análise Sintática – Tabela Preditiva

Pilha Entrada Ação

S$ cbca$ S→cAa

cAa$ cbca$

Não Terminal Símbolo de Entrada

a b c

S erro erro S→ cAa

A A→B A→B A→cB

B B→ε B→bcB erro Entrada: cbca

S→ cAa

substitui na pilha o S por

cAa

(47)

Análise Sintática – Tabela Preditiva

Pilha Entrada Ação

S$ cbca$ S→cAa

cAa$ cbca$ casar(c)

Professor Ariel da Silva Dias - www.arieldias.com - Obra Gratuita, proibida reprodução e venda

Não Terminal Símbolo de Entrada

a b c

S erro erro S→ cAa

A A→B A→B A→cB

B B→ε B→bcB erro Entrada: cbca

O topo da pilha é igual ao

valor do topo de entrada

Análise Sintática – Tabela Preditiva

Pilha Entrada Ação

S$ cbca$ S→cAa

cAa$ cbca$ casar(c)

Aa$ bca$

Não Terminal Símbolo de Entrada

a b c

S erro erro S→ cAa

A A→B A→B A→cB

B B→ε B→bcB erro Entrada: cbca

A deriva em b?

Sim: A→B

(48)

Pilha Entrada Ação

S$ cbca$ S→cAa

cAa$ cbca$ casar(c)

Aa$ bca$ A→B

Ba$ bca$

Professor Ariel da Silva Dias - www.arieldias.com - Obra Gratuita, proibida reprodução e venda

Não Terminal Símbolo de Entrada

a b c

S erro erro S→ cAa

A A→B A→B A→cB

B B→ε B→bcB erro Entrada: cbca

Análise Sintática – Tabela Preditiva

Pilha Entrada Ação

S$ cbca$ S→cAa

cAa$ cbca$ casar(c)

Aa$ bca$ A→B

Ba$ bca$

Não Terminal Símbolo de Entrada

a b c

S erro erro S→ cAa

A A→B A→B A→cB

B B→ε B→bcB erro Entrada: cbca

B deriva em b?

Sim: B→bcB

(49)

Análise Sintática – Tabela Preditiva

Pilha Entrada Ação

S$ cbca$ S→cAa

cAa$ cbca$ casar(c)

Aa$ bca$ A→B

Ba$ bca$ B→bcB

Professor Ariel da Silva Dias - www.arieldias.com - Obra Gratuita, proibida reprodução e venda

Não Terminal Símbolo de Entrada

a b c

S erro erro S→ cAa

A A→B A→B A→cB

B B→ε B→bcB erro Entrada: cbca

B deriva em b?

Sim: B→bcB

Pilha Entrada Ação

S$ cbca$ S→cAa

cAa$ cbca$ casar(c)

Aa$ bca$ A→B

Ba$ bca$ B→bcB

bcBa$ bca$ casar(b)

Não Terminal Símbolo de Entrada

a b c

S erro erro S→ cAa

A A→B A→B A→cB

B B→ε B→bcB erro Entrada: cbca

O topo da pilha é igual ao

valor do topo de entrada

(50)

Pilha Entrada Ação

S$ cbca$ S→cAa

cAa$ cbca$ casar(c)

Aa$ bca$ A→B

Ba$ bca$ B→bcB

bcBa$ bca$ casar(b)

cBa$ ca$ casar(c)

Professor Ariel da Silva Dias - www.arieldias.com - Obra Gratuita, proibida reprodução e venda

Não Terminal Símbolo de Entrada

a b c

S erro erro S→ cAa

A A→B A→B A→cB

B B→ε B→bcB erro Entrada: cbca

Análise Sintática – Tabela Preditiva

Pilha Entrada Ação

S$ cbca$ S→cAa

cAa$ cbca$ casar(c)

Aa$ bca$ A→B

Ba$ bca$ B→bcB

bcBa$ bca$ casar(b)

cBa$ ca$ casar(c)

Ba$ a$ B→ε

Não Terminal Símbolo de Entrada

a b c

S erro erro S→ cAa

A A→B A→B A→cB

B B→ε B→bcB erro Entrada: cbca

B deriva em a?

SIM: quando B→ε

(51)

Análise Sintática – Tabela Preditiva

Pilha Entrada Ação

S$ cbca$ S→cAa

cAa$ cbca$ casar(c)

Aa$ bca$ A→B

Ba$ bca$ B→bcB

bcBa$ bca$ casar(b)

cBa$ ca$ casar(c)

Ba$ a$ B→ε

a$ a$ casar(a)

Professor Ariel da Silva Dias - www.arieldias.com - Obra Gratuita, proibida reprodução e venda

Não Terminal Símbolo de Entrada

a b c

S erro erro S→ cAa

A A→B A→B A→cB

B B→ε B→bcB erro Entrada: cbca

O topo da pilha é igual ao

valor do topo de entrada

Análise Sintática – Tabela Preditiva

Pilha Entrada Ação

S$ cbca$ S→cAa

cAa$ cbca$ casar(c)

Aa$ bca$ A→B

Ba$ bca$ B→bcB

bcBa$ bca$ casar(b) cBa$ ca$ casar(c)

Ba$ a$ B→ε

a$ a$ casar(a)

$ $ aceita

Não Terminal Símbolo de Entrada

a b c

S erro erro S→ cAa

A A→B A→B A→cB

B B→ε B→bcB erro Entrada: cbca

O topo da pilha é igual ao

valor do topo de entrada

(52)

▪ A análise top-down é realizada das folhas para a raiz

▪ Parte-se dos símbolos terminais em direção ao símbolo inicial da gramática

Professor Ariel da Silva Dias - www.arieldias.com - Obra Gratuita, proibida reprodução e venda

Análise sintática – Analisador Bottom-up

id * id F * id id T * id F id T * F F id id T T * F F id id E T T * F F id id E → E + T | T T → T * F | F F → (E) | id Entrada: id*id

(53)

Análise sintática – Analisador Bottom-up

▪ O processo de análise sintática ascendente pode ser encarado como um processo de “reduzir” uma cadeia w para o símbolo inicial da gramática

▪ Redução : operação de substituição do lado direito de uma produção pelo não-terminal correspondente do lado esquerdo

▪ Para a regra A → α , α pode ser reduzido em A

Professor Ariel da Silva Dias - www.arieldias.com - Obra Gratuita, proibida reprodução e venda

Análise sintática – Analisador Bottom-up

▪ Analisadores sintáticos Bottom-up

▪ Analisadores conhecidos como empilha-reduz (shift-reduce)

▪ Etapas do reconhecimento: determinar quando reduzir e determinar a produção a ser utilizada para que a análise prossiga

(54)

▪ Componentes do analisador bottom-up

▪ Pilha, onde os símbolos a serem reduzidos são empilhados ▪ Tabela sintática, que guia o processo de shift e reduce

▪ Processo de reconhecimento de uma sentença

1. Empilhar símbolos da cadeia de entrada

2. Quando um lado direito apropriado de uma produção aparece, ele é reduzido (substituído) pelo lado esquerdo da produção

3. Se a análise tiver sucesso, esse processo ocorre até que os símbolos da cadeia de entrada sejam todos consumidos e a pilha fique apenas com o símbolo inicial da gramática

Professor Ariel da Silva Dias - www.arieldias.com - Obra Gratuita, proibida reprodução e venda

Análise sintática – Analisador Bottom-up

Gramática: S→(L) | a L→ L+S | S

Entrada: a+a

Pilha Cadeia Regra

$ (a+a)$

$ (a+a)$ shift (

$( a+a)$ shift a

$(a +a)$ reduce S→a $(S +a)$ reduce L→S

$(L +a)$ shift +

$(L+ a)$ shift a

$(L+a )$ reduce S→a $(L+S )$ reduce L→L+S

(55)

Análise sintática – Analisador Bottom-up

▪ Operações durante a análise:

▪ Shift: coloca-se no topo da pilha o primeiro símbolo da cadeia de entrada ▪ Reduce: substitui-se o lado direito do handle pelo seu lado esquerdo ▪ Aceita: a cadeia de entrada é reconhecida

▪ Erro: a cadeia de entrada não é reconhecida

Professor Ariel da Silva Dias - www.arieldias.com - Obra Gratuita, proibida reprodução e venda

Análise semântica

▪ A semântica define o significado dos programas sintaticamente corretos; ▪ Por exemplo, em C, a instrução

if(a>b) max = a; else

max = b;

▪ Diz que a expressão a>b deve ser avaliada e, dependendo do retorno (true ou false), um dos dois comandos de atribuição será executado.

(56)

▪ Regras sintáticas: mostram como formar o comando; ▪ Regras semânticas: mostram qual é o efeito do comando; ▪ Erros semânticos

▪ tipos inválidos - o programa dá um resultado, mas não é correto! ▪ o computador não advinha o que eu quero

▪ logo: o programa que escrevi não resolve o problema pretendido ▪ os erros semânticos são os mais difíceis de corrigir

Professor Ariel da Silva Dias - www.arieldias.com - Obra Gratuita, proibida reprodução e venda

Análise semântica

▪ Conceitos semânticos básicos de uma LP

▪ Variáveis: questões semânticas associadas a declaração (escopo, tipo e tempo de vida);

▪ Valores e Referência: se o valor associado a variável denota localização na memória ou conteúdo localizado na memória;

▪ Expressões: possuem regras para serem escritas envolvendo os tipos de expressões permitidas;

(57)

Análise semântica

▪ Abstração

▪ Processo de identificar apenas as qualidades ou propriedades relevantes do fenômeno que se quer modelar;

▪ As LP são as ferramentas com as quais os programadores podem implementar os modelos abstratos;

▪ Por outro lado, as próprias LP são abstrações do processador subjacente;

Professor Ariel da Silva Dias - www.arieldias.com - Obra Gratuita, proibida reprodução e venda

Análise semântica

▪ Abstração

▪ Sugere a distinção que deve ser feita entre “o que” o programa faz e “como” ele é implementado”;

▪ Quando um procedimento é chamado , pode-se concentrar apenas no que ele faz; ▪ Quando se está escrevendo o procedimento deve-se concentrar em como

implementá-lo;

(58)

▪ Programas trabalham com entidades

▪ Entidades: Variáveis, rotinas e comandos;

▪ As entidades dos programas possuem propriedades chamadas atributos; ▪ Os valores dos atributos devem ser definidos antes de sua utilização.

Professor Ariel da Silva Dias - www.arieldias.com - Obra Gratuita, proibida reprodução e venda

Análise semântica

(59)

Análise semântica

▪ Amarração estática:

▪ A amarração é estabelecida antes do tempo de execução e não pode ser alterada depois;

▪ Exemplo: um conjunto de valores é amarrado ao tipo inteiro no tempo de

implementação da linguagem, assim, a definição da linguagem específica que o tipo inteiro deve ser suportado e a implementação da linguagem amarra-o à

representação da memória.

Professor Ariel da Silva Dias - www.arieldias.com - Obra Gratuita, proibida reprodução e venda

Análise semântica

▪ Amarração dinâmica:

▪ A amarração é estabelecida em tempo de execução.

(60)

▪ Analise os códigos abaixo e identifique os erros em léxico, sintático e semântico:

Professor Ariel da Silva Dias - www.arieldias.com - Obra Gratuita, proibida reprodução e venda

int I2, A@;

I2 = 0;

while(I2 <= 0);

I = I+1;

I2 = “a”;

int a, b c;

a = 2;

b := 3;

c = 4;

media = (a+b+c)/3;

Fases da compilação

Analisador Léxico total = num1 + num2 * 50

(61)

Fases da compilação

Professor Ariel da Silva Dias - www.arieldias.com - Obra Gratuita, proibida reprodução e venda

Fases da compilação

Analisador Léxico total = num1 + num2 * 50

Analisador Sintático (id,1)(=>(id,2)(+>(id,3)(*>(50> = (id,1) + (id,2) * (id,3) 50

(62)

Professor Ariel da Silva Dias - www.arieldias.com - Obra Gratuita, proibida reprodução e venda Analisador Semântico (id,3) 50 = (id,1) + (id,2) * (id,3) atof(50)

Fases da compilação

Analisador Léxico total = num1 + num2 * 50

Analisador Sintático

Analisador Semântico

Gerador de Código Intermediário (id,1)(=>(id,2)(+>(id,3)(*>(50> = (id,1) + (id,2) * (id,3) 50 t1 = atof(50) t2 = id3 * t1 t3 = id2 + t2 id1 = t3 = (id,1) + (id,2) * (id,3) atof(50)

(63)

Fases da compilação

Professor Ariel da Silva Dias - www.arieldias.com - Obra Gratuita, proibida reprodução e venda

Analisador Sintático

Analisador Semântico

Gerador de Código Intermediário = (id,1) + (id,2) * (id,3) 50 t1 = atof(50) t2 = id3 * t1 t3 = id2 + t2 id1 = t3 Otimizador de Código t1 = id3 * 50.0 id1 = id2 + t1 = (id,1) + (id,2) * (id,3) atof(50)

Fases da compilação

Analisador Léxico total = num1 + num2 * 50

Analisador Sintático

Analisador Semântico

Gerador de Código Intermediário (id,1)(=>(id,2)(+>(id,3)(*>(50> = (id,1) + (id,2) * (id,3) 50 t1 = atof(50) t2 = id3 * t1 t3 = id2 + t2 id1 = t3 Otimizador de Código t1 = id3 * 50.0 id1 = id2 + t1 = (id,1) + (id,2) * (id,3) atof(50) Gerador de Código LDF R2,id3 MULF R2, R2, #50.0

(64)

▪ SEBESTA, Robert W. Conceitos de linguagens de programação. 9ª ed. Porto Alegre: Bookman, 2011. 792 p. ISBN 978-85-7780-791-8.

▪ Notas de aula – Professora Isabel Harb Manssour

Professor Ariel da Silva Dias - www.arieldias.com - Obra Gratuita, proibida reprodução e venda

Referências

Documentos relacionados

Em média, a Vivo forneceu a melhor velocidade de download para os seus clientes em 2020... A Vivo progrediu em especial a partir de abril

Esta realidade exige uma abordagem baseada mais numa engenharia de segu- rança do que na regulamentação prescritiva existente para estes CUA [7], pelo que as medidas de segurança

־ Uma relação de herança surge quando um objecto também é uma instância de uma outra classe mais geral (exemplo: “automóvel é um veículo”). ־ É sempre possível

Não tem informações sobre a sua modificação química e, pelo exposto acima, no presente trabalho tem-se estudado a modificação química deste amido variando a concentração

Assim, nosso percurso vai abarcar primeiro algumas questões relativas a cibercultura – tais como a simulação, a imaterialidade, a alteração de conteúdo – tendo em vista que

A filosofia da linguagem de Wittgenstein é de fundamental importância para a construção do fundamento da culpabilidade; primeiro, porque absorvido na filosofia

No entanto, como se observou, a influência desses dispositivos e aplicativos é baixa (Figura 30). As práticas estão mais relacionadas aos grupos e às comunidades.. No entanto,

3.5.2 Quanto aos compostos estudados para os quais foram feitos cálculos de estrutura eletrônica utilizando o programa ZINDO98, onde foram obtidos orbitais moleculares para o