Você está na página 1de 2

Análise Sintática de Linguagens Livres de Contexto

Compiladores – 2023-1
Prof. Roberto C. de Araujo

1. Gramáticas Livres de Contexto 2. Árvores Sintáticas (ou de Derivação)


Uma gramática livre de contexto (GLC) é uma
Uma derivação também pode ser representada
quádrupla G=(N,T,P,S) tal que:
através de uma árvore na qual cada nó representa um
 um conjunto de símbolos não-terminais N
símbolo de NT{}:
 um conjunto de símbolos terminais T
 um conjunto P de regras αβ, com αN e  a raiz da árvore será o símbolo inicial da
β(NT)* gramática;
 um símbolo inicial SN  os nós internos da árvore serão os símbolos não-
terminais da gramática; e
Exemplo: Considere a gramática G1=(N,T,P,S), com  as folhas da árvore serão os símbolos terminais
N = { expr } da gramática (ou, eventualmente,  ).
T = { n ,+ }
P = { expr  expr + expr , expr  n } Cada nó interno da árvore (contendo um símbolo
S = expr AN) será ramificado em diversos filhos de acordo
Uma derivação em uma GLC é uma sequência de com uma regra da forma Aβ de tal forma que a
aplicações das regras de G a partir do símbolo inicial. quantidade de ramificações corresponderá à
quantidade de símbolos de β e a ordem desses
Exemplo. Considere a derivação abaixo: símbolos em β será representada pela sequência de
expr  expr + expr  expr + n  filhos de A, lidos da esquerda para a direita.
 expr + expr + n  expr + n + n  Tal árvore, obtida a partir de uma derivação, é
 n+n+n chamada de árvore sintática (ou de árvore de
Usamos a notação expr * n + n + n derivação).
para descrever que é possível derivar a expressão
n + n + n a partir de expr usando um ou mais
Exemplo. Considerando a derivação anterior,
passos de uma derivação.
podemos construir a seguinte árvore sintática.
Exercício. Você consegue descrever o conjunto de expr
todas as palavras que podem ser derivadas usando a / | \
gramática G1 acima? / + \
expr expr
/ | \ |
Definição. A linguagem gerada por uma GLC G,
/ + \ n
denotada por L(G), é o conjunto de todas as palavras
expr expr
T*, tais que S * .
| |
n n
Uma linguagem L* é chamada de linguagem livre
de contexto se existir uma GLC G tal que L = L(G). Uma árvore sintática é bastante útil para retratar,
esquematicamente, uma derivação. No entanto, ela
não indica qual é a sequência de regras que foi usada
Exercício. Elabore uma GLC que gere números na derivação.
(representados pelo símbolo n) e expressões
envolvendo somas e subtrações de números.

Compiladores – 2023-1
3. Gramáticas Ambíguas 5. Análises Sintáticas Ascendente e Descendente

Uma gramática G é chamada de ambígua se existir Na área de compilação, a análise sintática


(pelo menos) uma palavra w tal que existam (pelo corresponde ao processo de construção de uma
menos) duas derivações diferentes para w em G e árvore sintática para uma palavra. Na prática,
essas derivações gerem árvores sintáticas diferentes. existem diversos algoritmos para se construir uma
árvore sintática. Eles podem ser classificados em dois
Exercício. Mostre que a gramática G1 é ambígua. tipos gerais:

 análise sintática descendente (top-down): a


Exercício. Altere minimamente a gramática G1 de árvore é construída a partir da raiz e termina com
tal forma que ela gere a mesma linguagem e deixe de a especificação de suas folhas; exemplos de
ser ambígua. algoritmos desse tipo:
o LL(1)
o Recursivo descendente
4. Notação EBNF
 análise sintática ascendente (bottom-up): a
A gramática apresentada no enunciado do projeto usa árvore é construída a partir de suas folhas e
uma notação chamada de EBNF baseada em termina com a especificação de sua raiz;
construções tais como: exemplos de algoritmos desse tipo:
o LR(0)
{ α } : repetição da cadeia a zero ou mais vezes o LR(1)
o SLR(1)
[ α ] : cadeia α é opcional o LALR(1)

( α | β ) : α ou β deve ser escolhido

Além disso, a notaão EBNF usa o símbolo ::= no Exercício: Usando a gramática abaixo,
lugar de  nas regras. S  cAc$
A  aAa | 
obtenha uma derivação para a palavra caaaac$.
Exercício. Converta as seguintes regras, escritas na Usando a derivação obtida, construa uma árvore
notação EBNF, para a notação usual para descrição sintática para ela.
de regras de uma gramática:

a) parFormal ::= ( int | bool ) ident

b) declFuncoes ::= { declaraFunc }

c) listIdent ::= ident { , ident }

d) param ::= [( ident | num | bool )]

Compiladores – 2023-1

Você também pode gostar