Relatório da Árvore de Execução e Executor. Fabrício Vazole Lilian Lahas
|
|
- Vitória Pinheiro Ribeiro
- 6 Há anos
- Visualizações:
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
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
#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
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
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
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
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
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
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
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
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
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
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
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?
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
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
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.
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
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
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
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
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
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
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
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.
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);
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
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,
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....................................
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
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
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
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.
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
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:
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
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
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
%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
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
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
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
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;
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
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
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
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);
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
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
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.
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",
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
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
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
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
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];
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)
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
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
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
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
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)
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
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
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
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
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
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
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)
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
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
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
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
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:
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
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
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
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
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
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
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
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
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,
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
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
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
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,
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
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
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
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
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
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
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
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
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
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,
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
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
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
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