Я думаю, вы хотите знать, как использовать синтаксис перезаписи для создания одиночного числового токена со значением $ c, а не другого дерева? Если это так, вы можете сделать это с
^(WRITE c=expression) -> INT[$c.v] ;
при условии, что INT является типом токена для целых чисел.
Это предполагает, что ваше правило выражения на самом деле вычисляет и возвращает целочисленный результат. Если это не так, и вы хотите знать, как делать постоянное сворачивание, это гораздо более важная тема. Взгляните на пример полинома в коллекции примеров ANTLR; это показывает, как сделать некоторое простое упрощение. Вы, вероятно, могли бы сделать это с помощью средства переписывания дерева, используя правила типа
^('+' a=INT b=INT) -> INT[String.valueOf($a.int+$b.int)] ;