Professor: Roberto Claudino Bianca Gueldini Tella 21189 Luzia Gomes de Amorim 22561 Maria Tereza Ribeiro Reis 15598
1. Anlise lxica
1.2. Definio Definio: O analisador lxico uma funo que transforma sequncias de caracteres em sequncias de smbolos (palavras ou tokens). Exemplos de tokens: Palavras reservadas do Pascal (begin, function, ), operadores (+, <=, ), identificadores, constantes e sinais de pontuao. Por exemplo, a sequncia: 45 * 10 ser convertida em: < NUM, 45 > < *, > < NUM, 10 > onde o atributo do token NUM o seu valor numrico.
1.3. Mtodos Podem-se usar dois mtodos: Utilizao de uma tabela de smbolos, onde so registados os identificadores e as palavras-chave do texto Fonte. Descrio dos smbolos atravs de expresses regulares.
1.4. Tabela de smbolos O atributo do token ID pode ser o endereo do elemento da tabela, onde est registada a cadeia de caracteres que descreve o identificador. As operaes de gesto de uma tabela de smbolos so as seguintes: Inicializao: com as palavras-chave e os identificadores-standard Pesquisa de um smbolo (fornece o endereo do registo que o contm) Insero de um novo smbolo (e informao associada)
1.5. Descrio atravs de expresses regulares Este mtodo consiste em traduzir os tokens atravs de expresses regulares, e utilizar autmatos finitos para reconhec-los.
Construo do autmato (algoritmo) A = (Q, T, M, q0, H): q estado_inicial Repetir q delta (q, c) Se ( q H ) { H = conj. estados finais do autmato } Ento guardar (c) ler (c) At ( q H) Cdigo_smbolo f (q)
Na implementao do autmato, os estados q so inteiros, com estado_inicial = 0, reservando os negativos para os H. (se q < 0 ento... ) Existem duas formas de implementar a funo de transio : Com um array bidimensional : delta [q, c] Como uma funo : delta (q, c) Ou utilizar solues intermdias Na implementao da funo de transio com um array, a execuo mais rpida, mas ocupa mais memria. Por exemplo, para o autmato seguinte:
2. Analisador sinttico Um analisador sinttico para uma gramtica G um programa que aceita como entrada uma sentena e constri para a sentena sua rvore gramatical (ou equivalentemente uma sequncia de derivao) ou, caso a sentena no pertena linguagem descrita por G, uma indicao de erro. O objetivo do analisador sinttico obter uma cadeia de tokens, provenientes de chamadas ao analisador lxico, e verificar se esta cadeia pode ser gerada pela gramtica da linguagem fonte. Como sada, o analisador sinttico pode gerar a rvore gramatical correspondente cadeia de tokens durante a anlise lxica, alm de relatar eventuais erros de sintaxe encontrados durante a fase de anlise.
3. Interligao entre os analisadores lxico e sinttico
O esquema de interao entre o analisador lxico e o analisador sinttico pode ser visualizado na figura seguinte.
O analisador lxico funciona com sub-rotina do analisador sinttico e comunica com este atravs de uma interface simples. O analisador sinttico chama o analisador lxico sempre que necessita de obter um elemento lxico. O analisador lxico devolve o cdigo do elemento lxico e informao extra. Por exemplo, se o analisador lxico detectar uma sequncia de caracteres descrita pela expresso regular [09]+, devolve ao analisador sinttico o cdigo do nmero inteiro. Uma vez que o valor do nmero inteiro pode ser importante, por exemplo, se for o literal de uma expresso aritmtica, o analisador lxico tambm deve devolver ao analisador sinttico o valor do nmero. Os identificadores de elementos sintticos como variveis devem ser armazenadas na tabela de identificadores. A insero pode ser feita pelo analisador lxico ou pelo analisador sinttico, conforme a linguagem processada e opo do compilador. Nas linguagens de programao imperativa (Pascal e C), os identificadores podem referir elementos distintos, tais como variveis e funes. Neste caso, prefervel o analisador lxico passar ao analisador sinttico a referncia zona de memria para onde copiado o identificador. Ser o analisador sinttico quem determina o significado do identificador e efetua as aes apropriadas de insero/pesquisa do smbolo na tabela de identificadores.
3.1. LEX : um gerador automtico de analisadores lxicos
Dado um programa escrito na linguagem de programao denominada por LEX (prog.lex), as trs fases da compilao deste programa so as seguintes : 1. lex prog.lex { contm uma funo em C chamada yylex() }
O LEX gera um autmato determinstico finito, capaz de reconhecer padres (de acordo com as expresses regulares especificadas), permitindo ainda associar aes. O LEX como analisador lxico: yylex() uma funo que fornece o valor zero no fim do ficheiro, e pode fornecer os cdigos dos smbolos reconhecidos. Exemplo : letra [azAZ] dig [0-9] %% BEGIN { return (1) ; } END { return (2) ; } := { return (3) ; } { letra } ( { letra } | { dig } ) * { return (4) ; } . . . Para escrever todos os valores dos cdigos dos smbolos que ocorrem nem texto : While (c = yylex () ) printf (%d, c) ; yytext um array externo onde ficam armazenados os caracteres reconhecidos. Para escrever a palavra lida : [az] + printf (%s, yytext) ; ou, abreviadamente [az] + ECHO ; yyleng d o comprimento do padro reconhecido [azAZ] + { palavras ++ ; letras += yyleng ; } Exemplo : Somar 3 a todo o inteiro no negativo que seja divisvel por 7. %% int k ; [0-9] + { k = atoi (yytext) ; if (k % 7 == 0) printf (%d, k+3) ; else printf (%d, k) ; } 4. Tabela de Anlise Sinttica LR (1)
A maioria das linguagens de programao podem ser descritas por uma gramtica livre de contexto que pode ser analisado por um analisador LR(1). Para a regra A- > a possvel indicar exatamente quais smbolos de entrada podem se seguir a um gerador a para o qual exista uma possvel reduo A. A informao extra incorporada dentro do estado pela redefinio dos itens, de forma que incluam um smbolo terminal como um segundo componente. A tabela LR(1) construda da mesma forma que a LR(0) exceto na maneira de inserir os reduces (redues). Quando h um item [A - > a.,a] em um estado i, ento deve-se inserir na linha i coluna a a reduo da regra de produo A - > a.
"PROGRAMA" [A-Z], [a-z]} [0-9] S S-> PROGRAMA
"PROGRAMA" [A-Z], [a-z]} [0-9] PROGRAMA PROGRAMA -> "PROGRAMA" NOMEPROG "INICIO" PROG "FIM"
INTEIRO -> NUMERO REAL -> NUMERO . NUMERO CARACTER -> [A-Z] | [a-z] | [0-9] | ['@', '_', '-', '$', '%', '&'] CADEIA -> '(' VAR ')' CADEIA | '(' VAR ')' TEXTO -> CARACTER TEXTO | CARACTER LISTA_INT -> '(' INTEIRO ')' LISTA_INT | '(' INTEIRO ')' LISTA_REAL -> '(' REAL ')' LISTA_REAL | '(' REAL ')'
-------------------------------------------
COMENTARIO -> '{' TEXTO '}'
5.1. rvore Sinttica Definio: Uma rvore de anlise sinttica, ou simplesmente rvore sinttica, uma estrutura de dados em rvore, que representa a estrutura sinttica de uma cadeia de acordo com alguma gramtica formal. Em uma rvore sinttica, os ns internos so rotulados por smbolos no-terminais da gramtica, enquanto os ns folha so rotuladas por smbolos terminais da gramtica. Um programa que produz tais rvores denominado um analisador sinttico. rvores sintticas podem ser geradas para sentenas em linguagem natural como tambm durante o processamento de linguagens formais, tais como as linguagens de programao.
S | PROGRAMA | "PROGRAMA" NOMEPROG "INICIO" PROG "FIM"
NEPOMUCENO, M. R. Compiladores: Anlise Sinttica. Disponvel em: <http://www.fafiman.br/leandro/arquivos/compiladores/apoio/Analise%20Sintatica/Ana liseSintatica.pdf> Acesso em: 28 de novembro de 2013. RIGO, S. Anlise Lxica. Disponvel em: < http://www.ic.unicamp.br/~sandro/cursos/mc910/slides/cap2-lex.pdf> Acesso em: 28 de novembro de 2013.