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
  • Linguagens regulares: exemplo 1
  • Linguagens regulares: exemplo 1
  • Linguagens regulares: exemplo 2
  1. Análise Lexical

Linguagens regulares

PreviousAnálise Lexical: Estrutura de um CompiladorNextGramáticas regulares

Last updated 2 years ago

As gramáticas regulares geram linguagens regulares.

A classe das linguagens regulares sobre um qualquer alfabeto A define-se indutivamente da seguinte forma:

  1. O conjunto vazio, é uma linguagem regular (LR).

  2. Qualquer que seja o símbolo a ∈ A, o conjunto {a} é uma LR.

  3. Se L1 e L2 são linguagens regulares, então L1 U L2 (união) é uma LR.

  4. Se L1 e L2 são linguagens regulares, então L1 . L2 (concatenação) é uma LR.

  5. Se L1 é uma linguagem regular, então (L1)* (fecho de Kleene) é uma LR.

  6. Nada mais é linguagem regular.

Note que o conjunto {e}, isto é, o conjunto composto pela palavra vazia, é também uma linguagem regular uma vez que: {e} = vazio*

Uma vez que operações sobre LR geram uma LR, diz-se que a LR é fechada sobre as suas operações.

Linguagens regulares: exemplo 1

Esta definição tem implicações interessantes.

Uma delas é que qualquer linguagem finita, isto é que descreva um número finito de sequências de símbolos do seu alfabeto, é uma linguagem regular.

Porquê?

  1. Seja A = {a1;a2; ... ;an} o alfabeto da linguagem L;

  2. Então as linguagens L1 = {a1}, L2 = {a2}, . . . , Ln = {an} são LR;

  3. Igualmente a linguagem Lany = L1 U L2 U ... U Ln é também uma LR;

  4. Qualquer que seja uma sequência finita de n símbolos do alfabeto A, podemos sempre descrevê-la como:

  5. Logo, a sequência será uma LR sse a subsequência prefixn-1(seqn) também o for.

  6. Aplicando indutivamente a demonstração, facilmente se chega à conclusão que se há-de de chegar à subsequência vazia, logo qualquer linguagem finita é uma linguagem regular.

Linguagens regulares: exemplo 1

Uma vez que uma linguagem regular é uma linguagem reconhecida por um autómato finito é fácil, também por aí, chegarmos à mesma conclusão.

Basta para tal considerar uma máquina de estados que implemente todas as transições das palavras da linguagem.

Como o número de transições é finito (porque o número de palavras da linguagem também o é), então é sempre possível criar esse autómato finito.

Mantendo esta perspectiva, podemos ir mais longe e afirmar que numa linguagem finita, os autómatos que a reconhecem não têm ciclos.

Da mesma forma, a existência de pelo menos um ciclo no autómato finito, implica necessariamente uma linguagem infinita.

Linguagens regulares: exemplo 2

Mostre que o conjunto dos números binários começados em 1 e terminados em 0 é uma LR sobre o alfabeto A = {0;1}.

O conjunto pretendido pode ser representado por L = {1} . A* . {0}.

  1. {1} e {0} são regulares;

  2. A = {0;1} = {0} U {1} é regular;

  3. Se A é regular então A* também é;

  4. Finalmente, {1} .A* . {0} é também regular.

Um autómato finito que reconhece esta linguagem pode ser:

(Nota: A simples existência deste autómato também mostra a regularidade desta linguagem).