1 parser glr denis pinheiro teoria de linguagens prof. newton josé vieira
TRANSCRIPT
1
Parser GLR
Denis PinheiroTeoria de Linguagens
Prof. Newton José Vieira
2
Motivação
Linguagens de Programação (LP) são estruturalmente bem definidas
A maioria da LPs são definidas sem ambigüidades (exceção, C++, Pearl etc.) Subconjunto das LLCs
3
Motivação
Existem Parsers muito eficientes (e.g. LL, LR etc.) que as reconhecem São determinísticos Não suportam ambigüidades, nem conflitos Baseados em um subconjunto de GLCs
4
Motivação
Linguagens Naturais (LN) são difíceis de serem tratadas Ambigüidade
Parsers que reconhecem as LPs, não suportam as LNs Não-determinismo
Necessidade de um mecanismo eficiente de reconhecimento das LNs
5
Motivação
Tomita (1986) apresenta um algoritmo eficiente: GLR parser (Generalized LR parser)
Extensão do algoritmo de parsing LR
Reconhece todas as LLC Simula o não-determinismo das GLC
ambíguas Solução para o reconhecimento das LNs
6
Sumário
Motivação Parser LR Parser GLR Trabalhos Relacionados Conclusão
7
Parser LR
Processa uma entrada da esquerda para a direita (Left-right)
Realiza uma derivação mais à direita (Right- most derivation)
Baseado em uma gramática LR Não ambígua Sem conflitos
8
Parser LR
Componentes
Entrada Saída Pilha Tabela de Parsing
APD Actions
Shift, Reduce Goto
Próximo estado
9
Parser LR
Funcionamento 1. E → E + T 2. E → T 3. T → T + F 4. T → F 5. F → (E) 6. F → id
Parsing Table
10
Parser LR
Funcionamento Entrada: id * id + id
11
Parser GLR
Criado por Tomita (1986)
Seu objetivo era poder processar LNs eficientemente
É uma extensão do Parser LR Reconhece LLCs (Parser Universal) Sua Tabela de Parsing pode conter duas ou mais ações Usa não-determinismo para resolver o problema
12
Parser GLR
Exemplo: (1) E → E + E (2) E → E * E (3) E → id
13
Parser GLR
Usa uma lista de pilhas (Stack List) e busca em largura (pseudo-paralelismo)
Algoritmo: Vários processos executam em paralelo Cada processo têm uma pilha e executa o
algoritmo de parsing LR
14
Parser GLR
Algoritmo: Quando um processo encontra múltiplas
entradas: Um novo processo é criado para cada entrada
adicional Cada novo processo tem um cópia da pilha As cópias das pilhas são adicionadas na Stack List
Quando um processo encontra um erro O processo termina Sua pilha é removida da lista de pilhas (Stack List)
15
Parser GLR
Algoritmo Os processos são todos sincronizados
Executam operações de shift ao mesmo tempo Estão sempre processando o mesmo símbolo de
entrada Quando um processo encontra uma ação de
shift: aguarda os outros processos também encontrarem
uma ação de shift (possivelmente diferente)
16
Parser GLR
Stack List para o processamento de “id+id*id”:
Acabou de empilhar id no topo.
17
Parser GLR
Problemas: Trabalho duplicado
O que um processo está processando pode já ter sido processado por outro processo
O número de pilhas na Stack List cresce exponencialmente em relação ao número de ambigüidades encontradas
18
Parser GLR
Primeira Otimização: Quando dois ou mais processos estão no
mesmo estado: Os estados no topo da pilha são unificados
criando uma pilha estruturada na forma de árvore (Tree-structured Stack)
Haverá apenas um processo com uma pilha onde o topo da pilha será a raiz da árvore
Quando o estado do topo for desempilhado são criados o mesmo número processos com as respectivas pilhas (filhas do nodo raiz)
19
Parser GLR
Primeira Otimização: Duas pilhas se unem:
20
Parser GLR
Primeira Otimização: Duas pilhas se unem:
A lista de pilhas (Stack List) toma a forma de uma floresta
21
Parser GLR
Segunda Otimização: Quando múltiplas entradas são encontradas,
uma cópia inteira da pilha é feita para cada novo processo criado
Mas, não é necessário copiar a pilha inteira: Em diferentes processos, as partes de baixo das
pilhas permanecem iguais; Somente o que ainda não foi reduzido precisa
ser copiado
22
Parser GLR
Segunda Otimização: Criando cópias otimizadas
23
Parser GLR
Segunda Otimização: Criando cópias otimizadas das pilhas
A lista de pilhas toma a forma de um grafo acíclico direcionado
24
Parser GLR
Com estas otimizações, garante-se: O parser não processa parte de uma sentença
várias vezes da mesma maneira Pois, se dois processos fizeram o parsing de
uma sentença da mesma maneira, eles devem estar no mesmo estado
Logo, eles serão unidos em um único processo.
25
Trabalhos Relacionados
Algoritmo CYK (Cocke and Younger, 1967), (Kazami,1965) Baseado em Programação Dinâmica(PD) Reconhece qualquer GLC na FNC Logo, reconhece qualquer LLC
Algoritmo de Earley (1970) Parser Universal de GLC Também baseado em PD Usado para processamento de Linguagens
Naturais
26
Conclusão
O Parser GLR é um Parser Universal Todas as LLCs podem ser reconhecidas através dos
Parsers Universais Compiladores de LPs não utilizam estes tipos de
parsers: Existem algoritmos mais apropriados para as LPs
(determinísticos) GLCs para as LPs normalmente são não ambíguas
Parsers Universais são normalmente utilizados para reconhecimento de LNs.
27
Bibliografia
[Aho et. al., 1986] Compilers: Principles, Techniques, and Tools. Addison-Wesley. 1986.
[Tomita, 1986] Efficient Parsing for Natural Language. Kluwer Academic Publishers.
[Cocke et. al.,1970]. Programming languages and their compilers: Preliminary notes. Technical report, Courant Institute of Mathematical Sciences, New York University.
[Kasami, 1965]. An efficient recognition and syntax-analysis algorithm for context-free languages. Scientific report AFCRL-65-758, Air Force Cambridge Research Lab, Bedford, MA.
[Younger, 1967]. Recognition and parsing of context-free languages in time n3. Information and Control 10(2): 189–208.
[J. Earley, 1970]. An efficient context-free parsing algorithm. Communications of the ACM, 13(2):94-102, 1970.