Compiladores / YACC Professor Ariel da Silva Dias YACC. Adaptação da obra original de Tom Niemann
|
|
- Baltazar Faro
- 4 Há anos
- Visualizações:
Transcrição
1 YACC YACC Adaptação da obra original de Tom Niemann As gramáticas para yacc são descritas usando uma variante da BNF. Esta técnica, foi usada por John Backus e Peter Naur foi para descrever ALGOL60. Em uma BNF a gramática pode ser usada para expressar gramáticas livres de contexto. A maioria das construções nas modernas linguagens de programação pode ser representada pela BNF. Por exemplo, a gramática de uma expressão que multiplica e adiciona números é: 1 E -> E + E 2 E -> E * E 3 E -> id Três produções foram especificadas. Termos que aparecem no left-hand side (lhs) de uma produção, como E, são não-terminais. Termos como id (identificador) são terminais (tokens retornados por lex) e só aparecem no right-hand side (rhs) de uma produção. Essa gramática especifica que uma expressão pode ser a soma de duas expressões, o produto de duas expressões ou um identificador. Podemos usar essa gramática para gerar expressões: E -> E * E (r2) -> E * z (r3) -> E + E * z (r1) -> E + y * z (r3) -> x + y * z (r3) Em cada passo, expandimos um termo e substituímos o lado esquerdo de uma produção com o correspondente lado direito. Os números à direita indicam qual regra aplicada. Para analisar uma expressão, precisamos fazer a operação inversa. Em vez de começar com um único não-terminal (símbolo inicial) e gerar uma expressão a partir de uma gramática, precisamos reduzir uma expressão a um único não-terminal. Isso é conhecido como análise bottom-up ou shift-reduce e usa uma pilha para armazenar termos. Aqui está a mesma derivação, mas na ordem inversa: 1. x + y * z shift 2 x. + y * z reduce(r3) 3 E. + y * z shift 4 E +. y * z shift 5 E + y. * z reduce(r3)
2 6 E + E. * z shift 7 E + E *. z shift 8 E + E * z. reduce(r3) 9 E + E * E. reduce(r2) emit multiply 10 E + E. reduce(r1) emit add 11 E. accept Os termos à esquerda do ponto estão na pilha, enquanto a entrada restante está à direita do ponto. Começamos trocando fichas para a pilha. Quando o topo da pilha corresponde ao lado esquerdo de uma produção, substituímos os tokens correspondentes na pilha com o lado esquerdo da produção. Em outras palavras, os tokens correspondentes do lado direito são retirados da pilha, e o lado esquerdo da produção é empurrada na pilha. Os tokens correspondentes são conhecidos como alça e estamos reduzindo a alça ao lado esquerdo da produção. Esse processo continua até que tenhamos deslocado toda a entrada para a pilha e apenas reste os não-terminais iniciados na pilha. No passo 1, nós mudamos x para a pilha. Passo 2 aplica a regra r3 para a pilha para mudar x para E. Continuamos mudando e reduzindo até que um único não-terminal, o símbolo inicial, permaneça na pilha. Na etapa 9, quando reduzimos a regra r2, emitimos a instrução de multiplicação. Da mesma forma, a instrução add é emitida na etapa 10. Consequentemente, a multiplicação tem uma precedência maior que a adição. Considere a mudança no passo 6. Em vez de mudar, poderíamos ter reduzido e aplicar a regra r1. Isso resultaria em adição, tendo uma precedência maior do que a multiplicação. Isso é conhecido como um conflito de redução de turno. Nossa gramática é ambígua porque há mais de uma derivação possível que produzirá a expressão. Nesse caso, a precedência do operador é afetada. Como outro exemplo, associatividade na regra E -> E + E é ambíguo, pois podemos recorrer à esquerda ou à direita. Para remediar a situação, poderíamos reescrever a gramática ou fornecer ao yacc diretivas que indicam qual operador tem precedência. O último método é mais simples e será demonstrado na seção de prática. A gramática a seguir tem um conflito reduzir-reduzir. Com um id na pilha, podemos reduzir para T ou E. E -> T E -> id T -> id
3 Yacc toma uma ação padrão quando há um conflito. Para conflitos de redução de turnos, o yacc mudará. Para conflitos com redução de redução, ele usará a primeira regra na listagem. Também emite uma mensagem de aviso sempre que houver um conflito. Os avisos podem ser suprimidos, tornando a gramática não ambígua.
4 Praticando (Calculadora 1) A entrada para yacc é dividido em três seções. A seção de definições consiste em declarações de token e código C entre " %{" e " %". A gramática é colocada na seção de regras e as sub-rotinas de usuários são adicionadas na seção de sub-rotinas. Isso é melhor ilustrado pela construção de uma pequena calculadora que pode adicionar e subtrair números. Vamos começar examinando a ligação entre lex e yacc. Aqui está a seção de definições para o yacc Arquivo de entrada: %token INTEGER Esta definição declara um INTEGER token. O Yacc gera um analisador no arquivo y.tab.c e um arquivo de inclusão y.tab.h: #ifndef YYSTYPE #define YYSTYPE int #endif #define INTEGER 258 extern YYSTYPE yylval; Lex inclui este arquivo e utiliza as definições para valores de token. Para obter saída yacc chamadas yylex. A função yylex tem um tipo inteiro que retorna um token. Os valores associados ao token são retornados por lex na variável yylval. Por exemplo, [0-9]+ { yylval = atoi(yytext); return INTEGER; armazenaria o valor do inteiro yylval e retornaria o símbolo INTEGER para o yacc. O tipo de yylval é determinado por YYSTYPE. Como o tipo padrão é inteiro, isso funciona bem nesse caso. Valores de token são reservados para valores de caractere. Por exemplo, se você tivesse uma regra como [-+] return *yytext; /* return operator */ o valor do caractere para menos ou mais é retornado. Observe que colocamos o sinal de menos primeiro para que não seja confundido com um designador de intervalo. Os valores de token gerados geralmente começam em torno de 258 porque lex reserva vários valores para
5 processamento de fim de arquivo e erro. Aqui está o arquivo lex completo com especificação de entrada para nossa calculadora (calc1.l): %{ % #include "y.tab.h" #include <stdlib.h> void yyerror(char *); [0-9]+ { yylval = atoi(yytext); return INTEGER; [-+\n] return *yytext; [ \t] ; /* espaço em branco */. yyerror("caracter invalido"); int yywrap(void) { return 1; Internamente yacc mantém duas pilhas na memória; uma pilha de análise e uma pilha de valores. A pilha de análise contém terminais e nãoterminais que representam o estado de análise atual. A pilha de valores é uma matriz de elementos do tipo YYSTYPE e associa um valor a cada elemento na pilha de análise. Por exemplo quando o lex retorna um token INTEGER, o yacc desloca este token para a pilha de análise. Ao mesmo tempo, o correspondente yylval é deslocado para a pilha de valores. As pilhas de análise e valor são sempre sincronizadas, portanto, é fácil de encontrar um valor relacionado a um token na pilha. Aqui está o yacc especificação de entrada para nossa calculadora (calc1.y): %{ % #include <stdio.h> int yylex(void); void yyerror(char *); %token INTEIRO
6 program: program expr '\n' $2); ; { printf("%d\n", expr: INTEIRO { $$ = $1; expr '+' expr { $$ = $1 + $3; expr '-' expr { $$ = $1 - $3; ; void yyerror(char *s) { fprintf(stderr, "%s\n", s); int main(void) { yyparse(); return 0; A seção de regras é semelhante à gramática BNF discutida anteriormente. O lado esquerdo de uma produção, ou não-terminal, é inserido à esquerda e seguido por dois pontos. Isto é seguido pelo lado direito da produção. Ações associadas a uma regra são inseridas entre chaves. Com a recursão à esquerda, especificamos que um programa consiste em zero ou mais expressões. Cada expressão termina com uma nova linha. Quando uma nova linha é detectada, imprimimos o valor da expressão. Quando aplicamos a regra expr: expr '+' expr { $$ = $1 + $3; Nós substituímos o lado direito da produção na pilha de análise com o lado esquerdo da mesma produção. Podemos referenciar posições na pilha de valores em nosso código C especificando " $1" para o primeiro termo no lado direito da produção, " $2" para o segundo e assim por diante. " $$" designa o topo da pilha após a redução ter ocorrido. A ação acima adiciona o valor associado a duas expressões, mostra três termos da pilha de valores e retorna uma única
7 soma. Como consequência, as pilhas de análise e valor permanecem sincronizadas. Os valores numéricos são inicialmente inseridos na pilha quando reduzimos de INTEGER para expr. Depois que o INTEGER é deslocado para a pilha, aplicamos a regra expr: INTEIRO { $$ = $1; O token INTEGER é retirado da pilha de análise seguido de um deslocamento de expr. Para a pilha de valores, removemos o valor inteiro da pilha e depois o colocamos novamente. Em outras palavras, não fazemos nada. Na verdade, esta é a ação padrão e não precisa ser especificada. Finalmente, quando uma nova linha é encontrada, o valor associado expr é impresso. No caso de erros de sintaxe yacc chama a função fornecida pelo usuário yyerror. Em seguida, compile da seguinte forma para testarmos: yacc -y -d calc1.y lex calc1.l gcc -c y.tab.c lex.yy.c gcc y.tab.o lex.yy.o -o calc1.exe
8 Praticando (Calculadora 2) Nesta seção, ampliaremos a calculadora da seção anterior para incorporar algumas novas funcionalidades. Novos recursos incluem: operadores aritméticos de multiplicação e divisão. Os parênteses podem ser usados para sobrepor a precedência do operador e variáveis de caractere único podem ser especificadas em instruções de atribuição. Abaixo ilustramos a entrada de amostra e a saída da calculadora: usuario: 3 * (4 + 5) calculadora: 27 usuario: x = 3 * (4 + 5) usuario: y = 5 usuario: x calculadora: 27 usuario: y calculadora: 5 usuario: x + 2*y calculadora: 37 O analisador léxico retorna os tokens VARIABLE e INTEGER. Para variáveis, yylval especifica um índice para a tabela de símbolos sym. Para este programa, sym apenas contém o valor da variável associada. Quando osinteger tokens são retornados, yylvalcontém o número digitalizado. Aqui está a especificação de entrada para lex (calc2.l): %{ % #include <stdlib.h> #include "y.tab.h" void yyerror(char *); /* variaveis */ [a-z] { yylval = *yytext - 'a'; return VARIAVEL; /* inteiros */ [0-9]+ { yylval = atoi(yytext); return INTEIRO;
9 /* operadores */ [-+()=/*\n] { return *yytext; /* espaço */ [ \t] ; /* qualquer outro caracter será um erro */. yyerror("caracter Inválido"); int yywrap(void) { return 1; A especificação de entrada para yacc segue. Os tokens para INTEGER e VARIABLE são utilizados por yacc para criar #defines em y.tab.h para uso em lex. Isto é seguido por definições para os operadores aritméticos. Podemos especificar %left, para associativo à esquerda ou %right para associativa à direita. A última definição listada tem a maior precedência. Consequentemente, multiplicação e divisão têm maior precedência do que adição e subtração. Todos os quatro operadores são associativos à esquerda. Usando esta técnica simples, podemos desambiguar nossa gramática (calc2.y). %token INTEIRO VARIAVEL %left '+' '-' %left '*' '/' %{ % void yyerror(char *); int yylex(void); int sym[26]; program: program statement '\n' ; statement: expr { printf("%d\n", $1); VARIAVEL '=' expr { sym[$1] = $3;
10 ; expr: INTEIRO VARIAVEL { $$ = sym[$1]; expr '+' expr { $$ = $1 + $3; expr '-' expr { $$ = $1 - $3; expr '*' expr { $$ = $1 * $3; expr '/' expr { $$ = $1 / $3; '(' expr ')' { $$ = $2; ; void yyerror(char *s) { fprintf(stderr, "%s\n", s); int main(void) { yyparse(); return 0; Agora vamos criar a nossa calculadora: yacc -y -d calc2.y lex calc2.l gcc -c y.tab.c lex.yy.c gcc y.tab.o lex.yy.o -o calc2.exe
11 Praticando (Calculadora 3) Esta versão da calculadora é substancialmente mais complexa que as versões anteriores. As principais alterações incluem: instruções de controle, como if-else e while. Além disso, uma árvore de sintaxe é construída durante a análise. Após a análise, percorremos a árvore sintática para produzir a saída. Três versões da rotina de caminhada na árvore são fornecidas: um intérprete que executa declarações durante a caminhada na árvore um compilador que gera código para uma máquina baseada em pilha hipotética uma versão que gera uma árvore de sintaxe do programa original. Para tornar as coisas mais concretas, aqui está um exemplo de programa que pode ser reconhecido pela nossa calculadora, x = 0; while (x < 3) { print x; x = x + 1; com saída para uma versão interpretativa, uma versão do compilador, push 0 pop x L000: push x push 3 complt jz L001 push x print push x push 1 add pop x jmp L000
12 L001: e uma versão que gera uma árvore de sintaxe. Graph 0: [=] ---- id(x) c(0) Graph 1: while [<] [;] id(x) c(3) print [=] id(x) id(x) [+] ---- id(x) c(1) O arquivo de inclusão contém declarações para a árvore de sintaxe e a tabela de símbolos. A tabela de símbolos (sym) permite nomes de variáveis de um único caractere. Um nó na árvore de sintaxe pode conter uma constante (connodetype), um identificador (idnodetype) ou um nó interno com um operador (oprnodetype). Uma união encapsula todas as três variantes. O nodetype.type é usada para determinar qual estrutura nós temos. O arquivo de entrada lex contém padrões para os tokens VARIAVEL e INTEIRO. Além disso, os tokens são definidos para operadores de 2 caracteres, como EQ e NE. Operadores de caractere único são simplesmente retornados como eles mesmos. O arquivo de entrada do YACC define YYSTYPE, o tipo de yylval, como
13 %union { int ivalue; /* valor inteiro */ char sindex; /* índice da tabela de simbolo */ nodetype *nptr; /* nó ponteiro */ ; Isso faz com que o seguinte seja gerado em y.tab.h: typedef union { int ivalue; /* valor inteiro */ char sindex; /* índice da tabela de simbolo */ nodetype *nptr; /* nó ponteiro */ YYSTYPE; extern YYSTYPE yylval; Constantes, variáveis e nós podem ser representados por yylval na pilha de valores do analisador. Uma representação mais precisa de inteiros decimais é dada abaixo. Isso é semelhante a C/C++ onde inteiros que começam com 0 são classificados como octal. 0 { yylval.ivalue = atoi(yytext); return INTEIRO; [1-9][0-9]* { yylval.ivalue = atoi(yytext); return INTEIRO; Observe as definições de tipo %token <ivalue> INTEIRO %type <nptr> expr Isso liga expr a nptr, e a união com INTEIRO e ivalue na YYSTYPE. Isso é necessário para que yacc possa gerar o código corretamente. Por exemplo, a regra expr: INTEGER { $$ = con($1); deve gerar o código a seguir. Observe que yyvsp[0] corresponde ao topo da pilha de valores ou o valor associado ainteger.
14 yylval.nptr = con(yyvsp[0].ivalue); O operador menos unário recebe maior prioridade que os operadores binários da seguinte maneira: %left GE LE EQ NE '>' '<' %left '+' '-' %left '*' '/' %nonassoc UMINUS O %nonassoc indica que não há associatividade implícita. É frequentemente usado em conjunto com %prec para especificar a precedência de uma regra. Assim, nós temos expr: '-' expr %prec UMINUS { $$ = node(uminus, 1, $2); indicando que a precedência da regra é a mesma que a precedência do token UMINUS. E UMINUS (conforme definido acima) tem precedência mais alta que os outros operadores. Uma técnica semelhante é usada para remover a ambiguidade associada à instrução if-else. A árvore de sintaxe é construída de baixo para cima, alocando os nós folha quando variáveis e números inteiros são reduzidos. Quando os operadores são encontrados, um nó é alocado e os ponteiros para estes nós são inseridos como operandos. Depois que a árvore é construída, a função ex é chamada para fazer uma caminhada em profundidade da árvore de sintaxe. Isso resulta em operadores sendo aplicados na ordem em que foram encontrados durante a análise. Temos três versões para o ex: uma versão interpretativa uma versão do compilador uma versão que gera uma árvore de sintaxe Os arquivos deste projeto (Calculadora 1, Calculadora 2 e Calculadora 3) estão anexos no site na disciplina de Compiladores.
15 Referência Niemann, Tom. Lex & YACC. Disponível em: epaperpress.com.
Compiladores. Lex e Yacc / Flex e Bison. Ferramentas Flex/Bison
Ferramentas Flex/Bison Prof. Sergio F. Ribeiro Lex e Yacc / Flex e Bison São ferramentas de auxílio na escrita de programas que promovem transformações sobre entradas estruturadas. São ferramentas desenvolvidas
Leia maisUm Compilador Simples. Definição de uma Linguagem. Estrutura de Vanguarda. Gramática Livre de Contexto. Exemplo 1
Definição de uma Linguagem Linguagem= sintaxe + semântica Especificação da sintaxe: gramática livre de contexto, BNF (Backus-Naur Form) Especificação Semântica: informal (textual), operacional, denotacional,
Leia maisCompiladores - Gramáticas
Compiladores - Gramáticas Fabio Mascarenhas - 2013.1 http://www.dcc.ufrj.br/~fabiom/comp Análise Sintática A análise sintática agrupa os tokens em uma árvore sintática de acordo com a estrutura do programa
Leia maisCompiladores - Gramáticas
Compiladores - Gramáticas Fabio Mascarenhas 2018.1 http://www.dcc.ufrj.br/~fabiom/comp Análise Sintática A análise sintática agrupa os tokens em uma árvore sintática de acordo com a estrutura do programa
Leia maisIntroduçã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 maisLex Adaptação da obra original de Tom Niemann
LEX Lex Adaptação da obra original de Tom Niemann Durante a primeira fase, o compilador lê a entrada e converte as strings na origem para os tokens. Com expressões regulares, podemos especificar padrões
Leia maisINE5416 Paradigmas de Programação. Ricardo Azambuja Silveira INE CTC UFSC E Mail: URL:
INE5416 Paradigmas de Programação Ricardo Azambuja Silveira INE CTC UFSC E Mail: silveira@inf.ufsc.br URL: www.inf.ufsc.br/~silveira Conceitos Léxica estudo dos símbolos que compõem uma linguagem Sintaxe
Leia maisConstrução de Compiladores Aula 3 - Analisador Sintático
Construção de Compiladores Aula 3 - Analisador Sintático Bruno Müller Junior Departamento de Informática UFPR 20 de Agosto de 2014 Definição A análise sintática (parsing) é um processo que verifica se
Leia maisCompiladores - JACC. Fabio Mascarenhas
Compiladores - JACC Fabio Mascarenhas - 2013.1 http://www.dcc.ufrj.br/~fabiom/comp JACC Gerador de analisadores sintáticos LALR que gera código Java Sintaxe baseada na sintaxe do YACC (e de muitos outros
Leia maisO que faz/o que é Como usar Como funciona Formato geral do Arquivo Submetido ao Lex ER estendidas Exemplos The Lex & YACC page:
O que faz/o que é Como usar Como funciona Formato geral do Arquivo Submetido ao Lex ER estendidas Exemplos The Lex & YACC page: http://dinosaur.compilertools.net/ 1 O que faz Lex gera programas (em C)
Leia maisUtiliza Expressões Regulares (ER) Estendidas para definir a especificação da análise léxica desejada
O que faz/o que é Como usar Como funciona Formato geral do Arquivo Submetido ao Lex ER estendidas Exemplos The Lex & YACC page: http://dinosaur.compilertools.net/ 1 O que faz Lex gera programas (em C)
Leia maisSintaxe e Semântica. George Darmiton da Cunha Cavalcanti.
Sintaxe e Semântica George Darmiton da Cunha Cavalcanti (gdcc@cin.ufpe.br) Tópicos Introdução O problema de descrever a sintaxe Métodos formais para descrever a sintaxe Gramáticas de atributos Descrevendo
Leia maisLinguagens e Programação BISON. Paulo Proença
Linguagens e Programação BISON BISON Gerador de analisadores sintáticos. Converte uma gramática independente de contexto LARL(1) 1 num programa C capaz de processar frases da linguagem. Gramática LARL(1)
Leia maisAnálise Sintática I. Eduardo Ferreira dos Santos. Abril, Ciência da Computação Centro Universitário de Brasília UniCEUB 1 / 42
Análise Sintática I Eduardo Ferreira dos Santos Ciência da Computação Centro Universitário de Brasília UniCEUB Abril, 2017 1 / 42 Sumário 1 Introdução 2 Derivações 3 Ambiguidade 4 Análise sintática descendente
Leia maisLÓ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 maisCapítulo 7. Expressões e Sentenças de Atribuição
Capítulo 7 Expressões e Sentenças de Atribuição Introdução Expressões são os meios fundamentais de especificar computações em uma linguagem de programação Para entender a avaliação de expressões, é necessário
Leia maisAnálise Sintática II. Eduardo Ferreira dos Santos. Outubro, Ciência da Computação Centro Universitário de Brasília UniCEUB 1 / 34
Análise Sintática II Eduardo Ferreira dos Santos Ciência da Computação Centro Universitário de Brasília UniCEUB Outubro, 2016 1 / 34 Sumário 1 Introdução 2 Ambiguidade 3 Análise sintática descendente 4
Leia maisAnálise Bottom-Up. Compiladores. Parsing LR. Tabela Ações/Transições. Análise LR. Construindo tabelas LR
Análise Bottom-Up Compiladores Análise sintática 5) Gramáticas SLR), LR) e LALR String Entrada -> Símbolo Inicial Regras aplicadas em reverso adiar decisões mais poderoso Noção de handle, redução, uso
Leia mais3. Linguagem de Programação C
Introdução à Computação I IBM1006 3. Linguagem de Programação C Prof. Renato Tinós Departamento de Computação e Matemática (FFCLRP/USP) 1 Principais Tópicos 3.2. Estrutura de Programas e Representação
Leia maisEstruturas 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 maisProgramação 1. Atribuição, operadores aritméticos, entrada de dados. Técnico em Eletrônica Semestre 5 02
Programação 1 Atribuição, operadores aritméticos, entrada de dados Técnico em Eletrônica Semestre 5 02 Armazenando na memória tipo de variável #include #include main() { int ano; Declaração
Leia maisConceitos de Linguagens de Programação
Conceitos de Linguagens de Programação Aula 04 Sintaxe e Semântica Edirlei Soares de Lima Sintaxe e Semântica A descrição de uma linguagem de programação envolve dois aspectos principais:
Leia maisAnálise Sintática - Final
MAB 471 2011.2 Análise Sintática - Final http://www.dcc.ufrj.br/~fabiom/comp LR(k ) vs LL(k ) Encontrando o próximo passo em uma derivação LR(k) Cada redução na análise detectável com o contexto esquerdo
Leia maisUma gramática é ambígua se existe alguma cadeia para qual ela tem mais de uma árvore sintática
Ambiguidade Uma gramática é ambígua se existe alguma cadeia para qual ela tem mais de uma árvore sintática De maneira equivalente, se existe mais de uma derivação mais à esquerda para uma cadeia Ou se
Leia mais1 d=
O que faz/o que é Como usar / Como funciona Formato geral do Arquivo Submetido ao Lex ER estendidas / Exemplos The Lex & YACC page: http://dinosaur.compilertools.net/ Flex: versão livre http://simplesamples.info/c++/flex.php
Leia maisProcessamento de Linguagens I LESI + LMCC (3 o ano)
Processamento de Linguagens I LESI + LMCC (3 o ano) 3 o Ficha Prática Ano Lectivo de 05/06 1 Objectivos Este ficha prática contém 1 exercício para ser resolvido nas aulas teórico-práticas com vista a consolidar
Leia maisIntrodução à Linguagem de Programação C: Variáveis, Constantes, Expressões, Atribuição, Tipos de dados, Entrada e Saída de Dados
Introdução à Linguagem de Programação C: Variáveis, Constantes, Expressões, Atribuição, Tipos de dados, Entrada e Saída de Dados Disciplina de Programação de Computadores I Universidade Federal de Ouro
Leia maisTécnicas de Programação em Engenharia Elétrica I - Engenharia de Sistemas Embarcados - Prof. Alessandro Zimmer Introdução à Linguagem C
Técnicas de Programação em Engenharia Elétrica I - Engenharia de Sistemas Embarcados - Prof. Alessandro Zimmer Introdução à Linguagem C Operadores aritméticos Operadores Unários (um só operando) Incremento
Leia maisAmbiente 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 maisUniversidade 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 maisCompilação: Erros. Detecção de Erros: * Analisadores Top-Down - Preditivo Tabular (LL) - Feito a mão. * Analisadores Botton-Up: - Shift-Reduce (SLR)
Compilação: Erros Detecção de Erros: * Analisadores Top-Down - Preditivo Tabular (LL) - Feito a mão * Analisadores Botton-Up: - Shift-Reduce (SLR) * Erros no Lex * Erros no Yacc * Erros na Definição da
Leia maisCompiladores - Gramáticas
Compiladores - Gramáticas Fabio Mascarenhas 2015.2 http://www.dcc.ufrj.br/~fabiom/comp Ambiguidade Uma gramática é ambígua se existe alguma cadeia para qual ela tem mais de uma árvore sintática De maneira
Leia maisCompiladores I Prof. Ricardo Santos (cap 3 Análise Léxica: Introdução, Revisão LFA)
Compiladores I Prof. Ricardo Santos (cap 3 Análise Léxica: Introdução, Revisão LFA) Expressões e Definições Regulares Revisão Expressões regulares descrevem todas as linguagens que podem ser construídas
Leia maisCompiladores. Análise Léxica
Compiladores Análise Léxica Cristiano Lehrer, M.Sc. Introdução (1/3) Análise léxica é a primeira fase do compilador. A função do analisador léxico, também denominado scanner, é: Fazer a leitura do programa
Leia maisAnálise Sintática. Eduardo Ferreira dos Santos. Outubro, Ciência da Computação Centro Universitário de Brasília UniCEUB 1 / 18
Análise Sintática Eduardo Ferreira dos Santos Ciência da Computação Centro Universitário de Brasília UniCEUB Outubro, 2016 1 / 18 Sumário 1 Introdução 2 Derivações 2 / 18 1 Introdução 2 Derivações 3 /
Leia maisLinguagem C Operadora
Linguagem C Operadora Objetivos Abordar os conceitos sobre os Operadores demonstrando o seu uso com exemplos para um melhor aprendizado. Operadores Os operadores indicam ao compilador a necessidade de
Leia maisCompiladores. 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 maisCompiladores - Análise SLR
Compiladores - Análise SLR Fabio Mascarenhas - 2013.1 http://www.dcc.ufrj.br/~fabiom/comp Um exemplo que funciona Todo estado com um item de redução e algum outro item causa conflito LR(0)! A técnica LR(0)
Leia maisProgramação em C. Variáveis e Expressões. Universidade Federal do Rio Grande do Norte Departamento de Engenharia de Computação e Automação
Universidade Federal do Rio Grande do Norte Departamento de Engenharia de Computação e Automação Programação em C Variáveis e Expressões DCA0800 Algoritmos e Lógica de Programação Heitor Medeiros Florencio
Leia maisPROGRAMAÇÃO I E N T R A DA E S A Í DA D E DA D O S
PROGRAMAÇÃO I VA R I Á V E I S, C O N S TA N T E S, O P E R A D O R E S E N T R A DA E S A Í DA D E DA D O S Variáveis 2 Variáveis são locais onde são armazenados os valores na memória. Toda variável é
Leia maisLinguagem C Operadores
Linguagem C Operadores Objetivos Abordar os conceitos sobre os Operadores demonstrando o seu uso com exemplos para um melhor aprendizado. Pré-requisitos É necessário que o leitor tenha acompanhado o artigo
Leia maisConceitos de Linguagens de Programação
Conceitos de Linguagens de Programação Aula 06 Análise Sintática (Implementação) Edirlei Soares de Lima Análise Sintática A maioria dos compiladores separam a tarefa da análise sintática
Leia maisLinguagens 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 maisIntrodução à Computação MAC0110
Introdução à Computação MAC0110 Prof. Dr. Paulo Miranda IME-USP Aula 2 Variáveis e Atribuições Memória Principal: Introdução Vimos que a CPU usa a memória principal para guardar as informações que estão
Leia maisLinguagem 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 maisParadigmas de Linguagens de Programação. Expressões e Instruções de Atribuição
Expressões e Instruções de Atribuição Cristiano Lehrer Introdução Expressões são o meio fundamental de especificar computações em uma linguagem de programação: Familiarização com as ordens de avaliação
Leia maisLinguagens de Programação Aula 4
Aula 4 Celso Olivete Júnior olivete@fct.unesp.br Na aula passada... Autômatos finitos AF:exemplos... Cadeia de caracteres a,b,c 2/82 Na aula passada... Autômatos finitos AF:exemplos... Números inteiros(com
Leia maisProgramação de Computadores I Introdução ao C PROFESSORA CINTIA CAETANO
Programação de Computadores I Introdução ao C PROFESSORA CINTIA CAETANO Introdução Criada em 1972, por Dennis Ritchie; Centro de Pesquisas da Bell Laboratories; Para utilização no S.O. UNIX; C é uma linguagem
Leia maisCONJUNTO DE INSTRUÇÕES DE UM PROCESSADOR (UCP)
CONJUNTO DE INSTRUÇÕES DE UM PROCESSADOR (UCP) 1 LINGUAGENS Conhecida pelo PROCESSADOR Conhecida pelo Usuário COMPILADOR LINGUAGEM DE ALTO NÍVEL LINGUAGEM ASSEMBLY 2 INSTRUÇÕES EM ASSEMBLY Para programar
Leia maisIntrodução. Flex e uma ferramenta para gerar scanners programas que reconhecem padrões lexicais em texto
Compiladores Flex Introdução Flex e uma ferramenta para gerar scanners programas que reconhecem padrões lexicais em texto O flex lê o arquivo de entrada fornecido, para uma descrição de um scanner a ser
Leia maisCapítulo 1: Introdução à Linguagem C. Pontifícia Universidade Católica Departamento de Informática
Capítulo 1: Introdução à Linguagem C Pontifícia Universidade Católica Departamento de Informática Programa Programa é um algoritmo escrito em uma linguagem de programação. No nosso caso, a linguagem C.
Leia maisConceitos Básicos de Programação
BCC 201 - Introdução à Programação Conceitos Básicos de Programação Guillermo Cámara-Chávez UFOP 1/53 Conceitos básicos I Variável 2/53 Conceitos básicos II Posição de memoria, identificada através de
Leia maisLinguagens 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 maisCompiladores I. Caracterizar um método de análise bottom-up. Compreender os mecanismos básicos envolvidos no processo de análise LR.
Compiladores I Gerson Geraldo Homrich Cavalheiro Caracterizar um método de análise bottom-up Compreender oecanismos básicos envolvidos no processo de análise LR Oferecer as bases para utilização de uma
Leia maisAnálise Sintática Introdução
Análise Sintática Introdução Renato Ferreira Linguagens e Automatas Linguagens formais são importantes em Computação Especialmente em linguagens de programação Linguagens regulares A linguagem formal mais
Leia maisAlgoritmos e Programação
Algoritmos e Programação Aula 3 Introdução a Linguagem C Profa. Marina Gomes marinagomes@unipampa.edu.br 1 Aula de Hoje - Criar programas simples em C utilizando a estrutura básica; - Declarar variáveis;
Leia maisAula 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 maisConceitos básicos de programação
Constantes class Exemplo { static void Main() { float fahr, celsius; int lower, upper, step; lower = 0; /* limite inferior da tabela de temperaturas */ upper = 300; /* limite superior */ step = 20; /*
Leia maisPython e sua sintaxe LNCC UFRJ
Python e sua sintaxe LNCC UFRJ Linguagens naturais e formais Linguagens naturais Linguagem formal Um conjunto finito e não-vazio cujos elementos são símbolos Qualquer cadeia finita de símbolos justapostos
Leia maisFundamentos de Programação
Fundamentos de Programação CP41F Operadores aritméticos. Operadores lógicos. Operadores binários. Aula 7 Prof. Daniel Cavalcanti Jeronymo Universidade Tecnológica Federal do Paraná (UTFPR) Engenharia de
Leia maisPROGRAMAÇÃO de COMPUTADORES: LINGUAGEM FORTRAN 90/95
PROGRAMAÇÃO de COMPUTADORES: LINGUAGEM FORTRAN 90/95 Exercícios de revisão Lista 01: a) Monte um mapa conceitual indicando as relações entre os seguintes conceitos, no contexto do assunto visto em aula:
Leia maisLinguagens de Programação
45 Linguagens de Programação O paradigma de programação imperativo está diretamente atrelado à arquitetura básica dos computadores sobre os quais os programas eram executados. Boa parte dos computadores
Leia maisCONJUNTO DE INSTRUÇÕES DE UM PROCESSADOR (UCP)
CONJUNTO DE INSTRUÇÕES DE UM PROCESSADOR (UCP) 1 LINGUAGENS Constituída de seqüência de zeros (0) e uns (1) Cada instrução em ASSEMBLY constitui-se em um mnemônico (uma forma fácil de se lembra) de uma
Leia maisPrincípios de Desenvolvimento de Algoritmos MAC122
Princípios de Desenvolvimento de Algoritmos MAC122 Prof. Dr. Paulo Miranda IME-USP Aula de Revisão: Variáveis e Atribuições Introdução Memória Principal: Vimos no curso anterior que a CPU usa a memória
Leia maisProgramação Estruturada
Programação Estruturada Introdução à linguagem C Professores Emílio Francesquini e Carla Negri Lintzmayer 2018.Q3 Centro de Matemática, Computação e Cognição Universidade Federal do ABC Programação estruturada
Leia maisAnálise Sintática. Fabiano Baldo
Compiladores Análise Sintática Fabiano Baldo Gramáticas Livre de Contexto (GLC) É utilizada na especificação formal lda sintaxe de uma linguagem de programação. É um conjunto de produções ou regras gramaticais
Leia mais4. Constantes. Constantes pré-definidas
4. Constantes Constantes pré-definidas O PHP possui algumas constantes pré-definidas, indicando a versão do PHP, o Sistema Operacional do servidor, o arquivo em execução, e diversas outras informações.
Leia maisCompiladores. Bruno Lopes. Bruno Lopes Compiladores 1 / 31. Instituto de C
ompiladores Análise Léxica Bruno Lopes Bruno Lopes ompiladores 1 / 31 Front-end Lida com a linguagem de entrada Teste de pertinência: código fonte linguagem fonte? Programa está bem formado? Sintaticamente?
Leia maisComputação Eletrônica. Tipos de dados, constantes, variáveis, operadores e expressões. Prof: Luciano Barbosa
Computação Eletrônica Tipos de dados, constantes, variáveis, operadores e expressões Prof: Luciano Barbosa Site da disciplina: www.cin.ufpe.br/~if165/ Recapitulando num cubo = n * n * n cubo Algoritmo
Leia maisV.2 Especificação Sintática de Linguagens de Programação
V.2 Especificação Sintática de Linguagens de Programação Deve ser baseada: No planejamento da Linguagem / Compilador Objetivos, Filosofia, Potencialidades,... Nos critérios de projeto/avaliação Legibilidade,
Leia maisLinguagem de Programação I. Aula 06 Linguagem C: Tipos de Dados
Linguagem de Programação I Aula 06 Linguagem C: Tipos de Dados Da Aula Anterior Linguagens de Programação A Linguagem C: Como tudo começou Principais características da Linguagem C O primeiro programa
Leia mais#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 maisRevisão da Linguagem C Prof. Evandro L. L. Rodrigues
SEL0433 Aplicação de Microprocessadores I Revisão da Linguagem C Prof. Evandro L. L. Rodrigues Estrutura de um programa C Diretivas de pré processamento Declaração de variáveis globais Declaração de protótipos
Leia maisAnhanguera 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 maisIntrodução à Programação. Operadores, Expressões Aritméticas e Entrada/Saída de Dados
Introdução à Programação Operadores, Expressões Aritméticas e Entrada/Saída de Dados Programa em C #include int main main ( ) { Palavras Reservadas } float celsius ; float farenheit ; celsius
Leia maisConstruçã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 maisAnálise Sintática Bottom-up
MAB 471 2011.2 Análise Sintática Bottom-up http://www.dcc.ufrj.br/~fabiom/comp Recapitulando parsers top-down Constróem árvore sintática da raiz até as folhas Recursão à esquerda faz parsers entrarem em
Leia maisLinguagens de Programação. Marco A L Barbosa
Expressões e sentença de atribuição Linguagens de Programação Marco A L Barbosa cba Este trabalho está licenciado com uma Licença Creative Commons - Atribuição-CompartilhaIgual 4.0 Internacional. http://github.com/malbarbo/na-lp-copl
Leia maisIntroduçã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 maisCompiladores. 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 maisCompiladores 02 Analise léxica
Compiladores 02 Analise léxica Sumário Análise Léxica Definição: Lexema, tokens Tabela símbolos Expressões regulares, automatos Relembrando O compilador é dividido em duas etapas Análise Síntese Análise
Leia maisExpressões e sentença de atribuição
Expressões e sentença de atribuição Marco A L Barbosa malbarbo.pro.br Departamento de Informática Universidade Estadual de Maringá cba Este trabalho está licenciado com uma Licença Creative Commons - Atribuição-CompartilhaIgual
Leia maisCapítulo 2 Operadores. A função scanf()
Capítulo 2 Operadores A função scanf() A função scanf() é outra das funções de E/S implementadas em todos os compiladores e nos permite ler dados formatados da entrada padrão (teclado). Sintaxe: scanf(
Leia maisCompiladores. Análise Léxica
Compiladores Análise Léxica Regras Léxicas Especificam o conjunto de caracteres que constituem o alfabeto da linguagem, bem como a maneira que eles podem ser combinados; Exemplo Pascal: letras maiúsculas
Leia maisHello 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 maisCONJUNTO DE INSTRUÇÕES
CONJUNTO DE INSTRUÇÕES 1 CARACTERÍSTICAS DE INSTRUÇÕES DE MÁQUINA Quando um programador usa uma linguagem de alto-nível, como C, muito pouco da arquitetura da máquina é visível. O usuário que deseja programar
Leia maisIntrodução à Linguagem C Variáveis e Expressões
INF1005: Programação 1 Introdução à Linguagem C Variáveis e Expressões 08/03/10 (c) Paula Rodrigues 1 Tópicos Principais Programando em C Funções Variáveis Define Operadores e Expressões Entrada e Saída
Leia maisMétodos Computacionais. Operadores, Expressões Aritméticas e Entrada/Saída de Dados
Métodos Computacionais Operadores, Expressões Aritméticas e Entrada/Saída de Dados Tópicos da Aula Hoje aprenderemos a escrever um programa em C que pode realizar cálculos Conceito de expressão Tipos de
Leia maisEstruturas 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 maisLINGUAGEM C: VARIÁVEIS E EXPRESSÕES
LINGUAGEM C: VARIÁVEIS E EXPRESSÕES Prof. André Backes LINGUAGENS DE PROGRAMAÇÃO Linguagem de Máquina Computador entende apenas pulsos elétricos Presença ou não de pulso 1 ou 0 Tudo no computador deve
Leia maisParadigmas de Linguagens de Programação. Descrevendo a Sintaxe e a Semântica
Descrevendo a Sintaxe e a Semântica Cristiano Lehrer Introdução Descrição, compreensível, de uma linguagem de programação é difícil e essencial. Capacidade de determinar como as expressões, instruções
Leia maisIntrodução à Programação em C. Prof. Ricardo Teixeira Tecnologia em Mecatrônica Industrial SENAI
Introdução à Programação em C Prof. Ricardo Teixeira Tecnologia em Mecatrônica Industrial SENAI Linguagem C Criada em 1972 para uso no LINUX; Sintaxe base para diversas outras (Java, JavaScript, PHP, C++,
Leia maisCompiladores Analisador Sintático. Prof. Antonio Felicio Netto Ciência da Computação
Compiladores Analisador Sintático Prof. Antonio Felicio Netto antonio.felicio@anhanguera.com Ciência da Computação 1 Análise Sintática - A Análise Sintática constitui a segunda fase de um tradutor de uma
Leia maisLinguagens de Programação
Linguagens de Programação 128 13 129 Linguagens de Programação Uma linguagem de programação é um vocabulário e um conjunto de regras gramaticais usadas para escrever programas de computador. Esses programas
Leia maisLinguagem C. IF61A/IF71A - Computação 1 Prof. Leonelo Almeida. Universidade Tecnológica Federal do Paraná
Linguagem C IF61A/IF71A - Computação 1 Prof. Leonelo Almeida Universidade Tecnológica Federal do Paraná Até agora... Sabemos construir algoritmos que tenham: Variáveis Comandos sequenciais Entrada e saída
Leia maisLinguagem 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 maisCOMPILADORES. Análise sintática. Prof. Geovane Griesang Universidade de Santa Cruz do Sul UNISC Departamento de informática
Universidade de Santa Cruz do Sul UNISC Departamento de informática COMPILADORES Análise sintática Parte 04 Prof. geovanegriesang@unisc.br Data Conteúdo 23/09/2013 3. Análise Sintática: 3.1 analisadores
Leia mais