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
  2. Outras funcionalidades

Separar analisador léxico do analisador sintáctico

Muito embora se possa definir a gramática completa, juntando a análise léxica e a sintáctica no mesmo módulo, podemos também separar cada uma dessas gramáticas.

Isso facilita, por exemplo, a reutilização de analisadores léxicos.

Existem também algumas funcionalidades do analisador léxico, que obrigam a essa separação (“ilhas” lexicais).

Para que a separação seja bem sucedida há um conjunto de regras que devem ser seguidas:

  1. Cada gramática indica o seu tipo no cabeçalho.

  2. Os nomes das gramáticas devem (respectivamente) terminar em Lexer e Parser.

  3. Todos os tokens implicitamente definidos no analisador sintáctico têm de passar para o analisador léxico (associando-lhes um identificador para uso no parser).

  4. A gramática do analisador léxico deve ser compilada pelo ANTLR4 antes da gramática sintáctica.

  5. A gramática sintáctica tem de incluir uma opção (tokenVocab) a indicar o analisador léxico.

lexer grammar NAMELexer;
...
parser grammar NAMEParser;
options {
    tokenVocab=NAMELexer;
}

No teste da gramática deve utilizar-se o nome sem o sufixo:

  • antlr4-test NAME rule

Exemplo

lexer grammar CSVLexer ;
COMMA: ’,’ ;
EOL: ’\r’? ’\n’ ;
STRING: ’"’ ( ’""’ | ~’"’ )* ’"’ ;
TEXT: ~[,"\r\n]~[,\r\n]* ;
parser grammar CSVParser ;
options {
tokenVocab=CSVLexer ;
}
file : firstRow row* EOF;
firstRow : row ;
row : field (COMMA field )* EOL;
field : TEXT | STRING | ;
antlr4 CSVLexer.g4
antlr4 CSVParser.g4
antlr4-javac CSV* java
antlr4-test CSV file
PreviousPredicados semânticosNext“Ilhas” lexicais

Last updated 3 years ago