The demangler had no concept of operator precendence, and would parenthesize many more subexpressions than necessary. In particular it would parenthesize primary-expressions, such as '4', which just looks strange. It would also parenthesize '>' expressions, just in case they were inside a template parameter list.
This patch fixes both issues.
- Add operator precedence to the OpInfo structure, and add a subexpression helper that will parenthesize a lower precedence subexpression.
- Add a 'greater-than is greater-than' indicator to the output buffer, so the expression printer knows whether it is immediately inside a template parameter list (and must therefore parenthesize 'expr > expr'). This is a counter, so that ...
- Add open and close printers to the output buffer, that increment and decrement the gt-is-gt indicator.
- Parenthesize comma operators inside comma-separated lists. (probably a rare case, but still).
This dramatically reduces the extraneous parentheses being printed.
Nice!