Regras sintácticas

Construção de regras: síntese

SyntaxDescription

r: ...;

Define rule r

x

Match rule element x

x y ... z

Match a sequence of rule elements

(...)

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 | ... | z

Multiple alternatives

Regras sintácticas: movendo informação

Em ANTRL4 cada regra sintáctica pode ser vista como uma espécie de método, podendo-se havendo mecanismos de comunicação similares: argumentos e resultado, assim como variáveis locais à regra.

Podemos também anotar regras com um nome alternativo:

expr: el = expr '+' e2 = expr
    | INT;

Podemos também etiquetar com nomes, diferentes alternativas duma regra:

expr: expr ’*’ e2=expr # ExprMul t
    | expr ’+’ e2=expr # ExprAdd
    | INT # ExprInt
    ;

O ANTLR4 irá gerar informação de contexto para cada nome (incluindo métodos para usar no listener e/ou nos visitors).

grammar Info;

@header {
import static java.lang.System.*;
}

main: seq1 = seq[true] seq2=seq[false] {
        out.println("average(seq1): " + $seq1.average);
        out.println("average(seq2): " + $seq2.average);
    }
    ;

seq[boolean crash] returns[double average=0]
        locals[int sum=0, int count=0]: '(' (INT ($sum+=$INT, int; $count++;))* ')' {
                if($count > 0)
                        $average = (double) $sum/$count;
                else if ($crash) {
                        err.println("ERROR: divide by zero !");
                        exit(1);
                }
        }
        ;
INT: [0-9]+;
WS: [ \t\r\n]+ -> skip;

Last updated