Você está na página 1de 1

Editado por Aleardo Manacero Jr.

Captulo 1 - Gramticas
1. Conceitos 2. Classificao de gramticas segundo Chomsky 3. Notas adicionais

ATENO
Neste e nos prximos captulos estou utilizando uma notao diferenciada para letras gregas (pois no consegui encontrar uma fonte visvel em qualquer plataforma). Assim, usarei a notao "\letra" para designar "letra" em grego, com, por exemplo, \GAMMA para gama maisculo e \gamma para gama minsculo.

1. Conceitos
Antes de passarmos ao estudo dos vrios componentes de um compilador necessrio que entendamos o que uma linguagem e como podemos descreve-la atravs de gramticas. Isto importante pois todo o front-end de um compilador pode ser construdo de forma automtica a partir de gramticas bem definidas. Infelizmente, o tratamento formal de linguagens e gramticas foge ao escopo desta disciplina, portanto iremos apenas revisar o que deveria ser visto em outras disciplinas. Dedicaremos algum tempo a este formalismo, pois a partir dele que podemos entender melhor os mecanismos envolvidos nos analisadores lxico, sinttico e semntico. Vejamos ento algumas definies: DEF. 1.1 - Alfabeto um conjunto finito e no vazio de smbolos (caracteres). Um alfabeto, em geral, representado pelo smbolo \SIGMA. DEF. 1.2 - Uma linguagem L sobre um alfabeto \SIGMA uma coleo de strings finitos compostos por elementos de \SIGMA. Estes strings tambm so chamados sentenas de L. DEF. 1.3 - Dado \SIGMA um conjunto no vazio de caracteres, temos que \SIGMA* a linguagem de todos os strings finitos possveis de \SIGMA, incluindo o string vazio \lambda. \SIGMA+ a linguagem em que \lambda excludo. Como em geral uma linguagem L no compreende todos os strings possveis de um alfabeto \SIGMA, tem-se que necessrio definir uma metodologia para decidir quando um string vlido ou no em L. Esta metodologia o que chamamos gramtica, cuja definio se segue: DEF 1.4 - Uma gramtica G composta pelos seguintes quatro objetos: 1. Um alfabeto \SIGMA, cujos elementos so chamados de terminais. 2. Um conjunto N de smbolos, tambm chamados de no-terminais ou variveis, sendo que a interseco de N e \SIGMA vazia. 3. Um elemento S do conjunto N, que chamado de smbolo inicial. 4. Um conjunto P de produes consistindo em expresses do tipo A -> X1 X2 X3 .... Xn, em que A, X1, X2, X3, ..., Xn so combinaes de terminais e no-terminais. Exemplo: A gramtica G_0 de todas expresses aritmticas vlidas que podem ser formadas a partir de inteiros positivos e dos smbolos '+', '*', '(' e ')' dada por: G_0 = (\SIGMA, N, S, P) , em que: \SIGMA = {0,1,2,...,8,9,+,*,(,)} N = {E,T,F} S=E P: 1. E -> E+T 4. T -> F 2. E -> T 5. F -> (E) 3. T -> T*F 6. F -> 0 | 1 |...| 8 | 9 DEF. 1.5 - Uma forma sentencial de uma gramtica G = {\SIGMA, N, S, P} qualquer string X1 X2 ... Xn de smbolos, em que Xi pode ser um terminal ou um no-terminal. Exemplo: "7*3+4" , "F*F+F" , "T+4" so formas sentenciais vlidas para G_0. DEF. 1.6 - Uma forma sentencial \tau imediatamente derivvel de outra forma \sigma se \sigma puder ser expressa por \sigma = \gama1 A \gama2, com \gama1 e \gama2 sendo strings de terminais e no-terminais, A um no-terminal e existindo uma produo em P dada por A -> X1 X2 ... Xn tal que \tau = \gama1 X1 X2 ... Xn \gama2. Isto denotado por \sigma => \tau Exemplo: A forma sentencial "F*F+F" imediatamente derivvel de "F*T+F" DEF. 1.7 - Uma forma sentencial \sigma2 derivvel de outra forma \sigma1 se existir uma sequncia de formas sentenciais \tau1 \tau2 ... \taun tal que: \sigma1 => \tau1 => \tau2 => ... => \taun => \sigma2 , sendo denotado por \sigma1 =>* \sigma2 Exemplo: Dada a gramtica G_0, temos que: E+T imediatamente derivvel de E 3 imediatamente derivvel de F 3 derivvel de E pois E => T => F => 3 F*F+F derivvel de T+F pois T+F => F*T+F => F*F+F Todo processo de derivao de uma forma sentencial pode tambm ser expresso atravs de uma rvore de derivao, em que cada n representa um smbolo terminal ou no-terminal e os filhos de um dado n representam a derivao daquele n em outra forma sentencial imediatamente derivvel do n anterior. Exemplos: 1. Dada a gramtica G_0, temos que a forma sentencial (2*3)+7 pode ser representada pela rvore de derivao a seguir:

2. Na gramtica G = {\SIGMA, N, S, P} em que \SIGMA = {0,1}, N={S,A}, S = S, P = {"S -> A", "A -> A0A | 1"} , a string 10101 tem as seguintes rvores de derivao distintas:

DEF. 1.8 - Uma gramtica G dita ambgua se existir uma forma sentencial \sigma que tenha pelo menos duas rvores de derivao distintas na linguagem L formada por G. Obviamente, caso exista apenas uma rvore de derivao para todo e qualquer string de L a gramtica dita no-ambgua. Exemplo: A construo if-then-else abaixo ambgua: if < condicao > then < comando > | if < condicao > then < comando > else < comando > Exerccio: A partir das produes apresentadas no exemplo anterior, desenhe as duas possveis rvores de derivao para a sentena "if C=0 then if D=1 then A:=3 else A:=4"

2. Classificao de gramticas segundo Chomsky


Noam Chomsky idealizou uma forma de classificar gramticas segundo suas regras de produo, isto , segundo o grau de liberdade apresentado por suas produes. Alm de fazer esta classificao Chomsky notou que cada um dos nveis gramaticais propostos por ele poderia ser reconhecido por um autmato distinto, fato este que vai nos permitir especificar o front-end de um compilador de forma mais ou menos automtica a partir dos autmatos reconhecedores definidos por ele. O quadro a seguir apresenta os nveis hierrquicos propostos por Chomsky. NVEL GRAMTICA 0 1 2 3 Irrestrita Sensvel ao contexto Livre de contexto Regular RECONHECEDOR Mquina de Turing Autmato limitado linear Autmato de pilha Autmato de estado finito

A seguir temos as definies de cada um dos nveis gramaticais considerando-se que a nica distino entre os mesmos a forma de seu conjunto de produes. A) Gramticas irrestritas: So gramticas definidas por G = {\SIGMA, N, S, P} em que as produes em P so da forma u -> v, com u e v sendo strings arbitrrias de terminais e no-terminais. A nica restrio de que u no seja a string vazia (\lambda). Assim pode existir uma regra em que u seja um string contendo apenas smbolos terminais. B) Gramticas sensveis ao contexto: So gramticas G = {\SIGMA, N, S, P} em que as produes em P so da forma \alfa A \beta -> \alfa \sigma \beta , em que A um no-terminal e \sigma (diferente de \lambda) um string de terminais e no-terminais, sendo que A pode ser substitudo por \sigma apenas se A estiver cercado por \alfa e \beta, ou seja, no contexto de \alfa e \beta. A restrio quanto ao valor de \sigma (diferente de \lambda) faz com que produes do tipo aAc -> ac no sejam vlidas nessas gramticas. Deve ficar bastante claro aqui que essas gramticas no contm as gramticas livres de contexto, as quais admitem produes vazias. Como compensao, toda gramtica livre de contexto contendo produes vazias pode ser transformada numa outra em que a nica produo vazia possvel aquela que leva o smbolo inicial S em \lambda. C) Gramticas livres de contexto: So as gramticas em que as regras de produo assumem a forma A -> \sigma, em que A um no-terminal e \sigma um string de terminais e no-terminais, podendo incluir tambm a string vazia \lambda. Note que agora a produo no depende de um contexto, como no caso anterior, o que d o nome de livre de contexto gramtica. D) Gramticas regulares: So gramticas livres de contexto em que todas as produes levam a strings de uma das formas a seguir: Linear a direita : Linear a esquerda: S -> \lambda | A A -> aB | a S -> \lambda | A A -> Ba | a

3. Notas adicionais
1. Remoo de produes vazias Uma gramtica livre de contexto pode apresentar produes vazias, isto , produes do tipo A -> \lambda. Entretanto, a construo de um autmato para reconhecer tal linguagem fica mais simples quando estas regras no esto presentes. A eliminao de tais regras pode ser feita usando-se o esquema abaixo: 1. Encontre todas as produes com A no lado direito da produo (uma vez que estamos querendo eliminar A -> \lambda). 2. Copie cada uma das produes encontradas em 1., retirando A da expresso. 3. Se A no for o smbolo inicial, remova a produo A-> \lambda 4. Se A for o smbolo inicial, escolha um novo smbolo inicial G e adicione as produes: G -> A G -> \lambda e remova A -> \lambda Feito isto teremos uma gramtica com no mximo uma produo vazia, o que muito conveniente em termos de implementao do autmato que a represente. 2. Derivaes cannicas So as derivaes obtidas a partir da aplicao de produes sempre aos smbolos no-terminais mais prximos de uma das extremidades. Se escolhemos o extremo direito como aquele a ser trabalhado sempre, teremos a chamada derivao a direita (ou LR). Do outro lado, se o extremo escolhido for o esquerdo teremos a derivao LL.

Você também pode gostar