добавление (…) {…} литералов функций при воздержании от возврата
Составляя ответ, найденный в Как иметь как вызовы функций, так и группировку в скобках без возврата назад, Я хотел бы добавить функциональные литералы, которые не являются средствами LL (*), реализованными как
...
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*)
;
То, что я хотел бы сделать, это разрешить литералам анонимных функций, которые имеют список аргументов (например,()
или(a)
или(a, b, c)
) сопровождаемыйcompound_stmt
. Так(a, b, c){...}
хороший. Но(x)(y){}
не так много. (Конечно(x) * (y){}
"действителен" с точки зрения синтаксического анализатора, так же как((y){})()[1].x
было бы.