Este documento fornece um resumo introdutório sobre análise sintática. Discute tópicos como reconhecimento de sentenças, derivações canônicas, árvores sintáticas, gramáticas ambíguas e analisadores sintáticos como autômatos de pilha e analisadores preditivos. O objetivo é apresentar os principais conceitos e técnicas relacionados à validação automática de sentenças de acordo com uma gramática formal.
Πρόκειται για μια σειρά ασκήσεων βασισμένη στο κεφάλαιο του Διαφορικού λογισμού για την Γ' τάξη Λυκείου ΕΠΑΛ. Περιλαμβάνει ασκήσεις κατανόησης, αποδεικτικές, ασκήσεις συμπλήρωσης κενών και απλές υπολογιστικές ασκήσεις.
Πρόκειται για μια σειρά ασκήσεων βασισμένη στο κεφάλαιο του Διαφορικού λογισμού για την Γ' τάξη Λυκείου ΕΠΑΛ. Περιλαμβάνει ασκήσεις κατανόησης, αποδεικτικές, ασκήσεις συμπλήρωσης κενών και απλές υπολογιστικές ασκήσεις.
ΜΕΘΟΔΟΛΟΓΙΑ ΓΙΑ ΤΗΝ ΑΠΟΔΕΙΞΗ ΥΠΑΡΞΗΣ ΡΙΖΩΝ ΣΥΝΕΧΟΥΣ ΚΑΙ ΠΑΡΑΓΩΓΙΣΙΜΗΣ ΣΥΝΑΡΤΗΣΗΣΡεβέκα Θεοδωροπούλου
Στην παρουσίαση αυτή θα δείτε μια μεθοδολογία για την ύπαρξη ριζών συνεχούς και παραγωγίσιμης συνάρτησης, με χρήση των θεωρημάτων Bolzano και Rolle. Θα βρείτε επίσης λυμένα παραδείγματα και κάποιες ασκήσεις για εξάσκηση.
Frame Relay is a WAN protocol that operates at the physical and data link layers using packet switching technology. It provides connection-oriented virtual circuits between devices identified by a data-link connection identifier. Frame Relay supports both permanent virtual circuits that are always active and switched virtual circuits that are temporarily established for data transfer. It implements congestion notification using FECN, BECN and discard eligibility bits and uses CRC for error checking but not correction.
O documento discute conceitos de análise sintática como sujeito, predicado, adjuntos adnominais e adverbiais, e classificação de orações. Explica como identificar elementos essenciais como sujeito, objeto direto e indireto, e tipos de verbos e predicados.
O documento descreve como construir um compilador utilizando ferramentas Java. Ele aborda os principais componentes de um compilador como analisador léxico, analisador sintático, analisador semântico e gerador de código, e como cada um desses componentes é implementado para analisar uma linguagem e gerar código de máquina.
ΜΕΘΟΔΟΛΟΓΙΑ ΓΙΑ ΤΗΝ ΑΠΟΔΕΙΞΗ ΥΠΑΡΞΗΣ ΡΙΖΩΝ ΣΥΝΕΧΟΥΣ ΚΑΙ ΠΑΡΑΓΩΓΙΣΙΜΗΣ ΣΥΝΑΡΤΗΣΗΣΡεβέκα Θεοδωροπούλου
Στην παρουσίαση αυτή θα δείτε μια μεθοδολογία για την ύπαρξη ριζών συνεχούς και παραγωγίσιμης συνάρτησης, με χρήση των θεωρημάτων Bolzano και Rolle. Θα βρείτε επίσης λυμένα παραδείγματα και κάποιες ασκήσεις για εξάσκηση.
Frame Relay is a WAN protocol that operates at the physical and data link layers using packet switching technology. It provides connection-oriented virtual circuits between devices identified by a data-link connection identifier. Frame Relay supports both permanent virtual circuits that are always active and switched virtual circuits that are temporarily established for data transfer. It implements congestion notification using FECN, BECN and discard eligibility bits and uses CRC for error checking but not correction.
O documento discute conceitos de análise sintática como sujeito, predicado, adjuntos adnominais e adverbiais, e classificação de orações. Explica como identificar elementos essenciais como sujeito, objeto direto e indireto, e tipos de verbos e predicados.
O documento descreve como construir um compilador utilizando ferramentas Java. Ele aborda os principais componentes de um compilador como analisador léxico, analisador sintático, analisador semântico e gerador de código, e como cada um desses componentes é implementado para analisar uma linguagem e gerar código de máquina.
O documento descreve as principais etapas de um compilador, incluindo a geração de código intermediário, geração de código objeto, otimização de código e gerenciamento de tabelas de símbolos. O código intermediário representa o programa em uma forma independente da máquina e pode ser otimizado antes de ser traduzido para código de máquina. A geração de código objeto mapeia o código intermediário para instruções da máquina-alvo.
O documento discute os conceitos de compiladores, interpretadores e linkagem no contexto da programação. Explica que compiladores transformam programas de alto nível em código de máquina, enquanto interpretadores fazem isso linha a linha. A linkagem une código objeto e bibliotecas para criar programas executáveis.
Uma DSL para declarar a Ordem de Execução de AspectosGPrimola
Este documento apresenta uma DSL para declarar a ordem de execução de aspectos. A DSL permite definir restrições sobre a execução de advices de aspectos que interceptam um mesmo join point. O documento descreve um estudo de caso em que dois aspectos interceptam o mesmo join point e a DSL é usada para declarar que o advice de compressão deve executar antes do de criptografia. A solução proposta permite também suportar versões antigas do sistema variando a regra de composição usada.
O documento discute inteligência competitiva e como a internet pode ser usada como uma fonte valiosa de informações estratégicas para organizações. Define inteligência competitiva como um processo de coleta e análise de informações sobre concorrentes, clientes e tendências do mercado. Também descreve como a internet oferece acesso global a literatura, especialistas e dados governamentais que podem ser usados nesse processo para gerar vantagem competitiva.
Este documento fornece instruções passo a passo para construir um compilador de análise léxica usando o software FLEX. Ele explica como baixar os arquivos necessários, instalar o FLEX e MinGW, examinar exemplos iniciais, compilar os arquivos de exemplo usando FLEX e MinGW, e testar o resultado.
O documento descreve o compilador GCC, incluindo sua história, versões, estrutura e funcionamento. O GCC (GNU Compiler Collection) foi desenvolvido originalmente por Richard Stallman em 1987 para o projeto GNU. Ele é um compilador multiplataforma, de código aberto, que suporta várias linguagens como C, C++, Java e Fortran. O GCC realiza quatro etapas de compilação: pré-processamento, compilação, montagem e ligação. Sua estrutura inclui front-end, middle-end e back-end para análise, ot
Inteligência Artificial - Inferência Ascendente e DescendenteAldisio Medeiros
Descreve os algoritmos de percurso na base de conhecimento na forma de Horn. Encadeamento pra frente (Inferência Ascendente) e Encadeamento pra trás(Inferência Descendente)
Compilador-Analisador Léxico com FLEX + Linguagem C Aldisio Medeiros
O documento discute o analisador léxico, incluindo tokens, padrões e lexemas. Ele também cobre a estrutura de um analisador léxico em C e como simular a busca de símbolos em uma tabela de símbolos usando tabelas hash.
1. O documento discute conceitos básicos de linguagens formais, incluindo linguagens regulares, expressões regulares e gramáticas regulares.
2. Apresenta perguntas sobre propriedades de linguagens regulares definidas por expressões regulares e aceitas por gramáticas regulares.
3. Discutem aplicações de linguagens formais e propriedades importantes como fechamento e lema do bombeamento.
O documento discute os termos essenciais da oração, incluindo sujeito, predicado e diferentes tipos de sujeito. Explica que o sujeito é o ser do qual se diz alguma coisa e o predicado é aquilo que se declara do sujeito. Também define sujeito simples, sujeito composto, sujeito oculto e sujeito indeterminado.
Este documento apresenta um resumo do guia de bolso "Python - Guia de Bolso". Ele fornece um resumo conciso das instruções, tipos, funções e módulos da linguagem Python, servindo como ferramenta de consulta para desenvolvedores. O guia também inclui informações sobre a história e aplicações da linguagem Python.
O documento apresenta os conceitos básicos da linguagem C++, incluindo: 1) a estrutura de um programa Hello World; 2) a função main(); 3) a biblioteca iostream e o fluxo cout para exibir saída; 4) comentários no código; 5) tipos de dados básicos como int e char; 6) variáveis e atribuição de valores. O documento contém exemplos de código e exercícios para fixar os conceitos apresentados.
Este documento fornece uma introdução à linguagem de programação Python. Resume os principais pontos sobre o que é Python, por que usar Python, e compara Python com outras linguagens. O documento também fornece detalhes sobre recursos, produtividade, aplicações e comunidades de Python.
O documento discute a história e o estado atual da inteligência artificial. Ele começa definindo inteligência e descreve os primeiros estudos da área, incluindo o teste de Turing. Em seguida, discute os desafios atuais da IA, como reconhecimento de voz e visão, e mostra que a IA forte ainda é utópica, embora a IA fraca seja útil. Por fim, levanta questões éticas sobre o desenvolvimento futuro da inteligência artificial.
Este documento fornece uma introdução à análise sintática, explicando os principais elementos da oração como sujeito, predicado, verbo, objeto e predicativo. Ele define cada um destes elementos e fornece exemplos para ilustrar seus usos.
The Currency of Trust: Why Banks and Insurers Must Make Customer Data Safer a...Capgemini
Are banks and insurers a safe pair of hands when it comes to customer data? Our global survey of more than 180 senior data privacy and security professionals – as well as 7,600 consumers – found that less than a third (29%) of these organizations offer both strong data privacy practices and a sound security strategy. Just one in five (21%) are highly confident that they can detect a cybersecurity breach.
This picture has so far not unduly affected consumers’ perceptions of the industry. We found that 83% of consumers trust banks and insurers when it comes to data. And while one in four institutions have reported being victim of a hack, just 3% of consumers believe their own bank or insurer has ever been breached. However, with the pending General Data Protection Regulation (GDPR) regulations, this trust factor is likely to change as transparency increases. Financial organizations have to reveal a data breach 72 hours after the incident.
Banks and insurance firms have a clear incentive therefore to fortify their defences. As well as avoiding the prohibitive fines and penalties that will result from compromised data, protecting privacy offers a strategic business advantage. Addressing security concerns will drive greater adoption of low-cost digital channels. We found that security concerns deter nearly half of consumers (47%) from using digital channels. It will also reduce churn and attract competitors’ customers – 74% of consumers would switch their bank or insurer in the event of a data breach.
Preparing to be a trusted data steward is no easy task, however. It means raising the bar on multiple dimensions:
• Aligning data practices with consumers’ expectations
• Finding innovative ways of providing non-intrusive security to consumers
• Building the capabilities required to monitor cyber risks on a real-time basis
• Revisiting the data governance model.
Building your reputation for data privacy and robust security is definitely challenging. But, those who strike the right chord with consumers will enjoy a competitive advantage over their peers. The winners will be those who triumph in the trust game.
Descrição das técnicas de refatoração de código. Material de apoio à disciplina SI405, Análise de Sistemas de Informação 2, da Faculdade de Tecnologia da UNICAMP.
O documento discute o uso da Web Semântica em aplicações de saúde. Primeiramente, apresenta os conceitos da Web Semântica e suas tecnologias como RDF, OWL e SPARQL. Em seguida, aborda os conceitos de saúde e informática em saúde. Por fim, exemplifica possíveis aplicações da Web Semântica na integração e compartilhamento de informações em saúde.
Slides do minicurso oferecido na VII Tecnologia em Foco, na Faculdade de Tecnologia da Universidade Estadual de Campinas (FT-UNICAMP), em setembro de 2016
O documento discute os principais autores e conceitos da linguagem de modelagem unificada (UML), incluindo visões de implementação, descrições textuais e diagramas UML.
Uma breve revisão dos conceitos fundamentais de Java e de JUnit que serão necessários para a execução das atividades práticas de SI405 - Análise de Sistemas de Informação II, disciplina dos Cursos de Informática da Faculdade de Tecnologia da UNICAMP
C++: biblioteca padrão de templates - Parte 1Ivan Ricarte
O documento descreve as funcionalidades da classe string em C++, incluindo seus construtores, métodos para contar caracteres, verificar se está vazia, obter substrings e caracteres individuais. Também menciona vetores de inteiros e datas, além de iteradores e a declaração automática de tipo com "auto".
O documento descreve a alocação dinâmica de memória para objetos e a remoção de objetos sem liberar a memória alocada, o que pode causar vazamento de memória.
1. O documento discute os padrões de projeto de software, que são soluções reutilizáveis para problemas comuns em projeto de software. 2. São apresentados 23 padrões, como Adapter, Composite, Observer e Strategy, explicando suas intenções e como resolvem problemas de projeto. 3. Também discute conceitos importantes como herança, composição, acoplamento e encapsulamento que os padrões ajudam a aplicar.
This document contains C++ operators including arithmetic, assignment, comparison, logical, bitwise, increment/decrement, member access, new/delete, and other syntax symbols used in C++ such as brackets, parentheses and commas. It lists single-character operators like + - * / as well as multi-character operators like += -= and new delete.
Material complementar de SI405 - Análise de Sistemas de Informação II, da FT-UNICAMP, com uma revisão de como os modelos UML são refletidos no código orientado a objetos.
Princípios da organização de código fonte C++Ivan Ricarte
Este documento descreve os conceitos básicos de programação em C++, incluindo atributos, operações, cabeçalhos, declaração e definição de métodos. Ele também discute como salvar, compilar e executar arquivos C++.
Problemas no desenvolvimento do softwareIvan Ricarte
Apresenta a síndrome do "não foi feito", onde as pessoas culpam os outros por seus próprios erros ou falta de progresso, e argumenta que devemos manter as coisas simples e focar em entregar valor regularmente.
Aula 01 - As linguagens do software (2015)Ivan Ricarte
This document provides references to resources about engineering processes like reverse engineering, reengineering, and unified modeling language (UML) diagrams. It lists authors like Booch, Rumbaugh, Coad and Yourdon who have contributed to these fields. It also includes links to online tutorials and documentation about UML diagrams, agile modeling, C++, and the Java tutorial.
SI300 - Apoio a atividades práticas em C++ (01)Ivan Ricarte
This document provides a timeline of the C and C++ programming languages from 1967 to present day. It shows the evolution from BCPL to K&R C to the addition of classes in C++. It also lists some key differences in keywords between classic C and modern C++. Finally, it provides three tips for learning C++, including not to panic, not needing to know all details, and focusing on techniques over features.
O Projeto Evid@SP - Disseminação de evidências a profissionais da saúdeIvan Ricarte
Apresentação do Projeto Evid@SP - Impacto das informações disponibilizadas no portal Saúde Baseada em Evidências na prática clínica dos profissionais de saúde do Estado de São Paulo, realizada em 15 de outubro de 2014, na reunião do Marco Zero do Projeto PPSUS/FAPESP, no Instituto da Saúde, em São Paulo (SP)
As classes de modelagem podem ser comparadas a moldes ou
formas que definem as características e os comportamentos dos
objetos criados a partir delas. Vale traçar um paralelo com o projeto de
um automóvel. Os engenheiros definem as medidas, a quantidade de
portas, a potência do motor, a localização do estepe, dentre outras
descrições necessárias para a fabricação de um veículo
A linguagem C# aproveita conceitos de muitas outras linguagens,
mas especialmente de C++ e Java. Sua sintaxe é relativamente fácil, o que
diminui o tempo de aprendizado. Todos os programas desenvolvidos devem
ser compilados, gerando um arquivo com a extensão DLL ou EXE. Isso torna a
execução dos programas mais rápida se comparados com as linguagens de
script (VBScript , JavaScript) que atualmente utilizamos na internet
2. Sumário
Reconhecimento de sentenças
Derivações canônicas
Árvores sintáticas
Gramáticas ambíguas
Analisadores sintáticos
Autômato de pilha
Analisador sintático preditivo
Analisador de precedência fraca
Geradores de analisadores sintáticos
Especificação da gramática
Manipulação das sentenças reconhecidas
Desenvolvimento de uma aplicação
I NTRODUÇÃO À COMPILAÇÃO
3. Análise sintática
Arquivo de análise
Arquivo de
... síntese destino
origem léxica
análise
sintática
análise
Estruturas
Gramáticas internas
I NTRODUÇÃO À COMPILAÇÃO
4. Reconhecimento de sentenças
O reconhecimento de sentenças, ou parsing, é o
procedimento que verifica se uma dada sentença pertence
à linguagem gerada por uma gramática.
Gramáticas tipo 2, ou gramáticas livres de contexto, são
adequadas para representar boa parte das características
de linguagens de programação.
I NTRODUÇÃO À COMPILAÇÃO
5. Validação de uma sentença
Há duas formas de validar uma sentença:
Top-down ou descendente: a partir do símbolo sentencial,
selecionar uma seqüência de aplicação de regras
e aplicá-las, substituindo o lado esquerdo pelo
lado direito, até que se obtenha a sentença sob
análise; ou
Bottom-up ou ascendente: a partir da sentença, selecionar
uma seqüência de aplicação de regras e
aplicá-las, substituindo o lado direito pelo lado
esquerdo, até que reste apenas o símbolo
sentencial.
I NTRODUÇÃO À COMPILAÇÃO
6. Reconhecimento de sentenças
Exemplo: uma gramática para expressões
Para reconhecer expressões (E):
E → E +E 1
E → E ×E 2
E → (E) 3
E → v 4
A expressão (v + v ) × v faz parte dessa gramática?
I NTRODUÇÃO À COMPILAÇÃO
7. Estratégias de validação
Há duas formas de responder a essa questão:
Validação descendente A partir do símbolo sentencial E,
procura aplicar produções da gramática
substituindo o lado esquerdo pelo lado direito até
que a sentença (v + v ) × v seja derivada
Validação ascendente A partir da sentença (v + v ) × v ,
procura aplicar produções da gramática
substituindo o lado direito pelo lado esquerdo até
que reste apenas o símbolo sentencial E
I NTRODUÇÃO À COMPILAÇÃO
8. Validação descendente
Produções Derivações
E → E +E 1
E → E ×E 2 2
E =⇒ E × E
E → (E) 3
3
E → v 4 =⇒ (E) × E
1
=⇒ (E + E) × E
4
=⇒ (v + E) × E
4
=⇒ (v + v ) × E
4
=⇒ (v + v ) × v
Seqüência 2, 3, 1, 4, 4, 4
I NTRODUÇÃO À COMPILAÇÃO
9. Validação descendente
Outras seqüências de reconhecimento podem ser obtidas para
essa mesma estratégia:
2, 3, 4, 1, 4, 4
2 3 4
E =⇒ E × E =⇒ (E) × E =⇒ (E) × v
1 4 4
=⇒ (E + E) × v =⇒ (E + v ) × v =⇒ (v + v ) × v
2, 4, 3, 1, 4, 4
2 4 3
E =⇒ E × E =⇒ E × v =⇒ (E) × v
1 4 4
=⇒ (E + E) × v =⇒ (E + v ) × v =⇒ (v + v ) × v
I NTRODUÇÃO À COMPILAÇÃO
10. Validação ascendente
Produções Derivações
E → E +E 1
E → E ×E 2 4
(v + v ) × v ⇐= (E + v ) × v
E → (E) 3
4
E → v 4 ⇐= (E + E) × v
4
⇐= (E + E) × E
1
⇐= (E) × E
3
⇐= E × E
2
⇐= E
Seqüência de reconhecimento 4, 4, 4, 1, 3, 2
Também há outras seqüências
I NTRODUÇÃO À COMPILAÇÃO
11. Derivações canônicas
Forma sistemática de selecionar qual símbolo da forma
sentencial será substituído na próxima derivação
Duas formas
Derivação canônica mais à esquerda (leftmost derivation)
Derivação canônica mais à direita (rightmost derivation)
Para uma derivação canônica, a seqüência de
reconhecimento é única
I NTRODUÇÃO À COMPILAÇÃO
12. Derivações canônicas
Derivação canônica mais à esquerda
Derivação canônica mais à esquerda aplica uma produção da
gramática para substituir o símbolo não-terminal
mais à esquerda da forma sentencial
A seqüência de produções aplicadas desde o símbolo
sentencial até a sentença é denominada a seqüência de
reconhecimento mais à esquerda, ou leftmost parse
I NTRODUÇÃO À COMPILAÇÃO
13. Derivações canônicas
Derivação canônica mais à direita
Derivação canônica mais à direita símbolo não-terminal mais à
direita da forma sentencial é selecionado para ser
substituído pela aplicação de uma produção da
gramática
A seqüência de reconhecimento mais à direita, ou
rightmost parse, é dada pelo reverso da seqüência de
produções associada à derivação
É a seqüência de aplicação de produções para partir da
sentença e alcançar o símbolo sentencial
I NTRODUÇÃO À COMPILAÇÃO
14. Derivações canônicas
Exemplo
Produções
E → E +E 1
E → E ×E 2
E → (E) 3
E → v 4
Derivações canônicas para (v + v ) × v
Seqüência de reconhecimento mais à esquerda:
2, 3, 1, 4, 4, 4
Seqüência de reconhecimento mais à direita:
4, 4, 1, 3, 4, 2
I NTRODUÇÃO À COMPILAÇÃO
15. Árvores sintáticas
Representação das derivações utilizadas no reconhecimento
de uma sentença através de uma estrutura de árvore
Em uma árvore sintática:
1. a raiz da árvore é um nó com o símbolo sentencial;
2. as folhas da árvore são símbolos terminais, na mesma
seqüência em que estes ocorrem na sentença analisada; e
3. os nós intermediários da árvore correspondem a símbolos
não terminais, onde um nó cujo rótulo é P com filhos
s1 , s2 , . . . , sn pode ocorrer apenas se houver uma regra
P → s1 s2 . . . sn na gramática.
I NTRODUÇÃO À COMPILAÇÃO
16. Árvores sintáticas
Subárvores para a gramática de expressões
E →E ×E
E →E +E
E
E
E × E
E + E
E →v
E → (E)
E
( E )
v
I NTRODUÇÃO À COMPILAÇÃO
17. Árvore sintática para (v + v ) × v
E
E × E
v
( E )
E + E
v v
I NTRODUÇÃO À COMPILAÇÃO
18. Árvores sintáticas
Relação com derivações canônicas
Estrutura da árvore sintática independe da seqüência de
derivações utilizada para reconhecimento
Uma derivação canônica está associada à estratégia
utilizada para percorrer seqüencialmente os elementos da
árvore
pré-ordem raiz antes das folhas, folhas da esquerda para
a direita
seqüência de reconhecimento mais à esquerda
pós-ordem folhas da esquerda para a direita, raiz depois
das folhas
seqüência de reconhecimento mais à direita
I NTRODUÇÃO À COMPILAÇÃO
19. Gramáticas ambíguas
Gramática é ambígua se for possível obter, para uma
sentença, mais de uma árvore sintática
De modo equivalente, é ambígua se houver mais que uma
seqüência de reconhecimento mais à direita
Ou mais de uma seqüência de reconhecimento mais à
esquerda
Ou ainda, mais de uma derivação canônica mais à
esquerda
Ou mais de uma derivação canônica mais à direita
I NTRODUÇÃO À COMPILAÇÃO
20. Gramáticas ambíguas
Exemplo
Considere a sentença v + v × v em
E → E +E 1
E → E ×E 2
E → (E) 3
E → v 4
I NTRODUÇÃO À COMPILAÇÃO
21. Gramáticas ambíguas
Exemplo: árvore 1
E
E + E
v E × E
v v
seqüência de reconhecimento mais à esquerda 1, 4, 2, 4, 4
seqüência de reconhecimento mais à direita 4, 4, 4, 2, 1
I NTRODUÇÃO À COMPILAÇÃO
22. Gramáticas ambíguas
Exemplo: árvore 2
E
E × E
E + E v
v v
seqüência de reconhecimento mais à esquerda 2, 1, 4, 4, 4
seqüência de reconhecimento mais à direita 4, 4, 1, 4, 2
I NTRODUÇÃO À COMPILAÇÃO
23. Versão não-ambígua da gramática de expressões
E → E +M 1
E → M 2
M → M ×P 3
M → P 4
P → (E) 5
P → v 6
I NTRODUÇÃO À COMPILAÇÃO
24. Mesma sentença, na gramática revista
Única interpretação possível para v + v × v
Por exemplo, para o reconhecimento descendente:
E
1 2
E ⇒E +M ⇒M +M
4 6
E + M
⇒P +M ⇒v +M
3 4 M M × P
⇒v +M ×P ⇒v +P ×P
6 6
⇒v +v ×P ⇒v +v ×v P P v
v v
I NTRODUÇÃO À COMPILAÇÃO
25. Analisadores sintáticos
Programas que reconhecem automaticamente sentenças
de uma dada gramática livre de contexto
Como para analisadores léxicos, um autômato é uma
representação abstrata para o analisador
No entanto, para o analisador sintático o autômato precisa
de uma memória auxiliar:
Pilha estrutura linear com política de acesso LIFO
(Last In, First Out)
I NTRODUÇÃO À COMPILAÇÃO
26. Autômato de pilha
Definição formal
Sêxtupla M = (K , Σ, Γ, δ, s, F ), na qual os elementos são:
1. o conjunto finito de estados, K ;
2. o alfabeto de entrada finito, Σ;
3. o alfabeto de pilha finito, Γ;
4. a função de transição, δ : K × Σ × Γ → K × Γ;
5. o estado inicial, s, s ∈ K ; e
6. o conjunto de estados finais, F , com F ⊆ K .
I NTRODUÇÃO À COMPILAÇÃO
27. Analisadores sintáticos
Analisadores utilizam o autômato de pilha para reconhecer
sentenças de uma linguagem livre de contexto
Podem usar a técnica de construção descendente ou
ascendente
Descendente Pilha começa com símbolo sentencial
Ascendente Pilha começa vazia
Exemplos de analisadores
Analisador sintático preditivo construção descendente
Analisador de precedência fraca construção ascendente
I NTRODUÇÃO À COMPILAÇÃO
28. Analisador sintático preditivo
Analisador apropriado para gramáticas LL(1)
Varredura da sentença ocorre da esquerda para a direita
(Left-to-right)
Derivação canônica mais à esquerda (Leftmost derivation)
Um único símbolo da sentença (lookahead) analisado a
cada passo
I NTRODUÇÃO À COMPILAÇÃO
29. Analisador sintático preditivo
Gramáticas LL(1)
Gramática com produções A → α e A → β é LL(1) se:
1. α e β não iniciam com o mesmo símbolo terminal
Ou com símbolos não-terminais cujas expansões iniciem
com o mesmo símbolo terminal
2. Só α ou só β tem expansões que levam à string vazia
3. Se α leva à string vazia, β não inicia expansão com
símbolo terminal que possa ocorrer imediatamente à
direita de A
I NTRODUÇÃO À COMPILAÇÃO
30. Analisador sintático preditivo
Conversão de produções recursivas
Técnica de construção descendente não pode ser aplicada
a gramáticas com produções recursivas à esquerda
Se houver produção dessa forma, é necessário
convertê-la:
Para
De
A→δA
A→Aβ
A →βA
A→δ
A →ε
I NTRODUÇÃO À COMPILAÇÃO
31. Construção do analisador sintático preditivo
Uma tabela sintática representa as operações possíveis
para o autômato associado ao analisador
Construção dessa tabela é feita pela análise de cada
produção
Para cada par símbolo não-terminal, símbolo terminal, a
tabela indica qual produção deve ser aplicada, se possível
Símbolo terminal é o próximo símbolo da sentença
Símbolo não-terminal é o símbolo no topo da pilha
Além dos símbolos terminais, um delimitador de sentença
(denotado aqui por $ ) é uma entrada reconhecida pela
tabela
I NTRODUÇÃO À COMPILAÇÃO
32. Construção da tabela sintática
Para cada produção A → B na gramática,
Insira a produção na tabela sintática na linha A, coluna t,
para cada símbolo terminal t que pode iniciar a expansão
de B
Se B = ε, então insira a produção na tabela sintática na
linha A, coluna t para cada símbolo terminal t que pode
ocorrer à direita de A, sendo que:
O delimitador $ pode estar à direita do símbolo sentencial;
t pode ser um símbolo terminal que inicia a expansão de
um símbolo não-terminal que ocorre à direita de A em
alguma produção
Para cada produção na forma A → . . . B, os símbolos que
podem ocorrer à direita de A também podem ocorrer à
direita de B
I NTRODUÇÃO À COMPILAÇÃO
33. Construção da tabela sintática
Exemplo
Considere a construção do analisador sintático preditivo para a
seguinte gramática de expressões:
Gramática original
E → E +M 1
E → M 2
M → M ×P 3
M → P 4
P → (E) 5
P → v 6
I NTRODUÇÃO À COMPILAÇÃO
34. Construção da tabela sintática
Conversão da gramática
Inicialmente, é preciso eliminar das produções da gramática
qualquer recursão à esquerda:
Gramática equivalente sem recursão à esquerda
E → ME (1)
E → +ME (2)
E →ε (3)
M → PM (4)
M → ×PM (5)
M →ε (6)
P → (E) (7)
P→v (8)
I NTRODUÇÃO À COMPILAÇÃO
35. Construção da tabela sintática
Análise das produções (1)
A seguir, cada produção é analisada para obter as entradas na
tabela:
Produção 1: E → ME
Os símbolos terminais que podem iniciar a expansão de E
são aqueles que iniciam a expansão de M
Por sua vez, M → PM — expansão de P
Como P → (E) e P → v , os símbolos terminais que
podem iniciar essa expansão são ( e v
... ( ... v ...
E P1 P1
I NTRODUÇÃO À COMPILAÇÃO
36. Construção da tabela sintática
Análise das produções (2)
Produção 2: E → +ME
Um símbolo terminal pode iniciar a expansão de E por
essa produção: +
... + ... ... ...
E P2
I NTRODUÇÃO À COMPILAÇÃO
37. Construção da tabela sintática
Análise das produções (3)
Produção 3: E → ε
Não há expansão, a segunda regra deve ser usada
Se A → ε, então insira a produção na tabela sintática na
linha A, coluna t para cada símbolo terminal t que pode
ocorrer à direita de A
Pelas produções, não há nenhum símbolo que ocorra
diretamente à direita de E
Como E → ME , o que pode ocorrer à direita de E
também pode indiretamente ocorrer à direita de E
$ (E é o símbolo sentencial) e ) (pela produção P → (E))
... ) ... $ ...
E P3 P3
I NTRODUÇÃO À COMPILAÇÃO
38. Construção da tabela sintática
Análise das produções (4)
Produção 4: M → PM
Os símbolos terminais que podem iniciar a expansão de M
são aqueles que iniciam a expansão de P
Como P → (E) e P → v , os símbolos terminais que
podem iniciar essa expansão são ( e v
... ( ... v ...
M P4 P4
I NTRODUÇÃO À COMPILAÇÃO
39. Construção da tabela sintática
Análise das produções (5)
Produção 5: M → ×PM
Um símbolo terminal pode iniciar a expansão de M por
essa produção: ×
... × ... ... ...
M P5
I NTRODUÇÃO À COMPILAÇÃO
40. Construção da tabela sintática
Análise das produções (6)
Produção 6: M → ε
Não há expansão, a segunda regra deve ser usada
Pelas produções, não há nenhum símbolo que ocorra
diretamente à direita de M
Como M → PM , o que pode ocorrer à direita de M
também pode indiretamente ocorrer à direita de M
Pelas produções 1 e 2, E aparece à direita de M; a
expansão de E pode iniciar com +
Como E → ε pela produção 3, é preciso incluir também os
símbolos que podem ocorrer à direita de E, pois E → ME :
$ e)
... ) + $ ...
M P6 P6 P6
I NTRODUÇÃO À COMPILAÇÃO
41. Construção da tabela sintática
Análise das produções (7)
Produção 7: P → (E)
Um símbolo terminal pode iniciar a expansão de P por
essa produção: (
... ( ... ... ...
P P7
I NTRODUÇÃO À COMPILAÇÃO
42. Construção da tabela sintática
Análise das produções (8)
Produção 8: P → v
Um símbolo terminal pode iniciar a expansão de P por
essa produção: v
... v ... ... ...
P P8
I NTRODUÇÃO À COMPILAÇÃO
43. Construção da tabela sintática
Resultado
Tabela sintática derivada das produções
+ × ( ) v $
E P1 P1
E P2 P3 P3
M P4 P4
M P6 P5 P6 P6
P P7 P8
I NTRODUÇÃO À COMPILAÇÃO
44. Reconhecimento de sentenças
O reconhecimento da sentença com o analisador preditivo
utiliza duas estruturas auxiliares
1. Uma pilha com a forma sentencial resultante da aplicação
das produções, inicialmente com o símbolo sentencial
(precedido do delimitador de sentença, $ )
2. Uma lista com os símbolos terminais que compõem a
sentença, com o delimitador de sentença $ ao final
Quando o topo da pilha e o início da sentença têm o
mesmo símbolo, ambos são retirados
Condição de reconhecimento ocorre quando a pilha de
símbolos e a sentença tornam-se vazias
I NTRODUÇÃO À COMPILAÇÃO
45. Reconhecimento de sentenças
Exemplo: sentença v + v × v (1)
Estado inicial:
Pilha Lista de tokens Árvore sintática
v +v × v $ E
E
$
I NTRODUÇÃO À COMPILAÇÃO
46. Reconhecimento de sentenças
Exemplo: sentença v + v × v (2)
Para [E, v ], tabela indica aplicação da produção 1: E → ME
Pilha Lista de tokens Árvore sintática
v +v × v $ E
M
E M E
$
I NTRODUÇÃO À COMPILAÇÃO
47. Reconhecimento de sentenças
Exemplo: sentença v + v × v (3)
Para [M, v ], tabela indica aplicação da produção 4: M → PM
Pilha Lista de tokens Árvore sintática
v +v × v $ E
P
M M E
E
P M
$
I NTRODUÇÃO À COMPILAÇÃO
48. Reconhecimento de sentenças
Exemplo: sentença v + v × v (4)
Para [P, v ], tabela indica aplicação da produção 8: P → v
Pilha Lista de tokens Árvore sintática
v +v × v $ E
v
M M E
E
P M
$
v
I NTRODUÇÃO À COMPILAÇÃO
49. Reconhecimento de sentenças
Exemplo: sentença v + v × v (5)
Mesmo símbolo no topo da pilha e no início da lista:
consumi-los
Pilha Lista de tokens Árvore sintática
+ v ×v $ E
M
E M E
$ P M
v
I NTRODUÇÃO À COMPILAÇÃO
50. Reconhecimento de sentenças
Exemplo: sentença v + v × v (6)
Para [M , +], tabela indica aplicação da produção 6: M → ε
Pilha Lista de tokens Árvore sintática
+ v ×v $ E
E
M E
$
P M
v ε
I NTRODUÇÃO À COMPILAÇÃO
51. Reconhecimento de sentenças
Exemplo: sentença v + v × v (7)
Para [E , +], produção 2: E → +ME
Pilha Lista de tokens Árvore sintática
+ v ×v $ E
+
M M E
E
P M + M E
$
v ε
I NTRODUÇÃO À COMPILAÇÃO
52. Reconhecimento de sentenças
Exemplo: sentença v + v × v (8)
Mesmo símbolo no topo da pilha e início da lista: consumi-los
Pilha Lista de tokens Árvore sintática
v ×v $ E
M
E M E
$
P M + M E
v ε
I NTRODUÇÃO À COMPILAÇÃO
53. Reconhecimento de sentenças
Exemplo: sentença v + v × v (9)
Para [M, v ], produção 4: M → PM
Pilha Lista de tokens Árvore sintática
v ×v $ E
P
M
M E
E
$ P M
+ M E
v ε
P M
I NTRODUÇÃO À COMPILAÇÃO
54. Reconhecimento de sentenças
Exemplo: sentença v + v × v (10)
Para [P, v ], produção 8: P → v
Pilha Lista de tokens Árvore sintática
v ×v $ E
v
M
M E
E
$ P M
+ M E
v ε
P M
v
I NTRODUÇÃO À COMPILAÇÃO
55. Reconhecimento de sentenças
Exemplo: sentença v + v × v (11)
Mesmo símbolo no topo da pilha e início da lista: consumi-los
Pilha Lista de tokens Árvore sintática
× v $ E
M
E
M E
$
P M
+ M E
v ε
P M
v
I NTRODUÇÃO À COMPILAÇÃO
56. Reconhecimento de sentenças
Exemplo: sentença v + v × v (12)
Para [M , ×], produção 5: M → ×PM
Pilha Lista de tokens
× v $
×
P
M
E
$
I NTRODUÇÃO À COMPILAÇÃO
58. Reconhecimento de sentenças
Exemplo: sentença v + v × v (14)
Mesmo símbolo no topo da pilha e início da lista: consumi-los
Pilha Lista de tokens
v $
P
M
E
$
I NTRODUÇÃO À COMPILAÇÃO
59. Reconhecimento de sentenças
Exemplo: sentença v + v × v (15)
Para [P, v ], produção 8: P → v
Pilha Lista de tokens
v $
v
M
E
$
I NTRODUÇÃO À COMPILAÇÃO
61. Reconhecimento de sentenças
Exemplo: sentença v + v × v (17)
Mesmo símbolo no topo da pilha e início da lista: consumi-los
Pilha Lista de tokens
$
M
E
$
I NTRODUÇÃO À COMPILAÇÃO
62. Reconhecimento de sentenças
Exemplo: sentença v + v × v (18)
Para [M , $ ], produção 6: M → ε
Pilha Lista de tokens
$
E
$
I NTRODUÇÃO À COMPILAÇÃO
64. Reconhecimento de sentenças
Exemplo: sentença v + v × v (20)
Para [E , $ ], produção 3: E → ε
Pilha Lista de tokens
$
$
Condição de aceitação
Símbolo delimitador de sentença $ no topo da pilha e no
início da lista de tokens
I NTRODUÇÃO À COMPILAÇÃO
65. Reconhecimento de sentenças
Exemplo: sentença v + v × v (21)
Árvore sintática final
E
M E
P M
v ε + M E
P M ε
v × P M
v ε
I NTRODUÇÃO À COMPILAÇÃO
66. Analisador sintático preditivo
Construção da árvore sintática é descendente
Começa com o símbolo sentencial (conteúdo inicial da
pilha)
Cada vez que uma produção é selecionada para aplicação,
o nó não terminal mais à esquerda da árvore é expandido
em uma subárvore com o lado direito da produção
Quando símbolo mais à esquerda da árvore é terminal, se
for igual ao próximo símbolo da sentença há continuidade
I NTRODUÇÃO À COMPILAÇÃO
67. Analisador de precedência fraca
Analisador baseado na técnica de construção ascendente
Sentença é reconhecida quanto todos os símbolos da
sentença são lidos e na forma sentencial resta apenas o
símbolo sentencial
Corresponde à criação da árvore sintática das folhas para
a raiz
Sentença reconhecida quando todos os símbolos da
sentença estão associados às folhas da árvore sintática e a
raiz é o símbolo sentencial
I NTRODUÇÃO À COMPILAÇÃO
68. Gramáticas de precedência fraca
A gramática deve ser de precedência fraca para que o
correspondente analisador de precedência fraca seja
determinístico
Sem produções com string vazia no lado direito
Unicamente inversível (sem duas produções com mesmo
lado direito)
Livre de ciclos
Se X Y ou X ≈ Y , então X Y não ocorre
Que relações são estas?
I NTRODUÇÃO À COMPILAÇÃO
69. Relações de Wirth-Weber
1. X ≈ Y se existe pelo menos uma produção em G cujo
lado direito tenha X imediatamente antes de Y ,
A → αXY β
sendo α e β quaisquer strings em G.
I NTRODUÇÃO À COMPILAÇÃO
70. Relações de Wirth-Weber
2. X Y se existe um símbolo não terminal Z ∈ VN tal que
X ≈ Z e Y ∈ ESQ(Z )
Definição auxiliar
+
ESQ(X ) = {Y ∈ VT ∪ VN |X ⇒ Y α, para α ∈ (VT ∪ VN )∗}
I NTRODUÇÃO À COMPILAÇÃO
71. Relações de Wirth-Weber
3. X a, a ∈ VT , se uma das duas condições é verdadeira:
Existe um símbolo não-terminal Z ∈ VN tal que
Z ≈ a e X ∈ DIR(Z )
ou
Existem símbolos não-terminais Z1 , Z2 ∈ VN tal que
Z1 ≈ Z2 e X ∈ DIR(Z1 ) e a ∈ ESQ(Z2 )
Definição auxiliar
+
DIR(X ) = {Y ∈ VT ∪ VN |X ⇒ αY , para α ∈ (VT ∪ VN )∗}
I NTRODUÇÃO À COMPILAÇÃO
72. Condições para construção do analisador
Além das já apresentadas:
Se duas produções terminam com mesma seqüência de
símbolos β
A → αX β
e
B→β
O par de símbolos X , B não pode estar associado por
nenhuma das relações de Wirth-Weber
I NTRODUÇÃO À COMPILAÇÃO
74. Conjuntos DIR e ESQ
Gramática de expressões
ESQ(E) = {E, M, P, (, v } DIR(E) = {M, P, ), v }
ESQ(M) = {M, P, (, v } DIR(M) = {P, ), v }
ESQ(P) = {(, v } DIR(P) = {), v }
I NTRODUÇÃO À COMPILAÇÃO
75. Tabela das relações de Wirth-Weber
Gramática de expressões
E M P + × ( ) v
E ≈ ≈
M ≈
P
+ ≈
× ≈
( ≈
)
v
I NTRODUÇÃO À COMPILAÇÃO
76. Construção da tabela de deslocamento e redução
Analisador utiliza uma tabela para decidir que ação tomar
durante o reconhecimento de uma sentença
deslocar realizar a leitura do próximo símbolo da
sentença
reduzir substituir, na forma sentencial, símbolo(s)
corrente(s) pelo lado esquerdo de uma
produção
Construção da Tabela DR pela análise de relações obtidas
pela análise das produções da gramática
I NTRODUÇÃO À COMPILAÇÃO
77. Tabela DR
Duas regras adicionais são consideradas para obter
relações que envolvem o símbolo delimitador de sentença,
$ e o símbolo sentencial S:
$ X para cada símbolo X ∈ ESQ(S)
X $ para cada símbolo X ∈ DIR(S)
Para um símbolo qualquer X e um símbolo terminal t:
X t ou X ≈ t: Deslocar (D)
X t: Reduzir (R)
I NTRODUÇÃO À COMPILAÇÃO
78. Tabela DR para a gramática de expressões
Relações adicionais
ESQ(E) = {E, M, P, (, v }
DIR(E) = {M, P, ), v }
$ E
M $
$ M
P $
$ P
) $
$ (
v $
$ v
I NTRODUÇÃO À COMPILAÇÃO
79. Tabela DR para a gramática de expressões
+ × ( ) v $
E D D
M R D R R
P R R R R
+ D D
× D D
( D D
) R R R R R
v R R R R R
$ D D
I NTRODUÇÃO À COMPILAÇÃO
80. Reconhecimento de sentença
Estruturas auxiliares
Como o analisador preditivo, trabalha com duas estruturas
auxiliares:
Pilha para a forma sentencial, inicialmente apenas com o
delimitador de sentença $
Lista com os símbolos da sentença, com o delimitador $
ao final
I NTRODUÇÃO À COMPILAÇÃO
81. Reconhecimento de sentença
Procedimento
Analisador verifica topo da pilha (linha na tabela DR) e próximo
símbolo da sentença (coluna na tabela DR) para decidir qual
próxima ação
D Empilha o próximo símbolo da sentença
R Os símbolos no topo da pilha correspondem ao
lado direito de alguma produção, substituir pelo
correspondente lado esquerdo
Se não houver ação D ou R na linha e coluna indicada, então
há uma situação de erro.
I NTRODUÇÃO À COMPILAÇÃO
82. Reconhecimento de sentença
Exemplo (1): Estado inicial
Para reconhecer sentença v + v × v da gramática de
expressões, o estado inicial é:
Pilha Lista de tokens
v +v × v $
$
I NTRODUÇÃO À COMPILAÇÃO
83. Reconhecimento de sentença
Exemplo (2)
Para [ $ , v ], ação indicada é deslocar:
Pilha Lista de tokens Árvore sintática
+ v × v $ v
v
$
I NTRODUÇÃO À COMPILAÇÃO
84. Reconhecimento de sentença
Exemplo (3)
Para [v , +], ação indicada é reduzir (P → v ):
Pilha Lista de tokens Árvore sintática
+ v × v $ P
P
$ v
I NTRODUÇÃO À COMPILAÇÃO
85. Reconhecimento de sentença
Exemplo (4)
Para [P, +], reduzir (M → P):
Pilha Lista de tokens Árvore sintática
+ v × v $ M
M
$ P
v
I NTRODUÇÃO À COMPILAÇÃO
86. Reconhecimento de sentença
Exemplo (5)
Para [M, +], reduzir (E → M):
Pilha Lista de tokens Árvore sintática
+ v × v $ E
E
$ M
P
v
I NTRODUÇÃO À COMPILAÇÃO
87. Reconhecimento de sentença
Exemplo (6)
Para [E, +], deslocar:
Pilha Lista de tokens Árvore sintática
v ×v $ E +
+
E M
$
P
v
I NTRODUÇÃO À COMPILAÇÃO
88. Reconhecimento de sentença
Exemplo (7)
Para [+, v ], deslocar:
Pilha Lista de tokens Árvore sintática
× v $ E + v
v
+ M
E
P
$
v
I NTRODUÇÃO À COMPILAÇÃO
89. Reconhecimento de sentença
Exemplo (8)
Para [v , ×], reduzir (P → v ):
Pilha Lista de tokens Árvore sintática
× v $ E + P
P
+ M v
E
P
$
v
I NTRODUÇÃO À COMPILAÇÃO
90. Reconhecimento de sentença
Exemplo (9)
Para [P, ×], reduzir (M → P):
Pilha Lista de tokens Árvore sintática
× v $ E + M
M
+ M P
E
P v
$
v
I NTRODUÇÃO À COMPILAÇÃO
91. Reconhecimento de sentença
Exemplo (10)
Para [M, ×], deslocar:
Pilha Lista de tokens Árvore sintática
v $ E + M ×
×
M M P
+
E P v
$
v
I NTRODUÇÃO À COMPILAÇÃO
92. Reconhecimento de sentença
Exemplo (11)
Para [×, v ], deslocar:
Pilha Lista de tokens Árvore sintática
$ E + M × v
v
× M P
M
+ P v
E
v
$
I NTRODUÇÃO À COMPILAÇÃO
93. Reconhecimento de sentença
Exemplo (12)
Para [v , $ ], reduzir (P → v ):
Pilha Lista de tokens Árvore sintática
$ E + M × P
P
× M P v
M
+ P v
E
v
$
I NTRODUÇÃO À COMPILAÇÃO
94. Reconhecimento de sentença
Exemplo (13)
Para [P, $ ], reduzir (M → M × P):
Pilha Lista de tokens Árvore sintática
$ E + M
M
+ M M × P
E
P P v
$
v v
I NTRODUÇÃO À COMPILAÇÃO
95. Reconhecimento de sentença
Exemplo (14)
Para [M, $ ], reduzir (E → E + M):
Pilha Lista de tokens Árvore sintática
$ E
E
$
E + M
Condição de aceitação M M × P
Todos os tokens
consumidos e apenas P P v
símbolo sentencial na
pilha v v
I NTRODUÇÃO À COMPILAÇÃO
96. Analisador de deslocamento e redução
Construção ascendente da árvore sintática
Para construção de uma tabela DR sem conflitos (duas
possíveis ações numa mesma linha e coluna), gramática
deve ser uma gramática de operadores
Nenhuma produção com dois símbolos não-terminais
juntos no lado direito
Nenhuma produção com ε do lado direito
I NTRODUÇÃO À COMPILAÇÃO
97. Analisador de deslocamento e redução
É um analisador LR(1)
L Varredura da sentença da esquerda para a direita
(Left to right)
R Derivação canônica mais à direita é utilizada para
o reconhecimento (Rightmost derivation)
(1) Um símbolo da sentença analisado por vez para
decidir a ação a ser tomada
I NTRODUÇÃO À COMPILAÇÃO
98. Geradores de analisadores sintáticos
Como para análise léxica, procedimentos para construção
dos analisadores léxicos são sistemáticos
Podem ser automatizados
Papel das ferramentas para gerar analisadores sintáticos
Operam conjuntamente com analisadores léxicos
I NTRODUÇÃO À COMPILAÇÃO
99. Gerador de analisador sintático
Yacc
Yet Another Compiler-Compiler
Programa original do ambiente Unix, desenvolvido para
trabalhar juntamente com o lex
Gera uma função C que implementa um analisador
sintático LR(1) a partir de uma especificação de gramática
Como lex, deu origem a vários programas similares
Outras implemetações e outras linguagens
I NTRODUÇÃO À COMPILAÇÃO
100. Especificação do analisador
Formato yacc
Como arquivo lex, três seções separadas por %%:
1. Definições e declarações
2. Regras da gramática e ações associadas
3. Código complementar
I NTRODUÇÃO À COMPILAÇÃO
101. Especificação da gramática
Notação estilo BNF:
símbolo : expansão ;
símbolo lado esquerdo da produção, um símbolo
não-terminal
expansão lado direito da produção, a expansão de símbolo
em termos de outros símbolos, sejam eles
terminais ou não-terminais (definidos em outra
produção da gramática)
I NTRODUÇÃO À COMPILAÇÃO
102. Produções
Símbolo sentencial: declaração %start
Na ausência da declaração, lado esquerdo da primeira
produção é considerado o símbolo sentencial
Se produção é recursiva, recursão à esquerda é preferível
Expansões alternativas podem ser separadas com o
símbolo |
I NTRODUÇÃO À COMPILAÇÃO
103. Tokens
Os símbolos terminais das produções podem ser
representados de duas formas:
nomes simbólicos, declarados com o comando %token,
ou
representação direta com notação de caracteres de C, se
for um único caráter
I NTRODUÇÃO À COMPILAÇÃO
104. Tokens
Operadores
Símbolos terminais para operadores podem usar, ao invés de
token, declaração com associatividade explícita:
%left operador com associatividade à esquerda
%right operador com associatividade à direita
%nonassoc operador não-associativo
Estratégia para eliminar ambigüidade
Operadores declarados na mesma linha têm mesma
precedência
Operadores declarados na última linha têm maior
precedência
I NTRODUÇÃO À COMPILAÇÃO
105. Manipulação das sentenças reconhecidas
Ação semântica
Código C cuja execução está associada à aplicação da
produção
Especificado entre chaves após a expansão da produção
Pode referenciar o valor semântico de um token da
expansão
Notação posicional: $1 é o primeiro token, $2 o segundo. . .
Para tokens, analisador léxico deve definir esse valor por
meio da variável yylval
Um valor semântico pode ser associado ao lado esquerdo
($$), para uso em outras expansões
Tipo padrão do valor semântico é int, mas pode ser
alterado com a redefinição da string YYSTYPE
I NTRODUÇÃO À COMPILAÇÃO
106. Tratamento de erros
error símbolo não-terminal pré-definido que está
associado a sentenças não reconhecidas pela
gramática especificada
yyerrok macro definida em C que limpa a entrada de
caracteres para que a análise possa prosseguir
yyerror() função definida pelo usuário, invocada pelo
analisador para apresentação de mensagens de
erro
I NTRODUÇÃO À COMPILAÇÃO
107. Desenvolvimento de uma aplicação
A gramática de expressões (soma ou multiplicação) é usada
neste exemplo como a semente para uma calculadora:
E → E +E
E → E ×E
E → (E)
E → v
I NTRODUÇÃO À COMPILAÇÃO
108. Exemplo
Primeira seção: declarações C/C++ (1)
%{
#include <iostream>
using namespace std;
extern "C"
{
int yyparse(void);
int yylex(void);
int yywrap() {
return 1;
}
}
void yyerror(char *);
%}
I NTRODUÇÃO À COMPILAÇÃO
109. Exemplo
Primeira seção: declarações yacc (2)
%start entrada
%token VALOR FIMLIN
%left SOMA
%left MULT
%token ABRPAR FECPAR
%%
I NTRODUÇÃO À COMPILAÇÃO
110. Exemplo
Segunda seção: produções e ações (3)
expr : expr SOMA expr { $$ = $1 + $3; }
| expr MULT expr { $$ = $1 * $3; }
| ABRPAR expr FECPAR { $$ = $2; }
| VALOR
;
I NTRODUÇÃO À COMPILAÇÃO
111. Exemplo
Segunda seção: produções e ações (4)
entrada : /* vazia */
| entrada result
;
result : FIMLIN
| expr FIMLIN
{ cout << "Resposta: " << $1 << endl; }
| error FIMLIN { yyerrok; }
;
I NTRODUÇÃO À COMPILAÇÃO
112. Exemplo
Terceira seção: código C (5)
%%
void yyerror(char* msg) {
extern char* yytext;
cout << msg << ": " << yytext << endl;
}
I NTRODUÇÃO À COMPILAÇÃO
113. Integração com lex
Arquivo de cabeçalho produzido com opção -d
Definições de valores para os nomes simbólicos
associados aos tokens, declarados na primeira seção do
arquivo de especificação de yacc (acumuly.y)
Execução com bison (implementação Gnu de yacc)
> bison -d acumuly.y
I NTRODUÇÃO À COMPILAÇÃO
114. Integração lex-yacc
Entrada sintaticamente correta?
main()
yyparse() Próximo token?
0: ok Próximo caractere?
1: não yylex()
token
Arquivo de
entrada
yylval
yytext
yyin
yyout
Variáveis globais
I NTRODUÇÃO À COMPILAÇÃO
116. Geração da aplicação
Analisador léxico é um programa C, produzido com flex
> flex acumuly.l
> gcc -c lex.yy.c
Compilação do analisador sintático
> g++ -o acc lex.yy.o acumuly.tab.c -ly -lfl
I NTRODUÇÃO À COMPILAÇÃO