• Nenhum resultado encontrado

Construc¸ ˜ao da DAST: o front-end

No documento Sistematização da animação de programas (páginas 89-93)

Existem dois tipos de utilizadores do sistemaAlma: um que constr´oi o front-end para uma determinada linguagem (caso ainda n˜ao exista) e um outro que introduz um programa e recebe a sua animac¸˜ao au- tomaticamente. Quem desenvolve o front-end tem apenas que conhecer a gram´atica da sua linguagem e efectuar uma extens˜ao a essa gram´atica onde especifica o mapping conceptual entre as entidades da linguagens fonte e os nodos da gram´atica abstracta doAlma ou seja, indica as directivas de traduc¸ ˜ao entre a gram´atica concreta e a gram´atica abstracta.

Dado o conjunto de nodos poss´ıveis naDASTrepresentarem as operac¸ ˜oes mais b´asicas, comuns a muitas linguagens, torna-se f´acil para o utilizador indicar quais desses conceitos est˜ao envolvidos na sua lin- guagem e como se relacionam.

O front-end, gerado a partir da especificac¸˜ao dessas linguagens (gram´aticas), vai construir a representac¸ ˜ao interna de um programa fonte. Essa representac¸ ˜ao ´e aDASTconstru´ıda com base na GA doAlma. Os construtores dos nodos daDASTs˜ao especializac¸ ˜oes da func¸˜ao createNode que permitem construir nodos de v´arios tipos interligando-os em forma de ´arvore. A ´arvore ´e constru´ıda das folhas para a raiz. Os construtores dos nodos necessitam informac¸˜ao sobre o nodo a construir (s´ımbolo, c´odigo do s´ımbolo, n´umero da produc¸˜ao e atributos) e seus descendentes. Os construtores das folhas da ´arvore apenas ne- cessitam da informac¸˜ao sobre o pr´oprio nodo. Considera-se que o nome do nodo ´e o nome do s´ımbolo. Os construtores s˜ao invocados nas acc¸ ˜oes semˆanticas associadas `a gram´atica da linguagem fonte. A cada produc¸˜ao da gram´atica ´e associada a construc¸ ˜ao de um nodo daDASTque corresponde ao s´ımbolo do lado esquerdo dessa mesma produc¸ ˜ao e que ficar´a como ascendente de todas as sub´arvores correspon- dentes aos s´ımbolos do lado direito da produc¸ ˜ao.

gram´atica_do_FE = seq(produc¸˜ao)

produc¸˜ao = <lado_esq, lado_dir, semˆantica>

semˆantica = seq(construtor)

construtor = <nome, params>

Ao invocar um construtor est´a feito o mapeamento entre os conceitos definidos na gram´atica da nova linguagem e os conceitos pertencentes `a gram´atica abstracta doAlma. Entendeu-se representar nesta gram´atica doAlmaos conceitos mais b´asicos comuns `as linguagens. Esses conceitos sendo b´asicos s˜ao mais gerais e servir˜ao para definir conceitos mais alto n´ıvel das diferentes linguagens fonte. Em seguida ser˜ao apresentados dois exemplos de linguagens mapeadas nos nodos abstractos do sistemaAlma. Considerando uma primeira linguagem de estilo imperativo onde s˜ao permitidas apenas operac¸ ˜oes de atribuic¸ ˜ao onde o lado esquerdo da atribuic¸ ˜ao ´e sempre uma vari´avel e o lado direito pode ser uma vari´avel, um n´umero inteiro, ou uma adic¸˜ao de inteiros. As primeiras produc¸ ˜oes da gram´atica ser˜ao especificadas da seguinte forma:

START : inicio STMTS fim ALMA_ROOT(START,STMTS)

STMTS : STMT STMTS ALMA_STATS(STMTS_0,STMT,STMTS_1) | STMT ALMA_STATS_SING(STMTS,STMT)

Na primeira produc¸ ˜ao da gram´atica ´e usada uma func¸˜ao de construc¸ ˜ao da raiz da ´arvore. Esta linguagem permite definir v´arias instruc¸ ˜oes e o nodo doAlmausado para agrupar na ´arvore um conjunto de enti- dades do mesmo tipo, tem o nome STATS. Assim, ser´a criado um nodo STATS com dois filhos, no caso de haver mais do que uma instruc¸˜ao, ou um nodo STATS com um filho, quando apenas h´a uma instruc¸˜ao. O nome das func¸ ˜oes indica o tipo de nodo a criar (produc¸ ˜ao) e os parˆametros indicam o nome do s´ımbolo do nodo que est´a a ser criado e os nodos filhos, cujas ´arvores j´a foram entretanto geradas. Uma outra produc¸˜ao da gram´atica ser´a a seguinte:

STMT : ASSIGN ALMA_IDENT(STMT,ASSIGN)

A func¸˜ao ALMA IDENT n˜ao cria nodos novos apenas indica que a ´arvore associada ao nodo ASSIGN ´e a ´arvore a associar ao s´ımbolo STMT. Uma atribuic¸ ˜ao ser´a especificada pela seguinte produc¸ ˜ao:

ASSIGN : identificador = EXPR ALMA_ASSIGN_VAR(ASSIGN, getName(identificador),

getType(identificador),EXPR)

A func¸˜ao aplicada a esta produc¸˜ao cria dois nodos: o nodo que representa a atribuic¸ ˜ao e o nodo que representa a vari´avel atribu´ıda. Esta func¸˜ao usa tamb´em a ´arvore j´a associada ao s´ımbolo EXPR. O nome do identificador e o tipo s˜ao usados para criar o nodo que representa a vari´avel atribu´ıda. Uma express˜ao ficar´a definida pelas seguintes produc¸ ˜oes:

EXPR : EXPR + EXPR ALMA_OPER(EXPR_0,EXPR_1,EXPR_2,’’+’’)

EXPR : numero ALMA_CONST(EXPR,getValue(numero), getType(numero)) EXPR : identif ALMA_VAR(EXPR,getName(identif),getType(identif))

A produc¸˜ao que permite definir a adic¸˜ao de express˜oes levar´a `a criac¸˜ao de um nodo OPER que simboliza, neste caso, a operac¸ ˜ao de adic¸˜ao e cujos filhos s˜ao as sub´arvores relativas aos operandos. Neste caso, uma express˜ao se n˜ao for uma adic¸˜ao ´e apenas um numero ou uma vari´avel. Na primeira hip´otese ser´a criado um nodo CONST e, no segundo, um nodo VAR.

Considerando o programa exemplo abaixo e a gram´atica com as acc¸ ˜oes semˆanticas acima constru´ıda, pode-se deduzir que aDASTgerada pelo front-end ´e a representada na figura 4.4.

Exemplo 4.3.1 (Programa de entrada)

inicio a = 5 b = a + 3 fim

A ´arvore gerada ser´a a da figura 4.4.

STATS STATS CONST VAR VAR ASSIGN VAR CONST OPER ASSIGN

Figura 4.4: A DAST gerada para o exemplo 4.3.1

Um segundo exemplo de mapeamento mostra o caso de outro tipo de linguagem para a qual tamb´em ´e poss´ıvel identificar conceitos que podem ser representados pelos nodos daDASTdoAlma. A linguagem pretende descrever o funcionamento de um conjunto de m´aquinas de transic¸ ˜ao de estados, indicando, para cada m´aquina: o nome, o estado inicial e um conjunto de transic¸ ˜oes de estados sujeitas a pr´e-requisitos (condic¸ ˜oes). A gram´atica comec¸a pelas seguintes produc¸ ˜oes:

Maquinas : Maquina Maquinas

ALMA_STATS (Maquinas,Maquina,Maquinas) | Maquina

ALMA_STATS_SING (Maquinas,Maquina)

Pretende-se nestas primeiras produc¸ ˜oes definir um conjunto de entidades do mesmo tipo: sendo assim, o nodo a criar ´e o STATS, quer para o caso de ser mais do que uma m´aquina, quer no caso de ser apenas uma. A informac¸˜ao relativa a cada m´aquina ´e especificada da seguinte forma:

Maquina : Nome Estado_ini Transic¸˜oes

ALMA_LST(Nome, Estado_ini, Transic¸˜oes) Transic¸˜oes: Transic¸˜ao Transic¸˜oes

ALMA_STATS(Transic¸˜oes_0,Transic¸˜ao,Transic¸˜oes_1) | Transic¸˜ao

ALMA_STATS_SING(Transic¸˜oes, Transic¸˜ao)

Ao contr´ario do nodo STATS, o nodo LST representa um associac¸ ˜ao de entidades de tipos diferentes. Assim, todos os conceitos relacionados com uma m´aquina ficam agrupados por LST. A cada m´aquina est´a associada tamb´em um conjunto de transic¸ ˜oes, sendo cada transic¸ ˜ao representada pela produc¸ ˜ao:

Transic¸˜ao : EstadoA Condic¸˜ao -> EstadoB

ALMA_IF(Transic¸˜ao, Condic¸˜ao,

ALMA_STATS(ALMA_OPER(EstadoA,EstadoB,’’transita’’)))

Cada transic¸ ˜ao poder´a ser mapeada num nodo IF pois tamb´em est´a sujeita a uma condic¸˜ao. Se a condic¸ ˜ao ´e verificada a operac¸˜ao ´e executada, ou seja, a m´aquina “transita” de um estado A para um estado B. As ´ultimas produc¸ ˜oes da gram´atica s˜ao especificadas da seguinte forma:

Nome, EstadoA,

EstadoB : identif

ALMA_CONST(...,getName(identif),getType(identif)) Condic¸˜ao : Var_teste = Val_teste

ALMA_OPERREL(Condic¸˜ao,Var_teste,Val_teste,’’==’’) Var_teste : identif

ALMA_VAR(Var_teste,getName(identif),getType(identif)) Val_test : numero

Cada estado ´e visto como um nodo CONST pois a ´unica informac¸ ˜ao que tem associada ´e um nome e o mesmo acontece com o nome da m´aquina. Cada condic¸˜ao tem o formato de uma comparac¸˜ao de igualdade entre um identificador e um n´umero inteiro. As condic¸ ˜oes ser˜ao mapeadas para nodos do tipo

RELOPERcujos filhos ser˜ao do tipo VAR e CONST respectivamente.

Tomando como exemplo o seguinte texto de entrada, escrito na linguagem especificada pela gram´atica:

Exemplo 4.3.2 (Programa de entrada)

ROLDANA A

A a=3 -> B B a=1 -> A

O front-end constru´ıdo para esta linguagem produzir´a, como resultado, a DAST da figura 4.5.

STATS CONST STATS IF STATS CONST CONST OPER CONST CONST VAR VAR CONST IF STATS CONST STATS OPER CONST RELOPER RELOPER LST

Figura 4.5: A DAST gerada para o exemplo 4.3.2

No documento Sistematização da animação de programas (páginas 89-93)