Predicados semânticos
Em ANTLR4 é possível utilizar informação semântica (expressa na linguagem destino e injetada na gramática), para orientar o analisador sintáctico.
Essa funcionalidade chama-se predicados semânticos: {...}?
Os predicados semânticos permitem seletivamente activar/desactivar porções das regras gramaticais durante a própria análise sintáctica
Vamos, como exemplo, desenvolver uma gramática para analisar sequências de números inteiros, mas em que o primeiro número não pertence à sequência, mas indica sim a dimensão da sequência:
Assim a lista 2 4 1 3 5 6 7 indicaria duas sequências: (4,1) (5,6,7)
Exemplo 1
grammar Seq;
all: sequence* EOF;
sequence: INT number;
numbers: INT*;
INT: [0-9]+;
WS: [ \t\r\n]+ -> skip;
Com esta gramática, a árvore sintáctica gerada para a entrada 2 4 1 3 5 6 7 é:

Exemplo 2
grammar Seq;
all: sequence* EOF;
sequence
@init { System.out.print("("); }
@after { System.out.println(")"); }
: INT numbers[$INT.int];
numbers[int count] locals [int c = 0]
: ( {$c < $count}? INT
{$c++, System.out.print(($c == 1 ? "" : " ")+$INT.text):}
)* ;
INT: [0-9]+;
WS: [ \t\r\n]+ -> skip;
Agora a árvore sintáctica já corresponde ao pretendido:

Last updated