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
  • Construção de regras: síntese
  • Regras sintácticas: movendo informação
  1. Introdução, Estrutura, Aplicação

Regras sintácticas

Construção de regras: síntese

Syntax
Description

r: ...;

Define rule r

x

Match rule element x

x y ... z

Match a sequence of rule elements

(...)

Subrule

x?

Match rule element x

x*

Match rule element x zero or more times

x+

Match rule element x one or more times

x | ... | z

Multiple alternatives

Regras sintácticas: movendo informação

Em ANTRL4 cada regra sintáctica pode ser vista como uma espécie de método, podendo-se havendo mecanismos de comunicação similares: argumentos e resultado, assim como variáveis locais à regra.

Podemos também anotar regras com um nome alternativo:

expr: el = expr '+' e2 = expr
    | INT;

Podemos também etiquetar com nomes, diferentes alternativas duma regra:

expr: expr ’*’ e2=expr # ExprMul t
    | expr ’+’ e2=expr # ExprAdd
    | INT # ExprInt
    ;

O ANTLR4 irá gerar informação de contexto para cada nome (incluindo métodos para usar no listener e/ou nos visitors).

grammar Info;

@header {
import static java.lang.System.*;
}

main: seq1 = seq[true] seq2=seq[false] {
        out.println("average(seq1): " + $seq1.average);
        out.println("average(seq2): " + $seq2.average);
    }
    ;

seq[boolean crash] returns[double average=0]
        locals[int sum=0, int count=0]: '(' (INT ($sum+=$INT, int; $count++;))* ')' {
                if($count > 0)
                        $average = (double) $sum/$count;
                else if ($crash) {
                        err.println("ERROR: divide by zero !");
                        exit(1);
                }
        }
        ;
INT: [0-9]+;
WS: [ \t\r\n]+ -> skip;
PreviousAcções no preâmbulo da gramáticaNextPadrões sintácticos típicos

Last updated 3 years ago