PowerPoint

Propaganda
Mas para que serve um analisador sintático?
Verificar se a estrutura gramatical do programa está correta
Escrito de outra forma:
O texto segue as regras gramaticais da linguagem?
E como definir tais regras?
Através de produções: Ex: Uma calculadora
E
T|T+E|T-E
T
F|F*T|F/T
F
Número | ( E )
E o que mais um analisador sintático pode fazer?
•Detecção de Erros de Sintaxe
•Recuperação de Erros
Estratégia para recuperação de erros utilizadas neste analisador:
Considere a seguinte gramática:
S
a ( b | Sc) | dM | e
M
fM*
1º) Remoção de um símbolo:
O analisador sintático supõe que o usuário digitou um
símbolo extra. Por exemplo, considere o seguinte texto de
entrada: a a d f g e c c . Esse texto não segue as regras
definidas pela gramática acima. Entretando o texto:
a a d f e c c segue. Então o analisador remove o caractere
‘g’ do texto original, fazendo com que a string resultante
seja reconhecido.
2º) Inserção de um símbolo:
Nessa estratégia, o analisador sintático supõe que o usuário
esqueceu de digitar um símbolo. Neste caso, o analisador
tenta encontrar um símbolo que, quando inserido no texto a
string resultante seja reconhecida. Por exemplo, a entrada é:
d f b. Como podemos notar, essa entrada não pode ser
gerada com as regras definidas pela gramática. Mas o texto
d f a b pode. Então o analisador insere o símbolo ‘a’ no texto
original.
3º) Troca de um símbolo:
Agora o analisador supõe que o usuário trocou um símbolo
por um outro. Por exemplo, o texto:
a g f e c não pode ser gerado a partir da gramática. Mas o
texto a d f e c pode. Então o analisador substitui o símbolo
‘g’ pelo símbolo ‘d’.
4º) Busca de delimitadores:
Se o texto ‘a c’ for analisado, nenhuma das estratégias
anteriores conseguirão ‘consertar’ a string. Mas note que
sempre que reconhecemos um terminal a, teremos duas
possibilidades: ou reconhecer um terminal b, ou reconhecer
um não-terminal S. Nesse caso, o terminal b não foi
encontrado, mas sim o terminal c. Mas a S c pode ser gerado
pela gramática. O analisador então ‘supõe’ que o nãoterminal S foi reconhecido antes de reconhecer o caractere
‘c’. (delimitador para S)
E se nenhuma estratégia funcionar?
O simbolo atual é ignorado.
Como definimos as produções?
Forma original:
S
a ( b | Sc) | dM | e
M
fM*
Agora, em um grafo sintático
E quais são as opções deste plugin?
1º) Gerar a gramática a partir de um grafo sintático.
2º) Fazer a análise sintática de um código fonte.
3º) Gerar o analisador em um arquivo .java
Exemplos: A velha calculadora
Primeira Abordagem:
E as rotinas semânticas? Aonde estão?
As rotinas semânticas são declaradas em um arquivo especial,
(SemanticRoutines.java)
Segunda Abordagem:
Utilizando o método parse, podemos ter as seguintes saidas:
1) Pilha Semântica
2) Pilha Sintática
3) Saida gerada pelas rotinas sintáticas
4) Saida gerada pelas rotinas de recuperação de erros
5) Saida gerada pelo analisador léxico
Código fonte: (-1 + (-5) + 6 + (2 * (4+6)) / 4), pilha semântica:
Pilha sintática:
Saida das rotinas semânticas:
Saida do analisador léxico:
E a saida das rotinas de recuperação de erros?
Documentação completa, incluindo referências bibliográficas
e o futuro do plugin, localiza-se em :
www.linux.ime.usp.br/~chaos/DocAsin
Download