• Nenhum resultado encontrado

DESENVOLVIMENTO DA LINGUAGEM INTERPRETADA PARA SISTEMA

5. LINGUAGENS DE PROGRAMAÇÃO

7.4 DESENVOLVIMENTO DA LINGUAGEM INTERPRETADA PARA SISTEMA

; A linha abaixo só deverá ser descomentada se o autoload for igual a "no". ;load => pbx_dfn.so

; Como o autoload está habilitado, caso não se pretenda carregar o módulo da linguagem dfn,

; deve-se remover o comentário da linha abaixo ;noload => pbx_dfn.so

Figura 19 – Arquivo sip.conf Fonte: O autor

7.4 DESENVOLVIMENTO DA LINGUAGEM INTERPRETADA PARA SISTEMA MULTI-PLATAFORMA

A linguagem aqui proposta, chamada de dfn, implementa as construções fundamentais para definição de controle de fluxo como if, elseif, else, endif, while, do, endwhile, repeat, until, funções, e tipos definidos de dados. Trata-se ainda de uma linguagem com tipagem dinâmica.

sintaxes, etc.

7.4.1 VARIÁVEIS E TIPOS

As varáveis do dfn deverão conter pelo menos um caractere e deve ser iniciado por uma letra obrigatoriamente, os caracteres seguintes poderão ser outras letras, números e sublinha. Letras maiúsculas e minúsculas são diferentes.

Exemplo:

Nomes válidos de variáveis: a=12

a21 = “Teste” meuValor=51

Minha_Variavel=”Ok”

Nomes inválidos de variáveis: _12=21

21=22 *valor=12

Esses nomes não são admitidos como válidos no contexto da linguagem dfn.

A linguagem possui os seguintes tipos de variáveis, sendo que sua conversão é automática, o que lhe confere uma tipagem dinâmica:

Tipo null - esse tipo indica um valor indefinido. Por padrão todas as variáveis não declaradas são do tipo null, podendo, a partir desse conceito, verificar se uma variável foi ou não declarada no sistema.

Tipo numeric - são variáveis que contêm somente números armazenados.

Tipo string - São cadeias de caracteres contendo letras, números e caracteres especiais como "@", "%", etc.

Tipo array - São variáveis com índice numérico onde cada índice aponta para a posição onde o valor é armazenado.

Tipo hash - São arrays associativos, ou seja, o índice pode ser qualquer caractere ou cadeia de caractere, numérico ou string.

Tipo function - Esse tipo de dado compreende as funções declaráveis pelo programador na linguagem. Toda função criada pelo usuário deverá ser iniciada

pelo comando function, seguido do nome da função com os seus parâmetros entre parêntesis e separado por vírgula (caso haja mais de um).

7.4.2 ATRIBUIÇÕES

Para atribuição deve-se usar o sinal de igual simples “=” entre a variável e o valor. A simples atribuição já é suficiente para a própria declaração da variável. A atribuição pode ser simples ou múltipla. Exemplo:

Variável = Valor

O “Valor” pode ser numérico, string, array ou qualquer outro tipo de dados permitido pela linguagem.

Já a atribuição múltipla pode ser vista no exemplo a seguir:

var1, var2, var3 = "Universidade Anhembi Morumbi", 1231, {1,2,3,"Eu sou um valor de um array"}

No caso acima, a variável var1 é do tipo string, a var2 do tipo numérico e a var3 é um array de 4 elementos.

A atribuição múltipla permite a troca de valores armazenados em uma única linha. Exemplo:

var1 = "Teste1" var2 = "Teste2"

# Resultado var1="Teste1" e var2="Teste2" – Aqui é um comentário print( "var1=",var1, " var2=", var2 )

# Faz a troca

var1, var2 = var2, var1

# Resultado var1="Teste2" e var2="Teste1" print( "var1=",var1, " var2=", var2 )

7.4.3 OPERADORES ARITMÉTICOS E RELACIONAIS

Os operadores aritméticos são: adição, subtração, multiplicação e divisão. Exemplos:

a = 6/3 b = 2*10 c = 5-1 d = 20+9

Os operadores relacionais disponíveis são: < Menor que

> Maior que

<= Menor ou igual a >= Maior ou igual a

== Igual a != Diferente de

7.4.4 ORDEM DE PRECEDÊNCIA DOS OPERADORES

Os operadores têm a ordem de precedência usual. Essa ordem pode ser mudada com o uso de parênteses A lista abaixo apresenta os operadores, em ordem decrescente de precedência: ^ not -(unário) * / + - 7.4.5 COMENTÁRIOS

A linguagem provê recurso de inserção de comentários. Dessa forma o código poderá ser comentado conforme a necessidade do programador. Para isso deverá ser usado o caractere “#”.

Exemplo:

# Isso é um comentário

Variavel=123 # Comentando o código. A partir do # a linguagem vai ignorar o trecho até o fim de linha (\n)

7.4.6 FUNÇÕES DA LINGUAGEM

Para criação da linguagem foi necessário definir e criar as funções de manipulação de string, conversão de tipos e funções básicas.

7.4.6.1 FUNÇÕES DE MANIPULAÇÃO DE STRING Função strlen( str )

DESCRIÇÃO

Informa o tamanho de uma string. ARGUMENTOS

str string a ser medida RETORNO

Retorna o número de caracteres presentes na cadeia de caracteres. EXEMPLO

print(strlen("Universidade Anhembi Morumbi")) # imprime o valor 28.

Função strlower( str ) DESCRIÇÃO

Todas as letras maiúsculas passadas na variavel str são trocadas pelas minúsculas correspondentes.

ARGUMENTOS

str string a ser transformada RETORNO

Retorna a string transformada. EXEMPLO

print(strlower("Teste")) # Imprime teste.

Função strupper( str ) DESCRIÇÃO

Todas as letras minúsculas passadas na variável str são trocadas pelas maiúsculas correspondentes.

ARGUMENTOS

str string a ser transformada RETORNO

Retorna a string transformada. EXEMPLO

print(strlower("Teste")) # Imprime TESTE.

7.4.6.2 FUNÇÕES DE CONVERSÃO DE TIPOS Função tonumber( var )

DESCRIÇÃO

Tenta converter a variavel var em um valor numérico. ARGUMENTOS

a expressão a ser transformada em valor numérico RETORNO

Se for possível a conversão, retornará o valor numérico, caso contrário retornará <null>

EXEMPLO

# imprime os valores: 23, <null>, 22

Função tostring( var ) DESCRIÇÃO

Tenta converter a variável var em um valor string. ARGUMENTOS

a expressão a ser transformada em valor string RETORNO

O correspondente em string EXEMPLO

print(tostring( 22 )) # imprime os valores: "23"

7.4.7 CONTROLE DE FLUXO E LAÇOS ITERATIVOS

Foi necessário a criação de controles de fluxo e laços iterativos que serão descritos a seguir.

7.4.7.1 TOMADAS DE DECISÃO COM IF

O comando para tomada de decisão da linguagem DFN é o if. Sua forma é: if expr then bloco endif ou if expr then bloco1... else bloco2... endif ou ainda if expr1 then bloco1

elseif expr2 then bloco2

...

elseif expr N then bloco N

else

bloco N+1 endif

7.4.7.2 LAÇOS ITERATIVOS COM TOMADA DE DECISÃO NO INÍCIO (WHILE) A linguagem DFN possui duas opções para construção de laços iterativos, o comando while permite que a tomada de decisão seja no inicio antes de entrar no laço. Sua forma geral é:

while expr do bloco endwhile

Isto é, enquanto a expressão expr produzir um valor diferente de null e, portanto, verdadeiro, os comandos do bloco são executados. Considere o código abaixo que calcula o fatorial de um número armazenado na variável n:

fat = 1 i = n while i > 0 do fat = fat * i i = i – 1 endwhile

Ao final da execução do código acima, fat armazena o valor do fatorial de n e i armazena o valor zero.

7.4.7.3 LAÇOS ITERATIVOS COM TOMADA DE DECISÃO NO FIM (REPEAT/UNTIL)

Este tipo de laço é implementado pelo comando repeat/until. A validação da condição é feita após o bloco ser executado por, pelo menos, uma vez. Sua forma geral é:

repeat bloco until expr

O mesmo exemplo do fatorial acima pode ser reescrito usando o repeat/until conforme a seguir:

fat = 1 i = 1

repeat fat = fat * i i = i + 1 until i > n

7.4.8 ANALISADOR DE EXPRESSÃO

O analisador de expressão adotado na linguagem foi baseado nas ferramentas bison com gerador de parser em conjunto com o gerador de analisador sintático flex a partir da gramática previamente definida.

O código resultante foi modificado para otimização da linguagem. gerando dois fontes: y_tab.c e lex_yy.c, a implementação das funcionalidades foram escritas nos demais arquivos "C".

A função de entrada é a dfn_execfile, ela recebe o ponteiro para o arquivo a ser executado e chama a função dfn_parse() que por sua vez chama o yyparse() que realiza toda a tradução ou interpretação do código junto com a função dfn_execute().

O trecho da função yyparse() é extremamente grande, assim como a dfn_execute(), e podem ser vistos no apendice deste documento.

Segue o trecho responsável pela execução do arquivo fonte dfn: int dfn_execfile(char *filename) {

int x, y; y = dfn_openfile(filename); if (y) return 1; x=dfn_parse(); if( x ){ dfn_closefile(); return 1; } dfn_closefile(); return 0; } Função dfn_parse(void)

int dfn_parse(void) {

Byte *initcode = maincode; err = 0; if (yyparse() || (err == 1)) return 1; *maincode++ = HALT; if (dfn_execute(initcode)) return 1; maincode = initcode; return 0; }

7.5 IMPLEMENTAÇÃO DA LINGUAGEM INTERPRETADA NO SISTEMA

Documentos relacionados