adicionando (…) {…} literais de função enquanto se abstém de retroceder
Construindo a resposta encontrada emComo ter chamadas de função e agrupamento entre parênteses sem voltar atrás, Eu gostaria de adicionar literais de função que estão em um meio não LL (*) implementado como
...
tokens {
...
FN;
ID_LIST;
}
stmt
: expr SEMI // SEMI=';'
;
callable
: ...
| fn
;
fn
: OPAREN opt_id_list CPAREN compound_stmt
-> ^(FN opt_id_list compound_stmt)
;
compound_stmt
: OBRACE stmt* CBRACE
opt_id_list
: (ID (COMMA ID)*)? -> ^(ID_LIST ID*)
;
O que eu gostaria de fazer é permitir literais de função anônimos que tenham uma lista de argumentos (por exemplo,()
ou(a)
ou(a, b, c)
) seguido de umcompound_stmt
. assim(a, b, c){...}
é bom. Mas(x)(y){}
não muito. (Claro(x) * (y){}
é "válido" em termos do analisador, assim como((y){})()[1].x
seria.)