Linguagens de Programação e Compiladores - Aula 3 1 Alfabeto, Cadeias, Operações e Linguagens 1.Conjuntos Para representar um determinado conjunto é necessário buscar uma notação para representá-lo e ter um padrão para trabalhar com esse conjunto. Alguns exemplos de conjuntos são: conjunto dos números naturais, inteiros, reais, etc. Denotando por N o conjunto dos números naturais, para cada n N, {n} representa o conjunto dos naturais menores ou iguais a n: {n} = {x N 0 < x <= n} Esse conjunto pode também ser representado por {1, 2, 3, 4,, n}. Sendo que se ocorrer n = 1, indica o conjunto unitário {1}. Ao trabalhar com conjuntos, trabalha-se também com o Produto Cartesiano. O Produto Cartesiano de dois conjuntos A e B é indicado por AxB e definido por: A B = {(y,z) y A e z B} Dessa forma, também pode-se indicar a potência de um conjunto. n A = A A A A (n vezes) = {(y1, y2, y3,, yn) j {n}, yj A}. Exemplos: A = {a, b, c} B = {d, e} A B = {(a, d), (a, e), (b, d), (b, e), (c, d), (c, e)} B A = {(d, a), (d, b), (d, c), (e, a), (e, b), (e, c)} 1 A 2 A = {a, b, c} = A A = {(a, a), (a, b), (a, c), (b, a), (b, b), (b, c), (c, a), (c, b), (c, c)} 2.Alfabeto e símbolos Um alfabeto é um conjunto finito de elementos que recebem o nome de símbolos ou caracteres. Então um alfabeto e um conjunto de símbolos; e um símbolo é um elemento de um alfabeto. Deve-se saber qual é o alfabeto adequado para cada situação, depois quais os símbolos desse alfabeto. Como exemplo didático, usa-se {0, 1} ou {a, b}, porém pode-se usar outros alfabetos, como por exemplo:
Linguagens de Programação e Compiladores - Aula 3 2 Alfabeto dos números naturais menores que 8: {1, 2, 3, 4, 5, 6, 7} Alfabeto da língua portuguesa: {a, b, c,, z} Alfabeto dos números binários: {0, 1} Um alfabeto é normalmente descrito por. Exemplos: 1={a, b, kkk}, 2={1, 2, 3} 3={00, 11}. 4= Ø (conjunto vazio) Um conjunto infinito não pode ser um alfabeto: - Exemplos: conjunto dos números naturais, inteiros,... - {a, b, aa, ab, ba, bb, aaa,... } Os símbolos de um alfabeto não precisam ter necessariamente ter um único caractere. Além disso, os símbolos de um alfabeto não precisam todos ter o mesmo número de caracteres. A única restrição é que o tamanho do símbolo seja finito. Dependendo do alfabeto, pode-se alterar/montar os símbolos de acordo com o interesse do usuário/programador. Por exemplo se for um alfabeto para uma determinada linguagem de programação, pode-se ter como símbolos: main, if, else, for, end, while Dessa forma os símbolos escolhidos poderiam ser limitados para determinada função. 3.Cadeias de Símbolos, Palavras ou Strings Uma Cadeia de Símbolos sobre um conjunto é uma sequência de zero ou mais símbolos (do conjunto) justapostos. Uma Palavra ou String é uma cadeia de símbolos finita. Uma cadeia sem símbolos é uma palavra válida e o símbolo ε denota uma cadeia vazia ou palavra vazia. Exponenciação de Alfabetos: Σ k é o conjunto de todas as cadeias com tamanho k, formadas sobre o alfabeto Σ. Exemplo: considere Σ = {0, 1} Σ 0 = { ε } Σ 1 = {0, 1} = Σ
Linguagens de Programação e Compiladores - Aula 3 3 Σ 2 = {00, 01, 10, 11} Fechamento de um Alfabeto: Seja Σ um alfabeto, então o fechamento de Σ, descrito por Σ * é definido como Σ * = Σ 0 Σ 1 Σ 2 Σ 3... Σ n... Σ * é o conjunto de todas as cadeias possíveis de se formar sobre o alfabeto Σ. Fechamento positivo Σ + = Σ* - {ε}. Exemplo: se Σ = {a, b} - abcb é uma palavra do alfabeto {a, b, c} - Σ+ = {a, b, aa, ab, ba, bb, aaa,...} - Σ* = {ε, a, b, aa, ab, ba, bb, aaa,...} O Comprimento ou Tamanho de uma palavra w, representado por w, é o número de símbolos que compõe a palavra. Assim, por exemplo, se w = bbaba, w = 5. 4.Prefixos, Sufixo, Subpalavra Um Prefixo de uma palavra é qualquer seqüência inicial de símbolos da palavra. Um Sufixo de uma palavra é qualquer seqüência final de símbolos da palavra. Uma Subpalavra de uma palavra é qualquer sequência que compõe a palavra. Exemplo: Seja a palavra abcb - ε, a, ab, abc, abcb são os prefixos; - ε, b, cb, bcb, abcb são os sufixos; - ab, bcb, bc, cb são subpalabras; 5.Linguagem Formal de um alfabeto Uma Linguagem Formal ou simplesmente Linguagem é um conjunto de palavras sobre um alfabeto. Linguagem é qualquer subconjunto de *, isto é, qualquer conjunto de palavras de. Exemplo: Seja = {a,b}. São linguagens: i. O conjunto de palíndromos (palavras que tem a mesma leitura da esquerda para a direita e vice-versa) sobre Σ é um conjunto de linguagem infinita. Assim: ε, a, b, aa, bb, aaa, aba, bab, bbb, aaaa,... são palavras desta linguagem. ii. {aa,ab,ba,bb} ou {x/x {a,b}* e x = 2}
Linguagens de Programação e Compiladores - Aula 3 4 iii. {a,aa, ab,ba,aaa, aab, aba,...} ou {x/x {a,b}* com pelo menos um a} iv. v. vi. {,ab,ba,abab, aabb, baba, bbaa, abba, baab,...} ou {x/x {a,b}* com o mesmo número de a e b} n vii. * viii. ix. { ε } Dado o alfabeto, o conjunto de palavras L é uma linguagem sobre L *. A Figura 1, ilustra esta afirmação. Figura 1 Alfabeto e uma linguagem. As linguagens podem ser finitas ou infinitas. Busca-se representações finitas para linguagens infinitas: {w * / w tem a propriedade P}. Exemplos: {w w consiste em um número igual de 0 s e 1 s} {w w é um número inteiro binário primo} {w w é um programa em C sintaticamente correto} Também é comum substituir w por alguma expressão com parâmetros e descrever os strings na linguagem declarando condições sobre os parâmetros. Exemplos: {0 n 1 n n 1}. Lê-se o conjunto de 0 elevado a n 1 elevado a n tal que n maior ou igual a 1 ; essa linguagem consiste nos strings {01, 0011, 000111,...}. Note que, como ocorre com os alfabetos, podemos elevar um único símbolo a uma potência n para representar n cópias desse símbolo. {0 i 1 j 0 i j}. Essa linguagem consiste em strings com alguns 0 s (possivelmente nenhum) seguidos por um número igual ou superior de 1 s.
Linguagens de Programação e Compiladores - Aula 3 5 6.Operações sobre Linguagens Dadas as Linguagens L1 e L2, pode-se fazer as seguintes operações: Intersecção de L1 com L2 L1 L2 = {x/x L1 e x L2} União de L1 com L2 L1 L2 = {x/x L1 ou x L2} Diferença de L1 e L2 L1 - L2 = {x/x L1 e x L2} Concatenação L1 L2 = {xy /x L1 e y L2} Complemento L1(barra) = {x x Σ * x L1} Exemplo 1: se Σ {a, b, c}, L1 = {aa, bc, ca} e L2 ={ba, cc, bc} L1 L2 = {aa, bc, ca, ba, cc} L1 L2 = {bc} L1 L2 = {aa, ca} Exemplo 2: se Σ {a, b}, L1 = {a, ab} L2 ={b, ba}, L1 L2 = {ab, aba, abb, abba}. Normalmente, AB BA. 6.Linguagem Computacional Cada programa escrito numa linguagem computacional corresponde a uma cadeia de símbolos que podem ser: identificadores; palavras reservadas; símbolos especiais e operadores; constantes numéricas. A Figura 2 ilustra estes conceitos.
Linguagens de Programação e Compiladores - Aula 3 6 Figura 2 Código fonte de uma linguagem. Referências Bibliográficas - Notas de Aula do Prof. Nelson Augusto de Oliveira Aguiar USJT. - John E. Hopcroft, Rajeev Motwani, and Jeffrey D. Ullman. Introduction to Automata Theory, Languages and Computation. Addison Wesley, 3 nd edition, 2006.