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
  • Hello (1)
  • Hello (2)
  • ANTLR4: Ficheiros gerados
  1. Introdução, Estrutura, Aplicação

Exemplos

PreviousAutómatosNextExpr

Last updated 2 years ago

Hello (1)

ANTLR4

Exemplo

// (this is a line comment)
grammar Hello ; // Define a grammar called Hello

// parser (first letter in lower case) :
r : ’hello’ ID ; // match keyword hello followed by an identifier

// lexer (first letter in upper case) :
ID : [a-z]+ ; // match lower-case identifiers
WS : [\t \r \n]+ -> skip ; // skip spaces, tabs, newlines, °(Windows)

As duas gramáticas – lexical e sintática – são expressas com instruções com a seguinte estrutura:

  • alfa : beta;

em que alfa corresponde a um única símbolo lexical ou sintático (dependendo da sua primeira letra ser, respectivamente, maiúscula ou minúscula); e em beta é uma expressão simbólica equivalente a alfa.

Hello (2)

Uma sequência de símbolos na entrada que seja reconhecido por esta regra gramatical pode sempre ser expressa por uma estrutura tipo árvore (chamada sintática), em que a raiz corresponde a alfa e os ramos à sequência de símbolos expressos em beta:

Podemos agora gerar o processador desta linguagem e experimentar a gramática utilizando o programa de teste do ANTLR4.

$ antlr4 Hello.g4
$ antlr4-javac Hello*.java
$ echo "hello compiladores" | antlr4-test Hello r -tokens

Utilização:

$ antlr4-test [<Grammar> <rule>] [-tokens | -tree | -gui]

ANTLR4: Ficheiros gerados

Executando o comando antlr4 sobre esta gramática obtemos os seguintes ficheiros:

Ficheiros gerados:

  • HelloLexer.java: código Java com análise léxica (gera tokens para análise sintática).

  • Hello.tokens e HelloLexer.tokens: ficheiros com a identificação de tokens (pouco importante nesta fase, mas server para modularizar diferentes analisadores léxicos e/ou separar a análise léxica da análise sintática).

  • HelloParser.java: código Java com a análise sintática (gera a árvore sintática do programa).

  • HelloListener.java e HelloBaseListener.java: código Java que implementa automaticamente um padrão de execução de código tipo listener (observer, callbacks) em todos os pontos de entrada e saída de todas as regras sintáticas do compilador.

Podemos executar o ANTLR4 com a opção -visitor para gerar também código Java para o padrão tipo visitor (difere do listener porque a visita tem de ser explicitamente requerida).

  • HelloVisitor.java e HelloBaseVisitor.java: código Java que implementa automaticamente um padrão de execução de código tipo visitor todos os pontos de entrada e saída de todas as regras sintáticas do compilador.