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:
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):
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).
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
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