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

SyntaxDescription

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

Last updated