Relatório da Árvore de Execução e Executor. Fabrício Vazole Lilian Lahas

Tamanho: px
Começar a partir da página:

Download "Relatório da Árvore de Execução e Executor. Fabrício Vazole Lilian Lahas"

Transcrição

1 Relatório da Árvore de Execução e Executor Fabrício Vazole Lilian Lahas Vitória, ES Setembro de 2003

2 Sumário 1. Introdução Projeto Arquitetura do Compilador Tabela de Variáveis Tabela de Funções Primitivas Tabela de Programas Analisador Léxico Ferramenta Estrutura do arquivo de descrição Código Analisador Sintático Ferramenta Estrutura do arquivo de descrição Código Analisador Contexto Gerador de Código Executor de Código Exemplos de Programas Ambiente de Execução Menu MakeFile... 37

3 1. Introdução O trabalho consiste em criar um tradutor e um interpretador para a linguagem µpascal. A função do tradutor é ler um programa escrito na linguagem escolhida e montar uma árvore de execução. Já função do interpretador é executar um programa, dada sua árvore de execução. Além disso, faz parte do trabalho criarmos um ambiente de compilação e execução de programas que permita que um usuário compile e execute programas. Nas próximas seções detalharemos a construção e o funcionamento do compilador e do ambiente de execução. 2. Projeto O projeto é dividido em duas partes: o compilador e o ambiente de execução de programas. Iremos detalhar a arquitetura de ambos nas próximas seções. Utilizamos como plataforma de implementação Linux e linguagem de programação C. Não esquecendo de informar que também foram utilizadas as ferramentas Flex e Bison na análise semântica e sintática, respectivamente Arquitetura do Compilador O compilador possui basicamente quatro módulos principais. Abaixo, estão listados os passos gerais do funcionamento do compilador e a relação entre cada módulo. Analisador Léxico: É responsável por ler o código fonte e, utilizando regras definidas previamente de acordo com a linguagem, analisa cada vocábulo (token) classificando-os de acordo. O termo e a sua classe são enviados para o analisador sintático; Analisador Sintático: Recebe os termo e, segundo uma gramática fornecida, analisa a combinação destes para verificar a validade das expressões. Logo seu propósito é verificar se a sintaxe do programa está de acordo com a linguagem de programação utilizada; Analisador de Contexto: Trabalha durante a análise sintática verificando a validade na utilização dos termos através da realização das ações semânticas; Gerador da Árvore de Execução: termina o processo de interpretação do código e grava em memória a árvore para ser, depois, executada.

4 Abaixo apresentamos o funcionamento do compilador.

5 3. Tabela de Variáveis Abaixo se encontra o código da nossa tabela de variáveis que está no arquivo TabVar.c e TabVar.h. É importante destacar que para melhoria da consulta, a inserção é feita com o auxílio de uma função chamada Hash apresentada abaixo: /********************************************************** Função:hash Descrição:Dado um símbolo encontra a posição na tabela hash **********************************************************/ int hash(char *item){ int i; int posic=0; for(i=0;item[i]!=0;i++){ posic=posic + item[i]; posic=posic%m; return posic; Abaixo temos as definições da estrutura tabela e declarações de funções. #ifndef TabVar_H #define TabVar_H #include "hash.h" typedef struct Termo{ int tipo; int valor; Termo; /*Estrutura da Lista de Variáveis*/ typedef struct Variavel{ char palavra[max_string]; int tipo; Termo termo; struct Variavel *next; Variavel;

6 /*Funções*/ Variavel *newvar(char *); void initstack(); Variavel **newtabvar(); void inittabvar(variavel**); void inserevariavel(variavel** TabVar, Variavel* var,int posic); int consulta(variavel** TabVar,char *item); Variavel *consulta_var(variavel** TabVar,char *item); Abaixo apresentamos a implementação das funções acima definidas. /*********************************************************** Implementação da Tabela de Variáveis ***********************************************************/ #include <stdlib.h> #include <string.h> #include <stdio.h> #include "TabVar.h" #include "TabProg.h" extern Programa *programa; /*********************************************************** Função:newVariavel Descrição:Cria uma nova variável ***********************************************************/ Variavel *newvar(char *item){ Variavel *var=(variavel*)malloc(sizeof(variavel)); strcpy(var->palavra,item); var->termo.valor=0; var->next=null; return var;

7 Variavel **newtabvar(){ Variavel **TabVar=(Variavel**) malloc(sizeof(variavel*)*m); return TabVar; void inittabvar(variavel **TabVar){ int i; for (i=0;i<m;i++) TabVar[i]=NULL; /*********************************************************** Função:insereVariavel Descrição:Insere um Variavel na Tabela HasH ***********************************************************/ void inserevariavel(variavel** TabVar, Variavel* var,int posic){ if(consulta(tabvar, var->palavra)==false){ Variavel *aux=tabvar[posic]; if (aux==null){ TabVar[posic]=var; else{ while (aux->next!= NULL) aux=aux->next; aux->next= var; /*********************************************************** Função:consulta Descrição: Consulta um elemento na lista ***********************************************************/ int consulta(variavel**tabvar,char *item){ int posic =hash(item); Variavel *aux=tabvar[posic]; while (aux!= NULL){ if (!strcmp(item,aux->palavra)) return TRUE; aux=aux->next; return FALSE;

8 4. Tabela de Funções Primitivas As funções primitivas são aquelas definidas pela linguagem, nela sabemos o nome da função que pertence à linguagem, quantidade de argumentos permitidos (aridade), o número do procedimento. Será utilizada pelo analisador léxico e de contexto. A implementação está no arquivo TabPrimitiva.c e TabPrimitiva.h. Abaixo estão as estruturas e declarações das funções primitivas. #ifndef TabPrimitiva_H #define TabPrimitiva_H #include "hash.h" /*Estrutura da Lista de Funções Primitivas*/ typedef struct FuncPrim{ char palavra[max_string]; int aridade; int procedimento; struct FuncPrim *next; FuncPrim; /*Tabela de Funções Primitivas*/ FuncPrim *TabFP[M]; /*Funções*/ void inittabfp(); FuncPrim *newfuncprim(char *,int,int); void inserefp(funcprim* TabFP[], FuncPrim* func,int posic); void iniciafp(funcprim* TabFP[],char *nome_arq); FuncPrim *busca_fp(funcprim*tabfp[],char *item); int consulta_fp(funcprim*tabfp[],char *item); int consultaaridade(funcprim* TabFP[],char *item); #endif Abaixo estão as implementações das funções.

9 /*********************************************************** Implementação da Tabela Funções Primitivas ***********************************************************/ #include <stdlib.h> #include <string.h> #include <stdio.h> #include "TabPrimitiva.h" /*********************************************************** Função:newFuncPrim Descrição:Cria um novo FuncPrim ***********************************************************/ void inittabfp(){ int i; for (i=0;i<m;i++) TabFP[i]=NULL; FuncPrim *newfuncprim(char *item, int aridade,int proc){ FuncPrim *funcprim=(funcprim*)malloc(sizeof(funcprim)); strcpy(funcprim->palavra,item); funcprim->aridade=aridade; funcprim->procedimento=proc; funcprim->next=null; return funcprim; /*********************************************************** Função:insereFuncPrim Descrição:Insere um FuncPrim na Tabela HasH ***********************************************************/ void inserefuncprim(funcprim* TabFP[], FuncPrim* funcprim,int posic){ FuncPrim *aux=tabfp[posic]; if (aux==null){ TabFP[posic]=funcPrim; else{ while (aux->next!= NULL) aux=aux->next; aux->next= funcprim;

10 /*********************************************************** Função:carregaTS Descrição:Carrega os FuncPrims de um arquivo para a tabela de símbolos ***********************************************************/ void iniciafp(funcprim* TabFP[],char *nome_arq){ FILE *fp; char palavra[max_string]; int proc,aridade; int posic; /*Abrir arquivo para leitura*/ if (( fp = fopen(nome_arq, "r")) == NULL) { printf("nao foi possivel abrir o arquivo para leitura.\n"); else{ while (!feof(fp)){ FuncPrim *funcprim; memset(palavra,0,max_string); fscanf(fp,"%s", palavra); fscanf(fp,"%d",&aridade); fscanf(fp,"%d",&proc); if (!consulta_fp(tabfp,palavra)){ funcprim=newfuncprim(palavra,aridade,proc); posic=hash(palavra); inserefuncprim(tabfp,funcprim,posic); else printf("função %s redefinada,portanto não foi inserida\n"); fclose(fp); /*********************************************************** Função:consulta Descrição: Consulta um elemento na lista ***********************************************************/ int consulta_fp(funcprim*tabfp[],char *item){ int posic =hash(item); FuncPrim *aux=tabfp[posic]; while (aux!= NULL){ if (!strcmp(item,aux->palavra)) return TRUE; aux=aux->next;

11 5. Tabela de Programas Os programas compilados são inseridos na tabela de programas que se encontra implementado no arquivo TabProg.c e TabProg.h. Abaixo estão as estruturas e declarações da tabela de programas. #ifndef TabProg_H #define TabProg_H #include "hash.h" #include "TabVar.h" /*Nó de uma árvore*/ typedef struct No{ char nome[max_string]; char tipo; int valor; struct No *esq, *dir, *prox; No; /*Estrutura da tabela de programas*/ typedef struct Program{ char nome[max_string]; Variavel** TabVarProg; struct No *fst, *lst; Programa; /*Variáveis Globais*/ No *noatual, *noaux, *noauxp, *nofunc, *noprec; Programa *programa; Programa *ListPrograma[100]; /*Funções*/ Programa* inittabprog(programa*); No *newno(char *, char, int); Programa* getprograma(char *); void insereprograma(programa *); Abaixo estão as implementações das funções.

12 /*********************************************************** Implementação da Tabela de Programas ***********************************************************/ #include <stdlib.h> #include <string.h> #include <stdio.h> #include "TabProg.h" /** Variáveis externas **/ extern int gnumero; extern int gtipotermo; extern char gultvariavel[max_string]; extern int flag; int poslastprog=0; Programa* getprograma(char *nome){ int i; for (i=0;i<poslastprog;i++){ if (strcmp(listprograma[i]->nome,nome) == 0 ) return ListPrograma[i]; return NULL; void insereprograma(programa *programa){ ListPrograma[posLastProg]=programa; poslastprog++; /*********************************************************** Função:initTabProg Descrição:Cria uma nova Tabela de Programas ***********************************************************/ Programa* inittabprog(programa* programa){ programa = (Programa *) malloc(sizeof(programa)); programa->tabvarprog=newtabvar(); inittabvar(programa->tabvarprog); return programa;

13 6. Analisador Léxico 6.1. Ferramenta A ferramenta utilizada foi o FLEX, do linux. FLEX é uma ferramenta construtora de analisadores léxicos. O flex transforma um arquivo de especificações léxicas em um analisador (um programa). Abaixo apresento uma figura que mostra o funcionamento desta ferramenta Estrutura do arquivo de descrição Todo arquivo de descrição do Flex possui três seções separadas por uma linha com apenas os caracteres %% colocados em seu início, como esquematicamente ilustrado a seguir: DEFINIÇÕES %% REGRAS %% CÓDIGO Seção DEFINIÇÕES Como esperado a seção DEFINIÇÔES possui definições léxicas. É possível, no entanto que esta seção permaneça vazia, isto é, sem definições. Toda definição léxica tem a forma: Nome definição

14 Como Nome devemos usar uma palavra, iniciada por letra ou underscore ('_') seguida de uma ou mais letras, dígitos, underscore ou traços ('-'). A definição segue o nome e se inicia no primeiro caractere não branco continuando até o final da linha. Usualmente as definições são conjuntos de caracteres ou expressões regulares contidas entre colchetes. A seção DEFINIÇÕES pode ainda conter a declaração e inicialização de variáveis globais que poderão ser utilizadas nas ações e no código fornecido pelo programador Seção REGRAS A seção REGRAS possui por sua vez as regras do analisador léxico a ser construído. Esta seção sempre possui regras, pois sem estas o analisador gerado apenas copia sua entrada para a saída. Uma regra tem sempre a forma: Padrão ação O Padrão deve começar na primeira coluna do texto e são definidos como expressões regulares. A ação deve sempre ser iniciada na mesma linha e usualmente corresponde a um trecho de código C que será executado toda vez que o padrão for reconhecido na entrada. Tanto na seção de DEFINIÇÕES como de REGRAS qualquer texto identado ou entre %{e % é copiado literalmente para a saída (sem os caracteres %{e %). Para o reconhecimento dos caracteres {, e % estes devem aparecer não identados como padrões em separado. Em adição, apenas na seção de DEFINIÇÕES, qualquer texto não identado é copiado literalmente para a saída. Sob certos aspectos os caracteres %% indicam o início e o fim da seção REGRAS Seção CÓDIGO A última seção, CÓDIGO, contém todo o código C definido e fornecido pelo programador. Nesta seção usualmente temos declarada uma função main(), que define o início do programa que pode efetuar uma chamada à função yylex() (o scanner gerado por Flex). Outras funções, utilizadas nas ações definidas pelas regras, podem ser colocadas aqui. Esta seção também pode permanecer vazia, ou seja, sem código definido pelo programador. Recomenda-se ainda a declaração de uma função yywrap() como abaixo:

15 int yywrap(){ return 1; 6.3. Código O analisador léxico em nosso trabalho está implementado no arquivo AL.l. %{ #include "TabVar.h" #include "TabPrimitiva.h" #include "TabProg.h" #include <string.h> #ifndef ITS #define ITS(x) fprintf(stdout, "\t[%d]%s\n", x, yytext); return((int)(x)) #include "bison.h" #endif #ifndef verificaid #define verificaid if (consulta_fp(tabfp,yytext)){\ strcpy(gultfuncao,yytext);\ return (Tok_Fp);\ else if (consulta(programa->tabvarprog,yytext)){\ strcpy(gultvariavel,yytext);\ return (Tok_Variavel);\ else return (Tok_Iden); #endif /** Variáveis Globais **/ //Guarda o valor do ultimo termo lido char gultimotermo[max_string]; //Guarda o ultimo número lido char gultnumero[max_string]; //Guarda o nome da ultima variavel lida. char gultvariavel[max_string]; char gultfuncao[max_string]; //Guarda o nome da ultima funcao lida char gultoper[max_string]; //Guarda o nome da ultima operacao lida // Guarda o valor do ultimo número lido. int gnumero; // Guarda o tipo do ultimo termo lido. char gtipotermo;

16 // Flag para passagem de parâmetro para função. int flag = 0; % ESPACO [ \t]+ DIGITO [0-9] OPER [*+-/] ID [a-za-z][a-za-z0-9]* DELIM_VIR (,) DELIM_DP (:) DELIM_AP \( DELIM_FP \) DELIM_PV (;) FIM [.] ATR := %% "and" "array" "case" "const" "div" "do" "downto" "else" "file" "for" "function" "goto" "if" "in" "label" "mod" "nil" "not" "of" "or" "packed" "procedure" {ITS(Tok_Pr); "record" "repeat" "set" "then" "to" "type" "until" "while" "with" "program" "integer" "begin" "end" "var" "read" "write" {FIM {DELIM_VIR {ITS(Tok_Dlv ); {DELIM_DP {ITS(Tok_Dlp ); {DELIM_AP {ITS(Tok_Dla ); {DELIM_FP {ITS(Tok_Dlf ); {ITS(Tok_Pr); {ITS(Tok_Pr); {ITS(Tok_Pr); {ITS(Tok_Pr); {ITS(Tok_Pr); {ITS(Tok_Prog); {ITS(Tok_Int); {ITS(Tok_Begin); {ITS(Tok_End); {ITS(Tok_Var); {ITS(Tok_Func); {ITS(Tok_Fim); {DELIM_PV {ITS(Tok_Dlpv); {ATR {ITS(Tok_Atr); [+ -]*{DIGITO+ {strcpy(gultnumero,yytext);its(tok_num); {ID {strcpy(gultimotermo,yytext);verificaid;/*its(tok_iden);*/ {OPER {strcpy(gultoper,yytext);its(tok_op); {ESPACO {/*Não faz nada*/ \n {linhas++;doreset=1;. {printf( "Caracter desconhecido: %s\n", yytext ); %%

17 7. Analisador Sintático 7.1. Ferramenta A ferramenta utilizada para gerar o analisador sintático foi o BISON. BISON é uma ferramenta construtora de analisadores sintáticos. O bison transforma um arquivo de especificações sintáticas em um analisador (um programa). Abaixo, segue a gramática do compilador em formato BNF (Backus-Naur Form), que é a utilizada pelo Bison Estrutura do arquivo de descrição Todo arquivo de descrição do Bison possui três seções separadas por uma linha com apenas os caracteres %% colocados em seu início, como esquematicamente ilustrado a seguir: DEFINIÇÕES %% REGRAS %% CÓDIGO Seção DEFINIÇÕES Como esperado a seção DEFINIÇÔES possui definições sintáticas. Toda definição sintática tem a forma: definição nome Como nome devemos usar uma palavra, iniciada por letra ou underscore ('_') seguida de uma ou mais letras, dígitos, underscore ou traços ('-'), essa palavra pode ser o início da recursão sintática ou um vocábulo identificado no analisador léxico. A definição pode ser %token ou %start. Devo realçar que os arquivos do Flex e bison precisam ser ligados. Na seção do código estará como fazer isso. A seção DEFINIÇÕES pode ainda conter a declaração e inicialização de variáveis globais que poderão ser utilizadas nas ações e no código fornecido pelo programador Seção REGRAS A seção REGRAS possui por sua vez as regras do analisador sintático a ser construído. Esta seção sempre possui regras. Uma regra tem sempre a forma:

18 programa : combinação /*Vazio*/ ; O programa deve começar na primeira coluna do texto e corresponde ao laço inicial ou um laço recursivo. A ação deve sempre ser iniciada na mesma linha e usualmente corresponde a um laço ou a um vocábulo reconhecido na seção DEFINIÇÕES. Tanto na seção de DEFINIÇÕES como de REGRAS qualquer texto identado ou entre %{e % é copiado literalmente para a saída (sem os caracteres %{e %). Para o reconhecimento dos caracteres {, e % estes devem aparecer não identados como padrões em separado. Em adição, apenas na seção de DEFINIÇÕES, qualquer texto não identado é copiado literalmente para a saída. Sob certos aspectos os caracteres %% indicam o início e o fim da seção REGRAS Seção CÓDIGO A última seção, CÓDIGO, contém todo o código C definido e fornecido pelo programador. Nesta seção usualmente temos declarada uma função main(), que define o início do programa. Outras funções, utilizadas nas ações definidas pelas regras, podem ser colocadas aqui, como yyparse() e yyerror() com destaque para a yyerror que está apresentada logo abaixo. Esta seção também pode permanecer vazia, ou seja, sem código definido pelo programador. int yyerror () { result++; if(result) printf ("\nerro na linha (%d): %s\n", linhas, linebuf); return 1; 7.2. Código O analisador sintático em nosso trabalho está implementado no arquivo AS.y.

19 #include <malloc.h> #include "hash.h" extern int poslastprog; int doreset = 1; char linebuf[1024]; int linhas = 1; int result = 0; int func=0; // Minhas Variaveis int passo=1, LC=0,ninst=0; #define ITS(x) if (doreset) { \ return (int)x; linebuf[0] = 0; \ doreset = 0; \ \ else { strcat(linebuf," "); \ strcat(linebuf, yytext); \ if ((x) == Tok_Fl) \ doreset = 1; \ #if 0 #define ITS(x) fprintf(listff, "[]%s", yytext); return((int)(x)) #define ITS(x) return((int)(x)) #endif #define INTEGER 1 #define STRING 2 #include "AL.c" #include "TabVar.h" #include "TabProg.h" #include "executor.h" #include "TabPrimitiva.h" #include "semantica.h" #include "menu.h" % %token Tok_Pr %token Tok_Prog %token Tok_Int %token Tok_Begin %token Tok_End %token Tok_Var %token Tok_Func %token Tok_Dlv %token Tok_Dlp %token Tok_Dla %token Tok_Dlf %token Tok_Dlpv %token Tok_Atr %token Tok_Fim

20 %token Tok_Num %token Tok_Iden %token Tok_Op %token Tok_Fl %token Tok_Fp %token Tok_Variavel %start programa %% programa : Tok_Prog Tok_Iden {a90(gultimotermo); Tok_Dlpv Defvar Corpo Tok_Fim /*Vazio*/ ; Defvar : Tok_Var DeclaracaoVariaveis /*vazio*/ ; DeclaracaoVariaveis: Tok_Iden{a10(gUltimoTermo); Tok_Dlv DeclaracaoVariaveis FimDeclaracao ; FimDeclaracao: Tok_Iden {a10(gultimotermo);tok_dlp Tok_Int{a20(INTEGER);gTipoTermo='i'; Tok_Dlpv ; Corpo: Tok_Begin Bloco Tok_End; Bloco: Atribuicao Bloco Funcao Bloco /*vazio*/ ; Atribuicao: Tok_Variavel{ Variavel *var; gtipotermo='v'; strcpy(gultimotermo,gultvariavel); var=consulta_var(programa->tabvarprog,gultimotermo); gnumero=var->termo.valor=0; Tok_Atr {a70(":=", gultvariavel, 'o'); Expr Tok_Dlpv {a80(); ; Funcao: Tok_Fp {Lctermos=a40(Lctermos,gUltimoTermo,TabFP); a71(gultfuncao, 'f'); noatual = nofunc; Tok_Dla Termos Tok_Dlf {if ((Lctermos->valor)== 0) {Lctermos=pop(Lctermos);else/*if (a60(lctermos))*/ {printf("nmero de parametros invalido:");yyerror();exit(0);tok_dlpv {a80();;

21 Funcao: Tok_Fp {Lctermos=a40(Lctermos,gUltimoTermo,TabFP); a71(gultfuncao, 'f'); noatual = nofunc; Tok_Dla Termos Tok_Dlf {if ((Lctermos->valor)== 0) {Lctermos=pop(Lctermos);else {printf("numero de parâmetros inválido:");yyerror();exit(0);tok_dlpv {a80(); ; Termos: Termo {a50(lctermos); if(gtipotermo!= 'f') a71(gultimotermo, gtipotermo);tok_dlv Termos Termo {a50(lctermos); if(gtipotermo!= 'f') a71(gultimotermo, gtipotermo); ; Termo : Tok_Fp{Lctermos=a40(Lctermos,gUltimoTermo,TabFP); gtipotermo='f'; a71(gultfuncao, gtipotermo); Tok_Dla Termos Tok_Dlf{if ((Lctermos->valor)== 0) {Lctermos=pop(Lctermos);else{printf("Numero de parametros invalido:");yyerror();exit(0); Tok_Variavel{ Variavel *var; gtipotermo='v'; strcpy(gultimotermo,gultvariavel); /*Obtem a variï ½el na Tab de Simbolos*/ var=consulta_var(programa->tabvarprog,gultimotermo); gnumero=var->termo.valor=0; Tok_Num {gtipotermo='i';strcpy(gultimotermo,gultnumero);gnumero=atoi(gultnumero) ; ; Expr : Termo Termo Tok_Op{a70(gUltOper, gultimotermo, 'o'); Expr ; %%

22 { int main() FILE *arq; char nomearq[256]; int opcao; Programa *progexecutar; inittabfp(); iniciafp(tabfp,"funcprim.txt"); do { menu(); scanf("%d",&opcao); switch (opcao){ case 1: system("ls *.pas"); printf("\n"); printf("digite o arquivo a ser compilado\n"); scanf("%s",nomearq); arq = fopen(nomearq,"r"); if (arq == NULL){ printf("o arquivo %s nao pode ser aberto para leitura\n",nomearq); else{ initstack(); programa=inittabprog(programa); noatual=nofunc=noaux=null; linhas=0; result=0; yyin=arq; yyrestart(yyin); yyparse(); if (!result){ if (programa!= NULL){ insereprograma(programa); printf("programa %s analisado com sucesso\n", programa->nome); fclose(yyin); break;

23 case 2: if (poslastprog!= 0){ imprimelistprograma(); printf("digite o programa a ser executado\n"); scanf("%s",nomearq); progexecutar = getprograma(nomearq); compilado\n",nomearq); if (progexecutar == NULL) { printf("programa %s nao else { printf("executando %s\n",progexecutar->nome); executa(progexecutar); else { break; printf("nenhum programa compilado\n"); while (opcao!= 0); return 0; #include <stdio.h> int yyerror () { result++; if(result) printf ("\nerro na linha (%d): %s\n", linhas, linebuf); return 1; 8. Analisador de Contexto O analisador de contexto realiza ações semântica, que não podem ser realizadas pelo analisador léxico, para verificar a validade do programa. Por exemplo, uma das tarefas do analisador de contexto é verificar se o número de argumentos de uma primitiva está correto. Para pode fazer esse tipo de verificação, ele precisa ter acesso à tabela de funções primitivas. Mas a principal tarefa do analisador de contexto nesse projeto é verificar se um identificador, que pode ser uma variável, uma função ou um identificador normal, está na posição correta. Abaixo estão os códigos e as ações associadas. Essas ações estão nos arquivos semantica.c, semantica.h, TabVar.c e TabVar.h.

24 /* Ações Semânticas*/ /* Nome Ação: a10 Ação:Armazena as variáveis que estão sendo declaradas em um Stack (Lista encadeada) */ void a10(char *nomevar){ Variavel* var; Variavel*aux=Stack_Var; var=newvar(nomevar); if (aux==null){ Stack_Var=var; else{ while (aux->next!= NULL) aux=aux->next; aux->next= var; /* Acao : a20 Funcao: Insere na Tabela de Variáveis definindo o seu tipo */ void a20(int tipo){ int posic; Variavel *aux; while (Stack_Var!=NULL){ aux=stack_var; Stack_Var=aux->next; posic=hash(aux->palavra); aux->tipo=tipo; aux->termo.tipo=tipo; inserevariavel(programa->tabvarprog,aux,posic); /* a30: Verifica a variável já foi declarada antes de uma atribuição */ int a30(char *item){ return consulta(programa->tabvarprog,item);

25 ctermo *newtermo(int aridade){ ctermo *ct=(ctermo*)malloc(sizeof(ctermo)); ct->valor=aridade; ct->prox=null; return ct; ctermo * push(ctermo *ct,ctermo* p){ if (p) ct->prox=p; p=ct; return p; ctermo* pop (ctermo *p){ ctermo *aux=null; if (p){ aux=p; p=p->prox; free(aux); return p; void dec (ctermo *p){ p->valor--; ctermo *a40 (ctermo *p,char *fprim,funcprim* TabFP[]){ ctermo *ct=newtermo(consultaaridade(tabfp,fprim)); return (push(ct,lctermos)); void a50 (ctermo *p){ return dec(p); int a60(ctermo *p){ if (p->valor == 0){ p=pop(p); return 0; else{ printf("numero de parametros invalido:"); return (p->valor);

26 9. Gerador de Código O gerador de código constrói a árvore de execução do programa lido. A árvore de execução é uma estrutura de nós alocados dinamicamente e ligados através de ponteiros. As ligações dos nós determinam em que ordem às instruções é executada. Ao gerar a árvore de execução, o gerador de código armazena-a em memória. Mais tarde, o ambiente de execução poderá executar aquele código compilado. Abaixo estarei apresentando um código aceito pela linguagem, e sua respectiva árvore de execução. program T1; var A,B,C,D,E: integer; begin end. C:=10 + max(12, 30); leia (B); leia (E); D:=max (B, E); imprima (D); Abaixo, árvore de execução do programa acima. Essa árvore é formada pelas regras a70() a90(). Essas regras também estão apresentadas logo abaixo. Essas ações estão no arquivo TabProg.c e TabProg.h.

27 Árvore de Execução Início do Programa Fim do programa = o 0 leia f 0... C v 0 + o 0 B v 0 10 n 10 max f 0 12 n n 12

28 /* Nome Acao: a70 Acao:Inicia uma folha da arvore de execução. */ void a70(char* nome, char* nometermo, char tipo){ if(noatual == NULL){ noatual = newno(nome, tipo, 0); noatual->esq = newno(nometermo, gtipotermo, gnumero); noaux = noatual; else{ No *aux; aux = newno(nome, tipo, 0); noaux->dir = aux; noaux = aux; if(nofunc == NULL) aux->esq = newno(nometermo, gtipotermo, gnumero); else aux->esq = nofunc; nofunc = NULL; /* Nome Acao: a71 Acao:Inicia uma folha da arvore de execução. */ void a71(char* nome, char tipo){ if(nofunc == NULL) nofunc = newno(nome, tipo, 0); else{ No *aux1; aux1 = nofunc; while(aux1->esq!= NULL) aux1 = aux1->esq; aux1->esq=newno(nome, tipo, gnumero);

29 /* Ação: a80 Funcao: Insere a ultima folha na arvore de execução. */ void a80(){ if(programa->fst == NULL) programa->fst = programa->lst = noatual; else{ programa->lst->prox = noatual; programa->lst = noatual; if(programa->lst->tipo == 'o'){ if(nofunc == NULL){ No *aux; if(gtipotermo == 'i') aux = newno("numero", 'n', gnumero); else aux = newno(gultvariavel, 'v', 0); noaux->dir = aux; noaux = aux; else { noaux->dir = nofunc; nofunc = NULL; // Reseta a declaração atual. noatual = NULL; nofunc = NULL; flag = 0; /* a90: Insere o nome do programa. */ void a90(char *nome){ strcpy(programa->nome, nome); programa->fst = programa->lst = NULL;

30 10. Executor de Código O executor de código é um interpretador de árvore de execução formada pelo gerador de código. Ele navega pela árvore e executa os comandos que foram compilados a partir do código do usuário. Abaixo estará sendo apresentado o código de execução utilizado. #ifndef executor_h #define executor_h #include "TabProg.h" #include "TabVar.h" #include "TabPrimitiva.h" void executa(programa *); int resolvevalor(no *,Programa *); int resolvefuncao(no *,Programa *); int max(int, int); int leia(int *); int imprime(int); int retornavalor(no *,Programa *); #endif #include <malloc.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include "executor.h" void executa(programa *programa){ No *executor, *folhaatual; executor = programa->fst; while (executor!= NULL){ Variavel *var; folhaatual = executor; var = consulta_var(programa->tabvarprog, folhaatual->esq- >nome); var->termo.valor = resolvevalor(folhaatual->dir,programa); imprime(var->termo.valor); executor = folhaatual->prox;

31 // Função que resolve o valor de uma atribuicao. int resolvevalor(no *no,programa *programa){ int v=0; if(no!= NULL){ switch(no->tipo){ case('o'):{ if(no->esq->tipo == 'v'){ Variavel *aux; aux = consulta_var(programa->tabvarprog, no->esq-nome); v = aux->termo.valor; else if(no->esq->tipo == 'f') resolvefuncao(no->esq,programa); else v = no->esq->valor; if(strcmp(no->nome,"+") == 0) v += resolvevalor(no->dir,programa); else if (strcmp(no->nome,"-") == 0) v -= resolvevalor(no->dir,programa); else if (strcmp(no->nome,"*") == 0) v *= resolvevalor(no->dir,programa); else v /= resolvevalor(no->dir,programa); return v; case('n'):{ return no->valor; break; case('v'):{ Variavel *aux; case('f'):{ case('p'):{ else return 0; aux = consulta_var(programa->tabvarprog, no->nome); return aux->termo.valor; break; return resolvefuncao(no,programa); return resolveprec(no->dir,programa); break; break;

32 int resolvefuncao(no *no,programa *programa){ No *aux = no; int aridade = consultaaridade(tabfp, no->nome); if(strcmp(no->nome, "max") == 0){ return max(retornavalor(no->esq,programa), retornavalor(no->esq->esq,programa)); if (strcmp(no->nome, "leia") == 0) { Variavel *var = consulta_var(programa->tabvarprog, no->esq->nome); return leia(&var->termo.valor); if (strcmp(no->nome, "imprima") == 0){ return imprime(retornavalor((no->esq),programa));

33 case('n'):{ return no->valor; break; case('v'):{ Variavel *aux; aux = consulta_var(programa->tabvarprog, no->nome); return aux->termo.valor; break; case('f'):{ return resolvefuncao(no,programa); break; else return 0; int max(int a, int b){ if(a>b) return a; else return b; int leia(int *a){ scanf("%d", a); return 1; int imprime(int a){ printf("%d\n", a); return 1; int retornavalor(no *no,programa *programa){ if(no->tipo == 'v'){ Variavel *aux; aux = consulta_var(programa->tabvarprog, no->nome); return aux->termo.valor; else return no->valor;

34 11. Exemplos de programas Abaixo estaremos apresentando exemplos que são permitidos na linguagem. abaixo: program T2; var A,B,C,D,E: integer; begin C:=10; D:= C* 20; imprima (D); end. program T3; var A,B,C,D,E: integer; begin leia(a); leia(b); C:= 10 * A + B; D:= C* 20; imprima (D); end. 12. Ambiente de Execução Menu Estaremos apresentado o código responsável pelo Menu. Neste menu você pode compilar e executar programas do diretório em que o executável está inserido. Para facilitar, ao escolher a opção de compilar ou executar, ele apresenta a lista de possíveis candidatos.

35 #ifndef menu_h #define menu_h #include "TabProg.h" void menu(); void imprimelistprograma(); #endif #include <stdio.h> #include "menu.h" extern int poslastprog; void menu() { printf("menu:\n"); printf("1- Compilar\n"); printf("2- Executar\n"); printf("\n"); printf("0- Sair\n"); void imprimelistprograma() { int i; printf("programas que podem ser executados:\n"); for (i=0;i<poslastprog;i++) printf("%s\t",&listprograma[i]->nome); printf("\n");

36 Abaixo, apresentamos os Layouts do menu: Menu

37 Compilando prog02.pas

38 Executando prog01.pas

39 Executando prog02.pas

40 13. MakeFile Abaixo está o código do Makefile, para executar basta abrir um terminal e compilar: [...] # make Para executar: [...] #./AS all: AL.c AS AL.c: AL.l flex -i -oal.c AL.l AS: AS.c hash.c TabVar.c TabPrimitiva.c semantica.c TabProg.c executor.c menu.c gcc -o AS AS.c hash.c TabVar.c TabPrimitiva.c semantica.c TabProg.c executor.c menu.c -lfl -lm AS.c: AS.y bison -t -d -v -oas.c AS.y clean: rm -f AL.c *.o AL rm -f AS.c *.o AS.h *.output AS

Linguagem de programação: Pascal

Linguagem de programação: Pascal Aula 04 Linguagem de programação: Pascal Prof. Tecgº Flávio Murilo 26/03/2013 1 Pascal Introdução Pascal é uma linguagem de programação estruturada, criada em 1970 pelo suíço Niklaus Wirth, dando este

Leia mais

#include <stdio.h> Void main() { printf( Cheguei!\n"); } INTRODUÇÃO A LINGUAGEM C

#include <stdio.h> Void main() { printf( Cheguei!\n); } INTRODUÇÃO A LINGUAGEM C #include Void main() { printf( Cheguei!\n"); } INTRODUÇÃO A LINGUAGEM C ANTES DO C ERA A LINGUAGEM B B foi essencialmente uma simplificação da linguagem BCPL. B só tinha um tipo de dado, que

Leia mais

Anhanguera Educacional S.A. Centro Universitário Ibero-Americano

Anhanguera Educacional S.A. Centro Universitário Ibero-Americano O C++ foi inicialmente desenvolvido por Bjarne Stroustrup durante a década de 1980 com o objetivo de melhorar a linguagem de programação C, mantendo a compatibilidade com esta linguagem. Exemplos de Aplicações

Leia mais

Linguagem C Princípios Básicos (parte 1)

Linguagem C Princípios Básicos (parte 1) Linguagem C Princípios Básicos (parte 1) Objetivos O principal objetivo deste artigo é explicar alguns conceitos fundamentais de programação em C. No final será implementado um programa envolvendo todos

Leia mais

Introdução à Programação

Introdução à Programação Introdução à Programação Linguagens de Programação: sintaxe e semântica de linguagens de programação e conceitos de linguagens interpretadas e compiladas Engenharia da Computação Professor: Críston Pereira

Leia mais

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

Universidade Federal de Goiás Bacharelado em Ciências da Computacão Compiladores Universidade Federal de Goiás Bacharelado em Ciências da Computacão Compiladores 2013-2 Compilador para a Linguagem Cafezinho Especificação dos trabalhos: T2 (Geração da Representação Intermediária e Análise

Leia mais

Dicas para implementação do Trabalho 6

Dicas para implementação do Trabalho 6 Dicas para implementação do Trabalho 6 1 Passo a passo para implementação do trabalho 1 Faça um exemplo que contemple todos os possíveis comandos que sua linguagem aceita. Um possível exemplo, faltando

Leia mais

Pascal. -Cabeçalho do programa. - label - const - type - var - procedure - function. - integer - real - byte - boolean - char - string

Pascal. -Cabeçalho do programa. - label - const - type - var - procedure - function. - integer - real - byte - boolean - char - string Pascal -Cabeçalho do programa Áreas do programa -Área de declarações -Corpo do programa - label - const - type - var - procedure - function - integer - real - byte - boolean - char - string Program

Leia mais

Linguagem de Programação C

Linguagem de Programação C Linguagem de Programação C Aula 08 Diogo Pinheiro Fernandes Pedrosa Universidade Federal Rural do Semiárido Departamento de Ciências Exatas e Naturais 13 de novembro de 2009 Introdução O que é uma linguagem

Leia mais

Programação: Vetores

Programação: Vetores Programação de Computadores I Aula 09 Programação: Vetores José Romildo Malaquias Departamento de Computação Universidade Federal de Ouro Preto 2011-1 1/62 Motivação Problema Faça um programa que leia

Leia mais

Introdução à Programação. Introdução a Linguagem C. Prof. José Honorato F. Nunes

Introdução à Programação. Introdução a Linguagem C. Prof. José Honorato F. Nunes Introdução à Programação Introdução a Linguagem C Prof. José Honorato F. Nunes honorato.nunes@ifbaiano.bonfim.edu.br Resumo da aula Introdução Variáveis Tipos de dados Operadores e Expressões: Operadores

Leia mais

Introdução à Linguagem C

Introdução à Linguagem C Engenharia de CONTROLE e AUTOMAÇÃO Introdução à Linguagem C Aula 02 DPEE 1038 Estrutura de Dados para Automação Curso de Engenharia de Controle e Automação Universidade Federal de Santa Maria beltrame@mail.ufsm.br

Leia mais

Compiladores. Bruno Lopes. Bruno Lopes Compiladores 1 / 30. Instituto de C

Compiladores. Bruno Lopes. Bruno Lopes Compiladores 1 / 30. Instituto de C ompiladores Análise Sintática Bruno Lopes Bruno Lopes ompiladores 1 / 30 Front-end Lida com a linguagem de entrada Teste de pertinência: código fonte linguagem fonte? Programa está bem formado? Sintaticamente?

Leia mais

Análise Semântica: Verificação de Tipos

Análise Semântica: Verificação de Tipos Análise Semântica: Verificação de Tipos Introdução Verifica se as construções sintaticamente corretas possuem significado lógico dentro da linguagem Verifica a consistência da declaração e uso dos identificadores

Leia mais

Linguagem Pascal. Prof. Antonio Almeida de Barros Junior

Linguagem Pascal. Prof. Antonio Almeida de Barros Junior Linguagem Pascal Prof. Antonio Almeida de Barros Junior 1 Linguagem Pascal Criada para ser uma ferramenta educacional (Década de 70); Prof. Niklaus Wirth (Universidade de Zurique); Blaise Pascal (Matemático

Leia mais

Algoritmos e Introdução à Programação. Lógica e Linguagem de Programação

Algoritmos e Introdução à Programação. Lógica e Linguagem de Programação Algoritmos e Introdução à Programação Lógica e Linguagem de Programação Prof. José Honorato Ferreira Nunes honoratonunes@softwarelivre.org http://softwarelivre.org/zenorato/honoratonunes Linguagem C Prof.

Leia mais

Linguagens de Programação Conceitos e Técnicas. Amarrações

Linguagens de Programação Conceitos e Técnicas. Amarrações Linguagens de Programação Conceitos e Técnicas Amarrações Conceituação Amarração (ou binding) é uma associação entre entidades de programação, tais como entre uma variável e seu valor ou entre um identificador

Leia mais

Introdução à Ciência da Computação

Introdução à Ciência da Computação Introdução à Ciência da Computação Variáveis Conceitos Básicos Variáveis x Constantes a = x + 5 a, x e 5 são variáveis ou constantes? Variáveis As variáveis são recipientes de valores É um espaço reservado

Leia mais

Alocação de Memória. Lucas Ferrari de Oliveira Professor Adjunto Universidade Federal do Paraná (UFPR)

Alocação de Memória. Lucas Ferrari de Oliveira Professor Adjunto Universidade Federal do Paraná (UFPR) Alocação de Memória Linguagem de Programação Estruturada 1 Alocação dinâmica e ponteiros Lucas Ferrari de Oliveira Professor Adjunto Universidade Federal do Paraná (UFPR) Sumario Introdução Alocação Estática

Leia mais

Gilberto A. S. Segundo. 24 de agosto de 2011

Gilberto A. S. Segundo. 24 de agosto de 2011 Exercícios - Alocação Dinâmica Gilberto A. S. Segundo Programação Aplicada de Computadores Engenharia Elétrica Universidade Federal do Espírito Santo - UFES 24 de agosto de 2011 1 / 23 Grupo de e-mail

Leia mais

CAP. VI ANÁLISE SEMÂNTICA

CAP. VI ANÁLISE SEMÂNTICA CAP. VI ANÁLISE SEMÂNTICA VI.1 Introdução Semântica SIGNIFICADO, SENTIDO LÓGICO, COERÊNCIA,... Diferença entre SINTAXE e SEMÂNTICA Sintaxe : descreve as estruturas de uma linguagem; Semântica : descreve

Leia mais

Legibilidade do código fonte

Legibilidade do código fonte Sumário Legibilidade do código fonte Exemplos Normas Instrução switch Sintaxe e Semântica Exemplo Tipos enumerados Exemplo Programação 2007/2008 DEEC-IST 1 Legibilidade do código fonte Exemplo: Considere

Leia mais

Linguagem Pascal. Prof. Sérgio Rodrigues. É a descrição, de forma lógica, dos passos a serem executados no cumprimento de determinada tarefa;

Linguagem Pascal. Prof. Sérgio Rodrigues. É a descrição, de forma lógica, dos passos a serem executados no cumprimento de determinada tarefa; Linguagem Pascal Prof. Sérgio Rodrigues Introdução Algoritmo É a descrição, de forma lógica, dos passos a serem executados no cumprimento de determinada tarefa; Programa é a formalização de um algoritmo

Leia mais

Compiladores Prof. a Mariella Berger. Trabalho 1 Analisador Léxico

Compiladores Prof. a Mariella Berger. Trabalho 1 Analisador Léxico Compiladores Prof. a Mariella Berger Trabalho 1 Analisador Léxico 1. Objetivo O objetivo deste trabalho é a criação de um analisador léxico que será utilizado por um interpretador da linguagem Pascalzinho.

Leia mais

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

Computação L2. Linguagem C++ Observação: Material Baseado na Disciplina Computação Eletrônica. Computação L2 Linguagem C++ ovsj@cin.ufpe.br Observação: Material Baseado na Disciplina Computação Eletrônica. Alfabeto São os símbolos ( caracteres ) permitidos na linguagem: Letras (maiúsculas e minúsculas);

Leia mais

Linguagem C Controle do Fluxo de Execução. Lógica de Programação

Linguagem C Controle do Fluxo de Execução. Lógica de Programação Linguagem C Controle do Fluxo de Execução Lógica de Programação Caro(a) aluno(a), Aqui começaremos a escrever os nossos primeiros programas em uma Linguagem de Programação. Divirta-se!!! Estrutura Seqüencial

Leia mais

ADTs (Abstract Data Types): Motivação

ADTs (Abstract Data Types): Motivação ADTs (Abstract Data Types): Motivação Mesmas estruturas são usadas com vários tipos de dados Listas Pilhas Amontoado FIFOs Inteiros Reais Strings Estruturas O procedimento para inserir um inteiro, real,

Leia mais

Guia Rápido: GCC, Makefile e Valgrind.

Guia Rápido: GCC, Makefile e Valgrind. Guia Rápido: GCC, Makefile e Valgrind. Alexandro Ramos 10 de setembro de 2015 1 Sumário 1 Introdução 3 2 GCC 3 2.1 Outros parâmetros úteis no GCC....................... 4 3 Makefiles 6 3.1 Makefile 1....................................

Leia mais

Universidade Estadual da Paraíba - UEPB Curso de Licenciatura em Computação

Universidade Estadual da Paraíba - UEPB Curso de Licenciatura em Computação Universidade Estadual da Paraíba - UEPB Curso de Licenciatura em Computação Análise Semântica Disciplina: Compiladores Equipe: Luiz Carlos dos Anjos Filho José Ferreira Júnior Compiladores Um compilador

Leia mais

Controlo de Execução. K&R: Capitulo 3

Controlo de Execução. K&R: Capitulo 3 Controlo de Execução K&R: Capitulo 3 IAED, 2009/2010 Controlo de Execução Instruções e Blocos if else-if switch Ciclos: Instruçõeswhile e for Instruçãodo-while break e continue goto e labels 2 IAED, 2009/2010

Leia mais

Hello World. Linguagem C. Tipos de Dados. Palavras Reservadas. Operadores Aritméticos. Pré e pós incremento e pré e pós decremento

Hello World. Linguagem C. Tipos de Dados. Palavras Reservadas. Operadores Aritméticos. Pré e pós incremento e pré e pós decremento Hello World Linguagem C printf("hello world!\n"); main é a função principal, a execução do programa começa por ela printf é uma função usada para enviar dados para o vídeo Palavras Reservadas auto double

Leia mais

Lógica de Programação I

Lógica de Programação I Gilson de Souza Carvalho gaucho.gilson@hotmail.com 1 Comando Switch O comando Switch pode ser visto como uma especialização do comando if. Foi criado para facilitar um uso particular de comandos if encadeados.

Leia mais

5 - COMANDOS DE CONTROLE DE PROGRAMA Em C existem os comandos de decisões, os comandos de iteração (ou de laços) e os comandos de desvios.

5 - COMANDOS DE CONTROLE DE PROGRAMA Em C existem os comandos de decisões, os comandos de iteração (ou de laços) e os comandos de desvios. 3636363636363636363636363636363636363636363636363636 5 - COMANDOS DE CONTROLE DE PROGRAMA Em C existem os comandos de decisões, os comandos de iteração (ou de laços) e os comandos de desvios. 5.1 - Comandos

Leia mais

Trabalho Linguagem e Programação de Compiladores

Trabalho Linguagem e Programação de Compiladores Trabalho Linguagem e Programação de Compiladores Responda as questões. Os exercícios deverão ser desenvolvidos utilizando as estruturas apresentadas em aula e adequadas para cada problema. Forma de entrega:

Leia mais

Métodos Computacionais

Métodos Computacionais Métodos Computacionais Objetivos da Disciplina e Introdução a Linguagem C Construções Básicas Objetivos da Disciplina Objetivo Geral Discutir técnicas de programação e estruturação de dados para o desenvolvimento

Leia mais

Estruturas da linguagem C. 1. Identificadores, tipos primitivos, variáveis e constantes, operadores e expressões.

Estruturas da linguagem C. 1. Identificadores, tipos primitivos, variáveis e constantes, operadores e expressões. 1 Estruturas da linguagem C 1. Identificadores, tipos primitivos, variáveis e constantes, operadores e expressões. Identificadores Os identificadores seguem a duas regras: 1. Devem ser começados por letras

Leia mais

Unidade VI. Técnicas de Teste de Software Teste Estrutural. Profa. Dra. Sandra Fabbri

Unidade VI. Técnicas de Teste de Software Teste Estrutural. Profa. Dra. Sandra Fabbri Unidade VI Técnicas de Teste de Software Profa. Dra. Sandra Fabbri Os requisitos de teste são extraídos de uma implementação em particular Teste dos detalhes procedimentais A maioria dos critérios dessa

Leia mais

%LEOLRWHFDV(VWiWLFDVH'LQkPLFDV

%LEOLRWHFDV(VWiWLFDVH'LQkPLFDV 38& 81,; Prof. Renato Mauro Carlos Henrique Pereira de Oliveira kkrj@terra.com.br 16 de setembro de 2002 %LEOLRWHFDV(VWiWLFDVH'LQkPLFDV %LEOLRWHFDV Biblioteca é um recurso de programação que trás vantagens

Leia mais

Como construir um compilador utilizando ferramentas Java

Como construir um compilador utilizando ferramentas Java Como construir um compilador utilizando ferramentas Java p. 1/2 Como construir um compilador utilizando ferramentas Java Aula 1 - Introdução Prof. Márcio Delamaro delamaro@icmc.usp.br Como construir um

Leia mais

Linguagem C: diretivas, compilação separada. Prof. Críston Algoritmos e Programação

Linguagem C: diretivas, compilação separada. Prof. Críston Algoritmos e Programação Linguagem C: diretivas, compilação separada Prof. Críston Algoritmos e Programação Diretivas do pré processador Permite que o programador modifique a compilação O pré processador é um programa que examina

Leia mais

Estruturas de Dados. Introdução Definição de Ponteiros Declaração de Ponteiros em C Manipulação de Ponteiros em C

Estruturas de Dados. Introdução Definição de Ponteiros Declaração de Ponteiros em C Manipulação de Ponteiros em C Estruturas de Dados Revisão de Ponteiros Prof. Ricardo J. G. B. Campello Sumário Introdução Definição de Ponteiros Declaração de Ponteiros em C Manipulação de Ponteiros em C Operações Ponteiros e Arranjos

Leia mais

Programação. MEAer e LEE. Bertinho Andrade da Costa. Instituto Superior Técnico. Argumentos da linha de comando Funções recursivas

Programação. MEAer e LEE. Bertinho Andrade da Costa. Instituto Superior Técnico. Argumentos da linha de comando Funções recursivas Programação MEAer e LEE Bertinho Andrade da Costa 2010/2011 1º Semestre Instituto Superior Técnico Argumentos da linha de comando Funções recursivas Programação 2010/2011 DEEC-IST Arg. da linha de comando;

Leia mais

Funções em Linguagem C Parte II

Funções em Linguagem C Parte II Slides inicialmente preparados pelo Prof. Dr. Claudio Fabiano Motta Toledo Funções em Linguagem C Parte II Profa. Dra. Elisa Yumi Nakagawa 1. Semestre 2017 Sumário Introdução a Ponteiros Escopo de Variáveis

Leia mais

Descrição da Linguagem Pascal Jr.

Descrição da Linguagem Pascal Jr. Descrição da Linguagem Pascal Jr. Características gerais PascalJr possui convenções de tipos igual a linguagem Pascal PascalJr suporta definições de funções Com passagem de parâmetros por valor e por referência

Leia mais

Linguagens de Programação I

Linguagens de Programação I Linguagens de Programação I Tema # 4 Operadores em C Susana M Iglesias FUNÇÕES ENTRADA-SAÍDA I/O printf(), utilizada para enviar dados ao dispositivo de saída padrão (stdout), scanf(), utilizada para ler

Leia mais

MESMO QUE ESTAS VARIÁVEIS TENHAM NOME IDÊNTICOS

MESMO QUE ESTAS VARIÁVEIS TENHAM NOME IDÊNTICOS Funções As funções são blocos de instruções que facilitam o entendimento do código. Porque usar funções? Para permitir o reaproveitamento de código já construído (por você ou por outros programadores);

Leia mais

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

Classes o Objetos. Classes, objetos, métodos e variáveis de instância Classes o Objetos Um recurso comum de cada aplicativo feito até agora é que todas as instruções que realizavam tarefas localizavam-se no método main. Se você tornar parte de uma equipe de desenvolvimento

Leia mais

Sumário. Introdução à Ciência da Computação. Ponteiros em C. Introdução. Definição. Por quê ponteiros são importantes?

Sumário. Introdução à Ciência da Computação. Ponteiros em C. Introdução. Definição. Por quê ponteiros são importantes? Introdução à Ciência da Computação Ponteiros em C Prof. Ricardo J. G. B. Campello Sumário Introdução Definição de Ponteiros Declaração de Ponteiros em C Manipulação de Ponteiros em C Operações Ponteiros

Leia mais

Vetores. e o programa deverá ler os valores separadamente:

Vetores. e o programa deverá ler os valores separadamente: Vetores Vetor é um tipo de dado usado para representar uma certa quantidade de variáveis de valores homogêneos (do mesmo tipo). Imagine o seguinte problema: calcular a média das notas da prova de 5 alunos.

Leia mais

LÓGICA DE PROGRAMAÇÃO. PROFª. M.Sc. JULIANA H Q BENACCHIO

LÓGICA DE PROGRAMAÇÃO. PROFª. M.Sc. JULIANA H Q BENACCHIO LÓGICA DE PROGRAMAÇÃO PROFª. M.Sc. JULIANA H Q BENACCHIO Primeiro programa em C #include int main() { int num1, num2, result; scanf("%d",&num1); scanf("%d",&num2); result = num1 + num2; printf("%d",

Leia mais

Aula 5 Oficina de Programação Introdução ao C. Profa. Elaine Faria UFU

Aula 5 Oficina de Programação Introdução ao C. Profa. Elaine Faria UFU Aula 5 Oficina de Programação Introdução ao C Profa. Elaine Faria UFU - 2017 Linguagem de Programação Para que o computador consiga ler um programa e entender o que fazer, este programa deve ser escrito

Leia mais

Recuperação P1 de Estrutura de Dados

Recuperação P1 de Estrutura de Dados Recuperação P1 de Estrutura de Dados Sigla _IED001_ TURMA: A PERÍODO: MAT ( ) NOT ( ) DISCIPLINA:_Estrutura de Dados DATA: / / Argumente com fundamentando as questões da avaliação indicando porque a questão

Leia mais

Compiladores. Conceitos Básicos

Compiladores. Conceitos Básicos Compiladores Conceitos Básicos Processadores de Linguagem De forma simples, um compilador é um programa que recebe como entrada um programa em uma linguagem de programação a linguagem fonte e o traduz

Leia mais

LINGUAGEM C: FUNÇÕES FUNÇÃO 04/07/2017. Funções são blocos de código que podem ser nomeados e chamados de dentro de um programa.

LINGUAGEM C: FUNÇÕES FUNÇÃO 04/07/2017. Funções são blocos de código que podem ser nomeados e chamados de dentro de um programa. LINGUAGEM C: FUNÇÕES Prof. André Backes FUNÇÃO Funções são blocos de código que podem ser nomeados e chamados de dentro de um programa. printf(): função que escreve na tela scanf(): função que lê o teclado

Leia mais

1ª versão. #include <stdio.h> #include <string.h> #include <stdlib.h> #define maxdiscos 1000

1ª versão. #include <stdio.h> #include <string.h> #include <stdlib.h> #define maxdiscos 1000 #include #include #include #define maxdiscos 1000 typedef struct { char nomeautor[80]; char nomedisco[100]; int numdiscosvendidos; DISCO; 1ª versão int main() { DISCO listadiscos[maxdiscos];

Leia mais

Estruturas de Dados. Módulo 15 - Arquivos. 2/6/2005 (c) Dept. Informática - PUC-Rio 1

Estruturas de Dados. Módulo 15 - Arquivos. 2/6/2005 (c) Dept. Informática - PUC-Rio 1 Estruturas de Dados Módulo 15 - Arquivos 2/6/2005 (c) Dept. Informática - PUC-Rio 1 Referências Waldemar Celes, Renato Cerqueira, José Lucas Rangel, Introdução a Estruturas de Dados, Editora Campus (2004)

Leia mais

Universidade Estadual Paulista Júlio de Mesquita Filho UNESP

Universidade Estadual Paulista Júlio de Mesquita Filho UNESP Introdução à Computação II AULA 16 BCC Noturno - EMA896115B Prof. Rafael Oliveira olivrap@gmail.com Universidade Estadual Paulista Júlio de Mesquita Filho UNESP Rio Claro 2014 (Sem 2) Estruturas de Dados

Leia mais

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

Introdução a classes e objetos. Prof. Marcelo Roberto Zorzan Prof a. Rachel Reis Introdução a classes e objetos Prof. Marcelo Roberto Zorzan Prof a. Rachel Reis Estruturas de Seleção if... else Operador condicional (? : ) switch Aula de Hoje Estruturas de Repetição: while/do... while/for

Leia mais

INTRODUÇÃO À LINGUAGEM C. Prof. Msc. Luis Filipe Alves Pereira 2015

INTRODUÇÃO À LINGUAGEM C. Prof. Msc. Luis Filipe Alves Pereira 2015 INTRODUÇÃO À LINGUAGEM C Prof. Msc. Luis Filipe Alves Pereira 2015 INTRODUÇÃO À LINGUAGEM C 02/23 INTRODUÇÃO Criada em 1972 na AT&T Bell Labs É uma das linguagens mais populares. Existem poucas arquiteturas

Leia mais

Ambiente de desenvolvimento

Ambiente de desenvolvimento Linguagem C Ambiente de desenvolvimento Um programa em C passa por seis fases até a execução: 1) Edição 2) Pré-processamento 3) Compilação 4) Linking 5) Carregamento 6) Execução Etapa 1: Criação do programa

Leia mais

Linguagens de Programação PROGRAMAÇÃO DE COMPUTADORES. Linguagem C. Linguagem C Estrutura Básica. Constante (literais) Linguagem C Primeiro Programa

Linguagens de Programação PROGRAMAÇÃO DE COMPUTADORES. Linguagem C. Linguagem C Estrutura Básica. Constante (literais) Linguagem C Primeiro Programa Linguagens de Programação PROGRAMAÇÃO DE COMPUTADORES Linguagem C - Introdução Linguagens de Máquina Representação numérica Difícil utilização e compreensão Específica para cada máquina Linguagens Simbólicas(Assembly)

Leia mais

Apresentação da ferramenta de programação. Comandos de entrada e saída. Prof. Alex Camargo

Apresentação da ferramenta de programação. Comandos de entrada e saída. Prof. Alex Camargo UNIVERSIDADE FEDERAL DO PAMPA CAMPUS BAGÉ ALGORITMOS E PROGRAMAÇÃO Apresentação da ferramenta de programação. Comandos de entrada e saída Prof. Alex Camargo alexcamargoweb@gmail.com Linguagem C A linguagem

Leia mais

Curso de Programação C em Ambientes Linux Aula 05

Curso de Programação C em Ambientes Linux Aula 05 Curso de Programação C em Ambientes Linux Aula 05 Centro de Engenharias da Mobilidade - UFSC Professores Gian Berkenbrock e Giovani Gracioli http://www.lisha.ufsc.br/c+language+course+resources Conteúdo

Leia mais

Métodos Computacionais. Listas Encadeadas

Métodos Computacionais. Listas Encadeadas Métodos Computacionais Listas Encadeadas Vetores Declaração de vetor implica na especificação de seu tamanho Não se pode aumentar ou diminuir tamanho Outra alternativa no uso de vetores é alocar dinamicamente

Leia mais

Introdução a Programação de Jogos

Introdução a Programação de Jogos Introdução a Programação de Jogos Aula 03 Introdução a Linguagem C Edirlei Soares de Lima Estrutura de um Programa C Inclusão de bibliotecas auxiliares: #include Definição

Leia mais

Linguagem C Ficheiros Compilação Separada

Linguagem C Ficheiros Compilação Separada Linguagem C Ficheiros Compilação Separada typedef definição de tipos Apontadores para estruturas Ficheiros na bibiloteca standard do C Compilação Separada Definição de novos tipos em C É possível definir

Leia mais

Universidade Estadual de Mato Grosso do Sul Ciência da Computação Algoritmos e Estruturas de Dados I (AED-I) Prof. Nilton

Universidade Estadual de Mato Grosso do Sul Ciência da Computação Algoritmos e Estruturas de Dados I (AED-I) Prof. Nilton Universidade Estadual de Mato Grosso do Sul Ciência da Computação Algoritmos e Estruturas de Dados I (AED-I) Prof. Nilton nilton@comp.uems.br Introdução A linguagem C foi inventada por Dennis Ritchie e

Leia mais

Estruturas de Dados. Módulo 4 Funções. 9/8/2005 (c) Dept. Informática - PUC-Rio 1

Estruturas de Dados. Módulo 4 Funções. 9/8/2005 (c) Dept. Informática - PUC-Rio 1 Estruturas de Dados Módulo 4 Funções 9/8/2005 (c) Dept. Informática - PUC-Rio 1 Referências Waldemar Celes, Renato Cerqueira, José Lucas Rangel, Introdução a Estruturas de Dados, Editora Campus (2004)

Leia mais

Regras de estilo para código fonte em C/C++

Regras de estilo para código fonte em C/C++ Regras de estilo para código fonte em C/C++ No processo de escrita de código fonte em uma linguagem de alto nível é interessante que o programador se preocupe não somente com a correção sintática e lógica

Leia mais

INF 1620 P3-29/06/04 Questão 1 Nome:

INF 1620 P3-29/06/04 Questão 1 Nome: INF 1620 P3-29/06/04 Questão 1 Considere um arquivo texto que descreve um conjunto de retângulos e círculos. Cada linha do arquivo contém a descrição de uma figura. O primeiro caractere da linha indica

Leia mais

Licenciatura em Engenharia Informática DEI/ISEP Linguagens de Programação 2006/07. Tópicos avançados

Licenciatura em Engenharia Informática DEI/ISEP Linguagens de Programação 2006/07. Tópicos avançados Licenciatura em Engenharia Informática DEI/ISEP Linguagens de Programação 2006/07 Tópicos avançados Este documento apresenta alguns métodos para a resolução de problemas, susceptíveis de ocorrer na resolução

Leia mais

COMPILAÇÃO. Ricardo José Cabeça de Souza

COMPILAÇÃO. Ricardo José Cabeça de Souza COMPILAÇÃO Ricardo José Cabeça de Souza www.ricardojcsouza.com.br Programas Código-fonte escrito em linguagem de programação de alto nível, ou seja, com um nível de abstração muito grande, mais próximo

Leia mais

Tipos Abstratos de Dados. Estrutura de Dados

Tipos Abstratos de Dados. Estrutura de Dados Tipos Abstratos de Dados Tipo Abstrato de Dados ou TAD Idéia principal: desvincular o tipo de dado (valores e operações) de sua implementação: O que o tipo faz e não como ele faz! Vantagens da desvinculação:

Leia mais

Estrutura de Programas e Tipos de Dados Simples

Estrutura de Programas e Tipos de Dados Simples SSC0101 - ICC1 Teórica Introdução à Ciência da Computação I Estrutura de Programas e Tipos de Dados Simples Prof. Vanderlei Bonato: vbonato@icmc.usp.br Prof. Claudio Fabiano Motta Toledo: claudio@icmc.usp.br

Leia mais

Curso de C. Introdução by Arnaldo V. Moura e Daniel F. Ferber 3/10/ :43 AM

Curso de C. Introdução by Arnaldo V. Moura e Daniel F. Ferber 3/10/ :43 AM Curso de C Introdução 1 Introdução Roteiro: Recordando Algoritmos Linguagem de Programação O computador Instruções de Máquina Níveis de Abstração Compilação 2 Algoritmos Recordando: Algoritmo: conjunto

Leia mais

Compiladores I Prof. Ricardo Santos (cap 1)

Compiladores I Prof. Ricardo Santos (cap 1) Compiladores I Prof. Ricardo Santos (cap 1) Compiladores Linguagens de programação são notações que permitem descrever como programas devem executar em uma máquina Mas, antes do programa executar, deve

Leia mais

Indexação e Busca. O objetivo deste trabalho é projetar e implementar um sistema de programas para indexação e busca em arquivos de texto.

Indexação e Busca. O objetivo deste trabalho é projetar e implementar um sistema de programas para indexação e busca em arquivos de texto. Universidade Federal do Espírito Santo Departamento de Informática Estruturas de Dados 2017/1 Profa. Claudine Badue Trabalho 2 1. Objetivo Indexação e Busca O objetivo deste trabalho é projetar e implementar

Leia mais

Linguagem C. Prof.ª Márcia Jani Cícero

Linguagem C. Prof.ª Márcia Jani Cícero Linguagem C Prof.ª Márcia Jani Cícero A estrutura Básica de um Programa em C Consiste em uma ou várias funções ou programas. main( ) // primeira função a ser executada // inicia a função // termina a função

Leia mais

Introdução à linguagem C++

Introdução à linguagem C++ Estrutura de Dados e Algoritmos e Programação e Computadores II Aula 2: Introdução à linguagem C++ Introdução à linguagem C++ Conceitos básicos: variáveis, tipos de dados, constantes, I/O, etc. Estruturas

Leia mais

Fundamentos de Programação. Linguagem C++ Introdução, identificadores, tipos de dados. Prof. Bruno E. G. Gomes IFRN

Fundamentos de Programação. Linguagem C++ Introdução, identificadores, tipos de dados. Prof. Bruno E. G. Gomes IFRN Fundamentos de Programação Linguagem C++ Introdução, identificadores, tipos de dados Prof. Bruno E. G. Gomes IFRN 1 Linguagem de Programação Constituída por símbolos e por regras para combinar esses símbolos

Leia mais

Métodos Computacionais em Física Noções Básicas de Linguag

Métodos Computacionais em Física Noções Básicas de Linguag Métodos Computacionais em Física Noções Básicas de Linguagem C Aula 2 Diretivas de preprocessamento Identificadores Tipos Variáveis e Aritmética Operadores e precedência Efeitos colaterais Laços: if, while

Leia mais

Linguagem C (repetição)

Linguagem C (repetição) Linguagem C (repetição) André Tavares da Silva andre.silva@udesc.br Exercício Escrever um programa que conte (mostre na tela) os números de 1 a 100. Comandos aprendidos até o momento: printf, scanf, getchar,

Leia mais

Fábio da Fontoura Beltrão Felipe Augusto Chies Lucas Fialho Zawacki Marcos Vinicius Cavinato Matheus de Carvalho Proença

Fábio da Fontoura Beltrão Felipe Augusto Chies Lucas Fialho Zawacki Marcos Vinicius Cavinato Matheus de Carvalho Proença C++ Fábio da Fontoura Beltrão Felipe Augusto Chies Lucas Fialho Zawacki Marcos Vinicius Cavinato Matheus de Carvalho Proença Primeiro Programa //Primeiro Programa C++ #include int main() { std::cout

Leia mais

INF1005: Programação 1. Arquivos. 02/05/10 (c) Paula Rodrigues 1

INF1005: Programação 1. Arquivos. 02/05/10 (c) Paula Rodrigues 1 INF1005: Programação 1 Arquivos 02/05/10 (c) Paula Rodrigues 1 Tópicos Principais Motivação Abertura e fechamento de arquivos Leitura com fscanf Escrita com fprintf 08/03/10 (c) Paula Rodrigues 2 Motivação

Leia mais

O que é um apontador em C (type pointer in C)?

O que é um apontador em C (type pointer in C)? O que é um apontador em C (type pointer in C)? Um apontador é uma variável que contém um endereço de outra variável. int x = 10;//variável inteira iniciada com o valor 10 int *px = &x;//variável apontadora

Leia mais

The Cyclops Project. Introdução: C++

The Cyclops Project. Introdução: C++ The Cyclops Project Introdução: C++ Aula 1 Visão Geral Histórico da Linguagem Programa C++: header, source função main() GCC Arquivos objeto, bibliotecas dinâmicas e estáticas #include, #define, namespaces,

Leia mais

Programação Orientada a Objetos

Programação Orientada a Objetos Programação Orientada a Objetos Classes e Objetos Renato Dourado Maia Universidade Estadual de Montes Claros Engenharia de Sistemas Lembrando Na Unidade II Modelagem Orientada a Objetos, vimos: Como utilizar

Leia mais

Construção de Compiladores Aula 2 - Analisador Léxico

Construção de Compiladores Aula 2 - Analisador Léxico Construção de Compiladores Aula 2 - Analisador Léxico Bruno Müller Junior Departamento de Informática UFPR 8 de Agosto de 2014 1 Analisador Léxico 2 3 Método 1: Programa 4 Código Analisador Léxico 5 Método

Leia mais

Linguagem de Programação I. Aula 10 Funções

Linguagem de Programação I. Aula 10 Funções Linguagem de Programação I Aula 10 Funções Da Aula Anterior Tipos de dados básicos e operadores em C Declaração de variáveis e modificadores de tipo Estruturas de Controle Arrays unidimensionais Geração

Leia mais

Curso de Introdução à Liguagem de. Grupo PET-Tele. Universidade Federal Fluminense. July 16, 2012

Curso de Introdução à Liguagem de. Grupo PET-Tele. Universidade Federal Fluminense. July 16, 2012 urso de à urso de à Universidade Federal Fluminense July 16, 2012 Indrodução urso de à O é uma linguagem de programação criada por Dennis Ritchie, em 1972 e que continua a ser muito utilizada até os dias

Leia mais

Exercício 1. Tabela 1: Cadastro de usuários, senhas e privilégios (exemplo). Login Senha Privilégio Armamento

Exercício 1. Tabela 1: Cadastro de usuários, senhas e privilégios (exemplo). Login Senha Privilégio Armamento 1/5 Exercício 1 Um sistema de segurança militar, usado num submarino nuclear, controla o acesso de usuários a três subsistemas (armamento, navegação e comunicações) através da digitação do login do usuário

Leia mais

Capítulo 06: Arquivos

Capítulo 06: Arquivos Capítulo 06: Arquivos INF1004 e INF1005 Programação 1 Pontifícia Universidade Católica Departamento de Informática Funções de entrada e saída em arquivos Motivação: quando um programa precisa processar

Leia mais

Linguagem C: Introdução

Linguagem C: Introdução Linguagem C: Introdução Linguagem C É uma Linguagem de programação genérica que é utilizada para a criação de programas diversos como: Processadores de texto Planilhas eletrônicas Sistemas operacionais

Leia mais

Linguagem de Programação e Compiladores

Linguagem de Programação e Compiladores Linguagem de Programação e Compiladores Fernando Antônio Asevedo Nóbrega Instituto de Ciências Matemáticas e de Computação USP SCC-206 Introdução à Compilação 24 de abril de 2012 1 / 20 Sumário 1 Introdução

Leia mais

Rotinas, Modos e Tipos de Passagem de Parâmetros

Rotinas, Modos e Tipos de Passagem de Parâmetros Linguagens de Programação Rotinas, Modos e Tipos de Passagem de Parâmetros Carlos Bazilio carlosbazilio@id.uff.br http://www.ic.uff.br/~bazilio/cursos/lp Chamada de Rotinas Rotina f Rotina g(w) g (k) Passagem

Leia mais

Tipos de Dados, Variáveis e Entrada e Saída em C. DCC 120 Laboratório de Programação

Tipos de Dados, Variáveis e Entrada e Saída em C. DCC 120 Laboratório de Programação Tipos de Dados, Variáveis e Entrada e Saída em C DCC 120 Laboratório de Programação Variáveis Uma variável representa um espaço na memória do computador para armazenar um determinado tipo de dado. Em C,

Leia mais

A ferramenta make. A - Introdução. O C é orientado para a produção de aplicações informáticas de grande dimensão

A ferramenta make. A - Introdução. O C é orientado para a produção de aplicações informáticas de grande dimensão A - Introdução O C é orientado para a produção de aplicações informáticas de grande dimensão Na geração de aplicações informáticas há ficheiros gerados a partir de outros: logo, os segundos têm obrigatoriamente

Leia mais

Programação Básica. Estrutura de um algoritmo

Programação Básica. Estrutura de um algoritmo Programação Básica Estrutura de um algoritmo Código-fonte Como vimos na aula anterior um algoritmo pode ser representado usando um fluxograma Um algoritmo pode também ser representado usando texto Esse

Leia mais

Algoritmos e Estruturas de Dados I

Algoritmos e Estruturas de Dados I Algoritmos e Estruturas de Dados I Prof. Daniel M. Martin (daniel.martin@ufabc.edu.br) Aula 9 (laboratório) O Labirinto Descrição do problema O problema é achar o caminho entre dois pontos de interesse

Leia mais

ENGENHARIA DE PRODUÇÃO ICC 1 TÉCNICAS DE PROGRAMAÇÃO

ENGENHARIA DE PRODUÇÃO ICC 1 TÉCNICAS DE PROGRAMAÇÃO ENGENHARIA DE PRODUÇÃO ICC 1 TÉCNICAS DE PROGRAMAÇÃO 1. INTRODUÇÃO O que é um programa? Programa constitui uma seqüência lógica de passos para solução de um problema. Um programa pode ser codificado em

Leia mais