Click here to load reader

Compiladores Análise Sintática

  • View
    28

  • Download
    0

Embed Size (px)

DESCRIPTION

Compiladores Análise Sintática. Guilherme Amaral Avelino [email protected] Analisador sintático ( parser ) é o responsável por verificar se as construções utilizados no programa estão gramaticalmente corretas. Envia token. Árvore de derivação. Programa fonte. Analisador sintático. - PowerPoint PPT Presentation

Text of Compiladores Análise Sintática

  • COMPILADORES ANLISE SINTTICAGuilherme Amaral [email protected]

  • Analisador sinttico (parser) o responsvel por verificar se as construes utilizados no programa esto gramaticalmente corretas

    Programa fonteEnvia tokenSolicita novo tokenrvore de derivao

  • RECONHECIMENTO DE UMA LINGUAGEMToda linguagem tem de ter regras que descrevem sua estrutura sinttica (ou sintaxe)A sintaxe pode ser descrita atravs de uma gramtica ou pela notao BNFVantagens de se utilizar uma gramtica:Fornece uma especificao sinttica precisa e fcil de entenderPara certas classes de gramticas, podemos construir automaticamente um analisador sinttico e o gerador automtico pode certas ambigidades sintticas da LP, difceis de serem identificadas diretamente pelo projeto do compiladorNovas construes que surgem com a evoluo da linguagem podem facilmente ser incorporadas a um compilador se este tem sua implementao baseada em descries gramaticais

  • DESCRIO DE UMA LINGUAGEM ATRAVS DE UMA GRAMTICALinguagens regulares no so capazes de identificar recurses centraisE = x | ( E )Soluo: Uso de gramticas livres de contextosUma Gramtica Livre de Contexto construda utilizando smbolos terminais e no-terminais, um smbolo de partida e regras de produes, onde:Os terminais so os smbolos bsicos a partir dos quais as cadeias so formadas. Na fase de anlise gramatical os tokens da linguagem representam os smbolos terminais. Ex: if, then, else, num, id, etc.

  • GRAMTICA LIVRE DE CONTEXTOOs no-terminais as variveis sintticas que denotam cadeias de caracteres. Impem uma estrutura hierrquica que auxilia na anlise sinttica e influencia a traduo. Ex: cmd, expr.Numa gramtica um no terminal distinguido como smbolo de partida, e o conjunto que o mesmo denota a linguagem definida pela linguagem. Ex: programAs produes de uma gramtica especificam como os terminais e no-terminais podem se combinar para formas as cadeias da linguagem. Cada produo consiste em um no terminal seguido por uma seta (ou ::=), serguido por uma cadeia de no terminais e terminais

  • GRAMTICA LIVRE DE CONTEXTOEx:expr ::= expr op exprexpr ::= (expr)expr ::= - exprexpr ::= idop ::= +op ::= -op ::= *op ::= /Simbolos terminaisid + - * / ( )Smbolos no-terminaisexpr e op , sendo expr o smbolo de partida

  • CONVENES NOTACIONAISSmbolos TerminaisLetras minsculas do inicio do alfabeto, tais como a, b cSmbolos de operadores, tais como +, -, etcSmbolos de pontuao, tais como parnteses e vrgulasDgitos 0, 1, ..., 9Cadeias em negritos como id ou ifSmbolos no-terminaisLetras maisculas do incio do alfabeto, tais como A, B, CA letra S, quando aparecer usualmente smbolo de partidaNomes em itlico formados por letras minsculas, como expr ou cmdA menos que seja explicitamente estabelecido, o lado esquerdo da primeira produo o smbolo de partida

  • GRAMTICASProdues para o mesmo smbolo no terminal a esquerda podem ser agrupadas utilizando |. Ex: A::= +|-|...Exemplo:

  • GRAFOS DE SINTAXEGrafo direcionado contendo dois tipos de vrticesVrtices em elipse para representar os smbolos terminaisVrtices retangulares para no terminais

  • RVORES GRAMATICAISRepresentao grfica de uma derivaoD forma explcita a estrutura hierrquica que originou a sentenaDada uma GLC, a rvore de derivao obtida:A raiz da rvore o smbolo inicial da gramticaOs vrtices interiores so obrigatoriamente no-terminais. Ex: Se A ::= X1X2...Xn uma produo da gramtica, ento A ser um vtice interior e X1, X2, ..., Xn sero os filhos (da esquerda para a direita)Smbolos terminais e a palavra vazia so as folhas

  • RVORES DE DERIVAOExemplo: -(id + id)E-E(E)+EEIdidE::=-EE::=(E)E::=E+EE::=idE::=id

  • DERIVAESProcesso atravs do qual as regras de produes da gramtica so aplicadas para formar uma palavra ou verificar se esta pertence a linguagemSmbolo no terminal substitudo pelo lado direito da produo correspondeteEx: -( id + id )E => -E => -(E) => -(E+E) => -(id + E) => -(id + id)Dois passos:Qual terminal ser escolhido para derivarDerivao mais a esquerdaDerivao mais a direitaQual regra utilizar

  • AMBIGIDADESe uma gramtica possui mais de uma rvore gramatical para uma mesma sentena dita ambguaParte do significado dos comandos de uma linguagem podem estar especificado em sua estrutura sintticaEx: id + id * id possui duas derivaes mais a esquerda EidE*EEidid+EE*EEidid+id

  • AMBIGIDADERegras de precednciaReescrita da gramtica

  • cmd ::= if expr then cmd|if expr then cmd else cmd|outro

    if E1 then S1 else if E2 then S2 else S3

    cmdcmdcmdexprifthenelseE1S1cmdcmdexprifthenelseE2S2S3

  • if E1 then if E2 then S1 else S2cmd ::= if expr then cmd|if expr then cmd else cmd|outroRegra geral: associar cadaelse ao then anterior mais prximo

  • REESCREVENDO A GRAMTICATodo enunciado entre um then e um else precisa ser associado, isto no pode terminar com um then ainda no associadoUm enunciado associado ou um enunciado if-then-else contendo somente enunciados associados ou qualquer outro tipo de enunciado incondicional

    cmd ::= cmd_associado |cmd_no_associadocmd_associado ::= if expr then cmd_associado else cmd_associado|outrocmd_no_associado ::= if expr then cmd | if expr then cmd_associado else cmd_no_associado

  • ELIMINAO DE RECURSO A ESQUERDAUma gramtica recursiva a esquerda se possui um no-terminal A, tal que, exista uma derivao A => A para alguma cadeia importante para permitir o processamento top-downMtodo:Agrupamos os produes recursivasA ::= A1|A2|... |An |1|2|...|nOnde nenhum comea com um ASubstitumos as produes-A por A ::= 1A| 2A| ...|nAA ::= 1A| 2A|...| nA|Ex:E ::= E + T|TT ::= T * F|FF ::= (E)|idE ::= TEE ::= +TE | T ::= FTT ::= *FT | F ::= (E) | id

  • ELIMINAO DE RECURSO A ESQUERDARecurso no-imediataS ::= Aa | bA ::= Ac | Sd |

    A ::= Ac | Aad | bd | S ::= Aa | bA ::= bdA | AA ::= cA | adA | S ::= Sda | bS ::= bSS ::= daS| A ::= Ac | Sd | A ::= SdAA ::= cA | S ::= bSS ::= daS| A ::= SdAA ::= cA |

  • FATORAO ESQUERDATransformao que facilita a anlise sintticaDeve ser realizada quando a escolha entre duas opes comea com uma cadeia comumNeste caso deve se adiar a escolhaRegra geral:Se A ::= 1 | 2 forem duas produes e a entrada comear com uma cadeia no vazia derivada de , no sabemos se A deve ser expandida para 1 ou 2Devemos, ento, adiar a deciso expandido A para A e aps ler a entrada derivada de , expandir A para 1 ou 2.A ::= AA ::= 1 | 2

  • cmd ::= if expr then cmd else cmd|if expr then cmd|outro

    cmd ::= if expr then cmd cmd| outrocmd' ::= else cmd |

  • ANLISE GRAMATICALProcesso atravs do qual verificado se uma cadeia pode ser gerado pela gramticaAnlise Top-Down ou DescendenteInicia-se na raiz da rvore gramatical e segue em direo as folhasEm cada passo um lado esquerdo de uma regra de produo substitudo pelo direito at produzir todos os smbolos folha da palavraAnlise Botton-UpA anlise feita a partir das folhas em direo a raizEm cada passo um lado direito de uma regra de produo substitudo por um smbolo no-terminal (reduo) at obter o smbolo inicial S (raiz)

  • ANALISADOR SINTTICO TOP-DOWN (DESCENDENTE)Produz uma derivao mais a esquerda para uma cadeia de entradaTem como principal problema determinar, a cada passo, qual produo deve ser aplicada para substituir um o smbolo no-terminalQuando uma produo escolhida, o restante do processo de anlise consiste em casar os smbolos terminais da produo com o a cadeia de entrada

  • ANLISE SINTTICA DE DESCIDA RECURSIVAConsiste em um conjunto de procedimentos, um para cada no terminal da gramtica void A(){ escolheProduo-A(); // A:: X1,X2,...Xk for (i=1 at k){ if (Xi um no terminal) executa Xi(); else if (Xi igual a smbolo de entrada a) avana na entrada para o prximo smbolo; else /*ocorre um erro*/ }}

  • ANLISE SINTTICA DE DESCIDA RECURSIVAPode exigir retrocesso, resultando em repetidas leituras sobre a entrada (Tentativa e erro)Deve-se permitir a escolha de mais de uma produoUm erro no reconhecimento no deve gerar um erro, mas sim a tentativa de uma nova produoUm erro s deve ocorrer quando no houver mais nenhuma produo a ser testadaPara tentar uma nova produo necessrio colocar o apontador de entrada na posio que estava no inicio do processo

    S ::= cAdA ::= ab | aScAdaba*Obs: Uma gramtica recursiva esquerda pode fazer com queum analisador recursivo esquerda entre em loop infinito

  • FUNES FIRST E FOLLOWFunes que auxiliam a construo de analisadores sintticosPermitem escolher qual produo deve ser aplicada baseada no prximo smbolo de entradaFirstDefine o conjunto de smbolos que iniciam derivaes a partir de uma seqncia de smbolos terminais e no-terminaisc est em First(A)FollowDefine o conjunto de smbolos que se pode seguir a derivar aps um dado smbolo no terminala est em Follow(A) ...

  • FUNO FIRST - REGRASPara calcular FIRST(X) de todos os smbolos X da gramtica, as seguintes regras devem ser aplicadas at que no haja mais terminais ou : Se X um smbolo terminal, ento FIRST(X)={X}Se X um smbolo no-terminal e X::= Y1Y2...Yk uma produo p/ algum k1, ento: acrescente a a First(X) se, para algum i, a estiver em FIRST(Yi), e estiver em todos os FIRST(Y1),... FIRST(Yi-1).adicione se est em FIRST(Yj) para todo j = 1,2,...kSe Y1 no derivar , nada mais deve ser acrescentado a FIRST(X)Se X::= uma produo, ento acrescente a FIRST(X)

  • FUNO FIRST - EXEMPLODada a Gramtica G=({+,*,(,),id}, {E,T,F,T,E}, E, {E::=TE; E::=+TE|; T::=FT; T=*FT|; F::=(E)|id}), determine:FIRST(T) =

    FIRST(E) =

    FIRST(T) =FIRST(F)FIRST(() U FIRST(id){(,id}FIRST(+) U FIRST(){+, }FIRST(*) U FIRST(){*, }

  • FUNO FIRST - EXEMPLODada a Gramtica G=({a,b,c}, {I,A,B}, I, {I::=aBa|BAc|ABc; A::=aA|

Search related