Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
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 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
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
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]
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.
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]
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]
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:
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
15
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
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
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.
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
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
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:
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.
Hierarquia de Chomsky
23
onde
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
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.
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
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.
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
Linguagem Livre-do-contexto
A linguagem da gramtica Uma linguagem . o conjunto , tal que
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) ((()()))()(())
30
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
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:
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?
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]
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.
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
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
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
= primeiro-nome / (inicial ".") = *ALPHA = ALPHA "." = *ALPHA = ( "Sr." / "Jr." / 1*("I" / "V" / "X"))
= 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.
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
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)
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.
45
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
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
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.
49
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.
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.
53
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".
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
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.
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.
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
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.
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]
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/
64
65
Licena
66
Licena
Creative Commons Attribution-Share Alike 3.0 Unported //creativecommons.org/licenses/by-sa/3.0/