VinBR

Compiladores 12/03/2012

Mar 13th, 2012
59
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.97 KB | None | 0 0
  1.  
  2. # # # # # # # # # # # # #
  3. # Compiladores #
  4. # Professora Mariza #
  5. # notasdogarcia.blog.com #
  6. # # # # # # # # # # # # #
  7.  
  8. type -> simple
  9. | *id // um apontador
  10. | array [simple] of type
  11.  
  12. // Deve haver uma função simple() que é chamada quando se espera encontrar um simple.
  13.  
  14. simple -> array
  15. | char
  16. | num dotdot num
  17.  
  18. código do type:
  19.  
  20. if lookahead is {integer,char,num}
  21. then simple();
  22. else if lookahead = *
  23. then begin match(*) etc...
  24.  
  25. // se conseguir completar esse algoritimo complete, talvez tenha algo no site da materia.
  26.  
  27. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  28.  
  29. Vamos começar a fazer nosso compilador.
  30.  
  31. Função principal: Reconhecer os símbolos terminais.
  32.  
  33. Funções adicionais:
  34. - Remoção de branco
  35. - Remoção de comentários
  36. - Indicação de posição de erro // é necessário saber-se a linha e a coluna.
  37. - Listagem do fonte.
  38.  
  39.  
  40. Porque não juntar o analizador léxico com o sintatico?
  41.  
  42. Porque o primeiro é mais simples. Se juntarmos os dois voce acaba gastando mais tempo com uma coisa simples.
  43. - Simplicidade.
  44. - Eficiencia, pode-se criar otimizações mais especificas para cada um.
  45. - A portabilidade do compilador é melhorada, cada parte pode ser criada de forma mais versátil.
  46. O que de fato acontece é que chama-se o analisador lexico para ver se o caractere é válido e então se chama o sintatico.
  47. E se repete isso a cada trecho de código.
  48.  
  49. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  50.  
  51. Revendo conceitos:
  52. - Lexema: Sequencia de caracteres reconhecia pelo analisador léxico.
  53. - Token: Dupla contendo o tipo do lexema e um ponteiro para as informações do mesmo.
  54. - Padrão: Uma determinada formação de tokens reconhecida pelo analisador sintático.
  55.  
  56. Ex: <operador, +> ou <operador, ÷> ou <id, Aux>
  57.  
  58. // Na prática o compilador só utiliza o primeiro item da dupla, o segundo só é útil durante a execução.
  59.  
  60. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  61.  
  62. // Usa-se uma expressão regular para definir os lexemas aceitos na linguagem, assim temos algumas operações que podem ser usadaso:
  63.  
  64. Operações possíveis
  65.  
  66. União A,L = {x | x € A ou x € L}
  67. Concatenação A.B = AB
  68. Fecho A* = qualquer sequencia gerada por 0 ou mais concatenações de A
  69. Fecho positivo A+ = qualquer sequencia gerada por 1 ou mais concatenações de A
  70. A⁵ = Palavras formadas por 5 concatenações de A
  71.  
  72. Uma definição regular é da forma:
  73. {nome} => {exp regular}
  74. // Onde o nome é o nome do identificador
  75. ex: id = letra . { letra , numero }
  76.  
  77. A ordem de precedencia é: * . ,
  78. // A professora usa | ao inves de , para indicar união.
  79. // Concatenação (.) pode ser ocultado (basta colocar duas coisas lado a lado para denotar uma concatenação).
  80.  
  81. Ou seja para cada token de nome por exemplo "id" temos uma definição regular para dizer como ele é escrito.
  82.  
  83. Tranquilo isso né?
  84.  
  85. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  86.  
  87. Notações para abreviação
  88. a-z denota todo o alfabeto minusculo de a até z.
  89.  
  90. .digito? denota que se ocorrer a palavra . concatenado com um digito ele deve aparecer uma unica vez.
  91. (isso pode ser útil para denotar a parte fracionaria de um numero por exemplo)
  92.  
  93. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  94.  
  95. Notação para grafos que usaremos:
  96.  
  97. Estado inicial: "-> ()"
  98. Estado normal: "()"
  99. Estado final: "(())"
  100. Transição: "->"
  101.  
  102. Ex: ->(0)----letra------>(1)---outro_caractere--->((2)) Se chegou aqui faça: retract(); return(id)
  103. \
  104. ---letra ou digito----->(1) //Isso aqui denota um loop, ou seja um estado que pode sair de sí mesmo e voltar para sí mesmo.
  105.  
  106. Ao se chegar em um estado final, voce executa alguma ação e retorna.
  107. Normalmente voce da um retract() que seria um retorno no cabeçote de leitura em uma letra, e então retorna o tipo que voce recebeu.
  108.  
  109. E é imitando essa idéia que se faz um analisador léxico.
  110.  
  111. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  112.  
  113. Na prox aula a professora vai encinar a usar as ferramentas para analise lexica.
  114.  
  115. // Fim da aula.
Advertisement
Add Comment
Please, Sign In to add comment