Você está na página 1de 9

Anlise Sinttica

Sintaxe => Usualmente Gramtica Livre do Contexto (GLC) BNF (Backus-Naur Form)

Gramtica Livres de Contexto / Estruturas Recursivas comando => IF expressao THEN expressao ELSE expressao expressao => (expressao) OR (expressao) | (expressao) AND (expressao) expressao => numero expressao => numero oper_logico numero oper_logico => < | > | <= | >= | <> Conceitos utilizados: * Terminais: IF, >, <, <>, numero, ... * No-terminais: comando, expressao, op_logico * Smbolo Inicial: Um dos no-terminais (S) * Produes: A => ou A => 1 | 2 | 3 | ... rvore de Derivao: a representao grfica de uma derivao de uma sentena particular, de acordo com a gramtica especificada.
1

Anlise Sinttica
rvore de Derivao: a representao grfica de uma derivao de uma sentena particular, de acordo com a gramtica especificada. Exemplo 1: G = ( {<numero>,<num>,<digit>}, {0,1,2,...,9), P, <numero> ) P = { <numero> => <num> <num> => <num> <digit> | <digit> <digit> => 0 | 1 | ... | 9 } <numero> Sentena: 45 <num> <digit> 4 <num> <digit> Exemplo 2: G = ( {E}, { +, -, *, /, ( ,) , x }, P, E ) P={ E => E + E | E - E E => E * E | E / E E => (E) | x }

Anlise Sinttica
rvore de Derivao x Derivaes: Exemplo 2: E G = ( {E}, { +, -, *, /, ( ,) , x }P, E ) P={ E => E + E | E - E E => E * E | E / E E => (E) | x } + E E

x Sentena: x+x*x

Derivaes: (a) E => E + E => x + E => x + E * E => x + x * E => x + x * x (b) E => E + E => E + E * E => E + E * x => E + x * x => x + x * x (c) E => E + E => E + E * E => x + E * E => x + x * E => x + x * x
3

Anlise Sinttica
rvore de Derivao x Derivaes: Exemplo 2: E G = ( {E}, { +, -, *, /, ( ,) , x }P, E ) P={ E => E + E | E - E E => E * E | E / E E => (E) | x } + E E

x Sentena: x+x*x

Derivaes: (a) E => E + E => x + E => x + E * E => x + x * E => x + x * x (b) E => E + E => E + E * E => E + E * x => E + x * x => x + x * x (c) E => E + E => E + E * E => x + E * E => x + x * E => x + x * x
4

Anlise Sinttica
Gramticas: Caractersticas e Propriedades * Gramticas Ambguas: permite construir mais de uma rvore de derivao Sentena: x+x*x E

Qual das duas rvores deve ser derivada?


5

Anlise Sinttica
Gramticas: Caractersticas e Propriedades * Gramticas Ambguas: permite construir mais de uma rvore de derivao Sentena: x+x*x E

Qual das duas rvores deve ser derivada? A gramtica no permite determinar... A precedncia de operadores poderia ser usada neste caso (rvore esquerda)...

Anlise Sinttica
Gramticas: Caractersticas e Propriedades * Gramticas Ambguas: permite construir mais de uma rvore de derivao Outro exemplo: comando => IF expressao THEN comando | IF expressao THEN comando ELSE comando | outro_comando

Anlise Sinttica
Gramticas: Caractersticas e Propriedades * Gramticas Ambguas: permite construir mais de uma rvore de derivao

Outro exemplo... Gramtica ambgua!

Anlise Sinttica
Gramticas: Caractersticas e Propriedades * Gramticas Ambguas: permite construir mais de uma rvore de derivao

Outro exemplo... Gramtica ambgua!

Soluo... * Associar o ELSE com o THEN mais prximo! * Incorporar isto na gramtica.

Anlise Sinttica
Gramticas: Caractersticas e Propriedades * Gramticas Ambguas: permite construir mais de uma rvore de derivao

10

Anlise Sinttica
Gramticas: Caractersticas e Propriedades * Gramticas sem ciclos: uma GLC que no possui derivaes da forma A => + A para algum smbolo A no-terminal * Gramticas -Livre: uma GLC que no possui produes do tipo A => (exceto talvez para a produo inicial, S => )

* Gramtica recursiva esquerda: uma GLC que possui produes do tipo A => + A para algum smbolo A no-terminal Alguns tipos de reconhecedores (top-down) no aceitam este tipo de gramticas, exigindo que seja eliminada a recurso a esquerda.

11

Anlise Sinttica
Gramticas: Caractersticas e Propriedades * Gramticas fatorada esquerda: uma GLC que no apresenta produes do tipo A => 1 | 2 Fatorando esquerda a gramtica acima, obtm-se: (necessrio para anlise top-down) A => A A => 1 | 2 Exemplo de gramtica que pode ser fatorada esquerda: comando => IF expr THEN comando ELSE comando | IF expr THEN comando Ficaria... comando => IF expr THEN comando resto_do_if

resto_do_if => ELSE comando |

> Fatorao necessria para anlise top-down do tipo descendente preditivo

12

Anlise Sinttica
Tipos de Analisadores Gramticais: * Analisadores TOP-DOWN: rvore de derivao comea pela raiz indo para as folhas => Anlise Descendente Tipo LL(1): Left to right / Leftmost derivation / 1 symbol each time - lookahead - Recursivo com Retrocesso (Backtracking) - Recursivo Preditivo - Preditivo Tabular (no recursivo - pilha + tabela) * Analisadores BOTTON-UP: rvore de derivao comea pelas folhas indo para a raiz => Anlise Ascendente Shift / Reduce <= Anlise Redutiva - LR(k) => i) SLR (simple) ii) LR cannicos iii) LALR (lookahead LR) Tipo LALR(1) => Yacc / Bison - Left to right / Rightmost derivation / 1 each time * Recuperao de Erros * Traduo dirigida pela sintaxe
13

Anlise Sinttica
Tipos de Analisadores Gramticais: * Analisadores TOP-DOWN: rvore de derivao comea pela raiz indo para as folhas => Anlise Descendente Tipo LL(1): Left to right / Leftmost derivation / 1 symbol each time - lookahead - Recursivo com Retrocesso (Backtracking) - Recursivo Preditivo - Preditivo Tabular (no recursivo - pilha + tabela) Exemplo:

Sentena: cad
14

Anlise Sinttica
Tipos de Analisadores Gramticais: * Analisadores BOTTON-UP: rvore de derivao comea pelas folhas indo para a raiz => Anlise Ascendente Shift / Reduce <= Anlise Redutiva Tipo LALR(1) => Yacc / Bison - Left to right / Rightmost derivation / 1 each time Exemplo: Shift (empilha) / Reduce (Busca chegar no S - smbolo inicial) Sentena: X = 12 + 8 P = { statement => name = expr | expr expr => number + number | number - number

8 + 12 = X

P={

Empilha: shifting tokens on to the internal stack

statement => name = expr | expr expr => number expr => expr + number | expr - number

15

Anlise Sinttica
Vlido: Tipos de Analisadores Gramticais: * Analisador Tipo LALR(1) => Yacc / Bison - Shift / Reduce P={ statement => name = expr | expr expr => number expr => expr + number | expr - number } expr + 12 = X statement

expr = X

Sentena: X = 12 + 8

8 + 12 = X

Reduce: reduz em direo a raiz Pop(8) : expr => number Push(expr) Pop(expr+12) : expr => expr + number Push(expr) Pop(X=expr) : statement => name = expr Push(statement) Finish => Initial Symbol
16

Empilha: shifting tokens on to the internal stack

Anlise Sinttica
Tipos de Analisadores Gramticais: * Analisador Tipo LALR(1) => Yacc / Bison - Shift / Reduce Problemas... HORSE AND CART phrase => cart_animal AND CART | work_animal AND PLOW cart_animal => HORSE | GOAT work_animal => HORSE | OX Yacc: Gramticas ambguas / lookahead de 2 smbolos adiante Praticando com o YACC / BISON... P={ statement => name = expr | expr expr => number + number | number - number } }
17

P={ statement => name = expr | expr expr => number expr => expr + number | expr - number

Anlise Sinttica
Tipos de Analisadores Gramticais: * Recuperao de Erros > Modo pnico: descarta tokens at re-sincronizar Exemplo: em Pascal procura pelo prximo ; ou end > Recuperao local baseada em expresses > Produo de erros: gramtica com produes para detectar erros * Traduo dirigida pela sintaxe Traduo dirigida por sintaxe uma tcnica que permite realizar traduo (gerao de cdigo) concomitantemente com a anlise sinttica. Aes semnticas so associadas s regras de produo da gramtica. Exemplo: avaliao de expresses numricas

18