Вы бы не определяли массив как токен (правило лексера), а скорее как правило парсера. И вы бы не ставили строки, целые числа и т. Д. c. в массиве, а скорее выражения (которые могут соответствовать строкам, целым числам и т. д. c.):
array
: '[' ( expression ( ',' expression )* )? ']'
;
expression
: expression ( '*' | '/' ) expression
| expression ( '+' | '-' ) expression
| ... all other kind of expressions ...
| STRING
| BOOLEAN
| INTEGER
| DOUBLE
| array
;
Таким образом, array
будет соответствовать следующим вещам:
["text", 42, false, 1 + 2 * 3, [1, 2, 3]]