Ciências da computação dia 210

compiladores --- AST, recursividade, ambiguidade, etc.

Análise sintática

Métodos de derivação

# a esquerda

S -> S * S
S -> a * S
S -> a * a

# a direita

S -> S * S
S -> S * a
S -> a * a

AST

exmplo de árvore para a+a+a

Ambiguidade

exemplo:

S -> if b then S
S -> if b then S else S
S -> a

AST 1

AST2

Nesse exemplo, um else pode ser associado a mais de um if, gerando incongrências

exemplo:

S -> S + S | a  (ambiguo pois não define ordem)


# sem ambiguidade
S -> S + T | T
T -> a


----

S -> S + S | S * S | T


E -> E + T | T
T -> T * F | F
F -> a

nessa versão sem ambiguidade é possivel ver que o operador * fica nos niveis 
mais baixos da AST, fazendo com que a ordem de prescedencia seja seguida

Alguns passos para remover a ambiguidade:

  1. estabelecer a prescedencia os operadores
  2. definir a associatividade dos operadores
  3. usar a recursão à esquerda para força a associatividade à esquerda

Recursividade à esquerda

Exemplo

A -> Aa | b

dessa forma, podemos ter uma sentença enorme que segue o padrão
baaaaaaaaaaaaaaaaaaaaaaaaaaaaaa..., contudo a àrvore cresce a esquerda indo:

Aa 
Aaa
Aaaa
Aaaaa
Aaaaaa
Aaaaaaa
baaaaaa

o que queremos é remover isso e fazer se tornar

bA
baA
baaA
baaaA
baaaa



para isso podemos fazer:

A -> bA' | b
A' -> aA' | a

Restrições gramaticais