stan-dev / stanc3

The Stan transpiler (from Stan to C++ and beyond).
BSD 3-Clause "New" or "Revised" License
140 stars 44 forks source link

Group multiple declarations into the same AST node #1207

Closed WardBrian closed 2 years ago

WardBrian commented 2 years ago

This closes https://github.com/stan-dev/stan/issues/2610

It does 3 things:

  1. Multiple vardecls like int a, b; are stored in the same AST node, much like in Clang's C++ AST: https://stackoverflow.com/questions/41339220/clang-ast-visitor-for-single-line-multiple-variable-declaration. This saves some memory and allows the following two bullets
  2. As a result, the pretty-printer no longer turns int a, b; into int a; int b; but rather preserves the original syntax. (this is quite a nice benefit, see the test output)
  3. Finally, it resolves the above issue by allowing decls most places a statement was previously specified.

Other than the parsing and pretty-printing changes, all behavior is the same. The MIR works as before, where each item is split into its own vardecl statement.

Submission Checklist

Release notes

The pretty-printer now preserves multiple declarations in one line like int a, b; rather than splitting them into two declarations.

Declarations are now allowed in places they previously would not parse, such as the only statement in the body of an if statement.

Copyright and Licensing

By submitting this pull request, the copyright holder is agreeing to license the submitted work under the BSD 3-clause license (https://opensource.org/licenses/BSD-3-Clause)

rok-cesnovar commented 2 years ago

Yay!