Laboratório de Linguagens de Programação Prof. Andrei Rimsa Álvares. Trabalho Prático I. $ /usr/bin/beep f l 1000

Documentos relacionados
Laboratório de Linguagens de Programação Prof. Andrei Rimsa Álvares. Trabalho Prático I

Laboratório de Linguagens de Programação Prof. Andrei Rimsa Álvares. Trabalho Prático I

Laboratório!de!Linguagens!de!Programação! Prof.!Andrei!Rimsa!Álvares! Trabalho(Prático(I(

Laboratório!de!Linguagens!de!Programação! Prof.!Andrei!Rimsa!Álvares! Trabalho(Prático(I(

Trabalho Prático I. A seguir é dado um exemplo de utilização da linguagem que simula um objeto que mantém informações de um arranjo de inteiros:

Estruturas de seleção. Prof.: Jesus

Identificadores Nome de variáveis, constantes, métodos, etc...

Programação de Computadores I Introdução ao C PROFESSORA CINTIA CAETANO

Algoritmos e Programação

Descrição da Linguagem DECAF

Noções de algoritmos - Aula 1

4. Constantes. Constantes pré-definidas

Algoritmos I Aula 13 Linguagem de Programação Java

IV.2 Aspectos Léxicos Convencionais

C A P I T U L O 2 S I N T A X E B Á S I C A - V A R I Á V E I S E C O N S T A N T E S E M P H P

Descrição da Linguagem DECAF

Introdução a Programação. Curso: Sistemas de Informação Programação I José R. Merlin

Aula 03 Introdução à Java. Disciplina: Fundamentos de Lógica e Algoritmos Prof. Bruno Gomes

Bacharelado em Ciência e Tecnologia Processamento da Informação. Equivalência Portugol Java. Linguagem Java

08/05/2012. Tipos de dados. Tipos de dados. Elementos Básicos. Tipos de dados. Elementos Básicos Tipos de dados. Dados e seus tipos:

Professor Mauricio Lederer Algoritmos. Entrada e saída de dados

ALGORITMOS E APLICAÇÕES. FATEC IPIRANGA ADS Noturno 1º semestre de 2012 Prof. Luiz Carlos de Jesus Junior

Teoria e Implementação de Linguagens Computacionais. Especificação do projeto da disciplina (2006.1) Versão de 23/08/2006.

LINGUAGEM C: COMANDOS DE REPETIÇÃO

Programação I PRG Engenharia de Telecomunicações 2ª Fase Professor: Cleber Jorge Amaral

Lição 4 Fundamentos da programação

Sintaxe e Semântica. George Darmiton da Cunha Cavalcanti.

Programação em C. Variáveis e Expressões. Universidade Federal do Rio Grande do Norte Departamento de Engenharia de Computação e Automação

Introdução à Linguagem de Programação C: Variáveis, Constantes, Expressões, Atribuição, Tipos de dados, Entrada e Saída de Dados

Introdução à Programação

Diagramas Sintáticos

Computação L2. Linguagem C++ Observação: Material Baseado na Disciplina Computação Eletrônica.

Análise de Programação

Aula 8 Comandos de Seleção

PROGRAMAÇÃO ESTRUTURADA E ORIENTADA A OBJETOS

Aula 6 Oficina de Programação Estruturas Condicionais no C. Profa. Elaine Faria UFU

Estruturas de seleção. Prof.: Jesus

Fundamentos de Programação. Turma CI-240-EST. Josiney de Souza.

Conceitos básicos de programação

Programação Orientada a Objetos II Java Segunda aula. Prof. Rogério Albuquerque de Almeida

Bacharelado em Ciência e Tecnologia Processamento da Informação. Equivalência Portugol Java. Linguagem Java

Bacharelado em Ciência e Tecnologia Processamento da Informação. Equivalência Portugol Java. Linguagem Java

Programação Estruturada

Linguagem Java - Introdução

Sintática: como é escrito cada elemento da linguagem de programação.

Familiarização com a ferramenta JavaCC

Programação de Computadores III

Aula 4: Introdução à Linguagem C++

Bacharelado em Ciência e Tecnologia Processamento da Informação. Equivalência Portugol Java. Linguagem Java

Seleção Múltipla Laços (while, do-while, for) AULA 05

Introdução a JAVA. Variáveis, tipos, expressões, comandos e blocos

Estrutura do programa

Introdução a JAVA. Variaveis, tipos, expressões, comandos e blocos

CONCEITOS BÁSICOS DE ORIENTAÇÃO A OBJETOS PROF. ME. HÉLIO ESPERIDIÃO

ALGORITMOS AULA 2. Profª Amanda Gondim

INSTITUTO FEDERAL DE! EDUCAÇÃO, CIÊNCIA E TECNOLOGIA RIO GRANDE DO NORTE

Algoritmos II prof. Daniel Oliveira

PROGRAMAÇÃO I E N T R A DA E S A Í DA D E DA D O S

Mini apostila de Python - Oficina de Vestibulandos. PET Computação - UFPR September 2016

Linguagem Haskell. Universidade Estadual Santa Cruz Conceitos de Linguagens de Programação. Tiago Carneiro 19 Agosto 2013

Algoritmos e Programação

UNIVERSIDADE FEDERAL DO RIO GRANDE DO NORTE DEPARTAMENTO DE INFORMÁTICA E MATEMÁTICA APLICADA. DIM0320 Algoritmos e Programação de Computadores

Desenvolvido por: Juarez A. Muylaert Filho - Andréa T. Medeiros - Adriana S. Spallanzani -

Linguagem C. André Tavares da Silva.

Grupo 3: 8,3 - Parte Léxica (2,0): 1,9 - Na parte I especificou tamanho de identificador com 512 caracteres, mas não tratou (-0,1) -Parte Sintática

Operadores e Estruturas de Decisão

Sintaxe da linguagem Java

Operadores e Estruturas de Decisão. Vanessa Braganholo

ALGORITMOS AULA 01. Baseado nas aulas do Prof. Jorgiano Vidal

Passo-a-passo para desenvolver um Programa usando a Linguagem Python

3. Linguagem de Programação C

Estruturas de Repetição e String

I1, I2 e In são instruções simples ou estruturadas da linguagem Pascal.

Módulo Lógica Programação com aplicações em Java. Projeto khouse Profissionalizante Profª Larissa Brandão

Algoritmos. Algoritmos e Linguagem de Programação - Prof Carlos Vetorazzi

Universidade Federal de Goiás Bacharelado em Ciências da Computacão Compiladores

Estrutura de Condição, Escolha e Repetição

Prof. A. G. Silva. 28 de agosto de Prof. A. G. Silva INE5603 Introdução à POO 28 de agosto de / 1

Aula de hoje. Expressões. Expressões. Expressões. Exemplos. Programa em Python. SCC Introdução à Programação para Engenharias

Um Compilador Simples. Definição de uma Linguagem. Estrutura de Vanguarda. Gramática Livre de Contexto. Exemplo 1

INE5416 Paradigmas de Programação. Ricardo Azambuja Silveira INE CTC UFSC E Mail: URL:

Puca Huachi Vaz Penna

Operadores e Estruturas de Decisão

Computação para Informática - Prof. Adriano Joaquim de Oliveira Cruz Segunda Aula Prática - 29 de agosto de 2008

Fluxograma Pseudocódigo Estruturas de decisão. Professor Leandro Augusto Frata Fernandes

Programação de Computadores III

INFORMÁTICA APLICADA AULA 03 ALGORITMOS

Introdução a classes e objetos. Prof. Marcelo Roberto Zorzan

ALGORITMOS. Professor: Diego Oliveira. Aula 06 - Tipos Primitivos de Dados

Como construir um compilador utilizando ferramentas Java

Estruturas de Controle de Fluxo Estruturas de Seleção. Givanaldo Rocha

Compilação da linguagem Panda

Curso de PHP. FATEC - Jundiaí

Unidade 5: Introdução à Programação com C/C++ Prof. Daniel Caetano

Classes o Objetos. Classes, objetos, métodos e variáveis de instância

Fluxogramas e variáveis

Transcrição:

1. Objetivo Laboratório de Linguagens de Programação Trabalho Prático I O objetivo desse trabalho é desenvolver um interpretador para uma linguagem de programação fictícia chamada DTS (Digital Tone Synthesizer). Essa linguagem é capaz de tocar notas musicais no autofalante de beeps do computador com diversas durações. Com isso é possível emular músicas através dessa interface. A linguagem é capaz de tocar uma nota com certa duração, pausar por um determinado tempo, usar expressões e variáveis inteiras, comandos condicionais e de repetição. 2. Contextualização O beep do PC pode ser acessado por chamadas de sistema tanto no Linux quanto no Windows. Já o Macintosh não possui um autofalante de beeps, sendo necessário usar formatos de músicas como midi ou mp3. No Linux, existe a ferramenta beep (/usr/bin/beep) capaz de executar uma nota definindo sua frequência (-f) e duração (-l). Por exemplo, para tocar a nota Lá (A), frequência 440.0Hz, por 1 segundo (1000ms), basta executar o seguinte comando: $ /usr/bin/beep f 440.0 l 1000 Esse comando será usado pelo interpretador para executar comandos no Linux. Uma função em C e uma classe em Java para esse propósito podem ser encontradas na pasta do trabalho. Tabela 1. Frequências das doze (12) notas no 4 grau. Nota Frequência Frequência Nome Nota (Hz) (Hz) Nome C 261.6 Dó F# 370.0 Fá sustenido C# 277.2 Dó sustenido G 392.0 Sol D 293.7 Ré G# 415.3 Sol sustenido D# 311.1 Ré sustenido A 440.0 Lá E 329.6 Mi A# 466.2 Lá sustenido F 349.2 Fá B 493.9 Si Figura 1. Partitura da música Cai Cai Balão.

As frequências das 12 notas musicais podem ser encontradas na Tabela 1. O beep é capaz de tocar apenas uma nota por vez, portanto a linguagem DTS não suporta acordes (combinações de notas). Por exemplo, a música Cai Cai Balão cuja partitura é mostrada na Figura 1 pode ser expressa na linguagem DTS conforme programa a seguir, cujo tempo musical é de 400ms: tempo 400; musica "Cai Cai Balão"; faca i = 1; repetir (i =< 2); faca tocar(g, 1) : "Cai,"; tocar(g, 1.) : "cai,"; + meia tocar(f, %2) : "ba"; // fa colcheia se (j =< 2); faca tocar(e, 1) : "lao."; // fa seminima senao tocar(e, 1) : "lao"; // fa minima i = i + 1; tocar(g, 1) : "na"; tocar(a, 1) : "ru"; tocar(g, 1) : "a"; tocar(f, 1) : "do"; tocar(e, 1) : "sa"; tocar(d, 2) : "bao"; pausar(1); // la seminima // fa seminima // mi seminima // re minima // intervalo j = 1; repetir (j =< 3); faca tocar(d, %2) : "Nao"; // re colcheia tocar(e, %2) : "cai"; // mi colcheia se (j =< 2); faca tocar(f, 1) : "nao."; // fa seminima senao tocar(f, 2) : "nao."; // fa minima j = j + 1; tocar(g, 1) : "Cai"; tocar(a, 1) : "a"; tocar(g, 1) : "qui"; tocar(f, 1) : "na"; tocar(e, 1) : "mi"; tocar(d, 1) : "nha"; tocar(c, 2) : "mao!"; cai-cai-balao.dts // la seminima // fa seminima // mi seminima // re seminima // do minima

3. Descrição Um programa DTS possui as seguintes características: Um tempo opcional em milissegundos que deve ser informado uma única vez antes da música. Caso não seja especificado, deve-se considerar 500ms. o Ex.: tempo = 400ms; Todo programa deve obrigatoriamente conter a seção musica com seu respectivo nome, onde comandos são dados entre as palavrasreservadas faca e. o Ex.: musica "cai cai balão"; faca... Comentários de única linha, estilo C. o Ex.: int i = 1; // iniciar variável i com valor 1 Doze (12) notas musicais com letras maiúsculas e símbolo #. o Ex.: A ou C# Duração como um número que indica a quantidade de tempo em três formatos: número simples (tempo * numero), número seguido de ponto (tempo * numero * 1.5) e número prefixado com uma porcentagem (tempo / numero). o Ex: 1, 2., %4 Literais inteiras. o Ex: 5 Literais strings. o Ex: "cai" Variáveis que só podem ter um única letra minúscula. o Ex.: a ou v Expressões inteiras. o Ex: x + 1 Além disso, um programa DTS é formado por cinco (5) tipos de comandos distintos: Tocar: recebe uma nota e uma duração e tem o efeito de tocar essa nota com essa duração no autofalante de beep. Opcionalmente, podese associar uma palavra a essa nota. Deve terminar com ponto-vírgula. o Ex.: tocar(a#, 2); // tocar lá sustenido em 2 tempos o Ex: tocar(g, 1) : "cai"; // tocar sol em 1 tempo com texto "cai" Pausar: recebe uma duração e tem o efeito de interromper momentaneamente a música por essa duração. Não pode ter uma palavra associada. Deve terminar com ponto-vírgula. o Ex: pausar(1); // interromper por 1 tempo Atribuir: atribuir uma expressão aritmética simples (sempre com somente dois operandos) a uma variável. Deve terminar com pontovírgula. o Ex.: x = x+ 1;

Se: recebe uma expressão booleana entre parênteses e executa os comandos entre faca e se avaliar em verdadeiro. Opcionalmente pode incluir um bloco senao, que executa os comandos se a expressão avaliar em falso. o Ex: se (x == 1); faca... o Ex: se (x < 0); faca... senão... Repetir: recebe uma expressão booleana entre parênteses e executa os comandos entre faca e enquanto a expressão avaliar em verdadeiro. Ao avaliar em falso deve-se continuar a execução do programa executando o primeiro comando imediatamente após esse. o Ex.: repetir (x < 5); faca... A gramática para as expressões lógicas e inteiras é dada na gramática estendida de Backus-Naur Form (EBNF): <bool-expr> ::= <term> <rel_op> <term> <rel_op> ::= ==!= < > =< >= <int-expr> ::= <term> [ <arith_op> <term> ] <arith_op> ::= + - * / <term> 4. Instruções ::= <var> <num> Deve ser desenvolvido um interpretador em linha de comando que recebe um programa-fonte na linguagem DTS como argumento e executa os comandos especificados pelo programa. Os comandos Tocar e Pausar, além de suas respectivas funções, eles devem imprimir na saída do terminal conforme a seguir: Por exemplo, para o programa cai-cai-balao.dts deve-se tocar a música no beep e mostrar no terminal : $ dtsi cai-cai-balao.dts (G, 400.0) -> Cai, (G, 600.0) -> cai, (F, 200.0) -> ba (E, 400) -> lao. (G, 400) -> Cai, (G, 600) -> cai, (F, 200) -> ba (E, 400) -> lao (G, 400) -> na (A, 400) -> ru (G, 400) -> a (F, 400) -> do (E, 400) -> sa (D, 800) -> bao. (400) (D, 200) -> Nao (E, 200) -> cai (F, 400) -> nao. (D, 200) -> Nao (E, 200) -> cai (F, 400) -> nao. (D, 200) -> Nao (E, 200) -> cai (F, 800) -> nao. (G, 400) -> Cai (A, 400) -> a (G, 400) -> qui (F, 400) -> na (E, 400) -> mi (D, 400) -> nha (C, 800) -> mao!

O programa deverá abortar sua execução, em caso de qualquer erro léxico, sintático ou semântico, indicando uma mensagem de erro. As mensagens de erro são padronizadas indicando o número da linha (com no mínimo 2 dígitos) onde ocorreram: Tipo de Erro Léxico Sintático Semântico Mensagem Lexema inválido [lexema] Fim de arquivo inesperado Lexema não esperado [lexema] Fim de arquivo inesperado Operação inválida Exemplo de mensagem de erro: 5. Avaliação $ dtsi erro.dts 03: Lexema não esperado [;] O trabalho deve ser feito em grupo de até dois alunos, sendo esse limite superior estrito. O trabalho será avaliado em 15 pontos, onde essa nota será multiplicada por um fator entre 0.0 e 1.0 para compor a nota de cada aluno individualmente. Esse fator poderá estar condicionado a apresentações presenciais a critério do professor. Trabalhos copiados, parcialmente ou integralmente, serão avaliados com nota ZERO, sem direito a contestação. Você é responsável pela segurança de seu código, não podendo alegar que outro grupo o utilizou sem o seu consentimento. 6. Submissão O trabalho deverá ser submetido até as 23:55 do dia 05/10/2015 (segunda-feira) via sistema acadêmico (Moodle) em pasta específica. Não serão aceitos, em hipótese alguma, trabalhos enviados por e-mail ou por quaisquer outras fontes.

Class Diagram0 2015/10/02 powered by Astah pkg Lexema + type : Integer + token : String AnalisadorLexico - arquivo : FILE - linha : int - tabelasimbolos : Map<String,Integer> + AnalisadorLexico(nomeArquivo : String) + getlinha() : int + nexttoken() : Lexema - iniciartabelasimbolos() : void - consultartabelasimbolos(string : int) : Integer AnalisadorSintatico - lexico : AnalisadorLexico - atual : Lexema + AnalisadorSintatico(lexico : AnalisadorLexico) + init() : BlocoComandos - matchtoken(type : Integer) : void - procprogram() : BlocoComandos - proctempo() : TempoComando - proccomandos() : BlocoComandos - proccomando() : Comando - proctocar() : TocarComando - procpausar() : PausarComando - procatribuir() : AtribuirComando - procse() : SeComando - procrepetir() : RepetirComando - procexprbool() : ExprLogica - procexprint() : ExprInteira - proctermo() : Termo - procoprel() : RelOp - procoparit() : ArithOp - procnota() : Nota - procduracao() : double - procvar() : Variavel - procnum() : ConstInt - procstring() : String Comando Termo Expressao<E> <<enum>> Nota + La : double + LaSustenido : double + Si : double + Do : double + DoSustenido : double + Re : double + ReSustenido : double + Mi : double + Fa : double + FaSustenido : double + Sol : double + SolSustenido : double + nome() : String + frequencia() : double BlocoComandos TocarComando - comandos : List<Comando> - nota : Nota - duracao : double + BlocoComandos() : void - palavra : String + adicionarcomando(c : Comando) : void + TocarComando(nota : Nota, duracao : double, palavra : String) TempoComando AtribuirComando - tempo : ConstInt - var : Variavel - expr : ExprInteira Tempo + TempoComando(tempo : ConstInt) + AtribuirComando(var : Variavel, expr : ExprInteira) - tempo : int + settempo(tempo : int) : void + gettempo() : int + getvalor() : int + avaliar() : E <<Integer>> PausarComando ConstInt Variavel ExprInteira - tempo : ConstInt - valor : int - valor : int + avaliar() : Integer + PausarComando(tempo : ConstInt) + ConstInt(valor : int) + Variavel() + getvalor() : int + getvalor() : int + setvalor(valor : int) : void RepetirComando ExprIntSimples ExprIntDupla - expr : ExprLogica - termo : Termo - termo1 : Termo - comandos : BlocoComandos - op : ArithOp + ExprIntSimples(termo : Termo) + RepetirComandos(expr : ExprLogica, comandos : BlocoComandos) - termo2 : Termo + avaliar() : Integer + ExprIntDupla(termo1 : Termo, op : ArithOp, termo2 : Termo) + avaliar() : Integer <<Boolean>> ExprLogica + avaliar() : Boolean ExprLogicaDupla - termo1 : Termo - op : RelOp - termo2 : Termo + ExprLogicaDupla(termo1 : Termo, op : RelOp, termo2 : Termo) + avaliar() : Boolean SeComando - expr : ExprLogica - comandosse : BlocoComandos - comandossenao : BlocoComandos + SeComando(expr : ExprLogica, comandosse : BlocoComandos, comandossenao : BlocoComandos) <<enum>> ArithOp <<enum>> RelOp - Mais : int - Menos : int - Multiplicacao : int - Divisao : int - Igual : int - Diferente : int - Menor : int - MenorIgual : int - Maior : int - MaiorIgual : int