Escolar Documentos
Profissional Documentos
Cultura Documentos
Neste captulo estudaremos como feita a anlise semntica dentro de um compilador. Porm, antes precisamos lembrar que para o nosso objeto de estudo a anlise semntica consiste basicamente na verificao de tipos, isto , em verificar se as variveis e constantes que aparecem em cada expresso possuem tipos compatveis entre si. Uma outra atividade realizada na anlise semntica a verificao do escopo de uma varivel, isto , na determinao dos pontos do programa para os quais uma dada varivel est definida e portanto seria visvel para as demais variveis do programa. Isso exige uma gramtica sensvel ao contexto para determinar os contextos em que cada identificador est sendo utilizado. Entretanto, uma gramtica desta categoria exige (segundo Chomsky) um autmato limitado, o qual impraticvel de ser implementado. A soluo para este problema a adoo de restries na anlise semntica, fazendo com que a mesma possa ser feita a partir da anlise sinttica com apenas alguns acrscimos feitos gramtica livre de contexto. A seguir apresentamos as gramticas de atributo, que na realidade podem ser interpretadas como uma gramtica livre de contexto na qual so acrescentadas regras para fazer restries quanto a compatibilidade de tipos e determinao de escopo. O uso de atributos para fazer a anlise semntica em conjunto com a anlise sinttica vantajoso pois podemos ento construir o analisador semntico de forma automtica. Na realidade, se usarmos esta abordagem estaremos construindo um analisador sinttico que pode tambm fazer a anlise semntica do programa em compilao.
Figura 4.1 - Derivao dos atributos para a gramtica de binrios Como podemos ver, o processo no trivial e pode complicar ainda mais se ocorrer dependncia circular, isto , se tivermos atributos cujos valores dependam circularmente um do outro. Muita pesquisa tem sido feita no sentido de descobrir formas de evitar a dependncia circular e de encontrar meios timos para a ordem do clculo dos atributos. Uma das coisas que podem ser feitas forar com que todos os atributos sejam ou herdados ou sintetizados, mas nunca termos os dois casos ao mesmo tempo. Na gramtica de nmeros binrios isso pode ser feito substituindo os parmetros 'f' e 'v' dos no-terminais S e B pelo parmetro ', que representa o valor integral do dgito binrio ou string. Com isso nossa gramtica simplificada para: N ^v -> S ^i1 ^l1 '.' S ^i2 ^l2 [ v = i1 + i2 * 2 ** (-l2)] S ^i ^l -> S ^i1 ^l1 B ^i2 [i = 2 * i1 + i2; l = l1 + 1] S ^i ^l -> B ^i [l = 1] B ^i -> '0' [i = 0] B ^i -> '1' [i = 1] A derivao de 11.01 com esses atributos esta apresentada na Figura 4.2
Figura 4.2 - Derivao dos atributos para a nova gramtica de binrios Entretanto nem sempre se consegue fazer com que todos os atributos estejam num s sentido. Na realidade muitas vezes nem queremos que isso acontea, como por exemplo na verificao de tipos ou na manipulao da tabela de smbolos. Ento, de acordo com os vrios sentidos de clculo de atributos existentes temos que usar diferentes mtodos para determinar os valores dos atributos. O primeiro deles o bottom-up, que se presta mais quando os atributos so puramente sintetizados. J a avaliao top-down vantajosa quando os atributos forem todos herdados. Um terceiro fluxo seria o right-to-left, porm este muito pouco usado apesar de o parsing bottom-up representar bastante bem este tipo de fluxo. Por fim, o fluxo left-to-right o mais usado pois tanto o parsing top-down quanto o bottom-up podem ser feitos com este sentido de avaliao pois a leitura do arquivo a ser compilado feita sempre da esquerda para a direita. Alm disso, linguagens que exijam prdeclarao de variveis tem implicitamente atributos left-to-right, uma vez que no programa a declarao vem antes do ponto em que usada, ou seja, vem esquerda do uso. Uma ilustrao da aplicao do fluxo left-to-right vista na Figura 4.3, para a gramtica dada por: B A A A A -> -> -> -> -> A !vo^v1 [v0=0] A !vo^v1 A!v1^v2 "0" [v2=2*v0] "1" [v2=2*v0+1] \lambda [v2=v0]
Para fazer nosso compilador verificar o escopo de uma varivel teramos ento que modificar o analisador lxico, para que ele consiga agora tambm colocar o nvel lxico em cada entrada na tabela de smbolos. Isso resolve o nosso problema pois agora a anlise semntica a partir da gramtica de atributos continua sendo a mesma, isto , a anlise (e verificao de tipos compatveis) atravs da gramtica de atributos no sofre alterao alguma.