Frank Coelho de Alcantara - 2021
metacaractere | conhecido como | significado |
---|---|---|
. | curinga | qualquer caractere, exceto a quebra de linha \n |
[...] | conjunto | qualquer caractere incluído no conjunto |
[^...] | conjunto negado | qualquer caractere não incluído no conjunto |
\d | dígito | o mesmo que [0-9] |
\D | não-dígito | o mesmo que [^0-9] |
\s | branco | espaço, quebra de linha, tabs etc.; o mesmo que [ \t\n\r\f\v] |
\S | não-branco | o mesmo que [^ \t\n\r\f\v] |
\w | alfanumérico | o mesmo que [a-zA-Z0-9_] (mas pode incluir caracteres Unicode; ver flag_unicode) |
\W | não-alfanumérico | o complemento de \w |
\ | escape | anula o significado especial do metacaractere seguinte; por exemplo, \. representa apenas um ponto, e não o curinga |
metacaractere | significado |
---|---|
{n} | exatamente n ocorrências |
{n,m} | no mínimo n ocorrências e no máximo m |
{n,} | no mínimo n ocorrências |
{,n} | no máximo n ocorrências |
? | 0 ou 1 ocorrência; o mesmo que {,1} |
+ | 1 ou mais ocorrência; o mesmo que {1,} |
* | 0 ou mais ocorrência |
^ | início do texto, ou de uma linha com o flag re.MULTILINE |
\A | início do texto |
$ | fim do texto, ou de uma linha com o flag re.MULTILINE; não captura o \n no fim do texto ou da linha |
\Z | fim do texto |
\b | posição de borda, logo antes do início de uma palavra, ou logo depois do seu término; o mesmo que a posição entre \W e \w ou vice-versa |
\B | posição de não-borda |
Usando o site www.regex101.com
Identificar um número de telefone da forma como a pessoa escrever incluíndo os dados internacionais de ddi e ddd.
Identificar um CEP, segundo o padrão brasileiro, da forma como a pessoa escrever, incluíndo espaços, pontos e hífens.
Identificar um CPF, segundo o padrão brasileiro, da forma como a pessoa escrever, incluíndo espaços, pontos e hífens.
Responsáveis pela identificação e validação dos lexemas da linguagem.
Utilizam MEF ou REGEX para identificar estes Lexemas, ou não.
A cada lexema identificado é atribuído uma estrutura contendo dados sobre o lexema.
A classe de cada lexema, seu tipo e seu valor são dados comuns nesta atribuição.
Cada linguagem usada para criar um interpretador utiliza uma solução diferente.
Interpretadores criados em C, por exemplo, podem usar structs ou um conjunto delas para armazenar os dados relativos a cada lexema.
Cada Lexema corretamente identificado é armazenado na tabela de símbolos.
A linguagem das linguagens: Uma gramática é uma lista de regras que determina como podem ser criadas e utilizadas todas as strings de uma linguagem;
Noam Chomsky é um dos pesquisadores mais importantes nesta área.
Devemos ao trabalho de Chomsky a classificação das Gramáticas que usamos hoje.
Linguagem | Gramática | Identificador |
---|---|---|
Recursivamente Enumeráreis | Gramáticas Irrestritas | Máquina de Touring |
Linguagens sensíveis ao contexto | Gramáticas sensíveis ao contexto | Maq. Turing com fita limitada |
Linguagens livres de contexto | Gramáticas livres de contexto | Autômato com pilha |
Linguagens Regulares | Gramáticas regulares | Autômato finito |
Uma Gramática Formal: 4-tupla: $$𝑮 := \{𝑵, \Sigma, 𝑷, 𝑺\}$$
“uma gramática livre de contexto descreve um conjunto de strings, ou linguagem, por meio da definição da estrutura das strings da linguagem. Esta definição é recursiva, indicando que cada regra produção pode, ou não, ser utilizada para definir novas regras de produção”
Os símbolos que aparecem à esquerda da seta, são não terminais e representados por letras latinas maiúsculas $(𝐴, 𝐵, 𝑆, …)$.
O símbolo inicial é o que aparece do lado esquerdo da primeira regra $𝑆$.
Pode ser qualquer símbolo, usaremos o $𝑆$ por convenção.
Vamos produzir a string:“aabb”
Temos $S \rightarrow \emptyset$ e aplicamos 2 $𝑺 \rightarrow 𝑨𝑺𝑩$
Temos de $S \rightarrow ASB$ e aplicamos 3 $A \rightarrow a$
Temos de $S \rightarrow aSB$ e aplicamos 4 $B \rightarrow b$
Temos de $S \rightarrow aSb$ e aplicamos 1 $𝑺 \rightarrow AB$
Temos de $S \rightarrow aABb$ e aplicamos 3 $A \rightarrow a$
Temos de $S \rightarrow aaBb$ e aplicamos 4 $B \rightarrow b$
Conseguimos: $S \rightarrow aabb$
Considere a gramática definida por:
Encontre uma sequência de substituições para encontrar: $aab$
Duas classes de regras de produção.
Lineares à Direita: as regras de produção obedecem: $$𝑨 \rightarrow 𝒘𝑩 \vee 𝑨\rightarrow 𝒘 (𝒘 \in \Sigma^*)$$
Lineares à esquerda: as regras de produção obedecem: $$𝑨 \rightarrow 𝑩𝒘 \vee 𝑨 \rightarrow 𝒘 (𝒘 \in \Sigma^*)$$
Em 1957 John Backus, trabalhando na IBM, criou uma linguagem para criar linguagens.
Representa uma gramática.
É mais simples para leitura que a álgebra.
É mais simples para escrita que a álgebra.
Finalmente virou um padrão ISO/IEC 14977 em 1996.
O criador da linguagem define como, e se usará este padrão.
Símbolo | Lêmos como |
---|---|
$::=$ | “é definido como” ou “pode ser substituído por” |
$|$ | seleção / ou |
$<>$ | não terminais |
Começou muito simples e com o tempo foi sendo adaptada as necessidades dos criadores de linguagens.
Funciona segundo os princípios das regras de produção. Uma sequência recursiva de substituição de regras permitindo a criação das sentenças da linguagem.
Considere a seguinte gramática definida em BNF
Derive o seguinte programa:
$\text{begin } a = b + \text{ const } \text{ end}$
Começamos do símbolo inicial, neste caso $ <program>$ e recorrentemente vamos procurando regras de substituição na grámática definida.
A palavra parser, que usaremos com frequência, tem o sentido de percorrer, varrer.
Nesta disciplina: técnicas de percorrer uma árvore sintática validando a gramática.
Na literatura, o conceito de parser se confunde com o conceitos de análise sintática. Não são raros os parsers que fazem análise léxica, sintática e semântica.
Considerando a gramática a seguir, apresente as derivações necessárias para encontrar “abbcde”, usando Bottom-up parser.
Regra 2: $abbcde \Rightarrow aAbcde$
Regra 2: $abbcde \Rightarrow aAde;$
Regra 3: $abbcde \Rightarrow aABe;$
Regra 1: $abbcde \Rightarrow S;$
A string “abbcde” é válida nesta gramática.
Vamos criar um parser para validar fórmulas de cálculo proposicional. Na linguagem de programação que você desejar usando o site Repl.it
Nosso parser deve ser recursivo e usar latex e notação rpn para a digitação das expressões. Segundo a seguinte gramática em EBNF
Vamos criar um parser para validar fórmulas de cálculo proposicional.
Poste o link com a sua solução no lugar determinado no ambiente virtual de aprendizagem..
Você pode baixar o material de apoio clicando aqui