Notes - MIECT
Compiladores
Notes - MIECT
Compiladores
  • Compiladores
  • Compiladores, Linguagens e Gramáticas
    • Enquadramento
    • Compiladores
      • Interpretadores
      • Estrutura de um Compilador
    • Implementação de um Compilador
    • Linguagens: Definição como Conjunto
      • Conceito básicos e terminologia
      • Operações sobre palavras
      • Operações sobre linguagens
    • Introdução às gramáticas
      • Hierarquia de Chomsky
      • Autómatos
  • Introdução, Estrutura, Aplicação
    • Exemplos
      • Expr
      • Exemplo figuras
      • Exemplo visitor
      • Exemplo listener
    • Construção de gramáticas
      • Especificação de gramáticas
    • Estrutura léxica
    • Regras léxicas
      • Padrões léxicos típicos
      • Operador léxico “não ganancioso”
    • Estrutura sintática
      • Secção de Tokens
      • Acções no preâmbulo da gramática
    • Regras sintácticas
      • Padrões sintácticos típicos
      • Precedência
      • Associatividade
      • Herança de gramáticas
    • Outras funcionalidades
      • Tabelas CSV
      • Gramáticas ambíguas
      • Predicados semânticos
      • Separar analisador léxico do analisador sintáctico
      • “Ilhas” lexicais
      • Enviar tokens para canais diferentes
      • Reescrever a entrada
      • Desacoplar código da gramática - ParseTreeProperty
  • Análise Semântica
    • Estrutura de um Compilador
    • Sistema de Tipos
    • Gramáticas de Atributos
    • Tabela de símbolos
    • Instruções restringidas por contexto
    • ANTLR4: gestão de erros
  • Síntese
    • Síntese: Geração de código
    • String Template
    • Síntese: geração de código intermédio
  • Análise Lexical
    • Análise Lexical: Estrutura de um Compilador
    • Linguagens regulares
    • Gramáticas regulares
    • Expressões regulares
    • Conversão entre ER e GR
    • Reconhecimento de tokens
    • Autómatos finitos
    • Autómato finito não determinista
    • Autómato finito determinista
      • Projecto de autómato finito determinista
    • Conversão de AFND em AFD
    • Conversão de uma expressão regular num AFND
    • Autómato finito generalizado (AFG)
  • Gramática de Atributos
    • Conteúdo semântico
    • Gramática de atributos
    • Avaliação Dirigida pela Sintaxe
  • Análise Sintática Descendente
    • Análise Sintática
    • Análise Sintática Descendente
    • Analisador (parser) Recursivo-Descendente Preditivo
    • Questões a resolver
    • Fatorização à Esquerda
    • Eliminação de Recursividade á Esquerda
    • Conjuntos predict, first e follow
      • Conjunto first
      • Conjunto follow
    • Reconhecedor Descendente Preditivo
  • Análise Sintática Ascendente
    • Análise Sintática Ascendente
    • Construção de um reconhecedor ascendente
    • Tabela de decisão de um reconhecedor ascendente
    • Reconhecedor Ascendente
    • Tabela de Decisão de um Reconhecedor Ascendente
Powered by GitBook
On this page
  • Expressões regulares: exemplos
  • Simplificação notacional
  • Expressões regulares: exemplos
  • Outras extensões notacionais
  • Gramática para expressões regulares
  1. Análise Lexical

Expressões regulares

As expressões regulares foram introduzidas em 1956 por Stephen Kleene.

O conjunto das expressões regulares sobre um alfabeto A define-se indutivamente da seguinte forma:

  1. () é uma expressão regular (ER) que representa a LR {} (∅).

  2. Qualquer que seja o a ∈ A, a é uma ER que representa a LR {a}.

  3. Se e1 e e2 são ER representando respectivamente as LR L1 e L2 , então (e1 | e2) é uma ER representando a LR L1 ∪ L2 .

  4. Se e1 e e2 são ER representando respectivamente as LR L1 e L2 , então (e1e2) é uma ER representando a LR L1 · L2.

  5. Se e1 é uma ER representando a LR L1 , então e*1 é uma ER representando a LR (L1)*.

  6. Nada mais é expressão regular.

A evidente semelhança entre LR e ER não é casual. Ambas expressam gramáticas regulares.

Uma expressão regular, tal como uma gramática regular, gera uma linguagem regular.

  • Logo, é possível converter uma gramática regular numa expressão regular que represente a mesma linguagem e vice-versa.

Tal como as gramáticas regulares, as expressões regulares são fechadas nas suas operações.

Expressões regulares: exemplos

P: Determine uma ER que represente o conjunto de números binários começados por 1 e terminados por 0.

R: 1(0|1)*0

P: Determine uma ER que representa as sequências definidas sobre o alfabeto A = {a;b;c} que satisfazem o requisito de qualquer símbolo b ter um a imediatamente à sua esquerda e um c imediatamente à sua direita.

R: (a|abc|c)*

P: Determine uma ER que represente as sequências binárias com um numero par de zeros.

R: 1*(01*01*)*

Simplificação notacional

Para simplificar a escrita das expressões regulares (de forma análoga às expressões aritméticas) existe uma precedência bem definida na aplicação dos diferentes operadores.

A ordem decrescente de precedência é a seguinte:

  1. Parêntesis;

  2. Fecho de Kleene (*);

  3. Concatenação (implícita ou . )

  4. Escolha (|).

A utilização destas precedências permite simplificar as ER.

  • e = (((1*)0)(1*))0)(1*) <=> e = 1*01*01* e1 | e2 · e3* = e1 | (e2 · (e3*))

Expressões regulares: exemplos

Recuperando os exemplos anteriores.

P: Determine uma ER que represente o conjunto de números binários começados por 1 e terminados por 0.

R: 1(0|1)*0 <=> (1((0|1)*))0

P: Determine uma ER que representa as sequências definidas sobre o alfabeto A = {a;b;c} que satisfazem o requisito de qualquer símbolo b ter um a imediatamente à sua esquerda e um c imediatamente à sua direita.

R: (a|abc|c)* <=> ((a | ((ab)c)) |c)*

P: Determine uma ER que represente as sequências binárias com um numero par de zeros.

R: 1*(01*01*)* <=> (1*)(((((0(1*))0)(1*)))*)

Outras extensões notacionais

Existem outras extensões a expressões regulares (utilizadas, por exemplo, em muitos comandos UNIX):

Símbolo
Significado

.

Um símbolo qualquer diferente de \n

^

palavra vazia no início de linha

$

palavra vazia no fim de linha

\<

palavra vazia no início de palavra

\>

palavra vazia no fim de palavra

Gramática para expressões regulares

Podemos definir a linguagem das expressões regulares com uma gramática (A é o conjunto dos caracteres):

  • ER -> ER '|' Term {alternativa}

  • ER -> Term

  • Term -> Term Primary {concatenação}

  • Term -> Primary

  • Primary -> Factor '*' {iteração}

  • Primary -> Factor

  • Factor -> '('ER')' {grupo}

  • Factor -> A {qualquer terminal}

PreviousGramáticas regularesNextConversão entre ER e GR

Last updated 2 years ago