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
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 |
Last updated