INTRODUÇÃO
PROBLEMA DE PESQUISA
- Solução Proposta
- Delimitação de Escopo
- Justificativa
A ferramenta proposta permite a especificação de semânticas simplificadas de linguagens, como aquelas utilizadas na disciplina Compiladores para ensinar técnicas de especificação de linguagens de programação e desenvolvimento de compiladores, e facilita a implementação desses compiladores. Para tanto, a especificação da nova linguagem deve ser escrita de acordo com as teorias da linguagem formal e as restrições impostas pela metalinguagem a ser criada. Desta forma, a ferramenta proposta não visa estabelecer-se como um padrão para especificação semântica, mas sim auxiliar estudantes de ciência da computação a realizarem esta tarefa, permitindo-lhes aprimorar ainda mais seus conhecimentos sobre teoria de linguagem formal e compiladores.
O estudo dos conceitos decorrentes da Teoria das Linguagens Formais é uma perspectiva importante para a formação de estudantes de Ciência da Computação. Com uma ferramenta simples, os cientistas da computação poderiam manter seu foco na teoria das linguagens formais e dos compiladores necessários para implementar uma linguagem de programação, em vez de ter como objetivo especificar um modelo que possa aplicar ações semânticas a uma gramática.
OBJETIVOS
- Objetivo Geral
- Objetivos Específicos
A falta de um padrão formal para especificação semântica e de ferramentas que ajudem os acadêmicos nessa tarefa torna esse tema temido por muitos.
METODOLOGIA
- Metodologia da Pesquisa
- Procedimentos Metodológicos
Um exemplo de expressão regular utilizada para especificar o padrão de identificadores pode ser visto na Tabela 2. Portanto, para o desenvolvimento de um analisador dedutivo recursivo, a gramática da linguagem de programação deve pertencer à classe de gramáticas LL(1). Na gramática deste atributo, colchetes são usados para distinguir não-terminais na gramática, e apóstrofos são usados para distinguir produções do mesmo não-terminal.
A produção ou não terminal pode ser identificada como uma lista de não terminal. Automatizar a construção de um compilador pode garantir que o tratamento do contexto da linguagem de programação será adequado e padronizado, e que as ações semânticas serão calculadas corretamente.
FUNDAMENTAÇÃO TEÓRICA
LINGUAGENS DE PROGRAMAÇÃO
As linguagens de programação permitem o desenvolvimento de software de forma abstrata e independente da arquitetura do computador. No que diz respeito às linguagens de programação, a Teoria das Linguagens Formais fornece métodos para modelagem e desenvolvimento de ferramentas que descrevem as linguagens sintaticamente, bem como regras de análise, propriedades e restrições algorítmicas das linguagens (MENEZES, 2000 ). Outra diferença entre as linguagens LL(k) e LR(k) reflete a forma como a árvore derivada será construída.
Esses e outros recursos são explicados ao longo deste capítulo, bem como o relacionamento das classes com linguagens fuzzy livres de contexto. Apesar de expressivas, as linguagens livres de contexto são insuficientes para lidar com a semântica de um programa, enquanto as linguagens sensíveis ao contexto são redundantes e insuficientes em termos de complexidade computacional (MENEZES, 2000).
COMPILADORES
- Análise Léxica
- Análise Sintática
- Análise Semântica
- Gramática de atributos
- Tradução dirigida pela sintaxe
2 Tokens são unidades lógicas que representam cadeias de caracteres lidas pelo analisador léxico e identificadas com um nome de acordo com a gramática de uma linguagem de programação (AHO et al, 2008). Na Tabela 5 você pode ver um exemplo de programa que, apesar de atender às regras sintáticas da linguagem, possui um erro semântico comum entre linguagens de programação imperativas. Nesse sentido, processar o contexto de uma linguagem de programação consiste em computar dados armazenados na forma de atributos nos nós da árvore sintática (GRUNE et al, 2001).
A especificação das ações semânticas de uma gramática livre de contexto pode ser representada em diferentes notações: definições orientadas à sintaxe e esquemas de tradução orientados à sintaxe (AHO et al, 2008). O exemplo da Tabela 7 contém um trecho de um esquema de tradução responsável por reconhecer declarações de variáveis para programas de bloco único. Para isso, a ferramenta analisa um arquivo contendo a gramática de uma língua, combinada com um esquema de tradução, descrito na forma da metalinguagem especificada.
Terminada a análise, o compilador de metalinguagem deve gerar um arquivo com extensão jjt que contenha a especificação de um compilador para a gramática de entrada na forma sintática aceita pelo JavaCC, bem como as operações semânticas da linguagem Java. Tal como a implementação de uma linguagem de programação, uma metalinguagem deve ser formalmente descrita para que a sua implementação seja consistente e independente da implementação. Tal como acontece com qualquer conjunto de declarações, os identificadores não podem ser usados mais de uma vez.
A avaliação de expressões relacionais, aritméticas e lógicas pode ser realizada durante o processamento do contexto de uma linguagem de programação fortemente tipada e/ou durante sua execução. Assim, a sintaxe da metalinguagem permite ao usuário utilizar o caractere “:” (dois pontos) seguido de um dígito para distinguir cada ocorrência. Permitir que atributos de um não-terminal sejam inicializados para que não precisem ser inicializados em um bloco na própria produção.
DESENVOLVIMENTO
VISÃO GERAL DO SISTEMA
A ferramenta desenvolvida teve como objetivo auxiliar na especificação e implementação de linguagens de programação essenciais como as estudadas no curso de Ciência da Computação. O usuário pode utilizar o editor desenvolvido ou qualquer editor de texto de sua preferência para criar um esquema de tradução. Em seguida, inicie uma nova instância do compilador de metalinguagem usando a linha de comando ou um editor, conforme mostrado na Figura 7.
ANÁLISE DE REQUISITOS
- Requisitos Funcionais
- Requisitos Não Funcionais
O sistema deve permitir ao usuário inserir o conteúdo da área de transferência a partir da posição do cursor; O sistema deverá gerar um arquivo com a extensão ast com a estrutura em árvore de sintaxe do JastAdd (http://jastadd.org/);e. O sistema deverá gerar um arquivo com extensão jadd com as ações definidas pelo usuário para o JastAdd.
MODELAGEM DO SISTEMA
- Especificação da meta-linguagem
- Convenções Léxicas
- Casos de uso
- Diagrama de classes
Para facilitar a criação de esquemas de tradução, foi desenvolvido um editor que permite a integração com o tradutor de metalinguagem. O usuário digita o nome do arquivo e seleciona o local onde deseja salvar o conteúdo do editor e confirma. Pós-condições Se o fluxo principal for concluído sem erros, o conjunto de arquivos deverá estar no mesmo diretório que o arquivo do esquema de compilação.
Estas classes são responsáveis por implementar a coloração dos lexemas de metalinguagem quando o usuário edita um esquema de tradução no editor.
DETALHAMENTO DO DESENVOLVIMENTO
- Editor da meta-linguagem
- Implementação da meta-linguagem
- Implementação de uma linguagem
- Geração dos arquivos de especificação
Após o bloco de declaração da variável, deve-se construir um novo bloco com uma lista de comandos com expansão Body não terminal, que consiste em um bloco delimitado por chaves. Para especificar a lista de comandos usados no corpo não terminal, dois não terminais são usados, como aqueles na Tabela 24. A saída do tipo lista de comandos requer pelo menos uma expansão do comando não terminal seguido pelo terminal "." (apontar).
A avaliação da expressão deste comando depende das ações realizadas nas saídas que compõem a Expressão não terminal. Após avaliar a expressão e gerar a instrução de desvio, é construída uma lista de comandos expandindo o Corpo não terminal, que consiste em um bloco delimitado por chaves, conforme visto na Tabela 24. No quadro 28, o comando Repetir especifica as ações que As vontades executadas para lidar com o comando são claramente semelhantes às ações executadas no comando Seleção e diferem apenas pela instrução de desvio gerada após a expansão do Corpo não terminal.
Neste caso, o desvio deve apontar para a primeira instrução do bloco de instruções gerado com a expansão não terminal da Expressão, forçando a reavaliação da expressão durante a execução do código do objeto gerado e ramificando para a próxima instrução após a expansão do Corpo . quando a condição é falsa. Na Tabela 29, para avaliar se o tipo retornado pela expressão é o mesmo esperado de uma expressão relacional, após expandir ExpressaoAritmeticaLogica em Expressao é necessário manter o tipo registrado para compará-lo com o tipo retornado após a expansão. do segundo não terminal ExpressaoAritmeticaLogica encontrado nos não terminais Igual, Diferente, Menor ou Maior e expandido quando o operador relacional é consumido. O item não terminal pode ser expandido como uma Variável ou uma Constante, estas por sua vez já possuem suas próprias ações especificadas para tratar a expansão quando o contexto for registrado como .
Este método chama um segundo método com o mesmo nome do não-terminal inicial no meta-arquivo, no caso da Figura 13, Propriedades. No fragmento gramatical da Figura 15, o valor não terminal, que é especificado como uma produção abstrata, pode então ser expandido como SimpleValue ou ValueList. Embora o asterisco represente zero ou mais ocorrências da metalinguagem e do JavaCC, para JastAdd o asterisco especifica apenas que o não-terminal pode aparecer múltiplas vezes, como uma lista.
Em muitas gramáticas, a produção pode precisar expandir o mesmo não-terminal mais de uma vez sem a lista desse não-terminal. Como pode ser visto, os não-terminais identificados na produção abstrata são definidos no arquivo ast como classes que estendem o não-terminal no lado esquerdo da produção abstrata, como no caso de Real não-terminal estendendo Numérico abstrato não -terminal da Figura 17.
CONCLUSÃO
TRABALHOS FUTUROS
Ao longo do desenvolvimento e experimentação da ferramenta projetada, foram notadas possíveis implementações para ampliar as possibilidades da metalinguagem e do editor. Esta não é apenas uma limitação da implementação da metalinguagem, mas também do próprio JavaCC e JastAdd. Permitir a disposição repetida de terminais definidos, diferenciando-os de forma semelhante aos não terminais.
Complementando esta implementação, a metalinguagem deve permitir ao usuário escolher entre utilizar gramáticas de atributos ou simplesmente manipular o contexto utilizando blocos de código Java. Sugerir ao usuário as palavras reservadas na metalinguagem e na linguagem Java, bem como os terminais e não terminais já declarados, para serem preenchidos automaticamente conforme o usuário os digita, agilizando a especificação da linguagem. Unificar a implementação da coloração do editor com o analisador léxico da metalinguagem e da linguagem Java, eliminando a necessidade de alterações no editor quando houver alteração na metalinguagem ou na especificação da linguagem Java.
Habilite a gramática da metalinguagem para reconhecer a especificação de tokens a serem ignorados durante a análise lexical, como comentários e espaços em linhas e blocos.