Paradigmas de Programação Sintaxe e semântica Aula 4 Prof.: Edilberto M. Silva http://www.edilms.eti.br Prof. Edilberto Silva / edilms.eti.br
Sintaxe A sintaxe de uma linguagem de programação é a forma de suas expressões, declarações e unidades de programa. Também pode ser definida como o conjunto de regras que determinam que construções estão corretas e quais não estão. Algumas aplicações são melhor acomodadas pela sintaxe de uma linguagem do que outras. Por exemplo, a sintaxe de FORTRAN foi projetada para expressar programas matemáticos, enquanto que a de BASIC é uma boa opção para tornar o programa compreensível para não-programadores. As linguagens mais modernas como C, C++ e Java possuem uma sintaxe que permite mais facilmente a expressão de estruturas de controle.
Duas Abordagens para Descrição de Linguagens de Programação Descrições Informais Utiliza linguagem natural É imprecisa: permite a ocorrência de erros de interpretação Descrições Formais Utiliza uma linguagem matemática Possui significado bem definido: Evita erros de interpretação Possibilita a utilização de metodologias de apoio a projetos
Vantagens da Utilização de Métodos Formais Interface entre projetistas, implementadores e usuários Projetista: Define precisamente a linguagem desejada Permite a identificação precoce de erros Implementador: Possibilita a utilização de geradores (semi-)automáticos Dificulta o aparecimento de erros Usuários: Produção de bons manuais da linguagem
Sintaxe Define a forma e estrutura de uma linguagem Símbolos, palavras, frases e sentenças (estruturas) Principal formalismo: Gramáticas Livres de Contexto e Expressões Regulares Notação mais utilizada: BNF (Backus-Naur Form)
Gramáticas Livres de Contexto Estrutura principal: Comando <-- [[ if Expressão then Comando else Comando ]] Significado: Um Comando da linguagem definida pode ser formado pela palavra chave if seguida de uma Expressão da linguagem, da palavra chave then, de um Comando da linguagem, da palavra chave else, e de um outro Comando da linguagem.
Sintaxe Concreta x Sintaxe Abstrata Sintaxe concreta: Descreve a estrutura da linguagem com todos os detalhes. Considera elementos estéticos como comentários, palavras reservadas, precedência de operadores, e outros açucares sintáticos. Utilizado para construir reconhecedores para programas. Sintaxe abstrata: Descreve apenas os elementos relevantes da linguagem de programação. Ignora comentários e outros elementos que não contribuem para a semântica do programa Utilizada para representar programas internamente no compilador
Mais Detalhes... Esse formalismo será estudado mais detalhadamente na disciplina de Teoria e Implementação de Linguagens de Computacionais
Semântica Objetivo: Descrever o significados das estruturas do programa expressos na sua sintaxe Tipos de semântica Semântica estática: Descreve as características de uma programa válido Semântica dinâmica: Descreve os resultados da execução do programa
Formalismos Utilizados Ao contrário da sintaxe, não existe ainda um formalismo aceito globalmente para descrever a semântica da linguagem Exemplos de formalismos: Semântica Operacional Estrutural, Máquinas de Estado Abstratas, Semântica Denotacional, Semântica de Ações, Montages, etc.
Semântica De Ações Formalismo para definição de linguagens de programação. Define um mapeamento da sintaxe do programa para o seu significado. Significado de programa é dado através da notação de ações.
Notação de Ações Biblioteca que descreve os principais conceitos encontrados em linguagens de programação que serão estudados nesse curso (valores, bindings, memória, etc.) Durante esse curso veremos para cada conceito estudado os operadores que descrevem as propriedades fundamentais de cada conceito
Definição de Ações Uma ação é uma entidade que pode ser executada. Quando uma ação é executada ela pode: Terminar com sucesso Terminar com um erro Gerar uma exceção (escape) Não-terminar (executar para sempre) Durante a execução de uma ação ela produz e consome vários tipos de informação: (transientes, bindings, memória, etc.)
Semântica de Ações Faceta Básica A faceta básica define operadores que não manipulam nenhum tipo de informação apenas controlam o fluxo do programa Principais Operadores complete -- Executa com sucesso sem produzir nenhuma informação. fail -- Produz uma falha na execução da ação a and then b -- Executa as ações a e b sequêncialmente a or b -- Executa uma das ações e se esta falhar a outra ação será executada.
Exemplos de Ações: complete and then complete complete and then fail
Exemplo de Descrições Comandos vazio Sintaxe: Comando --> [[ ; ]] Semântica: execute _ :: Comando --> action. execute [[ ; ]] = complete.
Exemplo de Descrições Sequência de Comandos: Sintaxe: Comando --> [[ Comando Comando ]] Semântica: execute _ :: Comando --> action. execute [[ c 1 c 2 ]] = execute c 1 and then execute c 2.
Semântica de Ações -Faceta Funcional A faceta funcional define ações que manipulam valores temporários (transitórios) produzidos pela execução de um programa. Utilização principal: Descrição da manipulação de valores e como expressões são avaliadas em um programa. Principais Operadores give e -- produz o valor resultante da avaliação da expressão e. x then y -- Executa as ações x e y seqüencialmente, os valores transitórios produzidos por x serão repassados para a ação y. the given t # n -- Expressão (produtor) que recupera o n- ésimo valor passado para essa ação e verifica se este é do tipo t.
Exemplos de Ações give 10 give 20 then give sum(2,the given integer#1) give 1 and then give 2 then give product(the given integer#1, the given integer # 2)
EXP1 Linguagens de Expressões Aritméticas Demostra a utilização de valores em LP Estrutuas: Constantes numéricas: 1,2,3, etc. Operações fundamentais: 1 + 2 4-3 5 * 2 Etc.
Descrição de EXP1 Constantes Numéricas. Sintaxe: Expressão <-- [[ Integer ]]. Semântica: avalie _ :: Expressão --> action. avalie [[ x : Integer ]] = give x.
Descrição de EXP1 Soma de Expressões. Sintaxe: Expressão <-- [[ Expressão + Expressão ]]. Semântica: avalie _ :: Expressão --> action. avalie [[ x + y ]] = avalie x and then avalie y then give sum(the given integer#1, the given integer#2).