Python e sua sintaxe LNCC UFRJ
Linguagens naturais e formais
Linguagens naturais
Linguagem formal Um conjunto finito e não-vazio cujos elementos são símbolos Qualquer cadeia finita de símbolos justapostos inclusive a vazia, Coleção de todas as strings construídas a partir de Qualquer subconjunto L de *
princípio não existem regras para construir uma linguagem. Entretanto, ao criar uma linguagem, estamos cheios de segundas intenções e assim precisaremos de regras para atingi-las! Para = { 0, 1 }, temos = {, 0, 1, 00, 01, 10, 11, 000, 001,... }. A partir daí poderemos construir diversas linguagens, que serão muito úteis, conforme veremos.
Atenção! Um símbolo é uma entidade atômica Termos técnicos Uma string é só uma cadeia de símbolos Uma linguagem formal é só um conjunto de strings
Exemplo Coleção de símbolos para descrever jogos de baralho {,,,, A, 2, 3, 4, 5, 6, 7, 8, 9, 10, J, Q, K, [, ] }
Exemplo continuação Tokens { A, 2,..., 7, J, Q, K, A, 2,..., 7, J, Q, K, A, 2,..., 7, J, Q, K, A, 2,..., 7, J, Q, K }
Exemplo continuação Mais tokens Um Par uma Terna ou uma Quadra é qualquer conjunto constituído por dois, três ou quatro cartas distintas, colocadas entre colchetes. [3, 3 ], [Q, 5 ], etc [A, A, 2 ], [7, Q, 5 ], etc [K, J, 2, 3 ], [7, A, Q, 5 ], etc
Envolve a atribuição de um significado a cada string de uma linguagem
Gramática
Gramática Uma forma de definir uma linguagem formal L a partir de um alfabeto
Componentes de uma gramática Gramática N um conjunto de símbolos não-terminais T um conjunto de símbolos terminais N T S um símbolo especial: o símbolo de partida P um conjunto de produções
Os não-terminais... São as classes gramaticais O conjunto N dos símbolos não-terminais inglês, tokens português: os verbos, substantivos, adjetivos, pronomes, etc Python: Identificadores, Palavras-chave, Literais, Operadores, Delimitadores Além de NEWLINE, INDENT e DEDENT.
Os terminais... O conjunto T dos símbolos terminais São os lexemas da linguagem As sentenças (strings) de uma linguagem são compostas apenas por símbolos terminais. Python: 12, 3.1415, pi, Paulo, while, break, continue, for, if, else, etc Português: tudo que aparece no Aurélio. Apesar dos nãoterminais serem usados na construção, eles não aparecem na sentença acabada
As produções... As regras gramaticais O conjunto P das produções As produções estabelecem como derivar as sentenças (strings) da linguagem a partir do símbolo de partida S
Uma derivação...
Metalinguagem -BNF
Meta-linguagem Linguagem auxiliar utilizada para descrever mais claramente a linguagem formal { },
Metalinguagem Pode ser uma linguagem natural como o português ou inglês, ou outra linguagem formal O formalismo de Backus-Naur (BNF)
John Warner Backus O pai do FORTRAN; Participou decisivamente na criação do ALGOL.
Peter Naur Criador do ALGOL, junto com Backus e outros
O formalismo de Backus-Naur J. W. Backus desenvolveu, especificamente para a ALGOL 58, um método para descrever linguagens de programação, que veio a ser conhecido como a forma normal de Backus. Tal método foi revisado e expandido por Peter Naur para a ALGOL 60; por sugestão de Donald Knuth, foi renomeado como a forma normal de Backus-Naur
Noam Chomsky Filadelfia, 07/12/1928 Professor do MIT
Exemplo Símbolo terminal dígito 0 1 2 3 4 5 6 7 8 9 Nome do nãoterminal (a classe dígito) Leia: É definido como Separador de alternativas
Exemplo produção dígito 0 1 2 3 4 5 6 7 8 9 natural dígito dígito natural Observe que essa definição de natural é recursiva As definições acima permitem produzir, p/ex., os seguintes naturais: 325, 9, 79, 007, 222222, 000, etc
Regras de produção Os elementos são escolhidos de uma lista; a ordem não importa dígito 0 1 2 3 4 5 6 7 8 9 natural dígito dígito natural Os elementos são escritos sequencialmente da esquerda para a direita
A EBNF e os diagramas de caminho
EBNF O EBNF não é mais poderoso que o BNF; apenas é mais facilitador mais prático. Nele são incluídas notações para repetição e para elementos opcionais No EBNF os símbolos terminais são escritos entre aspas e os não-terminais diretamente, sem os
A EBNF Um elemento opcional é escrito entre colchetes [ a ]; O elemento a pode ser incluído ou descartado A repetição de um ou mais elementos é descrita pela utilização de chaves: ( a ) + indica a repetição do a pelo menos uma vez; ( a ) * indica a repetição do a zero ou mais vezes.
Exemplo dígito 0 1... 9 inteiro [ - + ] dígito ( dígito )* inteiro [ - + ] ( dígito ) + São produções de inteiro: -1, +21, 9, 12047, etc Não são produções de inteiro: +, ++, 2-1, 9-, etc
Apesar da notação usada ser praticamente a mesma, há uma grande diferença entre o significado de definições léxicas e sintáticas. Uma definição léxica opera sobre os caracteres individuais do fluxo de entrada, ao passo que Uma definição sintática opera no fluxo de tokens gerado pela análise léxica.
EBNF e diagramas de caminho Representação gráfica Representação gráfica A B A EBNF AB Significado A seguido de B EBNF [ A ] Significado A ou nada
EBNF e diagramas de caminho Representação gráfica A B EBNF A B Significado ou A ou B
EBNF e diagramas de caminho Representação gráfica EBNF ( A )* Significado A Sequência de zero ou mais A s Representação gráfica EBNF ( A ) + Significado A Sequência de um ou mais A s
EBNF e diagramas de caminho Representação gráfica Representação gráfica a a b EBNF a z Significado Símbolo terminal EBNF a b... z
Exemplo bit sinal 0 1 + - Um número binário pode ser constituído por apenas um bit, como 0 ou 1, ou por vários, como 110. Para gerar 110: Você sai de número binário no diagrama, passa por bit e escolhe 0. Volta, passa novamente por bit e escolhe 1. Torna a voltar, passa por bit mais uma vez e escolhe 1. número binário sinal bit Diagrama léxico
A EBNF e os diagramas de caminho em Python
Python, EBNF e diagramas de sintaxe
identificador letra _ letra dígito _ letra letra_min letra_min a b letra_maius z letra_maius A B dígito 0 Z 1 9
O comando print cmd_print print expr expr,, >> expr, expr,
O comando if cmd_if if expr : seq elif expr : seq else : seq
Ele deu aumento. Retornaremos!
Tchau! Até a próxima.