Documentação de Usuário – GrView 0.2.1alpha
Introdução | Modelagem de Grafos | Visualização dos Grafos | Analisador Léxico | Rotinas Semânticas | Analisador Sintático | Exemplos
Uma referência a uma rotina semântica (para análise de contexto e geração do código objeto, completando a compilação produzida com o analisador GSSL(1)) podem ser inseridas em qualquer nó do GSS por meio do grView, embora o analisador GSLL(1) ignore as rotinas presentes em cabeçalhos de produção (nó do símbolo inicial da gramática e nós inicial do não-terminais à esquerda): o fato de ser possível inseri-las em cabeçalhos deve-se à possibilidade de algum analisador diferente levar em consideração as rotinas semânticas nesses nós. Para inserir uma rotina semântica basta abrir o menu contextual sobre um nó e selecionar “Semantic Routine -> Create New...” (figura 20) para criar uma nova rotina, ou selecionar na lista mostrada uma das rotinas semânticas previamente criadas. Após esse procedimento o nome da rotina será indicado ao lado do símbolo do nó. Alternativamente, também é possível indicar a rotina semântica pelo próprio símbolo do nó. Para isso é necessário alterar seu símbolo anexando, logo em seguida ao símbolo existente do nó, o caractere # e o nome da rotina semântica desejada diretamente após o nome do nó. Assim, por exemplo, se um nó tem o símbolo “B”, e deseja-se utilizar a rotina semântica “semantic_routine1”, basta alterá-lo para “B#semantic_routine1” (figura 20, em verde).
Figura 20 – Nós com rotinas semânticas.
1. Criação de uma nova rotina semântica para o nó selecionado (na figura 20, em azul).
2. Um nó, rotulado “Numb” com a rotina semântica “semantic_routine_1”.
3. Um nó com a mesma rotina, inserida da forma alternativa.
4. Um nó lambda com a rotina “teste”.
Ao criar uma nova rotina semântica pelo método descrito acima será exibida uma caixa de diálogo onde se deverá informar o nome da nova rotina e inserir o código correspondente. O código para rotinas semânticas deve ser escrito em Groovy [23]. Algumas variáveis especiais são disponibilizadas para imprimir resultados, bem como ler e modificar a tabela sintática:
· parseStack – Cada elemento dessa pilha contém dois campos: um símbolo sintático (um terminal ou não terminal), ou melhor, um ponteiro para o nó do grafo, onde está o símbolo, e dados semânticos (ponteiro para a tabela de símbolos do compilador, um rótulo ou ponteiro para uma tabela de rótulos para desvios, etc.). Este objeto é uma instância de java.util.Stack, onde cada elemento é uma instância de org.grView.syntax.model.ParseStackNode.
· tabT – Um vetor com os símbolos de todos os terminais. Neste vetor os índices dos nós são correspondentes aos índices em parseStack.
· output – Esta variável aponta para a instância de um objeto utilizado para imprimir resultados. Os principais métodos associados a este objeto são: println(String) e DisplayTextExt(String), usados para imprimir resultados no interpretador e no campo de saída padrão, respectivamente.
Mais detalhes sobre a criação de rotinas semânticas podem ser encontrados em [20].
Uma vez criadas as rotinas semânticas, elas são armazenadas no diretório do projeto em um arquivo de extensão .sem; “Untitled.sem” para novos projetos. Este é escrito na linguagem Groovy. O código de cada rotina é inserido no campo indicado pelos comentários no arquivos. O exemplo abaixo mostra a função teste escrita nesse arquivo.
import org.grview.syntax.model.ParseStackNode
/*------ SEMANTIC ROUTINES ESPECIFICATION -----*/
/* you can modify the lines bellow */
void teste() {
println "hello world"
}
/* do not modify the lines bellow */
/*------ SELF GENERATED METHODS ---------------*/
this
Novas rotinas podem ser inseridas diretamente neste arquivo, desde que respeitem todas as restrições da sintaxe. Para tanto basta abrir normalmente o arquivo a partir do gerenciador de arquivos e salvá-lo após a edição.