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;

Last updated