quarta-feira, 18 de dezembro de 2013

18.05.03.01 Normal declaration

 

"Normal declarations" é o tipo de declaração mais usada.

Para contrastar com "syntax declarations", as "normal declarations" às vezes são chamadas de "semantic declarations".

 

Lembrando

 

 

Análise léxica

Efetua uma varredura quebrando o 'texto de entrada' conforme os 'símbolos da linguagem'.

Nota: análise léxica, lexical analyzer, scanner, lexer, tokenizer, tokenizador, referem-se a mesma coisa.

 

Análise sintática

Transforma o 'resultado léxico' em uma estrutura de dados, em geral uma árvore (chamada de árvore sintática).

Também verifica se a organização dos símbolos no conjunto formam um programa válido, ou não.

 

Análise semântica

Analisa a 'árvore sintática' e determina o que a informação realmente significa.

Neste ponto a linguagem está pronta para ser interpretada ou traduzida para o código-de-máquina.

 

 

 

Seed7 usa "uniform looking declaration constructs" para declarar variáveis​​, constantes, tipos, funções e parâmetros.

 

 

Variável

 

Por exemplo:

 

 

var integer: number is 0;

 

 

Declara uma variável do tipo integer chamada "number" e a inicializa com o valor 0.

 

 

Constante

 

const [tipo de dado da constante] : [nome] is [instruções];

 

Por exemplo,

 

 

const integer: ONE is 1;

 

 

Declara uma constante do tipo integer chamada "ONE" e a inicializa com o valor 1.

 

 

Tipo

 

Declaração de tipo é feita, assim como a declaração de constante, basta definir no "tipo de dado" da constante a palavra-chave type.

 

 

const type: myChar is char;

 

 

 

 

Função

 

Declaração de função também é feita da mesma forma que declaração de constante, no "tipo de dado" da constante use a palavra-chave func.

 

 

const func boolean: flipCoin is

  return rand(FALSE, TRUE);

 

 

 

 

Inicialização com Expressão

 

Cada objeto declarado como um 'const' ou 'var' possue um valor inicial.

Não é possível a utilização de 'const' ou 'var' sem valor inicial.

Nas declarações efetuar uma inicialização usando uma expressão é possível.

Por exemplo,

 

 

var string: fileName is NAME & ".txt";

 

 

 

A expressão é avaliada e o resultado é atribuído ao novo objeto.

Isto é feito na fase de análise do interpretador ou compilador, antes que a execução do programa comece.

A inicialização com expressões pode conter qualquer chamada a uma função ou operador.

Funções definidas pelo usuário também podem ser usadas para inicializar uma constante ou variável.

 

 

const boolean: maybe is flipCoin;

 

 

 

Declarações de constantes e variáveis ​​podem ser globais ou locais.

"The mechanism to define a parameter like 'x' is similar to the 'const' or 'var' declarations:"

 

 

const func float: inverse (in float: x) is

  return 1/x;

 

 

 

 

Passando instruções como argumento

 

Instruções podem ser passadas como argumento para um parâmetro e executadas.

Para isto Seed7 utiliza "call-by-name".

Este assunto é extenso, portanto para saber mais acesse o sub-tópico "referência" e acompanhe os link's.

 

No exemplo abaixo, o parâmetro chamado "statement" é do tipo proc e atua como um parâmetro "call-by-name".

 

 

const proc: possiblyDo (in proc: statement) is func

  begin

    if flipCoin then

      statement;

    end if;

  end func;

 

 

 

 

Dados Abstratos

 

Tipo de dados abstratos, como subtype, struct, subrange, array, hash, set, interface e enum são como funções que retornam um type.

Por exemplo: O tipo de dado array é definido na biblioteca seed7_05.s7i com o seguinte cabeçalho:

 

 

const func type: array (in type: baseType) is func

 

 

Tipo de dado abstrato definido pelo usuário é possível.

"The initialization uses the creation operation ( ::= ). "

"Explicit calls of the create operation are not needed."

 

O ciclo de vida de um objeto é:

1. Memória é reservada para o novo objeto (memória de stack ou heap não fazem diferença aqui).

2. O conteúdo da nova memória é indefinido e pode conter lixo, portanto é necessário criar a instrução, ao invéns de um "assignment".

3. "The create statements copies the right expression to the left expression taking into account that the left expression is undefined."

 

4. Se o objeto é variável outros valores podem ser atribuídos usando a instrução de atribuição (: =).

A atribuição pode assumir que a expressão da esquerda contém um valor correto.

Isto permite que strings e outros tipos que são apenas uma referência a uma deteminada área na memória, possam ser liberados quando necessário.

Mais exatamente a área de memória que contenha dados antigos e não a área de memória do próprio objeto.

 

5. No final do ciclo de vida de um objeto a instrução destroy é executada.

No caso de strings e outros tipos que são apenas uma referência a uma deteminada área na memória, ocorre o seguinte:

A área de memória que contém os dados é liberada, mas não a área de memória do próprio objeto.

 

6. A área de memória do próprio objeto é liberada.

 

As três primeiras etapas estão geralmente escondidas na instrução de declaração.

Neste código,

 

 

ONE . ::= . 1

 

 

Uma atribuição é executado para associar 1 ao objeto chamado ONE.

Existem 2 razões para usar ::= ao invéns de := ao inicializar o objeto com um valor.

- A atribuição por := somente pode ser usada para atribuir um valor a uma variável ou constante.

- Às vezes, várias inicializações são necessárias para o novo objeto e não somente uma atribuição.

 

Todos tipos de dados predefinidos já possuem o operador de criação ( ::= ) pronto e definido.

Para permitir "novos objetos definidos pelo usuário" a construção de um novo "tipo definido pelo usuário" deve ser definido.

 

 

 

 

 

 

 

 

 

Nenhum comentário:

Postar um comentário