Sei sulla pagina 1di 69

Compiladores

Teoria, tcnicas e aplicaes

PDF gerado usando o pacote de ferramentas em cdigo aberto mwlib. Veja http://code.pediapress.com/ para mais informaes. PDF generated at: Tue, 10 Apr 2012 22:45:38 UTC

Contedo
Pginas
Introduo aos Compiladores
O Compilador Os Interpretadores Compilador cruzado Linguagem compilada Linguagem interpretada 1 1 9 10 10 11 13 13 15 16 20 22 22 24 24 27 35 36 42 43 43 45 46 46 49 51 51 51 53

Anlise Lxica
Autmatos finitos determinsticos Autmatos finitos no determinsticos Minimizao de AFD Anlise lxica

Anlise Sinttica
Hierarquia de Chomsky Gramtica irrestrita Gramtica sensvel ao contexto Gramtica livre de contexto Gramtica regular Formalismo de Backus-Naur Anlise sinttica

Anlise Sinttica Top-Down


Analisador sinttico LL Analisador sinttico descendente recursivo

Anlise Sinttica Bottom-Up


Analisador sinttico LR Analisador sinttico GLR

Anlise semntica
Anlise semntica Gramtica de atributos Gramticas de Van Wijngaarden

Gerao de Cdigo
Gerao de Cdigo

56 56 58 58 59 61 62 63

Compiladores de Compilador
Compilador de compilador lex yacc Bison JavaCC

Referncias
Fontes e Editores da Pgina Fontes, Licenas e Editores da Imagem 64 65

Licenas das pginas


Licena 66

Introduo aos Compiladores


O Compilador
Um compilador um programa de computador (ou um grupo de programas) que, a partir de um cdigo fonte escrito em uma linguagem compilada, cria um programa semanticamente equivalente, porm escrito em outra linguagem, cdigo objeto.[1] Ele chamado compilador por razes histricas; nos primeiros anos da programao automtica, existiam programas que percorriam bibliotecas de subrotinas e as reunia juntas, ou compilava,[2] as subrotinas necessrias para executar uma determinada tarefa.[3][4]

Uma captura de tela do compilador GCC verso 4.0.2 rodando em uma janela xterm. Um programa simples est sendo compilado e ento executado

O nome "compilador" usado principalmente para os programas que traduzem o cdigo fonte de uma linguagem de programao de alto nvel para uma linguagem de programao de baixo nvel (por exemplo, Assembly ou cdigo de mquina). Contudo alguns autores citam exemplos de compiladores que traduzem para linguagens de alto nvel como C.[5] Para alguns autores um programa que faz uma traduo entre linguagens de alto nvel normalmente chamado um tradutor, filtro[6] ou conversor de linguagem. Um programa que traduz uma linguagem de programao de baixo nvel para uma linguagem de programao de alto nvel um descompilador.[7] Um programa que faz uma traduo entre uma linguagem de montagem e o cdigo de mquina denominado montador (assembler).[6] Um programa que faz uma traduo entre o cdigo de mquina e uma linguagem de montagem denominado desmontador (disassembler).[7] Se o programa compilado pode ser executado em um computador cuja CPU ou sistema operacional diferente daquele em que o compilador executado, o compilador conhecido como um compilador cruzado.[8]

O Compilador

Histria
Software para os primeiros computadores foram escritos principalmente em linguagem assembly por muitos anos. As linguagens de alto nvel de programao no foram inventadas at que os benefcios de ser capaz de reutilizar software em diferentes tipos de CPUs passassem a ser significativamente maiores do que o custo de se escrever um compilador. A capacidade de memria muito limitada capacidade dos primeiros computadores tambm criava muitos problemas tcnicos na implementao de um compilador. No final da dcada de 1950, as linguagens de programao independentes de mquina foram propostas. Posteriormente, vrios compiladores experimentais foram desenvolvidos. O primeiro compilador foi escrito por Grace Hopper,[9] em 1952, para a linguagem de programao A-0.[10] Antes de 1957, foram desenvolvidos esforos e vrias contribuies ao desenvolvimento Grace Hopper em 1984 de linguagens de alto nvel foram feitas. Entre estes, o desenvolvimento da Short Code (UNIVAC), Speedcoding no IBM 701,[11][12] o Whirlwind, o BACAIC e o PRINT.[13] A equipe de desenvolvimento do FORTRAN liderada por John Backus na IBM geralmente creditada como tendo introduzido o primeiro compilador completo em 1957 (embora tenha ocorrido simultaneamente o desenvolvimento do algebraic translator de Laning e Zierler[10]). O COBOL um exemplo de uma linguagem da primeira gerao que compilava em mltiplas arquiteturas, em 1960.[14] Em muitos domnios de aplicao a idia de usar uma linguagem de alto nvel rapidamente ganhou fora. Por causa da funcionalidade de expanso apoiada por linguagens de programao recentes e a complexidade crescente de arquiteturas de computadores, os compiladores tornaram-se mais e mais complexos. Os primeiros compiladores foram escritos em linguagem assembly. O primeiro compilador de auto-hospedagem capaz de compilar seu prprio cdigo-fonte em uma linguagem de alto nvel - foi criado para o Lisp por Tim Hart e Levin Mike no MIT em 1962.[15]

O Compilador

Caractersticas
Normalmente, o cdigo fonte escrito em uma linguagem de programao de alto nvel, com grande capacidade de abstrao, e o cdigo objeto escrito em uma linguagem de baixo nvel,[16] como uma sequncia de instrues a ser executada pelo microprocessador. O processo de compilao composto de anlise e sntese.[17] A anlise tem como objetivo entender o cdigo fonte e represent-lo em uma estrutura intermediria. A sntese constri o cdigo objecto a partir desta representao intermediria. A anlise pode ser subdividida ainda em anlise lxica, anlise sinttica, anlise semntica e gerao de cdigo intermedirio. tambm conhecida como front end.[17] A sntese pode ter mais variaes de um compilador a outro, podendo ser composta pelas etapas de optimizao de cdigo e gerao de cdigo final (ou cdigo de mquina), sendo somente esta ltima etapa obrigatria. tambm conhecida como back end.[17] Classicamente, um compilador traduz um programa de uma linguagem textual facilmente entendida por um ser humano para uma linguagem de mquina, especfica para um processador e sistema operacional. Atualmente, porm, so comuns compiladores que geram cdigo para uma mquina virtual que , depois, interpretada por um interpretador. Em linguagens hbridas, o compilador tem o papel de converter o cdigo fonte em um cdigo chamado de byte code, que uma linguagem de baixo nvel. Um exemplo deste comportamento o do compilador da linguagem Java que, em vez de gerar cdigo da mquina hospedeira (onde se est executando o compilador), gera cdigo chamado Java Bytecode.[18]

O processo da compilao

Um compilador chamado de Just-in-time compiler (JIT) quando seu processo de compilao acontece apenas quando o cdigo chamado.[19] Um JIT pode fazer otimizaes s instrues a medida que as compila.[19] Muitos compiladores incluem um pr-processador. Um pr-processador um programa separado, ativado pelo compilador antes do incio do processo de traduo.[20] Normalmente responsvel por mudanas no cdigo fonte destinadas de acordo com decises tomadas em tempo de compilao. Por exemplo, um programa em C permite instrues condicionais para o pr-processador que podem incluir ou no parte do cdigo caso uma assertiva lgica seja verdadeira ou falsa, ou simplesmente um termo esteja definido ou no. Tecnicamente, pr-processadores so muito mais simples que compiladores e so vistos, pelos desenvolvedores, como programas parte, apesar dessa viso no ser necessariamente compartilhada pelo usurio. Outra parte separada do compilador que muitos usurios vem como integrada o linker, cuja funo unir vrios programas j compilados de uma forma independente e unific-los em um programa executvel.[21] Isso inclui colocar o programa final em um formato compatvel com as necessidades do sistema operacional para carreg-lo em memria e coloc-lo em execuo.

O Compilador

Fases da compilao
Anlise lxica
A anlise lxica a primeira fase do compilador.[22] A funo do analisador lxico, tambm denominado scanner, ler o cdigo fonte, caracter a caracter, buscando a separao e identificao dos elementos componentes do programa fonte, denominados smbolos lxicos ou tokens.[23] tambm de responsabilidade desta fase a eliminao de elementos "decorativos" do programa, tais como espaos em branco, marcas de formatao de texto e comentrios.[24] Existem disponveis uma srie de geradores automticos de analisadores lxicos, como por exemplo, o lex. O objetivo dos geradores automticos limitar o esforo de programao de um analisador lxico especificando-se apenas os tokens a ser reconhecidos.[25]

Anlise sinttica
A anlise sinttica, ou anlise gramatical o processo de se determinar se uma cadeia de smbolos lxicos pode ser gerada por uma gramtica.[26] O analisador sinttico o cerne do compilador, responsvel por verificar se os smbolos contidos no programa fonte formam um programa vlido, ou no.[27] No caso de analisadores sintticos top-down, temos a opo de escrev-los mo ou ger-los de forma automtica, mas os analisadores bottom-up s podem ser gerados automaticamente.[28] A maioria dos mtodos de anlise sinttica, cai em uma dessas duas classes denominadas top-down e bottom-up.[29] Entre os mtodos top-down os mais importantes so a anlise sinttica descendente recursiva e a anlise sinttica preditiva no-recursiva. Entre os mtodos de anlise sinttica bottom-up os mais importantes so a anlise sinttica de precedncia de operadores, anlise sinttica LR cannico, anlise sinttica LALR e anlise sinttica SLR.[26] Existem disponveis uma srie de geradores automticos de analisadores sintticos,[30] como por exemplo, o Yacc, o Bison e o JavaCC.

Anlise semntica
As anlises lxica e sinttica no esto preocupadas com o significado ou semntica dos programas que elas processam. O papel do analisador semntico prover mtodos pelos quais as estruturas construdas pelo analisador sinttico possam ser avaliadas ou executadas.[31] As gramticas livres de contexto no so suficientemente poderosas para descrever uma srie de construes das linguagens de programao, como por exemplo regras de escopo, regras de visibilidade e consistncia de tipos.[32] papel do analisador semntico assegurar que todas as regras sensveis ao contexto da linguagem estejam analisadas e verificadas quanto sua validade. Um exemplo de tarefa prpria do analisador semntico a checagem de tipos de variveis em expresses.[33] Um dos mecanismos comumente utilizados por implementadores de compiladores a Gramtica de Atributos, que consiste em uma gramtica livre de contexto acrescentada de um conjunto finito de atributos e um conjunto finito de predicados sobre estes atributos.[34]

O Compilador

Gerao de cdigo intermedirio


Na fase de gerao de cdigo intermedirio, ocorre a transformao da rvore sinttica em uma representao intermediria do cdigo fonte. Esta linguagem intermediria mais prxima da linguagem objeto do que o cdigo fonte, mas ainda permite uma manipulao mais fcil do que se cdigo assembly ou cdigo de mquina fosse utilizado.[35] Um tipo popular de linguagem intermediria conhecido como cdigo de trs endereos.[36] Neste tipo de cdigo uma sentena tpica tem a forma X := A op B, onde X, A e B so operandos e op uma operao qualquer. Uma forma prtica de representar sentenas de Exemplo de cdigo de trs endereos e um DAG trs endereos atravs do uso de qudruplas (operador, correspondente para uma expresso aritimtica argumento 1, argumento 2 e, resultado). Este esquema de representao de cdigo intermedirio preferido por diversos compiladores, principalmente aqueles que executam extensivas otimizaes de cdigo, uma vez que o cdigo intermedirio pode ser rearranjado de uma maneira conveniente com facilidade.[37]Outras representaes de cdigo intermedirio comumente usadas so as triplas, (similares as qudruplas exceto pelo fato de que os resultados no so nomeados explicitamente) as rvores, os grafos acclicos dirigidos(DAG) e a notao polonesa.[38]

Optimizao de cdigo
A Otimizao de cdigo a estratgia de examinar o cdigo intermedirio, produzido durante a fase de gerao de cdigo com objetivo de produzir, atravs de algumas tcnicas, um cdigo que execute com bastante eficincia.[33] O nome optimizador deve sempre ser encarado com cuidado, pois no se pode criar um programa que leia um programa P e gere um programa P equivalente sendo melhor possvel segundo o critrio adotado.[24] Vrias tcnicas e vrias tarefas se renem sob o nome de Optimizao. Estas tcnicas consistem em detectar padres dentro do cdigo produzido e substitu-los por cdigos mais eficientes.[37] Entre as tcnicas usadas esto a substituio de expresses que podem ser avaliadas durante o tempo de compilao pelos seus valores calculados, eliminao de sub-expresses redundantes, desmembramento de laos, substituio de operaes (multiplicao por shifts), entre outras.[33] Uma das tcnicas de optimizao mais eficazes e independente de mquina a otimizao de laos, pois laos internos so bons candidatos para melhorias. Por exemplo, em caso de computaes fixas dentro de laos, possvel mover estas computaes para fora dos mesmos reduzindo processamento.[39]

Gerao de cdigo final


A fase de gerao de cdigo final a ltima fase da compilao. A gerao de um bom cdigo objeto difcil devido aos detalhes particulares das mquinas para os quais o cdigo gerado. Contudo uma fase importante, pois uma boa gerao de cdigo pode ser, por exemplo, duas vezes mais rpida que um algoritmo de gerao de cdigo ineficiente.[37] Nem todas as tcnicas de optimizao so independentes da arquitetura da mquina-alvo. Optimizaes dependentes da mquina necessitam de informaes tais como os limites e os recursos especiais da mquina-alvo a fim de produzir um cdigo mais compacto e eficiente. O cdigo produzido pelo compilador deve se aproveitar dos recursos especiais de cada mquina-alvo.[33] Segundo Aho, o cdigo objeto pode ser uma sequncia de instrues absolutas de mquina, uma sequncia de instrues de mquina relocveis, um programa em linguagem assembly ou um programa em outra linguagem.[40]

O Compilador

Tratamento de erros
O tratamento de erros est voltado a falhas devido a muitas causas: erros no compilador, erros na elaborao do programa a ser compilado, erros no ambiente (hardware, sistema operacional), dados incorretos, etc. As tarefas relacionadas ao tratamento de erros consitem em detectar cada erro, report-lo ao usurio e possivelmente fazer algum reparo para que o processamento possa continuar.[41] Os erros podem ser classificados em erros lxicos, erros sintticos, erros no independentes de contexto (semnticos), erros de execuo e erros de limite.[42] Os erros lxicos ocorrem quando um token identificado no pertence a gramtica da linguagem fonte. Os erros sintticos ocorrem quando alguma estrutura de frase no est de acordo com a gramtica, como por exemplo parnteses sem correspondncia. Os erros no indepenentes de contexto em geral so associados a no declarao de objetos como variveis e erros de tipos. Os erros de execuo ocorrem aps a compilao, quando o programa j est sendo executado. Um exemplo tpico o da diviso por zero. Os erros de limite, ocorrem durante a execuo e esto relacionados as caractersticas da mquina na qual o programa est sendo executado, como por exemplo, estouro de pilha.[42] Alguns compiladores encerram o processo de traduo logo ao encontrar o primeiro erro do programa-fonte. Esta uma poltica de fcil implementao. Compiladores mais sofisticados, porm, detectam o maior nmero possvel de erros visando diminuir o nmero de compilaes.[43] A recuperao de erros em analisadores sintticos top-down mais fcil de implementar do que em analisadores bottom-up.[44] O problema que diferente de um analisador top-down, este ltimo no sabe quais smbolos so esperados na entrada, somente os que j foram processados. Pode-se usar neste caso tcnicas como, por exemplo, a tcnica de panic-mode que procura em tabelas sintticas em busca de smbolos vlidos na entrada.[44] Nesta tcnica se descartam smbolos da entrada at que um delimitador (como um ponto e vrgula, por exemplo) seja encontrado. O analisador apaga as entradas da pilha at que encontre uma entrada que permita que o processo de anlise prossiga em diante.[45]
Tratamento de erro de execuo em uma aplicao Java no Elipse

Notas
[1] Aho, Alfred V.;Ullman, Jeffrey D.. Principles of Compiler Design (em ingls). Reading, Massachusetts, EUA:Addison-Wesley, 1977.604 p. p.1. ISBN 0-201-00022-9 [2] Em portugus, "compilar" significa, por exemplo: reunir obras literrias, documentos, escritos de vrios autores, entre outros, compondo uma obra com esse material. Larousse. Dicionrio da Lngua Portuguesa (em ingls). [S.l.]:Nova Cultural, 1992. ISBN 85-85222-23-9 [3] Parsons, Thomas W.. Introduction to Compiler Construction (em ingls). Nova Iorque, EUA:Computer Science Press, 1992.359 p. p.1. ISBN 0-7167-8261-8 [4] Appel, Andrew W.. Modern Compiler Implementation in Java (http:/ / www. cs. princeton. edu/ ~appel/ modern/ java/ ) (em ingls). Cambridge:Cambridge University Press, 1998.548 p. p.3. ISBN 0-521-58388-8 [5] Cooper, Torczon. Engineering a Compiler (em ingls). San Francisco:Morgan Kaufmann, 2003. p.2. ISBN 1-55860-698-X [6] Neto, Joo Jos. Introduo Compilao (em portugus). Rio de Janeiro:LTC, 1987.222 p. ISBN 978-85-216-0483-9 [7] Watt, David A.; Brown, Deryck F.. Programming Language Processors in Java (em ingls). Harlow, England:Prentice Hall, 2000.436 p. p.27. ISBN 0-130-25786-9 [8] Elder, John. Compiler Conctruction: A Recursive Descent Model (em ingls). Englewood Cliffs, Nova Jersey, EUA:Prentice Hall, 1994.437 p. p.7-8. vol.1. ISBN 0-13-291139-6

O Compilador
[9] Lemone, Karen A.. Fundamentals of Compilers: An Introduction to Computer Language Translation (em ingls). Boca Raton:CRC, 1992.184 p. ISBN 0-8493-7341-7 [10] Wexelblat, Richard L.(Editor). History of Programming Languages. New York:Academic Press, 1981.758 p. p.6-15. ISBN 0-12-745040-8 [11] Bashe, Charles J.; Johnson, Lyle R.; Palmer, John H.; Pugh, Emerson W.. IBMs Early Computers. Cambridge:MIT Press, 1986.716 p. p.333. ISBN 0-262-02225-7 [12] McClelland, William F. (abril 1983). "Programming" (em ingles). Annals of The History of Computing 5 (2): 135-139. Arlington, VA: American Federation of Information Processing Societies. ISSN 1058-6180 (http:/ / worldcat. org/ issn/ 1058-6180). [13] Sammet, Jean E. Programming Languages: History and Fundamentals. Englewood Cliffs, New Jersey:Prentice Hall, 1969.785 p. p.5. ISBN 0-13-729988-5 [14] IP: Os primeiros compiladores COBOL do mundo (http:/ / www. interesting-people. org/ archives/ interesting-people/ 199706/ msg00011. html). interesting-people.org (12 de Junho de 1997). [15] T. Hart and M. Levin. O novo compilador, AIM-39 - CSAIL Digital Archive - Artificial Intelligence Laboratory Series (ftp:/ / publications. ai. mit. edu/ ai-publications/ pdf/ AIM-039. pdf). publications.ai.mit.edu. [16] Mak, Ronald. Writing Compilers and Interpreters: An Applied Approach Using C++ (em ingls). Nova Iorque:John Wiley and Sons, 1996.838 p. p.1. ISBN 0-471-11353-0 [17] Holmes, Jim. Object-Oriented Compiler Construction (em ingls). Englewood Cliffs, Nova Jersey:Prentice Hall, 1995.483 p. p.2-3. ISBN 0-13-630740-X [18] Sebesta, Robert. Conceitos de Linguagens de Programao (em portugus). 9ed. Porto Alegre:Bookman, 2010.792 p. p.49-50. ISBN 978-85-7780-791-8 [19] Engel, Joshua. Programming for the Java Virtual Machine (em ingls). Reading, Massachusetts:Addison & Wesley, 1999.488 p. p.355. ISBN 0-201-30972-6 [20] Louden, Kenneth C.. Compiladores: Princpios e Prticas (em portugus). So Paulo:Pioneira Thompson Learning, 2004.569 p. p.5. ISBN 85-221-0422-0 [21] Levine, John R.. Linkers & Loaders (em ingls). San Francisco:Morgan Kaufmann Publishers, 2000.256 p. p.1-3. ISBN 1-55860-496-0 [22] Aho, Alfred V.;Ullman, Jeffrey D.. The Theory of Parsing, Translation, and Compiling, Vol. 1, Parsing (em ingls). Englewood Cliffs, Nova Jersey, EUA:Prentice Hall, 1972.542 p. p.59. 2vol. vol.1. ISBN 0-13-914556-7 [23] Price, Ana M. A.; Toscano, Simo Sirineo. Implementao de Linguagens de Programao: Compiladores: Srie de Livros Didticos Nmero 9 (em portugus). Porto Alegre:Sagra Luzzatto, 2000.195 p. ISBN 978-85-241-0639-2 [24] Compiladores - Pgina de Jos Lucas Mouro Rangel Netto (http:/ / www-di. inf. puc-rio. br/ ~rangel/ comp. html) (em portugus). PUC-Rio. Pgina visitada em 21 de junho de 2009. [25] Fischer, Charles N.; LeBlanc, Jr, Richard J.. Crafting a Compiler with C (em ingls). Redwood City, California:Benjamin Cummings Publishing, 1991.812 p. p.50. ISBN 0-8053-2166-7 [26] Aho, Alfred V.; Sethi, Ravi; Ullman, Jeffrey D.. Compilers: Principles, Techniques and Tools (em ingls). Reading, Massachusetts, EUA:Addison-Wesley, 1986.796 p. ISBN 978-0-201-10088-4 [27] Delamaro, Marcio. Como Construir um Compilador Utilizando Ferramentas Java (http:/ / www. novateceditora. com. br/ livros/ compilador/ ) (em portugus). So Paulo:Novatec, 2004.308 p. p.4. ISBN 85-7522-055-1 [28] Grune, Dick;Bal, Henri E.; Jacobs, Ceriel J. H.; Langendoen, Koen G. Projeto Moderno de Compiladores (em portugus). Rio de Janeiro:Campus, 2001. ISBN 978-85-352-0876-4 [29] Lewis II, P. M.;Rosenkrantz, D,J.; Stearns, R.E.. Compiler Design Theory (em ingls). Reading, Massachusetts:Addison-Wesley, 1978.647 p. p.227. ISBN 0-201-14455-7 [30] Alblas, Henk; Nymeyer, Albert. Practice and Principles of Compiler Building with C (em ingls). London:Prentice Hall, 1996.427 p. p.30. ISBN 0-13-349267-2 [31] Watson, Des. High-Level Languages and Their Compilers (em ingls). Wokingham, Reino Unido:Addison-Wesley, 1989.337 p. ISBN 0-201-18489-3 [32] Wilhelm, Reinhard; Maurer, Dieter. Compiler Design (em ingls). Harlow, England:Addison-Wesley, 1995.606 p. ISBN 0-201-42290-5 [33] Tremblay, Jean-Paul; Sorenson, Paul G.. The Theory and Practice of Compiler Writing (em ingls). Nova Iorque:McGraw-Hill, 1989.796 p. ISBN 0-07-065161-2 [34] Pittman, Thomas; Peters, James. The Art of Compiler Design: Theory and Practice (em ingls). Englewood Cliffs, Nova Jersey, EUA:Prentice Hall, 1992.419 p. ISBN 0-13-048190-4 [35] Pyster, Arthur B.. Compiler Design and Construction: Tools and Techniques (em ingls). Nova Iorque, EUA:Van Nostrand Reinhold Company, 1988.267 p. p.8. ISBN 0-442-27536-6 [36] Crespo, Rui Gustavo. Processadores de Linguagens: da Concepo Implementao (em portugus). Lisboa, Portugal:IST Press, 1998.435 p. p.247. ISBN 972-8469-01-2 [37] Aho, Alfred V.; Ullman, Jeffrey D.. Principles of Compiler Design (em ingls). Reading, Massachusetts, EUA:Addison-Wesley, 1977.604 p. ISBN 0-201-00022-9 [38] Muchnick, Steven S.. Advanced Compiler Design Implementation (em ingls). San Francisco, California:Morgan Kaufmann Publishers, 1997.856 p. p.96. ISBN 1-55860-320-4 [39] Kakde, O. G.. Algorithms for Compiler Design (em ingls). Hingham:Charles River media, 2003.334 p. ISBN 81-7008-100-6

O Compilador
[40] Aho, Alfred V.; Ullman, Jeffrey D.. The Theory of Parsing, Translation, and Compiling, Vol. 2, Compiling (em ingls). Englewood Cliffs, Nova Jersey, EUA:Prentice Hall, 1972. p.720. 2vol. vol.2. ISBN 0-201-914564-8 [41] Waite, William M.; Goos, Gerhard. Compiler Construction (em portugus). Nova Iorque:Springer-Verlag, 1984.446 p. p.302. ISBN 0-387-90821-8 [42] Hunter, Robin. Compiladores: Sua Concepo e Programao em Pascal (em portugus). Lisboa:Presena, 1987.323 p. p.259-275. Depsito legal n 16057/87 [43] Kowaltowski, Tomasz. Implementao de Linguagens de Programao (em portugus). Rio de Janeiro:Guanabara Dois, 1983.189 p. p.170-171. ISBN 85-7030-009-3 [44] Holub, Allen I.. Compiler Design in C (em ingls). Englewood Cliffs, Nova Jersey:Prentice Hall, 1990.924 p. p.201;348. ISBN 0-13-155045-4 [45] Kakde, O. G.. Algorithms for Compiler Design (em ingls). Hingham:Charles River media, 2003.334 p. p.261. ISBN 81-7008-100-6

Bibliografia
Appel, Andrew W.. Modern Compiler Implementation in C: Basic Techiques (em ingls). [S.l.]:Cambridge University Press, 1997.398 p. ISBN 0-521-58653-4 Brown, P. J.. Writing Interactive Compilers and Interpreters (em ingls). Chichester:John Wiley & Sons, 1979.265 p. ISBN 0-471-27609-X Kaplan, Randy M.. Constructing Language Processors for Little Languages (em ingls). Nova Iorque:John Wiley & Sons, 1994.452 p. ISBN 0-471-59754-6 Lee, John A. N.. The Anatomy of a Compiler (em ingls). Nova Iorque:Reinhold Publishing Company, 1967.275 p. Library of Congress Catalog Card Number: 67-29207 Metsker, Steven John. Building Parsers with Java (em ingls). Boston:Addison-Wesley, 2001.371 p. ISBN
0-201-71962-2

Ricarte, Ivan. Introduo Compilao (em portugus). Rio de Janeiro:Campus, Elsevier, 2008.264 p. ISBN
978-85-352-3067-3

Terry, Patrick D.. Programming Language Translation: A Practical Approach (em ingls). Wokingham:Addison-Wesley, 1986.443 p. ISBN 0-201-18040-5 Wirth, Niklaus. Compiler Construction (http://www.cs.inf.ethz.ch/~wirth/books/CompilerConstruction) (em ingls). [S.l.]:Addison-Wesley, 1996. ISBN 0-201-40353-6

Ligaes externas
Pgina com material de compiladores (http://www-di.inf.puc-rio.br/~rangel/comp.html) (em portugus) Compilador Educativo Verto (http://verto.sf.net) (em portugus) Compiladores livres (http://www.thefreecountry.com/compilers/index.shtml) (em ingls)

Os Interpretadores

Os Interpretadores
Interpretadores so programas de computador que leem um cdigo fonte de uma linguagem de programao interpretada e o converte em cdigo executvel. Seu funcionamento pode variar de acordo com a implementao. Em alguns casos, o interpretador l linha-por-linha e converte em cdigo objeto (ou bytecode) medida que vai executando o programa e, em outros casos, converte o cdigo fonte por inteiro e depois o executa. Na verdade, em princpio, pode-se implementar compiladores e interpretadores para qualquer linguagem de programao. Mas, dependendo da necessidade, pode ser melhor criar um interpretador ou um compilador.

Exemplo de linguagens interpretadas


BASIC Bash Perl PHP Python Euphoria Forth JavaScript Logo Lisp Lua MUMPS Ruby Haskell

Compilador cruzado

10

Compilador cruzado
Um compilador cruzado (ingls: Cross compiler) um compilador que produz cdigos para diferentes tipos de computadores, usado no desenvolvimento de software que funciona em maquinas com uma nova arquitectura ou em dispositivos que no podem abrigar os seus prprios compiladores.

Ligaes externas
(em ingls) How to Choose a Cross Compiler [1]

Referncias
[1] http:/ / www. netrino. com/ Articles/ CrossCompilers/

Linguagem compilada
Linguagem compilada uma linguagem de programao, onde o cdigo fonte nessa linguagem executado diretamente pelo sistema operacional ou pelo processador, aps ser traduzido, atravs de um processo chamado compilao, usando um programa de computador chamado compilador, para uma linguagem de baixo nvel, como linguagem de montagem ou cdigo de mquina.[1][2] Teoricamente, qualquer linguagem pode ser compilada ou interpretada e, por causa disso, h algumas linguagens que possuem ambas implementaes.[1]

Linguagens tipicamente compiladas


Abaixo, segue-se algumas linguagens de programao que so tipicamente compiladas:
Ada ALGOL BASIC C C++ CLEO COBOL Cobra D Delphi Eiffel Fortran JOVIAL LabVIEW Lush ML Objective-C Ocaml Pascal Sather Ubercode Urq Visual Basic Visual Foxpro Visual Prolog

Common Lisp

Linguagem compilada

11

Referncias
[1] Scott, Michael L. Programming Language Pragmatics (em ingls). San Francisco:Morgam Kaufmann/Academic Press, 2006.875 p. p.15. ISBN 978-0-12-633951-2 [2] Fisher, Alice; Grodzinsky, Frances S. The Anatomy of Programming Languages (em ingls). Englewood Cliffs, New Jersey:Prentice Hall, 1993.557 p. p.167. ISBN 0-13-035155-5

Linguagem interpretada
Linguagem interpretada uma linguagem de programao, onde o cdigo fonte nessa linguagem executado por um programa de computador chamado interpretador, que em seguida executado pelo sistema operacional ou processador.[1][2] Mesmo que um cdigo em uma linguagem passe pelo processo de compilao, a linguagem pode ser considerada interpretada, se o programa resultante no for executado diretamente pelo sistema operacional ou processador. Um exemplo disso o Bytecode, que um tipo de linguagem interpretada, que passa pelo processo de compilao e, em seguida, executado por uma mquina virtual, cuja sintaxe similar a cdigo de mquina e, cada comando ocupa 1 byte. Existem tambm, as linguagens de script, que so linguagens interpretadas, executadas do interior de programas e/ou de outras linguagens de programao. Teoricamente, qualquer linguagem pode ser compilada ou interpretada e, por causa disso, h algumas linguagens que possuem ambas implementaes.[1]

Linguagens tipicamente interpretadas


Abaixo, segue-se algumas linguagens de programao que so tipicamente interpretadas (que podem possuir implementaes compiladas):
ActionScript APL ASP BASIC Bistro C# CYBOL DMDScript E4X Euphoria F-Script Forth Icon Inform J Java JavaScript Lisp Logo Lua MUMPS PHP Python R Ruby S Scheme Smalltalk Squeak VBScript VisualAge VisualWorks Tcl

ECMAScript

Linguagem interpretada

12

Referncias
[1] Scott, Michael L. Programming Language Pragmatics (em ingls). San Francisco:Morgam Kaufmann/Academic Press, 2006.875 p. p.15. ISBN 978-0-12-633951-2 [2] Fisher, Alice; Grodzinsky, Frances S. The Anatomy of Programming Languages (em ingls). Englewood Cliffs, New Jersey:Prentice Hall, 1993.557 p. p.167. ISBN 0-13-035155-5

13

Anlise Lxica
Autmatos finitos determinsticos
Dentro da Teoria da Computao, uma mquina de estados finitos determinstica ou autmato finito determinstico uma mquina de estados finitos onde, para cada par de estados e smbolo de entrada, existe um prximo estado determinstico.

Definio formal
Um autmato finito determinstico uma quntupla, (S, , T, s, A), que consiste de um conjunto finito de estados (S) um conjunto finito de smbolos chamado de alfabeto () uma funo de transio (T : S S) um estado inicial (s S) um conjunto de estados finais(A S) Considere que M seja um AFD (ou DFA) tal que M = (S, , T, s, A), e X = x0x1 ... xn seja uma string contida no alfabeto . M aceita a string X se numa seqncia de estados, r0,r1, ..., rn, existe em S com as seguintes condies: 1. r0 = s 2. ri+1 = T(ri, xi), para i = 0, ..., n-1 3. rn A. Conforme mostrado na primeira condio, a mquina inicia no estado inicial s. A segunda condio diz que, dado cada caracter de uma string X, a mquina passar de estado a estado de acordo com a definio de uma funo de transio T. A ltima condio diz que a mquina aceita uma string se a ltima entrada de X faz com que a mquina passe para um dos estados de aceitao. Caso contrrio, dizemos que a mquina rejeitou a string. O conjunto de strings que ela aceita forma uma linguagem, a qual a linguagem que um AFD reconhece.

Exemplo
O exemplo a seguir um autmato finito determinstico M, que possui um alfabeto binrio, o qual determina se a entrada contm um nmero par de 0's. M = (S, , T, s, A) onde = {0, 1}, S = {S1, S2}, s = S1, A = {S1}, and T definido pela seguinte tabela de transio de estados:

Autmatos finitos determinsticos

14

S1 S2 S1 S2 S1 S2

Considerando o autmato de maneira simplificada, o estado S1 representa que havia realmente um nmero par de 0's, enquanto S2 significa um nmero mpar. Um '1' na entrada no muda o estado do autmato. Quando a entrada consumida, o estado ir indicar se a entrada continha ou no um nmero par de 0's. A linguagem de M pode ser descrita pela linguagem regular dada por essa expresso regular:

Softwares
Simulador de Autmatos [1] - Software para criao, teste e converso de Modelos Formais. Com interface grfica. SCTMF [2] - Software para Criao e Teste de Modelos Formais. JFlap [3] - Software americano para testes com interface grfica.
Teoria de autmatos: linguagem formal e gramtica formal Hierarquia Chomsky Gramtica Tipo-0 -Tipo-1 Tipo-2 Tipo-3 Irrestrita --

Linguagem

Reconhecedor

Recursivamente enumervel Mquina de Turing Recursiva Mquina de Turing que sempre para Autmato linearmente limitado Autmato com pilha Autmato finito

Sensvel ao contexto Sensvel ao contexto Livre de contexto Regular Livre de contexto Regular

Referncias
[1] http:/ / www. simuladordeautomatos. com [2] http:/ / www. din. uem. br/ yandre/ sctmf/ [3] http:/ / www. jflap. org

Autmatos finitos no determinsticos

15

Autmatos finitos no determinsticos


Embora na prtica seja invivel a implementao de autmatos finitos no determinsticos (AFN), esses possuem algumas vantagens sobre os autmatos puramente determinsticos, sobretudo quanto facilidade de representao em diagramas (ver grafo). Na tentativa de obteno de um autmato finito para reconhecer certa linguagem regular , mais natural, em muitos casos, pensar-se primeiramente em representaes no determinsticas. Assim, dado que um AFND uma generalizao de um autmato finito determinstico (AFD), sempre possvel encontrar um AFD equivalente que reconhea a partir de um dado AFND (possivelmente atravs de um algoritmo de construo de subconjuntos), o que torna a implementao vivel.

Descrio Bsica
Autmatos finitos no determinsticos diferem dos Autmatos finitos determinsticos quanto regra de transio entre estados. Dada uma combinao de um estado atual e um smbolo de entrada, pode no haver estados especificados para os quais o estado atual deve conduzir o processamento, bem como pode haver vrios estados resultantes da leitura do smbolo. Portanto, para uma funo de transio definida em , o seu valor no deve ser um elemento de (como acontece com os autmatos determinsticos), mas um subconjunto de leva a um conjunto de estados em que a mquina . Assim, podemos definir lendo um smbolo de entrada (incluindo o conjunto vazio). Ou seja, o processamento de pode legalmente se encontrar aps estar em um estado

um autmato finito no determinstico matematicamente como se segue.

Definio Formal
Um autmato finito no determinstico uma quntupla no-vazios, , e o alfabeto, o estado inicial, o conjunto de estados vlidos (ou de onde e so conjuntos

o conjunto de estados, aceitao) e

significa o conjunto das partes de Q.

Referncias
Martin, John C. - Introduction to languages and the theory of computation (2 Edio) John E. Hopcroft, Rajeev Motwani, Jeffrey D. Ullman Introduo Teoria de Autmatos, Linguagens e Computao (2 Edio).

Softwares
Simulador de Autmatos [1] - Software para criao, teste e converso de Modelos Formais. Com interface grfica. SCTMF [2] - Software para Criao e Teste de Modelos Formais. JFlap [3] - Software americano para testes com interface grfica.

Autmatos finitos no determinsticos

16

Conceitos relacionados
Linguagens Formais Teoria de Autmatos Teoria da Computao Teoria dos Grafos

Minimizao de AFD
Em cincia da computao, mais especificamente no ramo da teoria dos autmatos, Minimizao de AFD o processo de transformao de um dado autmato finito determinstico (AFD) em outro equivalente que tenha um nmero mnimo de estados. Aqui, dois AFDs so ditos equivalentes se eles descrevem a mesma linguagem regular. Vrios algoritmos diferentes que realizam essa tarefa esto descritos em livros-texto padres que abordam a teoria dos autmatos.[1]

AFD Mnimo
Para cada linguagem regular passvel de ser aceita por um AFD, existe um AFD com um nmero mnimo de estados (e portanto com esforo mnmo de programao para cri-lo e us-lo), e nico (embora possam ser dados nomes diferentes a estados).[2] H trs classes de estados que podem ser removidos/mesclados ao AFD original sem afetar as linguagens que esse aceita: Estados inalcanveis so aqueles estados impossveis de se alcanar a partir do estado de inicial do AFD, para qualquer cadeia de entrada. Estados mortos so quaisquer estados, exceto os de aceitao, cujas transies para todo caracter de entrada tem ele prprio como destino. Eles so tambm conhecidos como Estados Armadilha (Trap States) pois uma vez alcanados, no h escapatria. Estados indistinguveis so estados indistintos entre si, para qualquer cadeia de entrada. A minimizao do AFD geralmente feita em trs passos, correpondentes s remoes/mesclagens dos estados relevantes. Como a eliminao dos estados indistinguveis o mais caro computacionalmente, esse normalmente o ltimo passo a ser dado.

Estados Inalcanveis
O estado p do AFD M=(Q, , , q0, F) inalcanvel se no existe qualquer cadeia w em * tal que p=(q0, w). Estados alcanveis podem ser obtidos pelo seguinte algoritmo: let estados_alcancaveis:= {q0}; let novos_estados:= {q0}; do { temp := conjunto vazio; for each q in novos_estados do for all c in do temp := temp {p tal que p=(q,c)}; end; end; novos_estados := temp \ estados_alcancaveis; estados_alcancaveis := estados_alcancaveis novos_estados;

Minimizao de AFD } while(novos_estados conjunto vazio); estados_inalcancaveis := Q \ estados_alcancaveis; Estados inalcanveis podem ser removidos do AFD sem afetar a linguagem que ele aceita.

17

Estados Indistinguveis
Algoritmo de Hopcroft
Um algoritmo para mesclar estados indistuinguveis do AFD, elaborado por Hopcroft (1971). baseado no refinamento de partio, no qual estados do AFD so particionados em grupos, de acordo com seu comportamento. Esses grupos representam classes de equivalncia, como na relao de equivalncia MyhillNerode, pela qual todo dois estados da mesma partio so equivalentes se eles tm o mesmo comportamento para todas as sequncias de entrada. Isto , para todo dois estados e que pertencem mesma classe de equivalncia da partio , temos que para qualquer palavra de entrada a levar a um estado de aceitao e , ao seguir-se as transies determinadas por a um estado de rejeio, ou vice-versa. partindo dos estados e , ambos os estados sero levados a estados de aceitao, ou ambos a estados de rejeio; no deveria ser possvel O seguinte pseudocdigo descreve o algoritmo: P := {{todos estados de aceitao}, {todos estados de no-aceitao}}; Q := {{todos estados de aceitao}}; while (Q no-vazio) do escolha e remova um conjunto A de Q for each c in do let X o conjunto de estados para o qual uma transio sobre c leva a um estado em A for each conjunto Y in P para o qual X Y no-vazio do substitua Y em P pelos dois conjuntos X Y e Y \ X if Y est contido em Q substitua Y em Q pelos mesmos dois conjuntos else adicione o menor dos dois conjuntos Q end; end; end; O algoritmo inicia com uma partio grossa: todo par de estados equivalentes de acordo com relao Myhill-Nerode pertencem ao mesmo conjunto na partio, mas pares no-equivalentes ainda podem pertencer ao mesmo conjunto. O algoritmo gradualmente refina a partio em um nmero maior de conjuntos menores, em cada passo dividindo conjuntos de estados em pares de subconjuntos necessariamente no-equivalentes. A partio inicial uma separao dos estados em dois subconjuntos de estados que claramente no tm o mesmo comportamento:estados de aceitao e estados de rejeio. O algoritmo ento repetidamente escolhe um conjunto da partio atual e um smbolo de entrada , e divide cada um dos conjuntos da partio em dois subconjuntos: o subconjunto de estados que leva atravs do smbolo de entrada , e o subconjunto de estados que no leva a . Como se sabe que tem comportamento diferente dos outros conjuntos da partio, os subconjuntos que levam a comportamentos diferentes dos subconjuntos que no levam a ser encontrada, o algoritmo termina. O tempo de execuo do algoritmo no pior caso do alfabeto. Esse limite vem do fato que, para cada umas das , onde o nmero de estados e o tamanho tambm tm . Quando nenhuma outra diviso desse tipo pode

transies do autmato, os conjuntos tomados de

Minimizao de AFD

18

que contm o estado alvo da transio tm tamanhos que decrescem relativamente entre si por um fator de dois ou mais, ento cada transio participa em dos passos de diviso no algoritmo. A estrutura de dados do refinamento de partio permite que cada passo de diviso seja feito em tempo proporcional ao nmero de transies que participam dele.[3] Esse o melhor algoritmo conhecido para resolver o problema da minimizao de AFDs, e para certas distribuies de entradas sua complexidade do caso-mdio ainda melhor, .[4] Uma vez que o algoritmo de Hopcroft tenha sido usado para agrupar estados do AFD de entrada em classe de equivalncia, o AFD mnimo pode ser construdo formando um estado para cada classe de equivalncia. Se um conjunto de estados em do estado para , um estado em ,e um caracter de entrada, ento a transio no AFD mnimo , sobre a entrada , leva ao conjunto contendo o estado ao qual o autmato de entrada levaria

partindo do estado , sobre a entrada . O estado inicial do AFD mnimo o conjunto que contm o estado inicial do AFD de entrada, e os estados de aceitao do AFD mnimo so os conjuntos cujos membros so estados de aceitao no AFD de entrada.

Algoritmo de Moore
O algoritmo de Moore para minimizao de AFD foi proposto por Moore (1956). Como o algoritmo de Hopcroft, ele mantm uma partio que inicia separando os estados de aceitao dos estados de rejeio, e repetidamente refina a partio at que nenhum outro refinamento possa ser efetuado. Em cada passo, ele substitui a partio atual com o refinamento mais grosso das parties, das quais uma a atual e as outras so as pr-imagens da partio atual sob as funes de transio para cada um dos smbolos de entrada. O algoritmo termina quando essa substituio no muda a partio atual. A complexidade de tempo no pior caso pode ser executado em tempo : cada passo do algoritmo usando uma variante de radix sort para reordenar os estados tal que estados no

mesmo conjunto da nova partio sejam consecutivos na ordenao, e haja no mximo passos j que todos menos o ltimo passo aumentam o nmero de conjuntos na partio. Os exemplos do problema da minimizao de AFD que causam o comportamento do pior caso so os mesmos que os para o algoritmo de Hopcroft. O nmero de passos que o algoritmo executa pode ser muito menor que , ento em mdia (para constante) seu desempenho ou at dependendo da distribuio randmica sobre o autmato escolhido para modelar o comportamento do caso mdio do algoritmo.[4]

Algoritmo de Brzozowski
Como Brzozowski (1963) observou, reverter as arestas de um AFD produz um AFN para a inversa da linguagem original, e convertendo este AFN para um AFD usando a construo do conjunto das partes padro (construindo apenas os estados alcanveis do AFD convertido) leva a um AFD mnimo para a mesma linguagem invertida. Repetindo essa operao inversa uma segunda vez produz um AFD mnimo para a linguagem original. A complexidade do pior caso do algoritmo de Brzozowski exponencial, j que h linguagens regulares para as quais o AFD mnimo da inversa exponencialmente maior do que o AFD mnimo da linguagem,[5], no entanto o algoritmo normalmente tem um desempenho melhor do que o pior caso sugeriria.[4]

Minimizao de AFD

19

Minimizao de AFN
Enquanto os procedimentos acima funcionam para AFDs, o motdo de particionamento no funciona para autmatos finitos no-determinsticos (AFNs). Encontrar um algoritmo de tempo polinomial que minimize AFNs impossvel, a menos que P=NP.[6]

Notas
[1] [2] [3] [4] Hopcroft, Ullman (1979) Hopcroft, Motwani & Ullman (2001), Seco 4.4.3, "Minimization of DFA's", p. 159. Hopcroft (1971); Aho, Hopcroft & Ullman (1974) Berstel et al. (2010). -simo smbolo um 'um' requer apenas estados cuja inversa requer estados, mas sua inversa requer estados. Leiss (1981) prov um AFD ternrio de estados, o mximo possvel. Para exemplos

[5] Por exemplo, a linguagem das cadeias binrias cujo

adicionais e observaes da conexo entre esses exemplos e a anlise de pior caso do algoritmo de Brzozowski, veja Cmpeanu et al. (2001). [6] Hopcroft, Motwani & Ullman (2001), Seco 4.4, Imagem rotulada "Minimizing the States of an NFA", p. 163.

Referncias
Aho, Alfred V.; Hopcroft, John E.; Ullman, Jeffrey D. (1974), "4.13 Partitioning", The Design and Analysis of Computer Algorithms, Addison-Wesley, pp.157162. Berstel, Jean; Boasson, Luc; Carton, Olivier; Fagnot, Isabelle (2010), "Minimization of Automata", Automata: from Mathematics to Applications, European Mathematical Society Brzozowski, J. A. (1963), "Canonical regular expressions and minimal state graphs for definite events", Proc. Sympos. Math. Theory of Automata (New York, 1962), Polytechnic Press of Polytechnic Inst. of Brooklyn, Brooklyn, N.Y., pp.529561. Cmpeanu, Cezar; Culik, Karel, II; Salomaa, Kai; Yu, Sheng (2001), "State Complexity of Basic Operations on Finite Languages", 4th International Workshop on Automata Implementation (WIA '99), Lecture Notes in Computer Science, 2214, Springer-Verlag, pp.6070, doi: 10.1007/3-540-45526-4_6 (http://dx.doi.org/10. 1007/3-540-45526-4_6). Hopcroft, John (1971), "An algorithm for minimizing states in a finite automaton", Theory of machines and computations (Proc. Internat. Sympos., Technion, Haifa, 1971), New York: Academic Press, pp.189196 Hopcroft, John E.; Motwani, Rajeev; Ullman, Jeffrey D. (2001), Introduction to Automata Theory, Languages, and Computation (2nd ed.), Addison-Wesley. Leiss, Ernst (1981), "Succinct representation of regular languages by Boolean automata", Theoretical Computer Science 13 (3): 323330, doi: 10.1016/S0304-3975(81)80005-9 (http://dx.doi.org/10.1016/ S0304-3975(81)80005-9). Moore, Edward F. (1956), "Gedanken-experiments on sequential machines", Automata studies, Annals of mathematics studies, no. 34, Princeton, N. J.: Princeton University Press, pp.129153.

Links externos
DFA minimization using the Myhill-Nerode theorem (http://www.cs.umu.se/kurser/TDBC92/VT06/final/1. pdf)

Anlise lxica

20

Anlise lxica
Anlise lxica o processo de analisar a entrada de linhas de caracteres (tal como o cdigo-fonte de um programa de computador) e produzir uma seqncia de smbolos chamado "smbolos lxicos" (lexical tokens), ou somente "smbolos" (tokens), que podem ser manipulados mais facilmente por um parser (leitor de sada). A Anlise Lxica a forma de verificar determinado alfabeto. Quando analisamos uma palavra, podemos definir atravs da anlise lxica se existe ou no algum caracter que no faz parte do nosso alfabeto, ou um alfabeto inventado por ns. O analisador lxico a primeira etapa de um compilador, logo aps vir a anlise sinttica. O analisador lxico funciona de duas maneiras:

Primeiro estado da anlise


A primeira etapa l a entrada de caracteres, um de cada vez, mudando o estado em que os caracteres se encontram. Quando o analisador encontra um caracter que ele no identifica como correto, ele o chama de "estado morto" ento, ele volta ltima anlise que foi aceita e assim tem o tipo e comprimento do lxico vlido. Um lxico, entretanto, uma nica lista de caracteres conhecidas de ser um tipo correto. Para construir um smbolo, o analisador lxico necessita de um segundo estado.

Segundo estado da anlise


Nesta etapa so repassados os caracteres do lxico para produzir um valor. O tipo do lxico combinado com seu valor o que adequadamente constitui um smbolo, que pode ser dado a um parser. (Alguns smbolos tais como parnteses no tm valores, e ento a funo da anlise no pode retornar nada). A anlise lxica escreve um parser muito mais fcil. Em vez de ter que acumular, renomeia seus caracteres individualmente. O parser no mais se preocupa com smbolos e passa a preocupar-se s com questes de sinttica. Isto leva a eficincia de programao, e no eficincia de execuo. Entretanto, desde que o analisador lxico o subsistema que deve examinar cada caracter nico de entrada, podem ser passos intensivos e o desempenhos se torna crtico, pode estar usando um compilador.

Anlise lxica do Python


Como a linguagem de programao Python passa por um interpretador, existe a necessidade implcita de analisar o cdigo-fonte colocado dentro do interpretador (entrada: tokens), para que o cdigo funcione corretamente (sada: parser). Python dividido em linhas lgicas que so separadas pelo token newline. Como Python no h a definio de incio e fim de blocos de cdigos, e sim por identao, os delimitadores so o Ident e o Dedent. So vrios os tipos de tokens que so reconhecidos pela linguagem, como: identificadores, palavras-chaves, classes reservadas, strings, nmeros inteiros, operadores, delimitadores, sequncias, listas, dicionrios, funes, classes, etc.

Anlise lxica

21

Ligaes externas
Aspectos Formais da Linguagem Python [1]

Referncias
[1] http:/ / www. portaldaprogramacao. com/ artigos2. asp?n=230

22

Anlise Sinttica
Hierarquia de Chomsky
Hierarquia de Chomsky a classificao de gramticas formais descrita em 1959 pelo linguista Noam Chomsky. Esta classificao possui 4 nveis, sendo que os dois ltimos nveis (os nveis 2 e 3) so amplamente utilizados na descrio de linguagem de programao e na implementao de interpretadores e compiladores. Mais especificamente, o nvel 2 utilizado em anlise sinttica (computao) e o nvel 3 em anlise lxica. A classificao das gramticas comea pelo tipo 0, com maior nvel de liberdade em suas regras, e aumentam Hierarquia de Chomsky as restries at o tipo 3. Cada nvel um super conjunto do prximo. Logo, uma gramtica de tipo n conseqentemente uma linguagem de tipo n - 1.

Gramtica com estrutura de frase


Tambm conhecida como Tipo 0, so aquelas s quais nenhuma limitao imposta. O universo das linguagens que se podem definir atravs dos mecanismos gerativos definidos pela gramtica corresponde exatamente ao conjunto das linguagens que esta classe de gramtica capaz de gerar.

Gramticas sensveis ao contexto


Tambm conhecida como Tipo 1. Se as regras de substituio forem sujeitas restrio de que nenhuma substituio possa reduzir o comprimento da forma sentencial qual a substituio aplicada, cria-se uma classe chamada sensveis ao contexto ou tipo 1.

Hierarquia de Chomsky

23

Gramticas livres de contexto


Tambm conhecida como de Tipo 2, so aquelas em que levantado o condicionamento das substituies impostas pelas regras definidas pelas produes. Este condicionamento eliminado impondo s produes uma restrio adicional, que restringe as produes forma geral

onde

Forma Normal de Backus


Backus-Naur Form ou somente BNF, uma outra forma de representar as produes de Gramticas livres de contexto. Onde, substitudo por ::= e os no terminais por <"nome" >.

Ela usada para definir gramticas com o lado esquerdo de cada regra composto por um nico smbolo no terminal. Exemplo: <Y> ::= y1 <Y> ::= y2 : <Y> ::= yn escreve-se: <Y> ::= y1| y2| ...| yn

Gramticas regulares
Tambm conhecida como de Tipo 3, uma restrio sobre a forma das produes, pode-se criar uma nova classe de gramticas de grande importncia no estudo dos compiladores por possurem propriedades adequadas para a obteno de reconhecedores simples. Que tambm podem ser denominada de Expresso regular.
Teoria de autmatos: linguagem formal e gramtica formal Hierarquia Chomsky Gramtica Tipo-0 -Tipo-1 Tipo-2 Tipo-3 Irrestrita --

Linguagem

Reconhecedor

Recursivamente enumervel Mquina de Turing Recursiva Mquina de Turing que sempre para Autmato linearmente limitado Autmato com pilha Autmato finito

Sensvel ao contexto Sensvel ao contexto Livre de contexto Regular Livre de contexto Regular

Gramtica irrestrita

24

Gramtica irrestrita
Em Teoria da computao, a Gramtica irrestrita (conhecida tambm como Gramtica com estrutura de frase) tambm conhecida como Tipo 0 da Hierarquia de Chomsky, que so aquelas s quais nenhuma limitao imposta. So capazes de reconhecer linguagens recursivamente enumerveis. O universo das linguagens que se podem definir atravs dos mecanismos gerativos definidos pela gramtica corresponde exatamente ao conjunto das linguagens que esta classe de gramtica capaz de gerar.
Teoria de autmatos: linguagem formal e gramtica formal Hierarquia Chomsky Gramtica Tipo-0 -Tipo-1 Tipo-2 Tipo-3 Irrestrita --

Linguagem

Reconhecedor

Recursivamente enumervel Mquina de Turing Recursiva Mquina de Turing que sempre para Autmato linearmente limitado Autmato com pilha Autmato finito

Sensvel ao contexto Sensvel ao contexto Livre de contexto Regular Livre de contexto Regular

Gramtica sensvel ao contexto


Em Teoria da computao uma gramtica sensvel ao contexto (GSC), tambm conhecida como Tipo 1 da Hierarquia de Chomsky, uma gramtica formal em que os lados esquerdo e direito de qualquer regra de produo podem ser cercados por um contexto de smbolo terminal e smbolo no-terminal. Gramticas sensveis ao contexto so mais gerais do que as gramticas livres de contexto mas ainda ordenadas o suficiente para serem verificadas por um autmato linearmente limitado. O conceito de gramtica sensvel ao contexto foi introduzido por Noam Chomsky na dcada de 1950 como uma maneira de descrever a sintaxe de linguagem natural, em que, de fato, frequentemente o motivo de uma palavra poder ou no ser apropriada em um determinado lugar, dependendo do contexto. A linguagem formal, que pode ser descrita por uma gramtica sensvel ao contexto, chamada de linguagem sensvel ao contexto.

Definio formal
A gramtica formal G= (N, ,P,S) (equivalente a G= (V,T,P,S), basta que V(arivel) no-Terminal seja substituda por N e T(erminal) passa a ser ) sensvel ao contexto se todas as regras em P so da forma A em que AN(isto , A um nico no-terminal), , (N U )* (ou seja, e so sequncias de no-terminais e smbolo terminal) e (N U )+ (isto , uma sequncia no vazia de no-terminais e terminais). Algumas definies ainda acrescentam que para qualquer regra de produo da forma u v de uma gramtica sensvel ao contexto, deve ser verdade que |u| |v|. Aqui |u| e |v| denotam o comprimento das cadeias, respectivamente. Alm disso, uma regra da forma S desde que S no aparea no lado direito de qualquer regra em que representa a cadeia vazia permitido. A adio de uma cadeia vazia permite a afirmao de que as linguagens sensveis ao contexto so um superconjunto adequado das linguagens livre do contexto, ao invs de ter que fazer uma declarao mais fraca de que todas as gramticas livres de contexto, sem produes so tambm

Gramtica sensvel ao contexto gramticas sensveis ao contexto. O nome sensvel ao contexto explicado pelo e que formam o contexto de A e determinar se A pode ser substitudo por ou no. Isto diferente de uma gramtica livre de contexto, em que o contexto de um no-terminal no levado em considerao. (Na verdade, todas as produes de uma gramtica livre de contexto da forma V w, em que V um nico smbolo no-terminal, e w uma cadeia de terminais e/ou no-terminais (w pode ser vazio)). Se a possibilidade de adicionar a cadeia vazia para uma linguagem, adicionada s cadeias reconhecidas pelas gramticas no-contratuais (que nunca podem incluir a cadeia vazia), ento as linguagens, nessas duas definies, so idnticas.

25

Exemplos
Essa gramtica gera a linguagem no-livre do contexto cannica 1. 2. 3. 4. 5. 6. 7. 8. 9. A derivao para aaabbbccc : :

Gramtica sensvel ao contexto Gramticas mais complicadas podem ser usadas para verificar com mais letras. A gramtica seguinte gera a linguagem de cpia no-livre do contexto, 1. 2. 3. 4. 5. 6. 7. 8. A derivao para abab : : , e outras linguagens ainda

26

Formas Normais
Toda gramtica sensvel ao contexto que no gera a cadeia vazia pode ser transformada em uma equivalente na forma normal de Kuroda. "Equivalente" aqui significa que as duas gramticas geram a mesma linguagem. A forma normal no vai, em geral, ser sensvel ao contexto, mas vai ser uma gramtica no-contratual.

Propriedades e usos computacionais


O problema da deciso que pergunta se uma certa cadeia s pertence linguagem de uma certa gramtica sensvel ao contexto G, PSPACE-completo. Existem mesmo algumas gramticas sensveis ao contexto, cujo problema de reconhecimento fixo de gramtica PSPACE-completo. O problema da vacuidade para gramticas sensveis ao contexto (dada a gramtica sensvel ao contexto G, ?) indecidvel. Tem sido demonstrado que quase todas as linguagens naturais podem, em geral, serem caracterizadas por gramticas sensveis ao contexto, mas toda a classe de GSC parece ser muito maior do que as linguagens naturais . Pior ainda, pois o problema da deciso para GSC PSPACE-completo, que os torna totalmente inviveis para o uso prtico, como um algoritmo de tempo polinomial para um problema PSPACE-total implicaria P=NP. Investigaes em andamento sobre lingustica computacional tm se centrado na formulao de outras classes de linguagens que so "levemente sensveis ao contexto" cujos problemas de deciso sejam factveis, assim como as gramticas de rvores-adjuntas, gramticas de categoria combinatria, linguagens livre de contexto acopladas, e sistemas lineares reescrevveis livres de contexto. As linguagens geradas por esses formalismos, esto entre as linguagens livres de contexto, e as sensveis ao contexto. Introduction to Languages and the Theory of Computation by John C. Martin McGraw Hill 1996 (2nd edition)

Gramtica sensvel ao contexto

27

Ligaes externas
Earley Parsing for Context-Sensitive Grammars (http://danielmattosroberts.com/earley/ context-sensitive-earley.pdf)
Teoria de autmatos: linguagem formal e gramtica formal Hierarquia Chomsky Gramtica Tipo-0 -Tipo-1 Tipo-2 Tipo-3 Irrestrita --

Linguagem

Reconhecedor

Recursivamente enumervel Mquina de Turing Recursiva Mquina de Turing que sempre para Autmato linearmente limitado Autmato com pilha Autmato finito

Sensvel ao contexto Sensvel ao contexto Livre de contexto Regular Livre de contexto Regular

Gramtica livre de contexto


Em Linguagem formal, uma gramtica livre-do-contexto (GLC) uma gramtica formal em que cada regra de produo da forma Vw onde V um nico smbolo no-terminal(Varivel), e w uma cadeia de terminais e/ou variveis (w pode ser a cadeia vazia). As linguagens geradas por gramticas livres-do-contexto so conhecidas como Linguagens livres-do-contexto. Gramticas livres-do-contexto so importantes em Lingustica para descrio da estrutura de sentenas e palavras em Lngua natural. Em Cincia da computao importante para descrio da estrutura de Linguagens de programao e outras linguagens artificiais. Em Lingustica, alguns autores usam o termo Gramtica de estrutura de frase para se referir a gramticas livres-do-contexto, como gramticas de estrutura da frase so diferentes de gramticas de dependncia. Em Cincia da computao, a notao mais popular para gramtica livre-do-contexto a Forma de Backus-Naur(BNF).

Histria
Desde o tempo de Pini, pelo menos, linguistas tem descrito as gramticas das linguagens em termos de suas estruturas de bloco, e descrito como as sentenas so construdas recursivamente a partir de frases menores, e eventualmente a partir de palavras ou elementos de palavras individuais. Uma propriedade essencial dessas estruturas de bloco que unidades lgicas nunca se sobrepem. Por exemplo, a sentena: Joo, cujo carro azul estava na garagem, caminhou at a loja verde. John, whose blue car was in the garage, walked to the green store. pode ser logicamente posta entre parenteses como se segue: (Joo, ((cujo carro azul) (estava (na garagem)))), (caminhou (at (a loja verde))). (John, ((whose blue car) (was (in the garage)))), (walked (to (the green store))). Uma gramtica livre-do-contexto proporciona um mecanismo matemtico simples e preciso para descrio dos mtodos em que algumas linguagens naturais so construdas a partir de blocos menores, capturando a "estrutura de bloco" das sentenas de uma maneira natural. Sua simplicidade faz o formalismo passvel de um rigoroso estudo

Gramtica livre de contexto matemtico. Importantes caractersticas de sintaxe de linguagem natural como concordncia no fazem parte de uma gramtica livre-do-contexto, mas a estrutura recursiva bsica de sentenas, a maneira pela qual clusulas so aninhadas em outras clusulas, e o modo pelo qual listas de adjetivos e advrbios so absorvidos por substantivos e verbos, so descritos precisamente. O formalismo das gramticas livres-do-contexto foi desenvolvido nos meados dos anos 1950 por Noam Chomsky, e tambm sua classificao como um tipo especial de gramtica formal (a qual ele chamou de gramtica de estrutura de frase).[1] No modelo da Gramtica gerativa de Chomsky, a sintaxe de linguagem natural era descrita por um conjunto de regras livres-do-contexto combinadas com regras de transformao. Em trabalhos posteriores (e.g. Chomsky 1981), a ideia de formulao de uma gramtica que consistisse de explcita reescrita de regras foi abandonada. Em outros modelos gerativos (e.g. Generalized Phrase Structure Grammar (Gazdar et al. 1985)), gramticas livres-do-contexto foram tomadas como o mecanismo de toda a sintaxe, eliminando as transformaes. Estruturas de bloco foram introduzidas em linguagens de programao de computadores pelo projeto Algol (1957-1960), que como consequncia, tambm contou com uma gramtica livre-do-contexto para descrio da sintaxe resultante Algol. Isto tornou-se uma caracterstica padro das linguagens de computadores, e a notao para gramticas usadas em descries concretas de linguagens de computadores tornaram-se conhecidas por Forma de Backus-Naur. A caracterstica de "estrutura de bloco" que as gramticas livres-do-contexto capturaram to fundamental para gramtica que os termos de sintaxe e gramtica so frequentemente identificados como regras das gramticas livres-do-contexto, especialmente em cincia da computao. Restries formais no capturadas pela gramtica so, ento, consideradas partes da "semntica" da linguagem. Gramticas livres-do-contexto so simples o suficiente para permitir a construo de eficientes algoritmos de anlise, os quais, para uma dada cadeia, determinam se e como essa cadeia pode ser gerada pela gramtica. O Algoritmo Earley um exemplo de um algoritmo do tipo, enquanto os amplamentes usados Analisador sinttico LR e Analisador sinttico LL so algoritmos mais simples que lidam com subconjuntos mais restritivos de gramticas livres-do-contexto.

28

Definies Formais
Uma gramtica livre-do-contexto G definida por uma 4-tupla: onde 1. um conjunto finito; cada elemento chamado smbolo no-terminal ou varivel. Cada varivel representa um tipo diferente de clusula ou frase em uma sentena. As vezes, variveis tambm so chamadas de categorias sintticas. Cada varivel define uma sub-linguagem da linguagem definida por . 2. 3. um conjunto finito de terminais, disjunto de um relao finita de para , o qual origina o real contedo da sentena. O conjunto de . so chamados regras de substituio ou terminais o alfabeto da linguagem definida pela gramtica

. Os membros de

produes da gramtica. (tambm, comumente simbolizada por ) 4. a varivel inicial (ou smbolo inicial), usado para representar toda a sentena (ou programa). Deve ser um elemento pertencente a . O asterisco representa a operao Fecho de Kleene ou estrela.

Gramtica livre de contexto

29

Aplicao de regra
Para qualquer cadeia com e para . aplicao da regra , dizemos que tal que produz e , escrito como . Por conseguinte, , se o resultado da

Aplicao de regra repetitiva


Para todo tal que (ou em algums livros-texto), se

Linguagem Livre-do-contexto
A linguagem da gramtica Uma linguagem . o conjunto , tal que

dita ser uma linguagem livre-do-contexto (LLC), se existe uma GLC

GLCs Apropriadas
Uma gramtica livre-do-contexto dita ser apropriada, se ela no tem smbolos inalcanveis: ela no tem smbolos improdutivos: ela no tem e-produes: ela no tem ciclos: A gramtica S aSa, S bSb, S e, livre-do-contexto. Uma derivao tpica nessa gramtica S aSa aaSaa aabSbaa aabbaa. Isso torna claro que . A linguagem livre-do-contexto, entretanto, pode ser provado que ela no regular. , com produes e

Exemplos
Parenteses bem formados
O exemplo cannico de uma gramtica livre-do-contexto a correspondncia de parenteses, que representa o caso geral. Existem dois smbolos terminais "(" e ")" e uma varivel S. As regras de produo so S SS S (S) S () A primeira regra permite S se multiplicar; a segunda regra permite que S seja inclusa entre parenteses; e a terceira regra finaliza a recurso. Iniciando com S, e aplicando as regras, pode-se construir: S SS SSS (S)SS ((S))SS ((SS))S(S) ((()S))S(S) ((()()))S(S) ((()()))()(S) ((()()))()(())

Gramtica livre de contexto

30

Parenteses e colchetes aninhados bem formados


Um segundo exemplo cannico , dois diferentes tipos de correspondncia aninhada de parenteses, descrito pelas produes: S SS S () S (S) S [] S [S] com smbolos terminais [ ] ( ) e varivel S. A seguinte sequncia pode ser derivada a partir dessa gramtica: ([ [ [ ()() [ ][ ] ] ]([ ]) ]) Entretanto, no h gramtica livre-do-contexto que possa gerar todas as sequncias da correspondncia de dois diferentes tipos de parenteses, considerando que eles devem corresponder independente da existncia do outro tipo de parentese, por exemplo: [ [ [ [(((( ] ] ] ]))))(([ ))(([ ))([ )( ])( ])( ])

Expresses Algbricas
Aqui esta uma gramtica livre-do-contexto para correo sinttica de expresses algbricas na forma infixa, com as variveis x, y e z: 1. 2. 3. 4. 5. 6. 7. 8. S?x S?y S?z S?S+S S?S-S S?S*S S?S/S S?(S)

Essa gramtica pode, por exemplo, gerar a cadeia (x+y)*x-z*y/(x+x) como segue: S (o smbolo inicial) S - S (pela regra 5) S * S - S (pela regra 6, aplicado ao S mais a esquerda) S * S - S / S (pela regra 7, aplicado ao S mais a direita) ( S ) * S - S / S (pela regra 8, aplicado ao S mais a esquerda) ( S ) * S - S / ( S ) (pela regra 8, aplicado ao S mais a direita) ( S + S ) * S - S / ( S ) (etc.) (S+S)*S-S*S/(S) (S+S)*S-S*S/(S+S) (x+S)*S-S*S/(S+S) (x+y)*S-S*S/(S+S)

Gramtica livre de contexto (x+y)*x-S*y/(S+S) (x+y)*x-S*y/(x+S) (x+y)*x-z*y/(x+S) (x+y)*x-z*y/(x+x) Note que, por baixo vrias escolhas foram feitas, escolhas que dizem qual ser a regra que vai ser escrita. Essas escolhas parecem bem arbitrrias. Na realidade, elas so, no sentido de que a cadeia gerada sempre a mesma. Por exemplo, a segunda e terceira produes S * S - S (pela regra 6, aplicada ao S mais a esquerda) S * S - S / S (pela regra 7, aplicada ao S mais a direita) poderia ser feita na ordem contrria: S - S / S (pela regra 7, aplicada ao S mais a direita) S * S - S / S (pela regra 6, aplicada ao S mais a esquerda) Igualmente, muitas escolhas foram feitas em cima de qual regrar aplicar a cada S selecionado. Mudar as escolhas feitas e no apenas a ordem em que elas foram feitas geralmente afeta qual cadeia gerada ao final. Vamos olhar para isso mais detalhadamente. Considere o rvore de anlise sinttica dessa derivao: S | /|\ S - S / \ /|\ /|\ S * S S / S / | | \ /|\ x /|\ /|\ ( S ) S * S ( S ) / | | \ /|\ z y /|\ S + S S + S | | | | x y x x Comeando no topo, passo a passo, um S na rvore expandido, at que no exista mais S's(variveis) a serem expandidas. Pegando uma diferente ordem de expanso ir produzir uma derivao diferente, mas na mesma rvore sinttica. A rvore sinttica ir apenas mudar se ns pegarmos uma diferente regra para aplicar em alguma posio na rvore. Mas, pode uma rvore sinttica diferente produzir a mesma cadeia, que ( x + y ) * x - z * y / ( x + x ) nesse caso? Sim, para esse caso em particular, isso possvel. Gramticas com essa propriedade so chamadas ambgua. Por exemplo, x + y * z pode ser produzido com essas duas rvores sintticas diferentes: S | /|\ S * S / \ / S | /|\ S + S \

31

Gramtica livre de contexto /|\ x + y z x /|\ y * z

32

Entretanto, a linguagem descrita por essa gramtica no inerentemente ambgua: uma gramtica alternativa no ambgua pode ser dada para a linguagem, por exemplo: Tx Ty Tz SS+T SS-T SS*T SS/T T(S) ST (mais uma vez, pegando S como smbolo inicial).

Forma Normal
Toda gramtica livre-do-contexto que no gera uma cadeia vazia pode ser transformada em uma que nenhuma regra tem a cadeia vazia como produto [uma regra com e como produto chamada e-produo]. Se ela no gera a cadeia vazia, ela ir necessariamente incluir a regra , mas no h necessidade de outra e-regra. Toda gramtica livre-do-contexto sem e-produo tem uma gramtica equivalente na Forma Normal de Chomsky ou Forma Normal de Greibach. "Equivalente" aqui significa que duas gramticas geram a mesma linguagem. Por causa da especial simplicidade das regras de produo de gramticas na Forma Normal de Chomsky, essa forma normal tem implicaes tericas e prticas. Por exemplo, dada a gramtica livre-do-contexto, algum pode usar a Forma Normal de Chomky para construir um algoritmo de tempo polinomial que decida se a cadeia dada est na linguagem representada pela gramtica (o Algoritmo CYK).

Problemas Indecidveis
Algumas questes que no so decidveis por classes de gramticas mais amplas se tornam decidveis com gramticas livres-do-contexto; e.g. o teste de vacuidade de uma gramtica (saber se a gramtica gera alguma cadeia, qualquer que seja ela), indecidvel para classe de Gramtica sensveis ao contexto, mas decidvel para gramticas livre-do-contexto. Ainda assim, muitos problemas permanecem indecidveis. Exemplos:

Gramtica livre de contexto

33

Universalidade
Dado uma GLC, ela gera a linguagem que contm todas as possveis cadeias a serem geradas pelo conjunto de smbolos terminais que so usados em suas regras?

Igualdade de linguagem
Dadas duas GLCs, elas geram a mesma linguagem?

Linguagem inclusa
Dadas duas GLCs, a primeira gramtica pode gerar todas as cadeias que a segunda gera?

Estar em um nvel mais baixo da hierarquia de Chomsky


Dada uma Gramtica sensvel ao contexto, ela descreve uma linguagem livre-do-contexto? Dada uma GLC, ela descreve uma linguagem regular? Cada um desses problemas indecidvel.

Extenses
Uma maneira bvia para estender o formalismo de gramtica livre-do-contexto permitir que variveis tenham argumentos, os valores que so passados com as regras. Isso permite caractersticas de uma linguagem natural, tais como concordncia e referncia, analogamente ao correto uso de identificadores em linguagem de programao, que devem ser expressos de maneira natural. E.g. agora, ns podemos facilmente expressar que em sentenas em ingls, o sujeito e verbo devem concordar em nmero. Em Cincia da computao, exemplos dessa abordagem incluem Gramtica de Afixos, Gramtica de atributos, Gramtica indexada, e Van Wijngaarden [[Gramtica de dois leveis]. Extenses similares existem em lingustica. Outra extenso permitir que terminais adicionais apaream no lado esquerdo das regras, restringindo sua aplicao. Isso produz o formalismo de Gramtica sensvel ao contexto.

Aplicaes Lingusticas
Chomsky inicialmente esperava superar as limitaes de gramticas livres-do-contexto ao adicionar regras de transformao.[1] Tais regras so outro dispositivo padro em lingustica tradicional; e.g. passivao da voz, em portugus. Grande parte da Gramtica gerativa tem se dedicado a encontrar maneiras de aprimorar os mecanismos descritivos de regras de estrutura de frase gramatical e transformao de tal forma possam ser expressas exatamente os tipos de coisas que podem ser expressos em linguagem natural. Permitir transformaes arbitrrias no faz com que esse objetivo seja atingido. Eles so muito mais poderosos, sendo Turing completos a no ser que restries significantes sejam adicionadas (e.g. no permitir transformaes que introduzam e ento reescrevam smbolos em uma maneira livre-do-contexto. Posio geral de Chomsky sobre a no-gratuidade contexto da linguagem natural tem se mantido desde ento Posio geral de Chomsky sobre a no-liberdade de contexto da linguagem natural tem se mantido desde ento,[2] entretanto seus exemplos especificos a respeito da no adequao de GLCs em termos de uma fraca capacidade gerativa foram mais tarde desaprovadas.[3] Gerald Gazdar e Geoffrey Pullum tem discutido que apesar de algumas construes no-livres-de-contexto em linguagem natural (como cross-serial dependencies na Sua Germnica[2] e reduplication em Bambara[4]), a grande maioria das formas em linguagem natural so, de fato livres de contexto.[3]

Gramtica livre de contexto

34

Veja tambm
Gramtica sensvel ao contexto Gramtica formal Anlise sinttica (computao) Parsing expression grammar, na wikipedia em ingls. Gramtica livre de contexto estocstica, na wikipedia em ingls. Algorithms for context-free grammar generation, na wikipedia em ingls.

Algoritmos
Algoritmo CYK Analisador sinttico GLR Algoritmo Earley

Notas
[1] Chomsky, Noam. (Sep 1956). " Three models for the description of language (http:/ / ieeexplore. ieee. org/ iel5/ 18/ 22738/ 01056813. pdf?isnumber=22738& prod=STD& arnumber=1056813& arnumber=1056813& arSt=+ 113& ared=+ 124& arAuthor=+ Chomsky,+ N. )". Information Theory, IEEE Transactions 2 (3): 113124. DOI: 10.1109/TIT.1956.1056813 (http:/ / dx. doi. org/ 10. 1109/ TIT. 1956. 1056813). [2] Shieber, Stuart. (1985). " Evidence against the context-freeness of natural language (http:/ / www. eecs. harvard. edu/ ~shieber/ Biblio/ Papers/ shieber85. pdf)". Linguistics and Philosophy 8 (3): 333343. DOI: 10.1007/BF00630917 (http:/ / dx. doi. org/ 10. 1007/ BF00630917). [3] Pullum, Geoffrey K.;Gerald Gazdar. (1982). "Natural languages and context-free languages". Linguistics and Philosophy 4 (4): 471504. DOI: 10.1007/BF00360802 (http:/ / dx. doi. org/ 10. 1007/ BF00360802). [4] Culy, Christopher. (1985). "The Complexity of the Vocabulary of Bambara". Linguistics and Philosophy 8 (3): 345351. DOI: 10.1007/BF00630918 (http:/ / dx. doi. org/ 10. 1007/ BF00630918).

Referencias
Chomsky, Noam (Sept. 1956). "Three models for the description of language". Information Theory, IEEE Transactions 2 (3). Chomsky, Noam (1957), Syntactic Structures, Den Haag: Mouton. Chomsky, Noam (1965), Aspects of the Theory of Syntax, Cambridge (Mass.): MIT Press. Chomsky, Noam (1981), Lectures on Government and Binding, Dordrecht: Foris. Gazdar, Gerald; Klein, Ewan; Pullum, Geoffrey & Sag, Ivan (1985), Generalized Phrase Structure Grammar, Cambridge (Mass.): Harvard University Press.

Ler mais
Michael Sipser. Introduction to the Theory of Computation. [S.l.]:PWS Publishing, 1997. ISBN 0-534-94728-X Section 2.1: Context-Free Grammars, pp.91101. Section 4.1.2: Decidable problems concerning context-free languages, pp.156159. Section 5.1.1: Reductions via computation histories: pp.176183.

Gramtica livre de contexto

35

Teoria de autmatos: linguagem formal e gramtica formal Hierarquia Chomsky Gramtica Tipo-0 -Tipo-1 Tipo-2 Tipo-3 Irrestrita --

Linguagem

Reconhecedor

Recursivamente enumervel Mquina de Turing Recursiva Mquina de Turing que sempre para Autmato linearmente limitado Autmato com pilha Autmato finito

Sensvel ao contexto Sensvel ao contexto Livre de contexto Regular Livre de contexto Regular

Gramtica regular
Em Teoria da computao as Gramticas regulares tambm conhecida como Tipo 3 da Hierarquia de Chomsky, uma restrio sobre a forma das produes, pode-se criar uma nova classe de gramticas de grande importncia no estudo dos compiladores por possurem propriedades adequadas para a obteno de reconhecedores simples. Que tambm podem ser denominada de Expresso regular.
Teoria de autmatos: linguagem formal e gramtica formal Hierarquia Chomsky Gramtica Tipo-0 -Tipo-1 Tipo-2 Tipo-3 Irrestrita --

Linguagem

Reconhecedor

Recursivamente enumervel Mquina de Turing Recursiva Mquina de Turing que sempre para Autmato linearmente limitado Autmato com pilha Autmato finito

Sensvel ao contexto Sensvel ao contexto Livre de contexto Regular Livre de contexto Regular

Formalismo de Backus-Naur

36

Formalismo de Backus-Naur
A forma de Backus-Naur (tambm conhecido como BNF, formalismo de Backus-Naur, forma normal de Backus, ou forma de Panini-Backus) uma meta-sintaxe usada para expressar gramticas livres de contexto: isto , um modo formal de descrever linguagens formais. A BNF amplamente usada como uma notao para as gramticas de linguagens de programao, conjuntos de instrues e protocolos de comunicao, e tambm como notao para representar partes de gramticas de linguagens naturais. A maioria dos livros-texto para teoria de linguagem de programao e/ou semntica documenta a linguagem de programao em BNF. H tambm variantes como a forma aumentada de Backus-Naur (FABN) baseada na BNF, mas que consiste em uma sintaxe e regras de derivaes prprias. O princpio norteador desta metalinguagem descrever um sistema formal de uma linguagem que um protocolo (especificao bidirecional). Ela est documentada em RFC 4234 [1].

Formalismo de Backus-Naur
Viso geral
BNF foi originalmente nomeada em homenagem a John Backus e tambm (por sugesto de Donald Knuth) a Peter Naur[2]. Eles foram dois pioneiros da cincia da computao, especialmente na arte de design de compiladores. A forma de Backus-Naur ou gramticas BNF bastante similar s regras da gramtica snscrita de Pnini (cerca do sculo V a.C.), e chamada s vezes de forma de Panini-Backus. A BNF foi proposta como parte da criao das regra para o Algol 60.

Introduo
Uma especificao BNF um conjunto de regras de derivao, escritas como: <[[Smbolo|smbolo]]> ::= <expresso com smbolos> Onde <smbolo> um no-terminal, e a expresso consiste em sequncias de smbolos e/ou sequncias separadas pela barra vertical, '|', indicando uma escolha. Esta notao indica as possibilidades de substituio para smbolo da esquerda. Smbolos que nunca aparecem no lado esquerdo so ditos terminais.

Exemplo
No exemplo, considere essa BNF possvel para um endereo postal do Brasil: <endereo-postal> ::= <parte-do-nome> <endereo-da-rua> <parte-do-CEP> <parte-do-nome> ::= <parte-pessoal> <ltimo-nome> <parte-opc-jr> <FDL> | <parte-pessoal> <parte-do-nome> <parte-pessoal> ::= <inicial> "." | <primeiro-nome> <endereo-da-rua> ::= <nome-da-rua> < nmero-do-movel> <num-apto-opc> <FDL> <parte-do-CEP> ::= <CEP> <nome-da-cidade> "-" <cdigo-do-estado> <FDL> Isto se traduz para o portugus como: Um endereo postal consiste da parte-do-nome, seguido pela parte do endereo-da-rua, seguido pela parte do CEP A parte do nome consiste em: ou a parte-pessoal seguido pelo ltimo nome seguido por um opcional "parte-jr" (Jr., Sr.) e o end-of-line (fim da linha), ou a parte pessoal seguido pela parte do nome (essa regra mostra o uso da recurso em FNBs, que inclui o caso das pessoas que usam o primeiro nome e o nome do meio e/ou as iniciais) A parte-pessoal consiste de ou uma inicial seguida por um ponto ou o primeiro nome

Formalismo de Backus-Naur Um endereo da rua consiste do nome da rua, seguido pelo nmero do imvel, seguido do especificador de apartamento opcional, seguido por um fim-da-linha A parte-do-CEP consiste do CEP, seguido pelo nome-da-cidade, por um hfen, pelo cdigo do estado, e por um fim-da-linha Note que muitas coisas (tais como o formato de um primeiro nome, especificador de apartamento, ou do CEP) no so especificados aqui. Se necessrio, elas podem se descritas usando regras BNF adicionais. Mais exemplos A sintaxe da FNB pode ser representado com uma FNB como no que se segue:
<sintaxe> ::= <regra> | <regra> <sintaxe> <regra> ::= <espao-em-branco-opc> "<" <nome-da-regra> ">" <espao-em-branco-opc> "::=" <espao-em-branco-opc> <expresso> <fim-da-linha> <espao-em-branco-opc> ::= " " <espao-em-branco-opc> | "" <expresso> <fim-da-linha> <lista> <termo> ::= <lista> | <lista> "|" <expresso> ::= <espao-em-branco-opc> <FDL> | <fim-da-linha> <fim-da-linha>

37

::= <termo> | <termo> <espao-em-branco-opc> <lista> ::= <literal> | "<" <nome-da-regra> ">"

<literal> ::= '"' <texto> '"' | "'" <texto> "'" <!-- Atualmente, a FNB original no usa citaes -->

Isso assume que o espao em branco no necessrio para a devida interpretao da regra. <FDL> o especificador fim da linha apropriado. <nome-da-regra> e <texto> so substitudos com uma regra nome/rtulo ou um texto literal, respectivamente. Outro exemplo de BNF: Transformar a expressa 32 + 16 / 45 * 3 em Linguagem BNF <expressao> ::= <valor> <operador><expressao> <numero> <operador><expressao> <sem sinal><sem sinal> <operador><expressao> <digito><digito><operador><expressao> 32+<valor><operador><expressao> 32+<numero><operador><expressao> 32+<sem sinal><sem sinal><operador><expressao> 32+<digito><digito><operador><expressao> 32+16/<expressao> 32+16/ <valor><operador><expressao> 32+16/ <numero><operador><express> 32+16/ <sem sinal><sem sinal><op><ex> 32+16/<digito><digito><op><exp> 32+16/45*<expressao> 32+16/45*<valor> 32+16/45*<numero> 32+16/45*<sem sinal> 32+16/45*<digito> 32+16/45*3

Formalismo de Backus-Naur

38

Forma Aumentada de Backus-Naur


Introduo
Uma especificao da FABN um conjunto de regras de derivao escrito na forma: regra = definio ; comentrio CR LF onde regra um no-terminal com caixa sensvel (letras em maiscula ou minsculas), a definio consiste numa seqncia de smbolos que definem a regra, o comentrio serve para documentao e terminando com o caractere de carriage return (retornar para a posio mais esquerda) e um line feed (indica quebra de linha). Nomes de regras no so caixa-sensveis, logo <regranome>, <Regranome>, <REGRANOME>, e <rEgRaNoMe> se referem mesma regra. Tais nomes consistem de uma letra seguida de letras, nmeros ou hfens. Os sinais < e > no so requeridos em torno do nome da regra (como so em BNF), no entanto, podem ser usados para delimitar um nome de regra a fim de discerni-lo mesmo fora de contexto. A FABN codificada em ASCII 7-bit, em que o 8 bit mais significativo posto em 0.

Valores terminais
Terminais so especificados por um ou mais caracteres numricos. Caracteres numricos podem ser especificados com o sinal de porcentagem % seguido pela referncia base (b = binrio, d = decimal, e x = hexadecimal) seguido pelo valor ou concatenao de valores (indicado por . ). Por exemplo um carriage return especificado por %d13 em decimal ou %x0D em hexadecimal. Um carriage return seguido por um line feed pode ser especificado por %d13.10. Textos literais so especificados pelo uso de uma string entre aspas duplas ("), tais strings so caixa-insensveis e o conjunto de caracteres usado o US-ASCII. Portanto a string abc casa com abc, Abc, aBc, abC, ABc, AbC, aBC, e ABC. Para um casamento com sensibilidade de caixa, os caracteres devero ser definido de forma explcita; no caso de aBc a definio ser %d97% d66% d99.

Operadores
Espao em branco Um espao em branco usando para separar elementos em uma definio. Para o espao ser reconhecido como um delimitador, ele deve ser includo explicitamente. Concatenao Regra1 Regra2 Uma regra pode ser definida listando-se uma sucesso de nomes de regras, ou seja, como uma concatenao de outras regras pr-existentes. Para casar a string aba as seguintes regras podem ser usadas: 1. fu = %x61 ; a 2. bar = %x62 ; b 3. mumble = fu bar fu

Formalismo de Backus-Naur Alternao Regra1 / Regra2 Uma regra pode ser definida por uma lista de regras separadas pelo caractere /. Ainda utilizando as regras <fu> e a regra <bar> a seguinte regra poderia ser construda: 1. fubar = fu / bar Alternao com incremento Regra1 =/ Regra2 Podem ser acrescentadas alternativas adicionais a uma regra pelo uso do =/ entre o nome da regra e a definio. Desta forma, a regra: 1. conjregra = alt1 / alt2 / alt3 / alt4 / alt5 equivalente : 1. conjregra = alt1 / alt2 2. conjregra =/ alt3 3. conjregra =/ alt4 / alt5 Srie de valores %c##-## Uma srie de valores podem ser especificados pelo uso do hfen ("-"). Logo, a regra: 1. OCTAL = "0" / "1" / "2" / "3" / "4" / "5" / "6" / "7" equivalente a: 1. OCTAL = %x30-37 Agrupamento de Sequncias (Regra1 Regra2) Pode-se colocar elementos entre parnteses a fim de agrupar regras em uma definio. Para casar elem fubar snafu ou elem tarfu snafu usamos a seguinte regra: 1. grupo = elem (fubar / tarfu) snafu Para casar elem fubar ou tarfu snafu podemos construir a seguinte regra: 1. grupo = elem fubar / tarfu snafu 2. grupo = (elem fubar) / (tarfu snafu) Repetio de variveis n*nRegra Para indicar a repetio de um elemento a forma <a>*<b>elemento usada. O campo opcional <a> se refere ao nmero mnimo de elementos a ser includo tendo por padro 0 (zero). O segundo campo opcional <b> se refere ao nmero mximo de elementos a serem includos tendo infinito como padro. Logo, usamos *elemento para zero ou mais elementos, 1*elemento para um ou mais e 4*5elementos para quatro ou cinco elementos.

39

Formalismo de Backus-Naur Repetio especifica nRegra Usa-se a forma <a>elemento para indicar um nmero explcito de elementos, tal forma equivalente a <a>*<a>elemento. Usa-se 2DIGIT para adquirir dois dgitos numricos e 3DIGIT para adquirir trs dgitos numricos. (Veja a definio de DIGIT em Regras essenciais e tambm no exemplo cdigo postal.) Sequncias opcionais [Regra] Para indicar um elemento opcional as seguintes formas so equivalentes: 1. [fubar snafu] 2. *1(fubar snafu) 3. 0*1(fubar snafu) Comentrio ; comentrio Usa-se ponto e virgula (";") para iniciar um comentrio que perdura o resto da linha. Precedncia de operadores Segue uma lista com a precedncia dos operadores descritos acima da maior para a menor precedncia: 1. 2. 3. 4. 5. 6. 7. String, Formao de nomes; Comentrios; Srie de valores; Repetio; Agrupamento, Opcional; Concatenao; Alternao.

40

O uso do operador de alternao e o operador de concatenao podem ser confundidos. e recomenda-se que agrupamentos sejam usados para fazer concatenaes explcitas de grupos. Regras essenciais Segue abaixo regras essenciais definidas por padro na FABN
Regra ALPHA DIGIT HEXDIG Definio Formal %x41-5A / %x61-7A %x30-39 Significado Letras ASCII em caixa alta e baixa (A-Z, a-z ) Dgitos decimais (0-9)

DIGIT / "A" / "B" / "C" / "D" / "E" / "F" Dgitos hexadecimais (0-9 A-F a-f ) Aspas duplas Espao Tabulao Espao e tabulao Espao de linha em brando (nova linha) Caractere visvel (imprimvel) Qualquer caractere US_ASCII 7-bit

DQUOTE %x22 SP HTAB WSP LWSP VCHAR CHAR %x20 %x09 SP / HTAB *(WSP / CRLF WSP) %x21-7E %x01-7F

Formalismo de Backus-Naur

41
%x00-FF %x00-1F / %x7F %x0D %x0A CR LF "0" / "1" 8 bits de dados Controles Carriage return Linefeed Nova linha no padro da internet

OCTET CTL CR LF CRLF BIT

Exemplo A implementao de um cdigo-postal em FABN seria:


endereo-postal = parte-do-nome rua parte-do-CEP

parte-do-nome parte-do-nome

= [parte-opc-jr] *(parte-pessoal SP) ultimo-nome [SP parte-opc-jr] ; a segunda parte opcinal se refere ao "Jr." CRLF =/ parte-pessoal CRLF

parte-pessoal primeiro-nome inicial ultimo-nome parte-opc-jr

= primeiro-nome / (inicial ".") = *ALPHA = ALPHA "." = *ALPHA = ( "Sr." / "Jr." / 1*("I" / "V" / "X"))

rua apt numero-casa rua-nome

= rua-nome SP numero-casa [SP apt] CRLF = 1*4DIGIT = 1*8(DIGIT / ALPHA) = 1*VCHAR

parte-do-CEP cidade estado CEP

= CEP 1*2SP cidade SP "-" SP estado CRLF = 1*(ALPHA / SP) = 2ALPHA = 5DIGIT "-" 3DIGIT

[1] http:/ / tools. ietf. org/ html/ rfc4234 [2] KNUTH, Donald E.. Selected Papers on Computer Languages: Backus Normal Form versus Backus Naur Form (em ingls). Ventura Hall, Stanford CA:CSLI-Center for Study of Language and Information, 2003.95-97 p. ISBN 1-57586-382-0

Anlise sinttica

42

Anlise sinttica
Em cincia da computao e lingustica, anlise sinttica (tambm conhecida pelo termo em ingls parsing) o processo de analisar uma sequncia de entrada (lida de um arquivo de computador ou do teclado, por exemplo) para determinar sua estrutura gramatical segundo uma determinada gramtica formal. Essa anlise faz parte de um compilador, junto com a anlise lxica e anlise semntica.

Exemplo da anlise sinttica de uma expresso matemtica. O resultado uma rvore da expresso

A anlise sinttica transforma um texto na entrada em uma estrutura de dados, em geral uma rvore, o que conveniente para processamento posterior e captura a hierarquia implcita desta entrada. Atravs da anlise lxica obtido um grupo de tokens, para que o analisador sinttico use um conjunto de regras para construir uma rvore sinttica da estrutura. Em termos prticos, pode tambm ser usada para decompor um texto em unidades estruturais para serem organizadas dentro de um bloco, por exemplo. A vasta maioria dos analisadores sintticos implementados em compiladores aceitam alguma linguagem livres de contexto para fazer a anlise. Estes analisadores podem ser de vrios tipos, como o LL, LR e SLR.

Tipos de analisadores sintticos


A tarefa do analisador sinttico (um algoritmo, programa de computador ou componente de software que se preze a realizar uma anlise sinttica) essencialmente a de determinar se uma entrada de dados pode ser derivada de um smbolo inicial com as regras de uma gramtica formal. Isso pode ser feito de duas maneiras: Descendente (top-down) - um analisador pode iniciar com o smbolo inicial e tentar transform-lo na entrada de dados. Intuitivamente, o analisador inicia dos maiores elementos e os quebra em elementos menores. Exemplo: analisador sinttico LL. Ascendente (bottom-up) - um analisador pode iniciar com um entrada de dados e tentar reescrev-la at o smbolo inicial. Intuitivamente, o analisador tentar localizar os elementos mais bsicos, e ento elementos maiores que contm os elementos mais bsicos, e assim por diante. Exemplo: analisador sinttico LR.

Determinismo
Analisadores sintticos so determinsticos se sempre souberem que ao tomar independentemente da entrada de texto. Este comportamento desejado e esperado na compilao de uma linguagem de programao. No campo de processamento de linguagem natural, pensava-se que essa a anlise sinttica determinstica era impossvel devido ambiguidade inerente das linguagens naturais, em que diversas sentenas possuem mais de uma possvel interpretao. Entretanto, Mitch Marcus props em 1978 o analisador sinttico Parsifal[1], que consegue lidar com ambiguidades ainda que mantendo o comportamento determinstico.
[1] Mitchell P. Marcus. Theory of Syntactic Recognition for Natural Languages. Cambridge:MIT Press, 1980.335 p. ISBN 0262131498

43

Anlise Sinttica Top-Down


Analisador sinttico LL
Um analisador sinttico LL um algoritmo de anlise sinttica para um sub-conjunto de gramticas livre de contexto. Ele dito um analisador sinttico descendente (top-down) pois tenta deduzir as produes da gramtica a partir do n raz. Ele l a entrada de texto da esquerda para a direita, e produz uma derivao mais esquerda (por isso LL, do termo em ingls left-left, diferente do analisador sinttico LR). As gramticas que podem ser analisadas sintaticamente usando esse tipo de analisador so chamadas gramticas LL. Outro termo usado analisador sinttico LL(x), no qual refere-se quantidade de tokens posteriores ao smbolo atual (ainda no consumidos da entrada) que so usados para tomar decises na anlise. Se tal analisador sinttico existe para uma dada gramtica, e ele pode analisar sentenas nessa gramtica sem o uso de backtracking, ento essa gramtica chamada gramtica LL(x). Dessas gramticas com anlise posterior, as gramticas LL(1) so as mais populares, pela necessidade de verificar somente o token posterior para a anlise. Linguagens mal desenvolvidas tipicamente possuem gramticas com um valor alto de , e necessitam de bastante esforo computacional para serem analisadas.

Arquitetura
Caso geral
O analisador sinttico trabalha em cadeias de texto de uma determinada gramtica formal, e consiste de: um buffer de entrada; uma pilha na qual so armazenados os smbolos da gramtica ainda no analisados; uma tabela anlise que indica se qual regra gramatical a ser aplicada dados os smbolos no topo da pilha e o prximo token de entrada. Quando o analisador iniciado, a pilha j contm dois smbolos: [ S, $ ] no qual $ um terminador especial para indicar o fim da pilha e o fim da entrada de dados, e S o smbolo de entrada da gramtica. O analisador sinttico ir tentar reescrever o contedo da pilha para o que ele interpreta da entrada de texto. Entretanto, ele somente mantm na pilha o que ainda deve ser reescrito.

Exemplo
A gramtica abaixo ser usada para o exemplo a seguir. Ela trata expresses matemticas, no qual so aceitas somas entre uns: (1) S F (2) S ( S + F ) (3) F 1 deve-se analisar sintaticamente a seguinte entrada: (1+1)

Analisador sinttico LL Tabela de anlise


( ) 1 + $ S 2 - 1 F - - 3 -

44

Procedimento de anlise O analisador sinttico primeiro l o terminal ( da entrada de texto, e o S da pilha. Da tabela indicado que deve-se aplicar a regra 2, isto , reescrever S para ( S + F ) na pilha e escrever o nmero dessa regra na sada de dados. No prximo passo removido o ( da entrada de dados e da pilha. Agora o analisador verifica o terminal 1 na entrada de texto ento aplica a regra 1 e ento a regra 3 da gramtica, e escreve seus nmeros na sada de dados. Nos prximos dois passos o analisador sinttico l o 1 e o + da entrada de dados e os compara aos valores da pilha. Como so iguais, eles so removidos da pilha. Nos prximos trs passos o F ser substitudo da pilha por 1, e o nmero 3 (a regra gramatical) ser escrita na sada de dados. Ento o 1 e o ) so removidos da pilha e da entrada de dados. Por fim, o analisador termina com $ tanto na pilha quanto na entrada de dados. Nesse caso ser retornado que a cadeia de caracteres de entrada foi aceita, e na sada de dados est a lista de regras usadas na anlise. Como pode ser visto no exemplo, o analisador sinttico LL realiza trs tipos de passos dependendo do contedo do topo da pilha, seja no-terminal, terminal ou $: Se o topo no terminal ento ele verifica a tabela de anlise, com base do valor no terminal e o smbolo na entrada de dados, qual regra da gramtica deve ser usada. O nmero da regra escrito na sada de dados. Se a tabela de anlise indica que no h regra programada, retornado um erro. Se o topo terminal ento ele compara o smbolo na entrada com o smbolo do topo da pilha, e se so iguais ambos so removidos. Se eles no so iguais retornado um erro de sintaxe. Se o topo $ e na entrada de dados tambm existe um $ ento ele retorna sucesso de anlise, seno erro de sintaxe. Parecido com o tratamento para um topo terminal, note que nesse caso o algoritmo terminado em ambos os casos. Esses trs passos so repetidos at o algoritmo parar, seja com sucesso ou com erro.

Analisador sinttico descendente recursivo

45

Analisador sinttico descendente recursivo


Um analisador sinttico descendente recursivo um analisador sinttico descendente construdo a partir de subrotinas mutualmente recursivas (ou qualquer equivalncia no recursiva como uma pilha) em que cada subrotina geralmente implementa uma das regras de produo da gramtica. Cada subrotina fica associada a um elemento no-terminal da gramtica. Consequentemente, a estrutura do programa resultante se assemelha bastante gramtica que ele reconhece. Um analisador sinttico preditivo (ou analisador sinttico preditor) um analisador sinttico descendente recursivo que no requer backtracking. Ele s possvel para a classe de gramticas LL(k), que so gramticas livres de contexto para as quais existem algum inteiro positivo k que permite um analisador sinttico descendente recursivo para decidir qual produo usar analisando somente os k tokens seguintes na entrada de dados. (Portanto, as gramticas LL(k) excluem todas as gramticas ambguas, assim como todas as gramticas que contm recursividade esquerda. O algoritmo entraria em lao infinito. Qualquer gramtica livre de contexto pode ser transformada numa gramtica equivalente que no possui recursividade esquerda, mas a remoo da recursividade a esquerda nem sempre resulta numa gramtica LL(k).) Um analisador sinttico preditivo possui complexidade linear. Um analisador sinttico descendente com cpia determina qual produo usar por tentativa e erro (por exemplo, diferentes regras com mesmo lado esquerdo, A ::= aB | aC | cD). O algoritmo s retorna ao consumir toda a entrada (sucesso) ou ao esgotar todas as possibilidades de produo (falha). Ele no limitado s gramticas LL(k), mas o trmino no garantido a menos que a gramtica seja LL(k). Mesmo que termine, essa tcnica pode levar a complexidade exponencial, e geralmente consome muita memria, o que a torna praticamente inutilizada atualmente. Apesar dos analisadores sintticos preditivos serem bastante usados, os programadores geralmente preferem criar analisador LR ou LALR atravs de geradores de analisador sintticos sem a transformao da gramtica numa forma LL(k). Geradores de analisadores sintticos descendentes recursivos incluem JavaCC (para Java), Coco/R (C#, Java), ANTLR (C, C++, Java, Python, C#, Objective-C), pyparsing (Python) e Spirit (C++, parte da biblioteca Boost).

Referncias
Pedro Sergio Nicolletti. Anlise Sinttica Parte 2 [1]. Material de Aula de Compiladores. Universidade Federal de Campina Grande. Pgina visitada em 21 de julho de 2008. Compilers: Principles, Techniques, and Tools, 1 ed., Alfred V Aho, Ravi Sethi e Jeffrey D Ullman. Seo 4.4. Modern Compiler Implementation in Java, Second Edition, Andrew Appel, 2002, ISBN 0-521-82060-X. Recursive Programming Techniques, W.H. Burge, 1975, ISBN 0-201-14450-6 Crafting a Compiler with C, Charles N Fischer and Richard J LeBlanc, Jr, 1991, ISBN 0-8053-2166-7. Compiling with C# and Java, Pat Terry, 2005, ISBN 0-321-26360-X, 624 Algorithms + Data Structures = Programs, Niklaus Wirth, 1975, ISBN 0-13-022418-9 Compiler Construction, Jonatan Rugarn, 1996, ISBN 0-201-40353-6

Referncias
[1] http:/ / www. dsc. ufcg. edu. br/ ~peter/ cursos/ cc/ material/ p3-sintatico-2p. pdf

46

Anlise Sinttica Bottom-Up


Analisador sinttico LR
Um analisador sinttico LR (tambm chamado parser LR) um algoritmo de anlise sinttica para gramticas livres de contexto. Ele l a entrada de texto da esquerda para a direita e produz uma derivao mais direita (por isso LR, do termo em ingls left-right, diferente do analisador sinttico LL). Outro termo usado analisador sinttico LR(x), no qual refere-se quantidade de smbolos posteriores ao smbolo atual (ainda no consumidos da entrada) que so usados para tomar decises na anlise. Geralmente esse valor 1, sendo omitido. Uma gramtica livre de contexto chamada LR(x) se existe uma analisador sinttico LR(x) para ela. Um analisador sinttico LR dito um analisador sinttico de ascendente (bottom-up) pois ele tenta deduzir as produes da gramtica a partir dos ns folha da rvore. Vrias linguagens de programao so descritas por uma gramtica LR(1), ou pelo menos parecida, e por isso os analisadores sintticos LR so geralmente usados por compiladores para realizar a anlise sinttica do cdigo fonte. Uma exceo notvel a linguagem de programao C++. Os analisadores sintticos LR podem ser implementados muito eficientemente, o que muito til para compiladores, por exemplo. Raramente so produzidos manualmente, sendo geralmente construdos por um gerador de anlise sinttica ou um compilador de compiladores. Dependendo da forma como a tabela de anlise sinttica gerada, o analisador chamado SLR (simples), LALR (quando h anlise de smbolos posteriores) e cannico (ou LR(1)). Os analisadores LALR podem lidar com mais tipos de gramticas que o SLR; o cannico pode lidar com mais tipos de gramticas que o LALR.

Arquitetura
Caso geral
O analisador sinttico uma mquina de estado finito que consiste de: um buffer de entrada; uma pilha no qual armazenada uma lista de estados anteriores; uma tabela de prximo estado que indica para onde o novo estado deve se mover; uma tabela de ao que indica uma regra gramatical a aplicar no estado e smbolo atual na entrada de dados.

Algoritmo O algoritmo do analisador sinttico LR definido como: 1. A pilha inicializada com [0]. O estado atual ser sempre o estado no topo da pilha. 2. Dado o estado atual e o smbolo atual na entrada, uma ao procurada na tabela de ao: uma mudana de estado sn: o smbolo terminal atual removido da entrada o estado n inserido na pilha (tornando-se o estado atual) uma reduo rm: o nmero m escrito no fluxo de sada para cada smbolo direita da regra m, um estado removido da pilha

Analisador sinttico LR dado o ento estado atual no topo da pilha e a regra m, um novo estado procurado na tabela de prximo estado, tornando-se o estado atual ao ser inserido na pilha uma aceitao: a cadeia de caracteres aceita sem ao: um erro de sintaxe retornado 3. O passo 2 repetido at que a haja uma aceitao ou um erro de sintaxe.

47

Exemplo
A gramtica abaixo ser usada para o exemplo a seguir. Ela trata expresses matemticas, no qual aceito somas e multiplicaes entre uns e zeros. (1) E E * B (2) E E + B (3) E B (4) B 0 (5) B 1 deve-se analisar sintaticamente a seguinte entrada: 1+1 Tabelas de ao e prximo estado
ao estado * 0 1 2 3 4 5 6 7 8 + 0 1 $ prximo estado E 3 r4 r5 acc r3 7 8 r1 r2 B 4

s1 s2 r4 r4 r4 r4 r5 r5 r5 r5 s5 s6 r3 r3 r3 r3 s1 s2 s1 s2 r1 r1 r1 r1 r2 r2 r2 r2

A tabela de ao classificada por um estado do analisador sinttico e um smbolo terminal (incluindo o terminal especial $ que indica o final da entrada de dados) e contm trs tipos de aes: mudana de estado (shift), escrito sn e indicando que o prximo estado n reduo (reduce), escrito rm e indicado que a reduo com a regra gramatical m deve ser feita aceitao (accept), escrito acc e indicando que o analisador sinttico aceita a entrada de dados A tabela de prximo passo classificada por um estado do analisador sinttico e por um smbolo no terminal. Ela indica qual o prximo estado do analisado se um smbolo no-terminal foi reconhecido.

Analisador sinttico LR Procedimento de anlise A tabela abaixo ilustra cada passo do processo. Aqui o estado refere-se ao elemento no todo da pilha (mais direita), e a prxima ao determinada referindo-se tabela de ao acima. Notar que um $ adicionado no final da entrada de dados para indicar o fim do texto.
Estado Entrada de dados Sada de dados 0 2 4 3 6 2 8 3 1+1$ +1$ +1$ +1$ 1$ $ $ $ 5 5,3 5,3 5,3 5,3,5 5,3,5,2 Pilha [0] [0,2] [0,4] [0,3] [0,3,6] Prxima ao mudana de estado para 2 reduz 5 reduz 3 mudana de estado para 6 mudana de estado para 2

48

[0,3,6,2] reduz 5 [0,3,6,8] reduz 2 [0 3] aceita

O estado inicial do analisador sempre 0, armazenado na pilha. O primeiro valor terminal encontrado pelo parser 1, e de acordo com a tabela de ao deve haver uma mudana de estado para 2. No estado 2 a tabela de ao indica que qualquer terminal que aparea, deve-se realizar uma reduo com a regra gramatical 5. Por isso escreve-se 5 da sada de dados, retira-se um estado da pilha e adiciona-se na pilha o estado da tabela de prximo estado (que no caso 4). Apesar disso a tabela de ao do estado 4 indica que deve-se realizar uma reduo com a regra 3. Ento escreve-se 3 na sada de dados, retira-se um estado da pilha, encontra-se um novo estado na tabela de prximo estado (que no caso 3). O prximo terminal no parser +, e de acordo com a tabela de ao deve-se ir para o estado 6. O prximo terminal 1, significando que deve-se realizar uma mudana para o estado 2. Assim como o 1 anterior, feita uma reduo para B, indo-se para o estado 8. Nesse estado sempre feita uma reduo pela regra 2. Finalmente lido o terminal $ da entrada de dados, o que significa que, de acordo com a tabela de ao (o estado atual 3), o analisador sinttico aceita a entrada de dados.

Analisador sinttico GLR

49

Analisador sinttico GLR


O analisador sinttico GLR (do ingls "Generalized Left-to-right Rightmost derivation parser") uma extenso do analisador sinttico LR que trata do problema do no determinismo em gramticas ambguas. Foi introduzido por Masaru Tomita no seu artigo publicado em 1984[1][2]. Este tambm pode ser encontrado na literatura com o nome de "analisador sinttico paralelo" (do ingls parallel parser). Apesar do algoritmo ser uma adaptao do analisador sinttico LR, os princpios da verso original continuam os mesmos. O objetivo de Tomita era reconhecer texto em linguagem natural de maneira completa e efetiva. O analisador sinttico LR tradicional no consegue lidar com o no determinismo e a natureza ambgua das linguagens naturais. Nestes casos o analisador sinttico GLR ser utilizado sem problemas.

O Algoritmo [3]
Em suma o algoritmo do analisador GLR funciona de maneira similar ao algoritmo implementado pelo seu antecessor, o LR. A diferena entre este algoritmo e seu antecessor que no primeiro, dada uma gramtica particular, ele ir processar todas as possveis interpretaes da entrada utilizando uma abordagem de busca em largura. Por outro lado um gerador de analisadores sintticos GLR converte a gramtica de entrada em tabelas sintticas de maneira similar ao gerador LR tradicional. Porm, enquanto uma tabela sinttica gerada por um analisador LR permite apenas um nico estado de transio, a tabela sinttica gerada pelo analisador GLR permite vrios estados de transies. Na realidade, a abordagem do GLR permite a ocorrncia de conflitos para mudana de estado/reduo e reduo/reduo. Quando uma transio conflitante encontrada a pilha do analisador dividida em duas ou mais pilhas, onde o estado corresponde a cada possvel transio est no topo de cada sub-pilha. Ento, a prxima marca contida na entrada lida e usada para determinar a prxima transio no topo de cada uma das sub-pilhas, alm disso o processo de diviso pode acontecer novamente. Se nenhum estado no topo da pilha e a marca da entrada resultarem em, pelo menos, uma transio ento o caminho percorrido na tabela do analisador invlido e pode ser descartado.

Vantagens
Quando implementado com cuidado, o algoritmo do GLR tem a mesma complexidade dos algoritmos CYK e de Earley, ambos com complexidade O(n3). O algoritmo GLR ainda conta com duas vantagens adicionais: O tempo necessrio para rodar o algoritmo proporcional ao grau de no determinismo encontrado na gramtica. No caso particular de gramticas determinsticas o algoritmo roda em ordem O(n), o que no acontece para os algoritmos CYK e de Earley. O algoritmo GLR pode ser considerado um algoritmo on-line, isso quer dizer que ele consome as marcas da entrada numa ordem especifica e a gasta a maioria do tempo de processamento aps o consumo de cada marca. Na prtica, a maioria das linguagens de programao so determinsticas ou a maior parte de suas instrues so determinsticas. Isso quer dizer que qualquer no-determinismo pode ser resolvido com um pequeno nmero de marcas. Comparado com os outros algoritmos que lidam com as gramticas livre de contexto o algoritmo GLR o que tem o melhor desempenho para as gramticas em que a maior parte determinstica, isso por que apenas uma pilha estar ativa durante a maior parte do processo de anlise sinttica.

Analisador sinttico GLR

50

Implementaes
Dparser [4] Scannerless Boolean Parser [5] ASF+SDF Meta Environment GNU Bison Elkhound [6] Tom: C implementation of the Tomita parsing algorithm [7] Harmonia: A Framework for Language-Aware Programming Tools [8]

Referncias
[1] Tomita, Masaru (1984). "LR parsers for natural languages" in 10th International Conference on Computational Linguistics. COLING: 354-357. [2] Tomita, Masaru (1985). "An efficient context-free parsing algorithm for natural languages" in International Joint Conference on Artificial Intelligence. IJCAI: 756-764. [3] Grune, Dick e Jacobs, Ceriel J.H. Parsing Techniques: A Practical Guide. [S.l.]:Springer Science+Business Media, 2008. ISBN 978-0-387-20248-8 [4] http:/ / dparser. sourceforge. net/ [5] http:/ / research. cs. berkeley. edu/ project/ sbp/ [6] http:/ / www. cs. berkeley. edu/ ~smcpeak/ elkhound/ [7] http:/ / www-2. cs. cmu. edu/ afs/ cs/ project/ ai-repository/ ai/ areas/ nlp/ parsing/ tom/ 0. html [8] http:/ / www. cs. berkeley. edu/ ~harmonia/ harmonia/ index. html

51

Anlise semntica
Anlise semntica
Anlise semntica a terceira fase da compilao onde se verifica os erros semnticos, (por exemplo, uma multiplicao entre tipos de dados diferentes) no cdigo fonte e coleta as informaes necessrias para a prxima fase da compilao que a gerao de cdigo objeto.

Gramtica de atributos
Uma gramtica de atributos uma formalizao que permite definir os atributos para as produes de uma gramtica formal, associando estes atributos com valores. A avaliao ocorre nos nodos da rvore sinttica abstrata, quando a linguagem processada por algum analisador sinttico ou compilador.

Tipos de Atributos
Os atributos so divididos em dois grupos: os atributos sintetizados e atributos herdados. Os atributos sintetizados, tambm denominados derivados, so associados aos no-terminais das regras de produo aos aquais eles se encontram ligados. Os atributos herdados so passados atravs dos nodos pais e so definidos por asseres nas produes cujo lado direito contenha referncias ao no terminal ao qual se encontram ligados[1]. Em algumas abordagens, os atributos sintetizados so utilizados para transmitir informao semntica no sentido bottom-up na rvore Atributos Herdados e Sintetizados sinttica ao passo que os atributos herdados passam informaes semnticas no sentido top-down na rvore sinttica. Por exemplo, quando se est a construir uma ferramenta de traduo, como um compilador pode-se atribuir valores semnticos construes sintticas. Tambm possvel realizar verificaes semnticas associadas gramtica de atributos, representando regras da linguagem no contempladas explicitamente pela sintaxe. Gramticas de atributos tambm podem ser utilizadas para traduzir a rvore sinttica diretamente para o cdigo especfico de algumas mquinas, ou em alguma lnguagem intermediria.

Gramtica de atributos

52

Definio
Uma Gramtica de Atributos uma tupla onde: uma gramtica livre de contexto. um conjunto finito de atributos distintos. um conjunto finito de asseres a atributos ou predicados.

Exemplo
O seguinte uma gramtica livre de contexto simples que pode descrever uma linguagem composta de multiplicao e adio de nmeros inteiros. Expr Expr + Term Expr Term Term Term * Fator Term Fator Fator "(" Expr ")" Fator inteiro A seguinte gramtica de atributos pode ser usada para calcular o resultado de uma expresso escrita na gramtica. Note-se que essa gramtica s usa valores sintetizados, e por isso uma gramtica S-atribuda. Expr1 Expr2 + Term [ Expr1.valor = Expr22.valor + Term.valor ] Expr Term [ Expr.valor = Term.valor ] Term1 Term2 * Fator [ Term1.valor = Term2.valor * Fator.valor ] Term Fator [ Term.valor = Fator.valor ] Fator "(" Expr ")" [ Fator.valor = Expr.valor ] Fator inteiro [ Fator.valor = strToInt(inteiro.str) ]

Bibliografia
Aho, Alfred V.; Ullman, Jeffrey D.. Principles of Compiler Design. Reading, Massachusetts, EUA:Addison-Wesley, 1977.604 p. ISBN 0-201-00022-9 Aho, Alfred V.; Sethi, Ravi; Ullman, Jeffrey D.. Compilers: Principles, Techniques and Tools. Reading, Massachusetts, EUA:Addison-Wesley, 1986.796 p. ISBN 0-201-10088-6 Pittman, Thomas; Peters, James. The Art of Compiler Design: Theory and Practice. Englewood Cliffs, New Jersey, EUA:Prentice Hall, 1992.419 p. ISBN 0-13-048190-4
[1] Pittman, Thomas; Peters, James. The Art of Compiler Design: Theory and Practice. Englewood Cliffs, New Jersey, EUA:Prentice Hall, 1992.419 p. ISBN 0-13-048190-4

Ligaes Externas
D. E. Knuth: O bero das Gramticas de Atributo (http://www-cs-faculty.stanford.edu/~knuth/papers/gag. tex.gz). Proceedings of the international conference on Attribute grammars and their applications (1990), 112. Some informal, historical information.

Gramticas de Van Wijngaarden

53

Gramticas de Van Wijngaarden


Uma gramtica de van Wijngaarden (tambm conhecida por gramtica-vW ou gramtica-W (W-grammar) uma gramtica em dois nveis que fornece uma tcnica para definir potencialmente infinitas gramticas, em um nmero finito de regras. O formalismo foi inventado por Adriaan van Wijngaarden para definir com rigor algumas restries sintticas que anteriormente tinham que ser formuladas em linguagem natural, apesar de seu contedo ser essencialmente sinttico. As aplicaes tpicas so o tratamento de gnero e nmero em sintaxes de linguagem natural e a boa definio de identificadores em linguagens de programao. A tcnica foi utilizada e desenvolvida na definio da linguagem de programao ALGOL 68. um exemplo da larga classe de gramticas aumentadas.

Viso global
Uma gramtica-W consiste de um conjunto finito de meta-regras, que so usadas para derivar (possivelmente infinitamente muitas) regras de produo de um conjunto finito de Hyper-regras. Meta-regras so restritas as definidas por uma gramtica livre de contexto. Hyper-regras restringem os contextos admissveis ao nvel superior. Essencialmente, as substituies consistentes, utilizadas no processo de derivao so equivalentes a unificao, como em Prolog, como foi observado por Alain Colmerauer.

Exemplos em Algol 68
Antes de ALGOL 68 a linguagem ALGOL 60 foi formalizada usando a forma, livre de contexto, de Backus-Naur. E assim o aparecimento de novas gramticas de dois nveis, sensveis ao contexto, apresentavam um desafio para alguns leitores do ALGOL 1968 ALGOL 68 "Final Report". Posteriormente, o relatrio final foi revisto por Wijngaarden e seus colegas, e publicado como o ALGOL 1973 68 "Revised Report".

ALGOL 68, como no Relatrio Final 1968 2.1


a) program : open symbol, standard prelude, library prelude option, particular program, exit, library postlude option, standard postlude, close symbol. b) standard prelude : declaration prelude sequence. c) library prelude : declaration prelude sequence. d) particular program : label sequence option, strong CLOSED void clause. e) exit : go on symbol , letter e letter x letter i letter t, label symbol. f) library postlude : statement interlude. g) standard postlude : strong void clause train

ALGOL 68 como no Relatrio Revisado de 1973, 2.2.1, 10.1.1


program : strong void new closed clause A) EXTERNAL :: standard ; library ; system ; particular. B) STOP :: label letter s letter t letter o letter p. a) program text : STYLE begin token, new LAYER1 preludes, parallel token, new LAYER1 tasks PACK, STYLE end token. b) NEST1 preludes : NEST1 standard prelude with DECS1,

Gramticas de Van Wijngaarden NEST1 library prelude with DECSETY2, NEST1 system prelude with DECSETY3, where (NEST1) is (new EMPTY new DECS1 DECSETY2 DECSETY3). NEST1 EXTERNAL prelude with DECSETY1 : strong void NEST1 series with DECSETY1, go on token ; where (DECSETY1) is (EMPTY), EMPTY. NEST1 tasks : NEST1 system task list, and also token, NEST1 user task PACK list. NEST1 system task : strong void NEST1 unit. NEST1 user task : NEST2 particular prelude with DECS, NEST2 particular program PACK, go on token, NEST2 particular postlude, where (NEST2) is (NEST1 new DECS STOP). NEST2 particular program : NEST2 new LABSETY3 joined label definition of LABSETY3, strong void NEST2 new LABSETY3 ENCLOSED clause. NEST joined label definition of LABSETY : where (LABSETY) is (EMPTY), EMPTY ; where (LABSETY) is (LAB1 LABSETY1), NEST label definition of LAB1, NEST joined label definition of$ LABSETY1. NEST2 particular postlude : strong void NEST2 series with STOP.

54

c)

d) e) f)

g)

h)

i)

Implementaes
Analisador sinttico (parser) yo-yo para gramticas de van Wijngaarden com gramticas de exemplo para expresses, eva, sal e a linguagem de programao Pascal[1]. O padro atual ISO 7185 para a Pascal usa a Forma de BackusNaur estendida.

Histria
Gramticas-W so baseadas na ideia de fornecer aos smbolos no-terminais de gramticas livres de contexto atributos (ou afixos) que passam informaes entre os nodos da rvore sinttica usados para restringir a sintaxe e especificar a semntica. Essa ideia era bem conhecido na poca; por exemplo, Donald Knuth visitou o comit de projeto de ALGOL 68 enquanto desenvolvia sua prpria verso de sua gramtica de atributos[2]. Bastante peculiar para gramticas-W foi seu tratamento rigoroso de atributos como cadeias de caracteres (strings), definidas por uma gramtica livre de contexto, em que a concatenao nica operao possvel; em gramticas de atributos, os atributos podem ser de qualquer tipo de dados, e qualquer tipo de operao pode ser aplicado a eles. Aps a sua introduo no relatrio Algol 68, as gramticas-W foram consideradas amplamente como demasiado poderosas e sem restries para serem prticas. Isso foi em parte uma consequncia da forma como tinham sido aplicadas; o relatrio revisado de Algol 68 continha uma gramtica muito mais legvel, sem modificar o formalismo da gramatica-W. Entretanto, ficou claro que as gramticas-W so de fato muito poderosas. Elas so Turing completo, o que torna impossvel a anlise sinttica, de um modo geral: um problema indecidvel decidir se uma dada cadeia de caracteres (string) pode ser gerada por uma dada gramtica-W. Seu uso deve ser seriamente limitado quando usado para anlise e traduo automtica. Variantes restritas e modificadas de

Gramticas de Van Wijngaarden gramticas-W foram desenvolvidas para resolver esta questo, por exemplo: Gramticas estendidas, aplicadas na descrio de gramticas de linguagem natural, tais como Ingls e Espanhol. Sistemas-Q, tambm aplicados na rea de processamento da linguagem natural. A srie de linguagens CDL, usadas na construo de compiladores para linguagens de programao.

55

Aplicaes alm de ALGOL 68


Anthony Fisher escreveu um analisador sinttico para uma vasta classes de gramticas-W [3]. Dick Grune criou um programa em linguagem C que poderia gerar todas as possveis produes de uma gramtica de dois nveis [4]. Gramticas-W tambm foram propostas para utilizao na descrio de aes humanas complexas em ergonomia.

Veja Tambm
Gramtica de Atributos
[1] http:/ / www-users. cs. york. ac. uk/ ~fisher/ software/ yoyovwg/ exs/ pascal. vwg [2] [D. E. Knuth: The genesis of attribute grammars (http:/ / www-cs-faculty. stanford. edu/ ~knuth/ papers/ gag. tex. gz). Proceedings of the international conference on Attribute grammars and their applications (1990), 112.] [3] http:/ / www-users. cs. york. ac. uk/ ~fisher/ software/ yoyovwg/ [4] http:/ / www. cs. vu. nl/ ~dick/ utils. html

Ligaes externas
Uso noAlgol68 (http://www.bookrags.com/sciences/computerscience/algol-68-wcs.html) Tutorial introdutrio (http://www.cwi.nl/~steven/vw.html) por Steven Pemberton.

56

Gerao de Cdigo
Gerao de Cdigo
Dentro do diversificado leque de categorias de ferramentas que prestam apoio s atividades da Engenharia de Software (CASE), uma especfica vem ganhando cada vez mais destaque e, sobre ela, tem-se aplicado muito investimento nos ltimos tempos: as Ferramentas de Gerao de Cdigo, ou simplesmente Geradores de Cdigo. Dessa forma, Gerador de Cdigo aquela ferramenta que possui a capacidade de gerar cdigo a partir de um determinado modelo de software. Inclusive, de acordo com alguns pontos de vista e a partir das caractersticas especficas do tipo de Gerador de Cdigo, ele passa a ser conversor de cdigos de linguagens distintas. Isso acontece, por exemplo, com o compilador, que transforma um cdigo escrito atravs de uma linguagem de programao para cdigo de mquina ou cdigo objeto.

Tipos mais comuns


Alguns tipos de Gerador de Cdigo valem a pena serem mencionados. Eles possuem caractersticas especficas e uma maneira de trabalhar prpria que est diretamente ligada aos seus objetivos. O mais bsico tipo de gerador de cdigo o j mencionado compilador, como pode ser visto no artigo Code generation. Outros dois tipos de gerador de cdigo que esto sendo cada vez mais utilizados em ambiente de produo de software so os geradores de cdigo de IDEs visuais e os geradores de cdigo baseados em templates. Uma nova tendncia a utilizao de geradores de cdigos baseados na base de dados. Um exemplo o Total Code Generator que cria um sistema em .Net.

Geradores de cdigo baseados em templates


Ultimamente, os geradores de cdigo baseados em templates comearam a figurar o elenco das ferramentas CASE presentes em ambiente de produo de software como sendo uma opo para a gerao automtica e massiva de funcionalidades de aplicaes, seja de maneira completa ou parcial. Ferramentas tais como Velocity (do Apache Jakarta Project), Transformica (do Hammurapi Group) ou CodeFSW (da Unitech Tecnologia de Informao), alm de diversas outras que vm surgindo neste cenrio, a depender de como sejam utilizadas, podem viabilizar a gerao de cdigo para as diversas camadas de uma aplicao, a partir de templates e parmetros de entrada. Dessa maneira, tendo a necessidade de possuir diversas funcionalidades semelhantes em suas estrutura e que englobem cdigos das camadas da aplicao adotadas em sua arquitetura, uma aplicao pode ser desenvolvida, em grande parte, com a ajuda de tais ferramentas.

Principais vantagens
Certamente que as vantagens adquiridas ao se adotar Geradores de Cdigo em um ambiente de produo de software s aparecem quando da boa utilizao dessas ferramentas. A partir do uso adequado dos geradores de cdigo, sejam quais tipos forem, a equipe de produo de software perceber um ganho significativo em sua produtividade, sendo capaz de realizar a construo de funcionalidades das aplicaes de maneira mais eficiente e segura, garantindo tambm a diminuio dos custos de projeto. Uma outra vantagem que vista de maneira bastante clara se refere padronizao percebida no cdigo gerado, visto que pode se basear, a depender do tipo, tanto em um template utilizado, como na filosofia de trabalho da ferramenta IDE. E est definitivamente consolidada a idia de que um ponto positivo com relao qualidade do

Gerao de Cdigo software, ter uma aplicao em cujo cdigo-fonte se percebe um estilo nico de programao. Por fim, pode-se considerar tambm como uma vantagem do uso de geradores de cdigo, a depender novamente de como so utilizados, a construo de aplicaes isentas de grande parte dos artifcios que facilitam a programao propriamente, mas, por outro lado, afetam diretamente o quesito performance. sabido, por exemplo, que o uso de Reflexo, artifcio que suportado em linguagens como Java e C# e que permite a introspeco e manipulao de classes, interfaces e objetos no geral, afeta negativamente a performance de funcionalidades de aplicaes. O uso adequado de geradores de cdigo no processo de desenvolvimento de software pode fazer desnecessrio o uso de tal artifcio, melhorando o desempenho do produto final. Muitas outras vantagens podem ser percebidas com o uso de geradores de cdigo no processo de construo de software. Mas tambm vale alertar que tais ferramentas, em vez de contribuir com vantagens, podem atrapalhar o andamento do projeto quando feito uso inadequado ou desnecessrio das mesmas.

57

Ligaes externas
Total Code Generator (br) [1] CodeSmith [2] Code Generation [3] Borland Delphi [4] Oracle JDeveloper [5] Microsoft Visual Studio [6] Velocity [7] Unitech CodeFSW [8] Transformica [9] Zibordi Sistemas [10]

Referncias
[1] http:/ / www. totalcodegenerator. com. br/ [2] http:/ / www. codesmithtools. com/ [3] http:/ / www. codegeneration. net/ [4] http:/ / www. borland. com/ br/ products/ delphi/ index. html [5] http:/ / www. oracle. com/ technology/ products/ jdev/ [6] http:/ / msdn. microsoft. com/ vstudio/ [7] http:/ / jakarta. apache. org/ velocity/ [8] http:/ / www. unitech. com. br [9] http:/ / www. hammurapi. biz/ products/ transformica/ [10] http:/ / www. zibordi. com. br

58

Compiladores de Compilador
Compilador de compilador
Um compilador de compilador (tambm conhecido como gerador de compilador, gerador de analisador sinttico ou ainda gerador de parser) um algoritmo, um componente de software ou um programa de computador que gera o cdigo fonte de um analisador sinttico, interpretador ou compilador de uma linguagem de programao. Na maioria dos casos ele alimentado com a descrio sinttica e semntica da linguagem independente de arquitetura, junto com uma uma descrio do conjunto de instrues da arquitetura independente de linguagem de programao.

Variantes
O primeiro e ainda mais comum tipo de compilador de compilador o gerador de analisador sinttico, cuja entrada uma gramtica formal da linguagem, geralmente no formalismo de Backus-Naur. Um gerador tpico associa cdigo executvel com cada uma das regras da gramtica que deve ser executado sempre que sua respectiva regra aplicada no analisador sinttico. Esses pedaos de cdigo so chamadas rotinas de ao semntica j que definem a semntica da estrutura sinttica que analisada.

Exemplos
yacc GNU bison JavaCC

lex

59

lex
Em cincia da computao (linguagens de programao), lex um programa que gera analisadores lxicos. Ele geralmente usado com o yacc, um gerador de analisador sinttico. Escrito originalmente por Eric Schmidt e Mike Lesk, ele o gerador de analisador lxico padro em diversos sistemas Unix. O lex l um fluxo de entrada especificando um analisador que mapeia expresses regulares em blocos de cdigo, e retorna um cdigo fonte implementando o analisador. Apesar do gerador ser genrico e poder se adequar a diferentes linguagens de programao, atualmente, somente a gerao de cdigo C suportada. Apesar de ser software proprietrio, verses do lex baseadas no cdigo original da AT&T esto disponveis em cdigo aberto, como parte de sistemas como OpenSolaris e Plan 9. Outra verso popular e livre do lex o flex.

Estrutura do arquivo
A estrutura de um arquivo lex intencionalmente similar ao de um arquivo yacc. Os arquivos so divididos em trs sees, separadas por linhas que contm somente dois smbolos de porcentagem, como a seguir: definies %% regras %% subrotinas Na seo de definies so definidas as macros e so importadas as bibliotecas escritas em C. tambm possvel escrever cdigo C na mesma seo. J a seo de regras associa padres com instrues C, padres escritos na forma de expresses regulares. Quando o analisador lxico identifica algum texto da entrada casando com um padro, ele executa o cdigo C associado. A tentativa do casamento sempre gananciosa, isto , no caso de dois padres distintos casando a mesma entrada, o maior deles ser usado. O maior deles o que consome mais caracteres da entrada. Caso os padres ambguos consumam a mesma quantidade de caracteres, o padro definido antes escolhido. Por fim, a seo de subrotinas contm blocos de cdigo C que sero apenas copiados ao arquivo final. Assume-se que tal cdigo ser invocado a partir das regras da seo de regras. Em programas maiores, mais conveniente separar esse cdigo final noutro arquivo.

Exemplo de um arquivo lex


O seguinte exemplo reconhece inteiros da entrada de dados e os imprime na sada padro. /*** seo de definio ***/ %{ # include <stdio.h> %} %% /*** seo de regras ***/ /* [0-9]+ casa uma cadeia de um ou mais dgitos */ [0-9]+ { /* yytext a cadeia contendo o texto casado. */ printf("Inteiro: %s\n", yytext);

lex } . { /* Ignora outros caracteres. */ }

60

%% /*** seo de cdigo C ***/ int main(void) { /* executa o analisador lxico. */ yylex(); return 0; } Com a entrada acima, ser feita a converso para um arquivo C. Para a seguinte entrada: abc123z.!&*2ghj6 O programa imprimir: Inteiro: 123 Inteiro: 2 Inteiro: 6

Relacionamento com yacc


O lex e o gerador de analisador sinttico yacc so geralmente usados em conjunto. O Yacc usa uma gramtica formal para analisar sintaticamente uma entrada, algo que o lex no consegue fazer somente com expresses regulares (o lex limitado a simples mquinas de estado finito). Entretanto, o yacc no consegue ler a partir duma simples entrada de dados, ele requer uma srie de tokens, que so geralmente fornecidos pelo lex. O lex age como um pr-processador do yacc. Segue abaixo dois diagramas do relacionamento entre lex e yacc:

regras lxicas

regras gramaticais

main()

lex

yacc

yyparse()

yylex()

Fluxo de entrada

entrada


yyparse()

yylex()

sada

A partir do diagrama 1, percebe-se que o lex gera a subrotina yylex() a partir de regras lxicas, e que o yacc gera a subrotina yyparse() a partir de regras gramaticais. A partir do diagrama 2, percebe-se que um programa qualquer invoca o analisador sinttico para uma fluxo de entrada. O analisador sinttico no consegue analisar entradas, mas sim tokens. Portanto, cada vez que ele precisa dum token, ele invoca o analisador lxico. O analisador lxico processa o fluxo de entrada e retorna o primeiro token que encontrar. Esse processo de requisio contnuo e s termina quando o analisador lxico identifica o fim o fluxo de entrada ou quando o analisador sinttico identifica uma falha gramatical.

lex

61

Referncias gerais
M. E. Lesk e E. Schmidt. Lex - A Lexical Analyzer Generator [1] (em ingls). The Lex & Yacc Page. Pgina visitada em 22 de julho de 2008. Ivan L. M. Ricarte (14 de fevereiro de 2003). Desenvolvimento de uma aplicao [2]. Programao de Sistemas: Uma Introduo. Universidade Estadual de Campinas. Pgina visitada em 22 de julho de 2008.

Referncias
[1] http:/ / dinosaur. compilertools. net/ lex/ index. html [2] http:/ / www. dca. fee. unicamp. br/ cursos/ EA876/ apostila/ HTML/ node69. html

yacc
yacc (acrnimo para Yet Another Compiler Compiler) um gerador de analisador sinttico desenvolvido por Stephen C. Johnson da AT&T para o sistema operacional Unix. Ele gera um analisador sinttico, parte do compilador responsvel por fornecer sentido sinttico a um determinado cdigo fonte, baseado numa gramtica formal escrita numa forma similar ao formalismo de Backus-Naur. O resultado um cdigo para o analisador sinttico em C. O yacc costumava ser o gerador de analisador sinttico padro na maioria dos sistemas Unix, mas acabou sendo suplantado por verses mais modernas ainda que compatveis, como Berkeley Yacc, GNU bison, MKS yacc e Abraxas pcyacc. Uma verso atualizada do cdigo original da AT&T includa no OpenSolaris. O yacc tambm j foi reescrito para outras linguagens, incluindo Ratfor, EFL, ML, Ada, Java e Limbo. O analisador sinttico gerado pelo yacc requer um analisador lxico, que pode ser fornecido externamente atravs e geradores de analisador lxicos como o lex ou o flex. A norma POSIX define a funcionalidade e os requisitos tanto para lex quanto para yacc.

Relacionamento com lex


O yacc e o gerador de analisador lxico lex so geralmente usados em conjunto. O Yacc usa uma gramtica formal para analisar sintaticamente uma entrada, algo que o lex no consegue fazer somente com expresses regulares (o lex limitado a simples mquinas de estado finito). Entretanto, o yacc no consegue ler a partir duma simples entrada de dados, ele requer uma srie de tokens, que so geralmente fornecidos pelo lex. O lex age como um pr-processador do yacc. Segue abaixo dois diagramas do relacionamento entre lex e yacc:

regras lxicas

regras gramaticais

main()

lex

yacc

yyparse()

yylex()

Fluxo de entrada

entrada


yyparse()

yylex()

sada

A partir do diagrama 1, percebe-se que o lex gera a subrotina yylex() a partir de regras lxicas, e que o yacc gera a subrotina yyparse() a partir de regras gramaticais. A partir do diagrama 2, percebe-se que um programa qualquer invoca o analisador sinttico para uma fluxo de entrada. O analisador sinttico no consegue analisar entradas, mas sim tokens. Portanto, cada vez que ele precisa dum token, ele invoca o analisador lxico. O analisador lxico processa o fluxo de entrada e retorna o primeiro token que encontrar. Esse processo de requisio contnuo e

yacc s termina quando o analisador lxico identifica o fim o fluxo de entrada ou quando o analisador sinttico identifica uma falha gramatical.

62

Referncias
Stephen C. Johnson (1979). Yacc: Yet Another Compiler-Compiler [1]. Pgina visitada em 22 de julho de 2008. M. E. Lesk e E. Schmidt. Lex - A Lexical Analyzer Generator [1] (em ingls). The Lex & Yacc Page. Pgina visitada em 22 de julho de 2008. Ivan L. M. Ricarte (14 de fevereiro de 2003). Desenvolvimento de uma aplicao [2]. Programao de Sistemas: Uma Introduo. Universidade Estadual de Campinas. Pgina visitada em 22 de julho de 2008.

Referncias
[1] http:/ / www2. informatik. uni-erlangen. de/ Lehre/ WS200304/ Compilerbau/ Uebungen/ yacc. pdf

Bison
Esta uma pgina de desambiguao, a qual lista artigos associados a um mesmo ttulo.

Bison pode referir-se a: Bisonte - animais da famlia dos bovdeos M. Bison, personagem da srie Street Fighter Balrog (Street Fighter), personagem da srie Street Fighter, conhecido no Japo como M. Bison

Pessoas
Bison Dele Bison Smith

Localidades
Estados Unidos Bison (Dacota do Sul) Bison (Kansas) Bison (Oklahoma)

JavaCC

63

JavaCC
JavaCC
Verso estvel Gnero(s) Licena Pgina oficial
4.0 (2 de janeiro de 2006) gerador de analisador sinttico BSD javacc.dev.java.net
[1]

Portal das Tecnologias de informao

JavaCC (Java Compiler Compiler) um gerador de analisador sinttico aberto para a linguagem Java. similar ao yacc na medida em que gera um analisador sinttico duma gramtica fornecida num Formalismo de Backus-Naur Estendido, exceto pelo fato da sada ser em Java. Entretanto, o JavaCC gera analisadores sintticos descendentes, o que o limita s classes gramaticais LL(k) (excluindo, por exemplo, recursividade esquerda).

Ligaes externas
Pgina oficial do JavaCC [1]

Referncias
[1] http:/ / javacc. dev. java. net/

Fontes e Editores da Pgina

64

Fontes e Editores da Pgina


O Compilador Fonte: http://pt.wikipedia.org/w/index.php?oldid=29351283 Contribuidores: Adailton, Alessa77, Bisbis, Carlosetc, Castelobranco, Darwinius, Diego UFCG, Dpc01, EJWM, Epinheiro, Gfc, JeffersonAlves, Jorge, Jorge.roberto, Juntas, Kaktus Kid, Leandromartinez, Leonardo.stabile, LeonardoG, Leslie, Mschlindwein, Nuno Tavares, Orium, PauloColacino, Pcgomes, Pedroca cerebral, Rafael.afonso, Ricardo Ferreira de Oliveira, Ricvelozo, Xexeo, 45 edies annimas Os Interpretadores Fonte: http://pt.wikipedia.org/w/index.php?oldid=28932814 Contribuidores: !Silent, 555, Dpc01, Eamaral, Fabiogramos, Lameiro, Leonardo.stabile, LeonardoG, LuisVeiga, Qritiq, Ricardofachada, Ricvelozo, Rui Silva, Santana-freitas, X spager, 28 edies annimas Compilador cruzado Fonte: http://pt.wikipedia.org/w/index.php?oldid=29472387 Contribuidores: 333, Instigate cjsc (Narine), Ricvelozo, Rmaax, 1 edies annimas Linguagem compilada Fonte: http://pt.wikipedia.org/w/index.php?oldid=29483234 Contribuidores: !Silent, John Eder, Ricardo Ferreira de Oliveira, Ricvelozo, 2 edies annimas Linguagem interpretada Fonte: http://pt.wikipedia.org/w/index.php?oldid=28096661 Contribuidores: !Silent, Darwinius, Lechatjaune, Profvalente, Ricardo Ferreira de Oliveira, Ricvelozo, 4 edies annimas Autmatos finitos determinsticos Fonte: http://pt.wikipedia.org/w/index.php?oldid=27846486 Contribuidores: Diego Queiroz, LeonardoG, Mobyduck, Njr, Olavom, SallesNeto BR, Santana-freitas, 6 edies annimas Autmatos finitos no determinsticos Fonte: http://pt.wikipedia.org/w/index.php?oldid=28789719 Contribuidores: Ariel C.M.K., Ccero, Diego Queiroz, Gunnex, JotaCartas, Leonardo.stabile, Njr, Renatoaz, 2 edies annimas Minimizao de AFD Fonte: http://pt.wikipedia.org/w/index.php?oldid=27924846 Contribuidores: FSogumo, Fhcj2, Helder.wiki, Kascyo Anlise lxica Fonte: http://pt.wikipedia.org/w/index.php?oldid=27246152 Contribuidores: !Silent, Bruno.gabrielli, Camponez, Clara C., Darwinius, Kleiner, Leonardo.stabile, LeonardoG, Mca.leite, Mion, Semente, Xexeo, 14 edies annimas Hierarquia de Chomsky Fonte: http://pt.wikipedia.org/w/index.php?oldid=26163570 Contribuidores: Campani, Jorge.roberto, LeonardoG, Mschlindwein, Patrick, Prss, Ricardo Ferreira de Oliveira, Zumg, 12 edies annimas Gramtica irrestrita Fonte: http://pt.wikipedia.org/w/index.php?oldid=17613584 Contribuidores: LeonardoG, Master Gramtica sensvel ao contexto Fonte: http://pt.wikipedia.org/w/index.php?oldid=29084683 Contribuidores: LeonardoG, Master, Thiago Miotto Amaral, Vanthorn, 1 edies annimas Gramtica livre de contexto Fonte: http://pt.wikipedia.org/w/index.php?oldid=28429089 Contribuidores: Chentz, FML, Fabiano Tatsch, Felipebagetti, Izaac, LeonardoG, Leslie, Master, Mschlindwein, Niteshadow, Ricardo Ferreira de Oliveira, Sqmedeiros, 5 edies annimas Gramtica regular Fonte: http://pt.wikipedia.org/w/index.php?oldid=25873758 Contribuidores: LeonardoG Formalismo de Backus-Naur Fonte: http://pt.wikipedia.org/w/index.php?oldid=27153352 Contribuidores: Albmont, Artursamenezes, Eduardo Carvalho, FML, Hivakun, JotaCartas, Leonardo.stabile, LeonardoG, OS2Warp, Renato Bullio, Ricardo Ferreira de Oliveira, Ricvelozo, Salgueiro, 6 edies annimas Anlise sinttica Fonte: http://pt.wikipedia.org/w/index.php?oldid=29369768 Contribuidores: Bisbis, Camponez, Devilr0ck123, Lameiro, Leonardo.stabile, LeonardoG, Mschlindwein, OS2Warp, Victorwss, 19 edies annimas Analisador sinttico LL Fonte: http://pt.wikipedia.org/w/index.php?oldid=25237987 Contribuidores: Diogofsr, Leonardo.stabile, Sanscrit1234, 1 edies annimas Analisador sinttico descendente recursivo Fonte: http://pt.wikipedia.org/w/index.php?oldid=25166514 Contribuidores: Leonardo.stabile Analisador sinttico LR Fonte: http://pt.wikipedia.org/w/index.php?oldid=26994176 Contribuidores: Leonardo.stabile, 2 edies annimas Analisador sinttico GLR Fonte: http://pt.wikipedia.org/w/index.php?oldid=28381250 Contribuidores: Chentz, 1 edies annimas Anlise semntica Fonte: http://pt.wikipedia.org/w/index.php?oldid=25827839 Contribuidores: 555, Carlosetc, ChristianH, Gfc, Leonardo.stabile, LeonardoG, Mion, Nuno Tavares, Semente, Sr X, Tiago de Jesus Neves, Wbrito, 6 edies annimas Gramtica de atributos Fonte: http://pt.wikipedia.org/w/index.php?oldid=25596200 Contribuidores: Douglas do Couto Teixeira, Ricardo Ferreira de Oliveira, Yanguas Gramticas de Van Wijngaarden Fonte: http://pt.wikipedia.org/w/index.php?oldid=21692055 Contribuidores: 2(L.L.K.)2, Ricardo Ferreira de Oliveira, Yanguas, Zdtrlik Gerao de Cdigo Fonte: http://pt.wikipedia.org/w/index.php?oldid=28838195 Contribuidores: Carlosetc, Clecio.vigo, Daemorris, GOE, Joao.rocha.jr, Vanthorn, Villarinho, Yanguas, 9 edies annimas Compilador de compilador Fonte: http://pt.wikipedia.org/w/index.php?oldid=22824402 Contribuidores: Leonardo.stabile lex Fonte: http://pt.wikipedia.org/w/index.php?oldid=20905152 Contribuidores: Fabiano Tatsch, Krauss, Leonardo.stabile, Mohar, 1 edies annimas yacc Fonte: http://pt.wikipedia.org/w/index.php?oldid=25813550 Contribuidores: Leonardo.stabile, Tiago de Jesus Neves Bison Fonte: http://pt.wikipedia.org/w/index.php?oldid=29315654 Contribuidores: GoEThe, JorgedeMiranda, Leonardo.stabile, Sturm, Wellyngton labes JavaCC Fonte: http://pt.wikipedia.org/w/index.php?oldid=21175070 Contribuidores: Eamaral, Leonardo.stabile, OS2Warp, Ricardojuliao, Rui Silva, 2 edies annimas

Fontes, Licenas e Editores da Imagem

65

Fontes, Licenas e Editores da Imagem


Ficheiro:GCC-4.0.2-screenshot.png Fonte: http://pt.wikipedia.org/w/index.php?title=Ficheiro:GCC-4.0.2-screenshot.png Licena: Public Domain Contribuidores: Dodek, Jlherren Ficheiro:Grace Hopper.jpg Fonte: http://pt.wikipedia.org/w/index.php?title=Ficheiro:Grace_Hopper.jpg Licena: Public Domain Contribuidores: James S. Davis Ficheiro:Nt-compilador.png Fonte: http://pt.wikipedia.org/w/index.php?title=Ficheiro:Nt-compilador.png Licena: Creative Commons Attribution-Sharealike 2.5 Contribuidores: User:Nuno Tavares Ficheiro:Cod 3 end.png Fonte: http://pt.wikipedia.org/w/index.php?title=Ficheiro:Cod_3_end.png Licena: Creative Commons Attribution-Sharealike 3.0 Contribuidores: User:Ricardo Ferreira de Oliveira Ficheiro:Erro de execuo.png Fonte: http://pt.wikipedia.org/w/index.php?title=Ficheiro:Erro_de_execuo.png Licena: Creative Commons Attribution-Sharealike 3.0 Contribuidores: User:Ricardo Ferreira de Oliveira Ficheiro:Hierarquia de Chomsky.PNG Fonte: http://pt.wikipedia.org/w/index.php?title=Ficheiro:Hierarquia_de_Chomsky.PNG Licena: Creative Commons Attribution-Sharealike 3.0 Contribuidores: Ricardo Ferreira de Oliveira Ficheiro:Parsing-example.png Fonte: http://pt.wikipedia.org/w/index.php?title=Ficheiro:Parsing-example.png Licena: GNU Free Documentation License Contribuidores: en:User:Nathanfulk Imagem:Gramatica_de_Atributos.PNG Fonte: http://pt.wikipedia.org/w/index.php?title=Ficheiro:Gramatica_de_Atributos.PNG Licena: Public Domain Contribuidores: Ricardo Ferreira de Oliveira Ficheiro:Disambig.svg Fonte: http://pt.wikipedia.org/w/index.php?title=Ficheiro:Disambig.svg Licena: Creative Commons Attribution-Sharealike 2.5 Contribuidores: Stephan Baum (converted to SVG by different users, see below) Ficheiro:Flag of the United States.svg Fonte: http://pt.wikipedia.org/w/index.php?title=Ficheiro:Flag_of_the_United_States.svg Licena: Public Domain Contribuidores: Dbenbenn, Zscout370, Jacobolus, Indolences, Technion.

Licena

66

Licena
Creative Commons Attribution-Share Alike 3.0 Unported //creativecommons.org/licenses/by-sa/3.0/

Potrebbero piacerti anche