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
  • ANTLR4: Expr
  • ANTLR4: contexto automático
  • ANTLR4: contexto automático (2)
  • ANTLR4: visitor
  • ANTLR4: listener
  • ANTLR4: atributos e acções
  1. Introdução, Estrutura, Aplicação
  2. Exemplos

Expr

PreviousExemplosNextExemplo figuras

Last updated 3 years ago

ANTLR4: Expr

Exemplo:

grammar Expr;
stat : assign;
assign : ID ’= ’ expr ’;’ ;
expr : INT ;
ID : [a-z]+ ;
INT : [0-9]+ ;
WS : [ \t \r \n ]+ -> skip ;

Se executarmos o compilador criado com a entrada:

  • sp = 100;

Vamos obter a seguinte árvore sintática:

ANTLR4: contexto automático

Para facilitar a análise semântica e a síntese, o ANTLR4 tenta ajudar na resolução automática de muitos problemas (como é o caso dos visitors e dos listeners).

No mesmo sentido são geradas classes (e em execução os respectivos objectos) com o contexto de todas as regras da gramática:

ANTLR4: contexto automático (2)

ANTLR4: visitor

Os objectos de contexto têm a si associada toda a informação relevante da análise sintática (tokens, referência aos nós filhos da árvore, etc).

Por exemplo o contexto AssignContext contém métodos ID e expr para aceder aos respectivos nós.

No caso do código gerado automaticamente do tipo visitor o padrão de invocação é ilustrado a seguir:

ANTLR4: listener

O código gerado automaticamente do tipo listener tem o seguinte padrão de invocação:

A sua ligação à restante aplicação é a seguinte:

ANTLR4: atributos e acções

É possível associar atributos e acções às regras:

grammar ExprAttr ;
stat : assign ;
assign : ID ’=’ e=expr ’;’
{ System.out.println ( $ID.text + "="+ $e.v ); } //action;
expr returns [int v] : INT //result attribute named v in expr
{ $v = Integer.parseInt($INT.text); } //action
;
ID : [a-z]+ ;
INT : [0-9]+ ;
WS : [ \t \r \n ]+ -> skip ;

Ao contrário dos visitors e listeners, a execução das acções ocorre durante a análise sintática.

A execução de cada acção ocorre no contexto onde ela é declarada. Assim se uma acção estiver no fim de uma regra (como exemplificado acima), a sua execução ocorrerá após o respectivo reconhecimento.

A linguagem a ser executada na acção não tem de ser necessariamente Java (existem muitas outras possíveis, como C++ e python).

Também podemos passar atributos para a regra (tipo passagem de argumentos para um método):

assign: ID ’=’ e=expr[true] ’;’ //argument passing to expr
    { System . o u t . p r i n t l n ( $ID . t e x t +" = "+ $e . v ) ; }
    ;
expr[boolean a] // argument attribute named a in expr
    returns [ i n t v ] : // result attribute named v in expr
    INT {
        if ($a)
            System.out.println ( "Wow! Used in an assignment !");
            $v = Integer.parseInt( $INT.text );
    };

É clara a semelhança com a passagem de argumentos e resultados de métodos.

Diz que os atributos são sintetizados quando a informação provém de sub-regras, e herdados quando se envia informação para sub-regras.