...Sorry, hit the enter button too fast. I've some more to say. :-)
For the Java environment
Xtext is a good choice (historically the predecessor of Langium; both are sharing the same idea/approach).
The main advantage for your requirement is, I guess, that by defining the concrete syntax grammar implicitly a tree data algebra is defined what the parser is using to create the tree representation of a sentence of your language. You may see this as a Concrete Syntax Tree and process it that way.
(Or did I interpret your "CST" wrongly?)