O documento descreve conceitos fundamentais de linguagens formais, como:
1) Linguagens naturais e linguagens formais possuem alfabetos, strings e gramáticas distintas;
2) Uma linguagem formal é definida por um alfabeto finito de símbolos e um conjunto de strings válidas geradas por gramáticas;
3) Gramáticas definem as regras para gerar strings válidas através de produções envolvendo símbolos terminais e não-terminais.
4. 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 *
5. Em 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.
6. Atenção!
Um símbolo é
Termos
uma entidade
técnicos
atômica
Uma string é
só uma cadeia
de símbolos
Uma linguagem
formal é só um
conjunto de
strings
7. Exemplo
Coleção de símbolos para
descrever jogos de
baralho
{ ,,,, A, 2, 3, 4, 5, 6, 7, 8, 9, 10, J, Q, K, [, ] }
12. Gramática
Componentes
de uma
gramática N – um conjunto de
símbolos não-terminais
T – um conjunto de N T
símbolos terminais
S – um símbolo especial: o
símbolo de partida
P – um conjunto de produções
13. Os não-terminais ...
As classes
gramaticais
Em inglês,
O conjunto N dos tokens
símbolos não-terminais
14. Os lexemas da Os terminais ...
linguagem
O conjunto T dos
símbolos terminais
Apesar dos não-terminais
serem usados na construção,
eles não aparecem na
sentença acabada
15. As produções ...
As regras
gramaticais
O conjunto P das
produções
17. Produções
naipe?
carta: um valor seguido de um naipe
mão : um conjunto de 3 cartas (p/ex.)
valor?
, 3A, 17, [J, K, A]
, 2, 7, A, [3, J, K]
Strings não
São strings admissíveis em
admissíveis em linguagens para
linguagens para jogos de baralho
jogos de baralho
18. As wff’s
Assim, a linguagem formal
é o conjunto de todas
as suas wff ’s Apenas um nome
mais enfático
para as strings
produzidas
19. Alfabeto de uma linguagem
Exemplo
para descrever datas no
calendário
{ /, jan, fev, ..., dez, 0, 1 2, 3, 4, 5, 6, 7, 8, 9 }
20. Produções
data: o dia, seguido do mês, seguido do ano;
separados pela barra
Dia? Mês? Ano?
6/jan/2009, 1/abr/1998, 14/jul/1872
Datas são wff’s (strings 46/jan/2009, abr/1/1998
admissíveis) no
calendário gregoriano Não são wff’s
26. 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
27. Noam Chomsky
Filadelfia, 07/12/1928
Professor do MIT
28. Exemplo
Símbolo
terminal
dígito 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
Separador de
Nome do alternativas
identificador da
classe
29. Exemplo – produção
dígito 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
natural dígito | dígito natural
Observe que a
definição de natural é
recursiva
30. 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
32. 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
33. 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.
35. 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. Todas as utilizações da BNF no próximo capítulo, Análise léxica, são
definições léxicas; já nos capítulos subsequentes são definições sintáticas.
36. EBNF e diagramas sintáticos
Representação gráfica
Representação gráfica
A
A B
EBNF EBNF
AB [A]
Significado
Significado
A seguido de B A ou nada
37. EBNF
e diagramas
Representação gráfica sintáticos
A
B
EBNF
A|B
Significado
ou A ou B
38. EBNF e diagramas sintáticos
Representação gráfica Representação gráfica
A
A
EBNF EBNF
( A )* ( A )+
Significado Significado
Sequência de zero Sequência de um
ou mais A ’s ou mais A ’s
39. EBNF e diagramas sintáticos
Representação gráfica
Representação gráfica
a
a b
EBNF
a z
Significado
Símbolo EBNF
terminal a | b | ... | z
40. Exemplo Um número binário pode ser
constituído por apenas um
bit, como 0 ou 1, ou por
vários, como 110.
0
bit Para gerar 110:
1 • Você sai de número binário no
diagrama, passa por bit e
escolhe 0.
+ • Volta, passa novamente por bit
sinal e escolhe 1.
- • Torna a voltar, passa por bit
mais uma vez e escolhe 1.
sinal
número
bit
binário
Diagrama sintático
41. Python, EBNF e
diagramas de sintaxe
Mais adiante no curso, teremos a oportunidade
de trabalhar com a EBNF para definição da
sintaxe da Linguagem Python.
Todo o manual de referência da linguagem, em
The Python Language Reference
é construído utilizando a EBNF; confira em
Python v2.6.5 documentation
A seguir exibiremos alguns exemplos.
42. A definição de nome em Python
letra_min a
b
nome ::= letra_min ( letra_min | “_” )*
letra_min ::= “a”...”z”
z
nome letra_min
letra_min
_
44. O comando print
O comando print avalia uma expressão por vez e escreve o objeto resultante
na saída padrão (veja a seguir). Se um objeto não é uma string ele é
convertido antes numa string, usando as regras para conversão de strings.
Então ela é escrita (a resultante ou a original).
É colocado (escrito) um espaço antes que cada objeto seja (convertido e)
escrito, a menos que o sistema de saída acredite que foi posicionado no início
de uma linha.
Este é o caso quando:
1. ainda foi escrito nenhum caractere na saída padrão
2. o último caractere escrito na saída padrão é ‘ n’ , ou
3. a última operação de escrita na saída padrão não foi um comando print.
(Por essa razão, em alguns casos pode ser funcional escrever uma string
vazia para a saída).
46. O comando if
O comando if é usado para execução condicional.
Ele seleciona exatamente uma das sequências avaliando as
expressões uma a uma até achar uma que seja verdadeira (true –
veja a seção Operações booleanas para as definições de true e
false); então essa sequência é executada (e nenhuma outra parte
do comando if é executado ou avaliado). Se todas as expressões
são falsas, é executada a sequência associada à clausula else
(caso esteja presente).