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