• Nenhum resultado encontrado

TCC II Corrigido - IIS Windows Server

N/A
N/A
Protected

Academic year: 2023

Share "TCC II Corrigido - IIS Windows Server"

Copied!
82
0
0

Texto

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).

Tabela 1. Classes de linguagens, gramática e reconhecedores.
Tabela 1. Classes de linguagens, gramática e reconhecedores.

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.

Figura 2. Principais fases de um compilador.
Figura 2. Principais fases de um compilador.

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.

Figura 8. Diagrama de casos de uso do Editor.
Figura 8. Diagrama de casos de uso do 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.

Tabela 4. Cores dos símbolos.
Tabela 4. Cores dos símbolos.

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.

Tabela com as teclas de atalho do editor.
Tabela com as teclas de atalho do editor.

Imagem

Figura 1. Hierarquia de Chomsky.
Tabela 1. Classes de linguagens, gramática e reconhecedores.
Figura 2. Principais fases de um compilador.
Tabela 2. Exemplos de tokens.
+7

Referências

Documentos relacionados

(c) Explique por que qualquer palavra derivada a partir da gramática tem que estar na linguagem (em geral, é mais fácil descrever a forma geral de uma forma sentencial da