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
  1. Introdução, Estrutura, Aplicação

Regras léxicas

A gramática léxica é composta por regras (ou produções), em que cada regra define um token.

As regras léxicas têm de começar por uma letra maiúscula, e podem ser visíveis apenas dentro do analisador léxico:

INT: DGIT+;            // visible in both parser and lexer
fragment DIGIT: [0-9]  // visible only in lexer

Como, por vezes, a mesma sequência de caracteres pode ser reconhecida por diferentes regras (por exemplo: identificadores e palavras reservadas), o ANTLR4 estabelece critérios que permitem eliminar esta ambiguidade (e dessa forma, reconhecer um, e um só, token).

Esses critérios são essencialmente dois (na ordem seguinte):

  1. Reconhece tokens que consomem o máximo possível de caracteres. Por exemplo, num reconhecedor léxico para Java, o texto ifa é reconhecido com um único token tipo identificador, e não como dois tokens (palavra reservada if seguida do identificador a).

  2. Dá prioridade às regras definidas em primeiro lugar. Por exemplo, na gramática seguinte: ID: [a-z]+; IF: 'if'; O token IF nunca vai ser reconhecido!

O ANTLR4 também considera que os tokens definidos implicitamente em regras sintáticas, estão definidos antes dos definidos explicitamente por regras léxicas.

A especificação destas regras utiliza expressões regulares.

Expressões regulares em ANTLR4

Syntax
Description

R :...: ;

Define lexer rule R

X

Match lexer rule element X

'literal'

Match literal text

[char-set]

Match one of the chars in char-set

'x'::'y'

Match one of the chars in the interval

X Y ... Z

Match a sequence of rule lexer elements

(...)

Lexer 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

Match one of the chars NOT in the set defined by x

.

Match any char

X*?Y

Match X until Y appears (non-greedy match)

{...}

Lexer action

{p}?

Evaluate semantic predicate p (if false, the rule is ignored)

x |...| z

Multiple alternatives

PreviousEstrutura léxicaNextPadrões léxicos típicos

Last updated 3 years ago