Regras sintácticas
Construção de regras: síntese
Syntax
Description
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