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
  • Comentários
  • Identificadores
  • Literais
  • Palavras reservadas
  • Acções
  1. Introdução, Estrutura, Aplicação

Estrutura léxica

Comentários

A estrutura léxica do ANTLR4 deverá ser familiar para a maioria dos programadores já que se aproxima da sintaxe das linguagens da família do C (C++, Java, etc.).

Os comentários são em tudo semelhantes aos do Java permitindo a definição de comentários de linha, multilinha, ou tipo JavaDoc.

/**
 * Javadoc alike comment !
 */
grammar Name;
/*
multiple comment
*/

/** parser rule for an identifier */
id: ID; // match a variable name

Identificadores

O primeiro caráter dos identificadores tem de ser uma letra, seguida por outras letras dígitos ou o caráter.

Se a primeira letra do identificador é minúscula, então este identificador representa uma regra sintáctica; caso contrário (i.e. letra maiúscula) então estamos na presença duma regra léxica.

ID, LPAREN, RIGHT_CURLY, Other    // lexer token names
expr, conditionalStatment         // parser rule names

Como em Java, podem ser utilizados caracteres Unicode.

Literais

Em ANTLR4 não há distinção entre literais do tipo carácter e do tipo string.

Todos os literais são delimitados por aspas simples.

Exemplos: ’if’, ’>=’, ’assert’.

Como em Java, os literais podem conter sequências de escape tipo Unicode (’\u3001’), assim como as sequências de escape habituais (’\’\r\t\n’).

Palavras reservadas

O ANTLR4 tem a seguinte lista de palavras reservadas (i.e. que não podem ser utilizadas como identificadores):

import, fragment, lexer,
parser, grammar, returns,
locals, throws, catch,
finally, mode, options,
tokens, skip

Mesmo não sendo uma palavra reservada, não se pode utilizar a palavra rule já que esse nome entra em conflito com os nomes gerados no código.

Acções

As acções são blocos de código escritos na linguagem destino (Java por omissão).

As acções podem ter múltiplas localizações dentro da gramática, mas a sintaxe é sempre a mesma: texto arbitrário delimitado por chavetas: {...}

Se por caso existirem strings ou comentários (ambos tipo C/Java) contendo chavetas não há necessidade de incluir um caráter de escape ({..."}"./}/..}).

O mesmo acontece se as chavetas foram balanceadas ({{...{}...}}).

Caso contrário, tem de se utilizar o caráter de escape ({{}, {}}).

O texto incluído dentro das acções tem de estar conforme com a linguagem destino.

As acções podem aparecer nas regras léxicas, nas regras sintácticas, na especificação de excepções da gramática, nas secções de atributos (resultado, argumento e variáveis locais), em certas secções do cabeçalho da gramática e em algumas opções de regras (predicados semânticos).

Pode considerar-se que cada acção será executada no contexto onde aparece (por exemplo, no fim do reconhecimento duma regra).

grammar Expr;
stat:
    {System.out.println("[stat]: before assign");} assign | expr {System.out.println("[stat]: after expr");};
assign:
    ID
    {System.out.println("[assign]: after ID and before =!");}
    '=' expr ';'
expr: INT {system.out.println("[expr]: INT!");};
ID: [a-z]+;
INT: [0-9]+;
WS: [\t\r\n]+ -> skip;
PreviousEspecificação de gramáticasNextRegras léxicas

Last updated 3 years ago