"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