Slide sem t - PowerPoint PPT Presentation

1 / 112
About This Presentation
Title:

Slide sem t

Description:

Linguagens Formais, Lex & Yacc Vladimir Oliveira Di Iorio Linguagens formais s o linguagens cuja sintaxe (e geralmente sem ntica) precisamente definida, sem ... – PowerPoint PPT presentation

Number of Views:92
Avg rating:3.0/5.0
Slides: 113
Provided by: VladimirO1
Category:
Tags: fundamentos | sem

less

Transcript and Presenter's Notes

Title: Slide sem t


1
Linguagens Formais, Lex Yacc Vladimir Oliveira
Di Iorio
2
Introdução
3
Linguagens Formais
  • Linguagens formais são linguagens cuja sintaxe (e
    geralmente semântica) é precisamente definida,
    sem ambigüidades.
  • São diferentes de linguagens naturais, recheadas
    de imprecisões e ambigüidades.
  • Exemplos de linguagens formais linguagens de
    programação como C, C, Pascal, Java, linguagens
    de consulta como SQL.

4
Exemplo
  • Uma definição para o comando UPDATE da linguagem
    SQL, usando estilo BNF
  • UPDATE TRANSACTION transaction table
    viewSET col ltvalgt , col ltvalgt WHERE
    ltsearch_conditiongt WHERE CURRENT OF cursor
  • Exemplo de um comando válido
  • UPDATE CLIENTE SET DATA_INCLUSAO CURRENT DATE

5
Objetivos do Curso
  • Estudar fundamentos teóricos de linguagens
    formais
  • alfabetos, palavras e linguagens
  • expressões regulares
  • gramáticas regulares e livres de contexto.
  • Apresentar ferramentas no estilo Lex, para
    processamento de entradas usando linguagens
    regulares.
  • Apresentar ferramentas no estilo Yacc, para
    processamento de entradas usando linguagens
    livres de contexo.
  • Dar exemplos de utilização de ferramentas Lex e
    Yacc, na construção de filtros, pequenos
    interpretadores e compiladores.

6
Visão Geral - Expressões Regulares
  • Expressões regulares são um formalismo usado para
    definir o formato correto de uma cadeia de
    caracteres.
  • São usados símbolos de um alfabeto qualquer,
    juntamente com operadores especiais, como '' e
    ''.
  • Um exemplo a b c
  • Essa expressão define que as cadeias válidas são
    aquelas que iniciam com uma seqüência não vazia
    de símbolos 'a', seguidos de exatamente um
    símbolo 'b', seguido de uma seqüência
    possivelmente vazia de símbolos 'c'.

7
Visão Geral - Autômatos
  • Autômatos finitos são um formalismo equivalente
    às expressões regulares, que usa representação em
    forma de grafo.
  • Autômato finito equivalente à expressão a b c

a
b
c
a
8
Visão Geral - Gramáticas
  • Gramáticas são mais um formalismo usado para
    definir o formato correto de uma cadeia de
    caracteres.
  • Os símbolos são classificados como terminais e
    não terminais, e são usadas regras de reescrita
    para os símbolos não terminais.
  • Gramática equivalente à expressão a b c
  • ltSgt -gt altAgt
  • ltAgt -gt altAgt bltBgt b
  • ltBgt -gt cltBgt c

9
Visão Geral - Lex
  • Ferramentas no estilo Lex utilizam uma
    especificação baseada em expressões regulares.
  • A partir dessa definição, Lex gera
    automaticamente um programa que simula o
    comportamento de autômatos equivalentes às
    expressões fornecidas.
  • O programa lê uma entrada e verifica se essa
    entrada está no formato especificado.
  • Enquanto verifica a entrada, pode executar
    algumas ações (trechos de programa) desejadas.

10
Visão Geral - Yacc
  • Ferramentas no estilo Yacc funcionam de maneira
    parecida com Lex - mas utilizam uma especificação
    baseada em gramáticas.
  • O formalismo de gramáticas é mais poderoso que o
    de expressões regulares e autômatos, assim é
    possível gerar programas que processam entradas
    mais complexas.
  • Da mesma forma que Lex, Yacc pode associar ações
    (trechos de programa) a cada regra da gramática.
    À medida que a entrada é processada, ações
    adequadas são executadas. Essas ações podem ser,
    por exemplo, a interpretação ou compilação da
    entrada.

11
Visão Geral - Lex Yacc
  • Um compilador ou interpretador pode ser gerado
    rapidamente usando Lex e Yacc em conjunto.
  • Lex é geralmente usado para separar uma entrada
    em unidades léxicas. No caso de uma linguagem de
    programação, por exemplo, pode identificar um
    número real como "1.23" ou uma palavra-chave como
    "begin".
  • Yacc pode usar as unidades léxicas produzidas por
    Lex e verificar se essas unidades formam uma
    entrada válida. Enquanto isso pode, por exemplo,
    compilar a entrada.

12
Visão Geral - Lex Yacc
regras léxicas
regras sintáticas
entrada
saída
Lex
Yacc
Analisador Léxico
Analisador Sintático
13
História
  • O primeiro compilador para uma linguagem de
    programação de alto nível foi desenvolvido para a
    linguagem FORTRAN, na década de 50.
  • Na época, a teoria de linguagens formais ainda
    não estava estabelecida (Chomsky, 1959).
  • Foi necessário um esforço gigantesco, e a
    utilização de um grande número de programadores.

14
História
  • Atualmente, com a utilização de ferramentas como
    Lex e Yacc, é possível construir rapidamente um
    compilador.
  • O processo de geração automática utilizado por
    essas ferramentas, em geral, produz analisadores
    quase tão rápidos quanto os escritos totalmente à
    mão.

15
Linguagens Formais
16
Alfabetos e Palavras
  • Um alfabeto é um conjunto finito de símbolos
    distintos.
  • Exemplo S a,b,c
  • é um alfabeto formado pelos símbolos a, b e c.
  • Uma palavra sobre um alfabeto S é uma seqüência
    de comprimento finito formada com símbolos desse
    alfabeto.
  • Algumas palavras sobre o alfabeto S a,b,c
  • abc , bcaabbac , b
  • A palavra de comprimento zero é representada por
    ? .

17
Linguagens
  • Seja S um alfabeto qualquer. O conjunto de todas
    as palavras sobre S é denotado por S .
  • Por exemplo, se S a,b,c , então
  • S ?, a, b, c, aa, ab, ac, ba, bb, bc, ca,
    cb, cc, aaa, ...
  • Uma linguagem sobre um alfabeto S é qualquer
    subconjunto de S .
  • Linguagens sobre S a,b,c
  • a, ab, bbc
  • aa, ab, ac, ba, bb, bc, ca, cb, cc
  • todas as palavras que começam com a

18
Linguagens
  • Outras linguagens sobre S a,b,c
  • todas as palavras de comprimento par
  • ?, a, b, c ?
  • S
  • A concatenação de 2 palavras será representada
    por sua justaposição. Por exemplo, sejam uma
    palavra x abc e uma palavra y bb .
  • A concatenação de x com y é representada por
  • xy abcbb .

19
Concatenação de linguagens
  • Se X e Y são duas linguagens,
  • a concatenação de X com Y, denotada por XY,
  • é a seguinte linguagem
  • XY palavras xy tais que x ? X e y ? Y
  • Ou seja, são as palavras formadas pela
    concatenação de uma palavra qualquer de X
  • com uma palavra qualquer de Y
  • (prefixo pertence a X, sufixo pertence a Y).

20
Concatenação de linguagens
  • Por exemplo, sejam
  • X a,b,c e Y abb,ba .
  • Então
  • XY aabb,aba,babb,bba,cabb,cba
  • A concatenação de X consigo mesma n vezes é Xn
  • Xn X X X ... X X (n vezes)
  • Por definição, X0 é o conjunto ?
  • X0 ?

21
Concatenação de linguagens
  • Outros exemplos, com X a,b,c e Y
    abb,ba
  • X0 ?
  • X1 X a,b,c
  • X2 XX aa,ab,ac,ba,bb,bc,ca,cb,cc
  • X3 X2X aaa,aab,aac,aba,abb,abc,aca,acb,acc,
  • baa,bab,bac,bba,bbb,bbc,bca,bcb,bcc,
  • caa,cab,cac,cba,cbb,cbc,cca,ccb,ccc
  • Y2 YY abbabb,abbba,baabb,baba

22
Exercícios
  • Considere o alfabeto S a,b,c. Seja L1 a
    linguagem das
  • palavras que começam com o símbolo 'a', e L2 a
    linguagem
  • das palavras que terminam com o símbolo 'b'.
  • O conjunto a,b,c é uma linguagem sobre S ?
  • Qual a menor linguagem que pode ser criada com
    esse alfabeto (menor número de palavras) ?
  • Qual é o resultado da concatenação de L1 com L2 ?
  • Qual é o resultado da união de L1 com L2 ?
  • A união de 2 linguagens pode resultar em uma
    linguagem menor que as outras duas?
  • A concatenção de 2 linguagens pode resultar em
    uma linguagem menor que as outras duas?

23
Fecho de Kleene
  • A operação X, denominada Fecho de Kleene de X,
  • é definida como a união de Xi ,
  • com i variando de 0 a infinito
  • X X0 ? X1 ? X2 ? X3 ? ...
  • Ou seja, X consiste de todas as palavras que se
    pode construir a partir dos elementos de X .
  • Por exemplo, se X a,b,c e Y abb,ba
  • X ?,a,b,c,aa,ab,ac,ba,bb,bc,ca,cb,cc,aaa,...
  • Y ?,abb,ba,abbabb,abbba,baabb,baba,abbabbabb
    ,...

24
Expressões Regulares
25
Expressões Regulares - Definição
  • Para definir expressões regulares, vamos usar as
    seguintes abreviações
  • o conjunto a será representado simplesmente por
    a
  • a,b,c,... será representado por a ? b ? c ?...
  • O conjunto de expressões regulares sobre um
    alfabeto S qualquer é definido como
  • os conjuntos e ? são expressões
    regulares
  • para todo símbolo a de S, a é uma expressão
    regular
  • se x e y são expressões regulares sobre S, então
    também são expressões regulares x ? y , xy e
    x .

26
Expressões Regulares - exemplos
  • a ? b
  • linguagem formada apenas pelas palavras a e b
  • abb ? aa ? ac
  • linguagem formada exatamente pelas palavras abb,
    aa e ac, ou seja, abb,aa,ac
  • a
  • linguagem (infinita) de todas as palavras
    formadas apenas com o símbolo a

27
Expressões Regulares - exemplos
  • (a ? b) (ab ? bb)
  • denota a linguagem aab,abb,bab,bbb
  • (a ? b)
  • a linguagem ?,a,b,aa,ab,ba,bb,aaa,...
  • (aa)
  • palavras só com a, e com comprimento par (inclui
    a palavra nula)

28
Expressões Regulares - exemplos
  • Outras abreviações
  • x é usado para abreviar xx
  • x2 é usado para abreviar xx
  • x3 para abreviar x2x etc.
  • (a2)
  • palavras só com a, e com comprimento par maior
    que zero (não inclui a palavra nula)
  • a (a ? b ? c)
  • Linguagem sobre a,b,c das palavras que começam
    com o símbolo a

29
Expressões Regulares - exemplos
  • a (a ? b ? c) b
  • Linguagem sobre a,b,c das palavras que começam
    com o símbolo a e terminam com b
  • (b ? c) (a ? b ? c) ? ?
  • Linguagem das palavras sobre a,b,c que não
    começam com o símbolo a

30
Expressões Regulares - exercícios
  • Que linguagens são essas?
  • (a ? b) b (a ? b)
  • (a ? b) a (a ? b) a (a ? b)
  • (a ? b ? c) (a ? b ? c) (a ? b ? c)
  • (b a b a b)

31
Expressões Regulares - exercícios
  • Construa expressões regulares para
  • Linguagem das palavras de comprimento par sobre o
    alfabeto a,b,c.
  • Linguagem das palavras sobre o alfabeto a,b,c
    que contenham exatamente um símbolo c .

32
Expressões Regulares - restrições
  • As linguagens que podem ser especificadas por
    expressões regulares são chamadas de
  • linguagens regulares.
  • Mas expressões regulares não podem ser usadas
  • para especificar qualquer linguagem desejada.
  • Muitas linguagens não conseguem ser especificadas
    com expressões regulares, necessitando de
    formalismos mais poderosos.

33
Expressões Regulares - restrições
  • Exemplos de linguagens que não são regulares
  • Linguagem cujas palavras têm o formato anbn,
  • para qualquer n. Ou seja
  • ?, ab, aabb, aaabbb, ...
  • Linguagem sobre alfabeto a, b, (, ) com
  • aninhamento correto de parêntesis abrindo e
    fechando.

34
Lex - Gerador de Analisadores Léxicos
35
Lex - Gerador de Analisadores Léxicos
  • Ajuda a escrever programas cuja entrada pode ser
    descrita por meio de expressões regulares.
  • Principais utilizações
  • transformações simples e extração de padrões em
    textos
  • separação da entrada em unidades léxicas, como
    preparação para um analisador sintático.
  • Os exemplos utilizados nesta apresentação
    seguirão o formato do programa JFlex, um clone de
    Lex que gera código em Java.

36
Lex - fonte
  • Um texto fonte para LEX é composto de
  • lista de expressões regulares
  • fragmentos de programa associados a cada
    expressão.
  • Quando o fonte é submetido ao LEX, um programa é
    automaticamente gerado. Esse programa
  • lê um arquivo de entrada
  • particiona a entrada em cadeias que "casam" com
    as expressões regulares definidas
  • executa os fragmentos de programa associados às
    expressões "casadas"
  • escreve no arquivo de saída.

37
Lex - esquema de funcionamento
Yylex (programa gerado)
fonte
Lex
entrada
saída
Yylex
38
Lex - exemplo com JFlex
  • Um exemplo, usando o gerador JFlex
  • Como na maioria dos clones de Lex, o fonte é
    dividido em 3 seções, separadas por "".
  • No JFlex, as seções são
  • código do usuário a ser incluído
  • opções e declarações
  • regras e ações associadas.

39
Lex - exemplo com JFlex
40
Lex - exemplo com JFlex
  • Essa regra "casa" com um caractere "\t"
    (tabulação) da entrada. Se isso acontecer, o
    código entre chaves é executado.
  • Se a entrada não casa com nenhuma regra, a ação
    default é executada escrever o caractere
    diretamente na saída.
  • Ou seja, esse "programa" Lex serve para ler uma
    entrada e trocar as tabulações por "TAB".

41
Lex - usando o JFlex
  • Supondo que o fonte abaixo esteja no arquivo
    ex1.flex

Executa jflex, gerando Yylex.java
gt jflex ex1.flex Reading "ex1.flex" Constructing
NFA 6 states in NFA Converting NFA to DFA
.. 4 states before minimization, 3 states in
minimized DFA Writing code to "Yylex.java" gt
javac Yylex.java
gera Yylex.class
42
Lex - executando analisador gerado
  • Supondo que o texto abaixo esteja no arquivo
    teste.txt

teste... Esta linha comeca com tab Esta com
2 tabs fim.
gt java Yylex teste.txt teste... TABEsta linha
comeca com tab TABTABEsta com 2 tabs
  • Para gerar a saída no arquivo saida.txt

gt java Yylex teste.txt gt saida.txt
43
Lex - expressões regulares
  • Expressões regulares usadas em regras
  • caracteres de texto letras, dígitos, caracteres
    especiais como '\t', '\n' etc.
  • operadores usados como funções especiais das
    expressões regulares.
  • Na maioria das versões de Lex, os operadores são
  • " \ ˆ - ? . ( ) / lt gt
  • Os operadores podem ser utilizados como
    caracteres de texto, se vierem precedidos de um
    caractere de escape ('\') ou se estiverem entre
    aspas duplas.
  • Nas slides seguintes, veremos o funcionamento de
    alguns operadores.

44
Lex - expressões regulares
  • Classes de caracteres
  • abc casa com um dos caracteres a, b ou c
  • a-zA-Z casa com uma letra minúscula ou
    maiúscula
  • a-zA-Z casa com qualquer coisa, exceto letras
  • Caractere arbitrário
  • . casa com qualquer caractere, exceto newline
  • Exclusivos de JFlex
  • letter isLetter( )
  • digit isDigit( )
  • lowercase isLowerCase( )
  • uppercase isUpperCase( )

45
Lex - expressões regulares
  • Expressões repetidas ( e )
  • a casa com qualquer número consecutivo de a's
    (incluindo zero repetições)
  • a casa com uma ou mais ocorrências de a
  • A-Za-zA-Za-z0-9
  • definição usual de "identificador"
  • Alternação e agrupamento ( )
  • (abcd) casa com ab ou cd

46
Lex - expressões regulares
  • Expressão opcional (?)
  • ab?c casa com ac ou abc
  • (abcd)?(ef)
  • casa com abefef , efefef , cdef, ou cddd
    mas não com abc , abcd , ou abcdef
  • Macros e repetições
  • digit casa com a definição da expressão
    regular
  • digit (seção de definições)
  • an casa com n vezes a concatenação de a

47
Lex - escolha de regras
  • Como ocorre a escolha das regras para casamento?
  • À medida que a entrada é lida, o analisador
    procura a regra que possibilita o casamento com a
    mais longa possível seqüência de caracteres da
    entrada.
  • Se mais de uma regra possibilita o casamento com
    a seqüência mais longa, a escolha é feita pela
    ordem em que as regras aparecem na fonte.

48
Lex - escolha de regras
  • Supondo que o fonte abaixo esteja no arquivo
    ex2.flex

gt jflex ex2.flex Reading "ex2.flex" Constructing
NFA 16 states in NFA Converting NFA to DFA
...... 8 states before minimization, 6 states in
minimized DFA Writing code to "Yylex.java" gt
javac yylex.java
49
Lex - escolha de regras
  • Supondo que o texto abaixo esteja no arquivo
    teste.txt

abcde abc abc123 123abcd 123abc
gt java Yylex teste.txt
  • O que será impresso???

50
Lex - escolha de regras
Saída
Entrada
-----id -----abc -----id 123-----id 123-----ab
c
abcde abc abc123 123abcd 123abc
51
Lex - objetos acessados nas ações
  • Dentro das ações associadas às regras, alguns
    objetos e métodos podem ser acessados pelos
    trechos de programa.
  • Esses objetos e métodos, gerados automaticamente
    pelo analisador, possuem nomes que iniciam com
    "yy", para evitar conflito com objetos do código
    inserido pelo usuário.
  • Exemplos o texto que foi "casado" com a regra, a
    linha e coluna atuais etc.
  • Nos próximos slides, veremos esses e outros
    exemplos de objetos e métodos acessíveis dentro
    das ações associadas às regras.

52
Lex - objetos acessados nas ações
  • String yytext() retorna a seqüência de
    caracteres que foi casada com a regra.
  • int yylength() retorna o comprimento da
    seqüência casada.
  • int yyline contém o número da linha atual.
  • int yycolumn contém o número da coluna atual,
    na linha atual.

53
(No Transcript)
54
Entrada
Saída
abcde // linha comentada abc abc123 123abcd 123
abc
idabcde linha 0 coluna 0 idabc linha 2
coluna 0 idabc123 linha 3 coluna
0 int123 idabcd linha 4 coluna
3 int123 idabc linha 8 coluna 3
55
Lex - exercícios
  • Inserir um caractere inválido (ex "_at_") no
    arquivo de entrada e executar a especificação
    anterior.
  • Responder é possível construir uma especificação
  • Lex que reconheça fórmulas matemáticas
    sintaticamente
  • corretas, com operandos, operadores e parêntesis
  • aninhados?
  • Exemplo
  • 12((5 2) / (3 - 1))

56
Lex - uso com analisador sintático
  • No exemplos exibidos até agora, Lex é usado para
    gerar um programa que processa toda a entrada de
    uma vez.
  • Como explicado anteriormente, outra importante
    utilização de Lex é na separação da entrada em
    unidades léxicas, para ser usado em conjunto com
    um analisador sintático.

57
Lex - uso com analisador sintático
regras léxicas
regras sintáticas
Lex
Yacc
entrada
saída
Yylex
Yyparse
58
Lex - uso com analisador sintático
  • Quando Lex é usado em conjunto com um analisador
    sintático, uma classe Main não é gerada.
  • Lex gera um método yylex que retorna a unidade
    léxica que foi extraída do texto de entrada.
  • O método yylex deve ser seguidamente executado
    pelo analisador sintático, para obter essas
    unidades sintáticas, chamadas tokens.
  • Algumas ações devem conter comandos return, que
    retornam o token que foi extraído, para o
    analisador sintático.

59
Usa classe Symbol definida em java_cup
Usa java_cup
Diretiva para teste cria uma função Main
artificial
Retorna um token. O código do token é definido no
analisador sintático.
60
Gramáticas
61
Gramáticas - Definição
  • Gramáticas são um formalismo utilizado para
    especificação de linguagens.
  • Em uma gramática, os símbolos são classificados
    como terminais (símbolos que formam as palavras
    da linguagem) e não terminais.
  • Os símbolos não terminais são também chamados de
    variáveis.
  • O processo de geração de palavras é denominado
    derivação, e consiste em regras de reescrita dos
    símbolos não terminais.

62
Gramáticas - Exemplo
  • Exemplo
  • ltSgt -gt altAgt
  • ltAgt -gt altAgt bltBgt b
  • ltBgt -gt cltBgt c
  • No exemplo acima, símbolos entre lt gt são
    considerados como não terminais ( ltSgt, ltAgt, ltBgt
    ). Os demais são os símbolos terminais ( a, b, c
    ).
  • Cada regra é composta de um lado esquerdo e um
    lado direito, separados por -gt .
  • O único tipo de gramática que vamos estudar são
    as gramáticas livres de contexto, em que o lado
    esquerdo é apenas uma variável (não terminal).

63
Gramáticas - Exemplo
  • Exemplo
  • ltSgt -gt altAgt
  • ltAgt -gt altAgt bltBgt b
  • ltBgt -gt cltBgt c
  • As regras ltBgt -gt cltBgt c são uma
    abreviação para as regras ltBgt -gt cltBgt e
    ltBgt -gt c .
  • Uma das variáveis é denominada símbolo inicial.
    Para simplificar, vamos supor que seja o símbolo
    do lado esquerdo da primeira regra (neste caso,
    ltSgt ).
  • Outra simplificação geralmente, usa-se
    maiúsculas para variáveis e minúsculas para
    terminais, dispensando ltgt .

64
Gramáticas - Derivação
  • Exemplo
  • S -gt aA
  • A -gt aA bB b
  • B -gt cB c
  • Uma derivação é uma seqüência de palavras
    formadas por símbolos terminais e variáveis, onde
    cada palavra é derivada da anterior.
  • Uma palavra y é derivada de x (escrevemos x gt y)
    se y pode ser obtida substituindo uma variável v
    de x por algum lado direito das regras de v.
  • Por exemplo, são válidas as seguintes relações
  • aabB gt aabc , aaA gt aaaA , ABAB gt AcAB

65
Gramáticas - Derivação
  • Exemplo
  • S -gt aA
  • A -gt aA bB b
  • B -gt cB c
  • Exemplo de derivação
  • aaA gt aaaA gt aaaaA gt aaaabB gt aaaabcB
  • Usa-se a abreviação gt para indicar derivação em
    0 ou mais passos aaA gt aaaabcB
  • Derivações de interesse, para uma gramática, são
    aquelas cuja primeira palavra é o símbolo
    inicial, e a última palavra contém apenas
    símbolos terminais.

66
Linguagem de uma gramática
  • Exemplo
  • S -gt aA
  • A -gt aA bB b
  • B -gt cB c
  • Derivações de palavras com terminais a partir de
    S
  • S gt aA gt aaA gt aab
  • S gt aA gt abB gt abcB gt abccB gt abccc
  • S gt aaabcc
  • A linguagem gerada por uma gramática é o conjunto
    de palavras apenas com símbolos terminais,
    derivadas a partir do símbolo inicial.

67
Exercícios
  • Usando a gramática abaixo
  • S -gt aA
  • A -gt aA bB b
  • B -gt cB c
  • mostre todos os passos das seguintes derivações
  • S gt ab
  • S gt aaabcc
  • Qual é a palavra de menor comprimento, apenas com
    símbolos terminais, que pode ser derivada a
    partir do símbolo inicial da gramática acima?
  • Qual é a linguagem gerada pela gramática acima?

68
Linguagem de uma gramática
  • Exemplo
  • S -gt aA
  • A -gt aA bB b
  • B -gt cB c
  • A linguagem gerada pela gramática acima é o
    conjunto de palavras sobre a,b,c que começam
    com a (uma ou mais ocorrências), seguido de
    exatamente um b, seguido de qualquer número de c.
  • Ou seja, a linguagem gerada por essa gramática é
    abc
  • MAS gramáticas podem gerar linguagens bem mais
    complexas que as expressas por expressões
    regulares!

69
Regulares X Livres de Contexto
  • Gramáticas com regras cujo lado esquerdo é apenas
    uma variável são chamadas gramáticas livres de
    contexto.
  • As linguagens geradas por gramáticas livres de
    contextro são chamadas linguagens livres de
    contexto.
  • As gramáticas regulares são um subconjunto das
    gramáticas livres de contexto. São aquelas com
    regras cujo lado direito é ?, ou é composto
    apenas de um terminal, ou então um terminal
    seguido de uma variável.
  • A gramática usada nos exemplos anteriores é
    regular.
  • As linguagens geradas por gramáticas regulares
    são chamadas de linguagens regulares.

70
Gramáticas Livres de Contexto
  • Exemplo
  • S -gt aSb ?
  • Algumas palavras geradas pela gramática acima
  • S gt ?
  • S gt aSb gt ab
  • S gt aSb gt aaSbb gt aabb
  • S gt aSb gt aaSbb gt aaaSbbb gt aaabbb
  • Qual é a linguagem gerada pela gramática acima?
  • Resposta o conjunto de palavras sobre a,b com
    o formato anbn , n 0.

71
Gramáticas Livres de Contexto
  • Exemplo
  • S -gt aSB ?
  • B -gt bb
  • Algumas palavras geradas pela gramática acima
  • S gt ?
  • S gt aSB gt aB gt abb
  • S gt aSB gt aaSBB gt aaBB gt aabbB gt aabbbb
  • S gt aSB gt aaSBB gt aaaSBBB gt aaaBBB gt
    aaabbBB gt
  • gt aaabbbbB gt aaabbbbbb
  • Qual é a linguagem gerada pela gramática acima?
  • É o conjunto de palavras sobre a,b com o
    formato anb2n , n 0.

72
Gramáticas Livres de Contexto
  • Exemplo
  • S -gt aSbb A
  • A -gt Ac ?
  • Algumas palavras geradas pela gramática acima
  • S gt A gt ?
  • S gt aSbb gt aAbb gt abb
  • S gt aSbb gt aaSbbbb gt aaAbbbb gt aacbbbb
  • S gt aSbb gt aAbb gt aAcbb gt aAccbb gt aAcccbb
    gt
  • gt aAcccbb gt acccbb
  • Qual é a linguagem gerada pela gramática acima?
  • É o conjunto de palavras sobre a,b,c com o
    formato ancmb2n , m,n 0.

73
Exercício
  • Construir uma gramática sobre o alfabeto
  • a, b, c, , -, (, )
  • para gerar fórmulas matemáticas sintaticamente
    corretas em que a, b e c são operandos, e - são
    operadores, e os parêntesis são corretamente
    aninhados.

74
Árvores de Derivação
  • Exemplo
  • S -gt aSB ?
  • B -gt bb
  • Árvore de derivação para a palavra aaabbbbbb

S
a S B
a S B
bb
a S B
bb
bb
?
75
Árvores de Derivação
  • Exemplo
  • S -gt aSB ?
  • B -gt bb
  • Árvore de derivação para a palavra aaabbbbbb

S
a S B
a S B
bb
a S B
bb
bb
?
76
Árvores de Derivação
  • Exemplo
  • S -gt aSB ?
  • B -gt bb
  • Árvore de derivação para a palavra aaabbbbbb

S
a S B
a S B
bb
a S B
bb
bb
?
77
Árvores de Derivação
  • Exemplo
  • S -gt aSB ?
  • B -gt bb
  • Árvore de derivação para a palavra aaabbbbbb

S
a S B
a S B
bb
a S B
bb
bb
?
78
Árvores de Derivação
  • Exemplo
  • S -gt aSB ?
  • B -gt bb
  • Árvore de derivação para a palavra aaabbbbbb

S
a S B
a S B
bb
a S B
bb
bb
?
79
Árvores de Derivação
  • Exemplo
  • S -gt aSB ?
  • B -gt bb
  • Árvore de derivação para a palavra aaabbbbbb

S
a S B
a S B
bb
a S B
bb
bb
?
80
Árvores de Derivação
  • Exemplo
  • S -gt aSB ?
  • B -gt bb
  • Árvore de derivação para a palavra aaabbbbbb

S
a S B
a S B
bb
a S B
bb
bb
?
81
Árvores de Derivação
  • Exemplo
  • S -gt aSB ?
  • B -gt bb
  • Árvore de derivação para a palavra aaabbbbbb

S
a S B
a S B
bb
a S B
bb
bb
?
82
Árvores de Derivação e Ambigüidade
  • Exemplo
  • S -gt XC AY
  • X -gt aXb ?
  • Y -gt bYc ?
  • A -gt aA ?
  • C -gt cC ?

S
S
X C
A Y
a X b
b Y c
c C
a A
c
?
?
?
83
Ambigüidade
  • Algumas gramáticas são ambíguas. Isso significa
    que uma mesma palavra (só com terminais) pode ser
    derivada de duas formas diferentes, mesmo que
    seja sempre escolhida uma mesma ordem para
    substituição das variáveis.
  • Duas gramáticas diferentes podem gerar a mesma
    linguagem, sendo uma das gramáticas ambígua e a
    outra não ambígua.
  • Gramáticas ambíguas não são muito adequadas para
    a construção automática de analisadores
    sintáticos.
  • Algumas linguagens são inerentemente ambíguas.
    Isso quer dizer que é impossível construir uma
    gramática não ambígua que gere essas linguagens.

84
Yacc - Gerador de Analisadores Sintáticos (Yacc
Yet Another Compiler-Compiler)
85
Yacc - Gerador de Analisadores Sintáticos
  • Auxilia no processo de definição do formato da
    entrada para um programa.
  • Uma especificação Yacc
  • regras que descrevem a estrutura da entrada
  • ações que devem ser executadas quando cada regra
    é utilizada
  • Os exemplos utilizados nesta apresentação
    seguirão o formato do programa Javacup, um clone
    de Yacc que gera código em Java.

86
Yacc - exemplo usando Javacup
Declaração de símbolos terminais e não terminais
Gramática lista de regras separadas por "" .
87
Yacc - geração de um analisador
  • A especificação apresentada tem como símbolos
    terminais PTVIRG, MAIS, MENOS e INTEIRO.
  • Se esse símbolos corresponderem a '', '', '-' e
    números inteiros, respectivamente, então a
    linguagem reconhecida é uma lista de expressões
    separadas por ''. O operadores são '' e '-' .
  • Para gerar um analisador sintático, vamos usar o
    Javacup (supondo especificação em um arquivo
    ex1.cup)

gt java java_cup.Main ex1.cup
java_cup é um programa escrito em Java!
88
Yacc - conflitos na gramática
gt java java_cup.Main ex1.cup Opening
files... Parsing specification from standard
input... ... Shift/Reduce conflict found in
state 9 ... More conflicts encountered than
expected -- parser generation aborted ...
  • A gramática utilizada possui várias ambigüidades,
    que causam conflitos no analisador sintático.

89
Yacc - conflitos na gramática
  • Por exemplo, considere a entrada 1 - 2 3

expr_list
expr_list
OU
expr_ptv
expr_ptv
expr
expr
expr expr
expr - expr
expr - expr
expr expr
INTEIRO
INTEIRO
INTEIRO
INTEIRO
INTEIRO
INTEIRO
3
1
2
3
1
2
90
Yacc - reescrevendo especificação
Ambigüidades eliminadas
91
Yacc - reescrevendo especificação
  • Supondo nova especificação em um arquivo ex2.cup

gt java java_cup.Main ex2.cup Opening
files... Parsing specification from standard
input... Checking specification... ... Writing
parser... Closing files... ------- CUP v0.10k
Parser Generation Summary ------- 0 errors and
0 warnings ... 0 productions never reduced. 0
conflicts detected (0 expected). Code written
to "parser.java", and "sym.java". ----------------
------------------------------------
92
Yacc - arquivos gerados
  • Os arquivos gerados pelo Javacup foram
    parser.java e sym.java. O primeiro contém o
    analisador sintático (parser). O segundo contém
    uma definição para símbolos terminais.
  • Conteúdo do arquivo sym.java

93
Yacc - especificando "scanner"
  • Falta especificar um procedimento que extrai os
    tokens do arquivo de entrada, classificando-os
    como PTVIRG, MAIS, MENOS ou INTEIRO.
  • Esse procedimento é geralmente chamado de
    scanner.
  • Isso será feito usando um analisador léxico
    automaticamente gerado com JFlex.

94
Yacc - especificando "scanner"
Usa classe Symbol, definida em java_cup.runtime, e
os códigos de sym.java.
95
Yacc - especificando "Main"
  • Finalmente, falta especificar uma função Main,
    que irá fazer as inicializações necessárias e
    chamar o analisador sintático.
  • O analisador sintático, por sua vez, irá chamar o
    analisador léxico para extrair os tokens do
    arquivo de entrada.

96
Yacc - especificando "Main"
97
Yacc - procedimento completo
  • Suponha que tenhamos então os seguintes arquivos
  • ex2.cup especificação que será submetida ao
    Javacup
  • ex2.flex especificação que será submetida ao
    JFlex
  • Main.java contém a função Main.
  • O procedimento completo para gerar um analisador
    sintático será

gt java java_cup.Main ex2.cup ... gt jflex
ex2.flex ... gt javac Main.java
98
Yacc - usando o analisador gerado
gt java Main 12 1-23 Z gt java
Main 12 1-23 1 1 Syntax error Couldn't
repair and continue parse ...
99
Yacc - valores e ações
  • Um analisador que só verifica a sintaxe de uma
    entrada tem pouca utilidade.
  • Ferramentas como Javacup permitem associar
    valores aos símbolos e ações às regras.
  • Uma ação é um trecho de programa que é associado
    a uma regra. Pode ser executado em qualquer ponto
    da derivação, quando a regra é utilizada.
  • Um valor pode ser associado a um símbolo terminal
    no analisador léxico. No analisador sintático, um
    valor pode ser associado a um símbolo não
    terminal, recursivamente.

100
Yacc - valores no JFlex
  • A classe Symbol possui construtores que permitem
    a especificação de um valor (Object) associado ao
    token.
  • Trecho da nova especificação para o JFlex

Valor associado ao token.
101
Yacc - valores no Javacup
  • No Javacup, na declaração de símbolos terminais e
    não terminais, pode-se especificar um TIPO
    associado.
  • Trecho da nova especificação para o Javacup

Tipo associado ao símbolo.
102
Yacc - valores no Javacup
  • As ações são trechos de programa delimitados por
    ... .
  • A cada token, é possível associar um
    identificador, para que o seu valor possa ser
    acessado dentro da ação.
  • Trecho da nova especificação para o Javacup

103
Yacc - valores no Javacup
  • A palavra-chave RESULT indica o valor do símbolo
    da esquerda da regra sendo utilizada.
  • Trecho da nova especificação para o Javacup

104
Yacc - usando o analisador gerado
  • Suponha especificações em ex3.cup e ex3.flex

gt java java_cup.Main ex3.cup ... gt jflex
ex3.flex ... gt javac Main.java gt java Main 1
1 11 2 1-1 0 1-2-3 2 Z
105
Exercício
  • Usando a gramática abaixo
  • expr_list -gt
  • expr_list expr_ptv
  • expr_ptv
  • expr_ptv -gt expr PTVIRG
  • expr -gt
  • INTEIRO MAIS expr
  • INTEIRO MENOS expr
  • INTEIRO
  • construir a árvore de derivação de 1 - 2 - 3

106
Yacc - associatividade
  • Derivação de 1 - 2 - 3

expr_ptv
expr
Associatividade à direita!
INTEIRO - expr
INTEIRO - expr
1
2
INTEIRO
3
107
Yacc - alterando associatividade
  • Trecho da nova especificação para o Javacup,
    implementando associatividade à esquerda para os
    operadores '' e '-'

108
Yacc - associatividade à esquerda
  • Derivação de 1 - 2 - 3

expr_ptv
expr
Associatividade à esquerda!
expr - INTEIRO
expr - INTEIRO
3
2
INTEIRO
1
109
Yacc - usando o analisador gerado
  • Suponha especificações em ex4.cup e ex4.flex

gt java java_cup.Main ex4.cup ... gt jflex
ex4.flex ... gt javac Main.java gt java Main 1
1 11 2 1-1 0 1-2-3 -4 Z
110
Yacc - associatividade e precedência
  • A associatividade de operadores é uma
    característica tão importante em gramáticas que a
    maioria dos clones de Yacc possuem diretivas para
    simplificar sua especificação.
  • Suponha que, além dos operadores representados
    por MAIS e MENOS, a gramática possua VEZES e
    DIVISAO.
  • As diretivas abaixo determinam a precedência e a
    associatividade desses operadores

111
Yacc - associatividade e precedência
  • Usando as diretivas apresentadas, não é mais
    necessário construir as regras de modo que a
    derivação defina a associatividade e precedência.
  • Trecho da nova especificação

112
FIM
Write a Comment
User Comments (0)
About PowerShow.com