Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[RFC007] Migrate the parser to the new AST #2083

Draft
wants to merge 18 commits into
base: master
Choose a base branch
from
Draft

Conversation

yannham
Copy link
Member

@yannham yannham commented Oct 29, 2024

WIP. Following the step by step implementation of RFC07, this PR migrates the parser to output the new AST, The plan is to convert this to the old AST for the remaining of the pipeline (typechecking, transformations, and evaluation), and to measure if that conversion is noticeable on various type of examples (small, big, small but importing big contracts, libraries, etc.)

Copy link
Contributor

github-actions bot commented Nov 20, 2024

Instead of elaborating piecewise definitions (such as `{foo.bar = 1,
foo.baz = 2}`) directly at the parsing stage, this commit makes the new
AST closer to the source language by making record a list of field
definition, where the field "name" can be a sequence of identifiers and
strings. This representation is used internally by the parser; we now
make it the default in the AST, such that the migration of the parser
won't have to do this elaboration at all. The elaboration is offloaded
to the conversion to `RichTerm`, which happens in the `ast::compat`
module.

This makes the AST closer to the source language.

The first motivation is that it'll be better for the LSP, where some
open issues on the tracker are caused by the inability to trace what the
LSP get back to the original piecewise definitions.

The second reason is that we can't actually elaborate a piecewise
definition while staying in the new AST correctly as of today: the new
AST only has one record variant, which is recursive by default, but this
doesn't match the way recursion and scoping work for piecewise
definition. For example, `{foo.bar = 1, baz.foo = foo + 1}` works fine
in today's Nickel (evaluate to `{foo = {bar = 1}, baz {foo = 2}}`), but
if we elaborate it in the new AST naively, we'll get an infinite
recursion: `{foo = {bar = 1}, baz = {foo = foo + 1}}`.

Mailine Nickel currently uses a non recursive `Record` for that, but we
don't want to introduce such "runtime dictionary" in the new AST as they
can't be expressed in the source language. Instead, we rather keep
record as defined piecewise and will do further elaboration when needed,
during typechecking, future compilation, or in the meantime when
converting the new AST representation to mainline Nickel.
First stab at making the parser compatible with the new AST
representation (`bytecode::ast::Ast`). This is a heavy
refactoring which required to update most of `parser::uniterm` and
`parser::utils` as well as `grammar.lalrpop`.

The current version is far from compiling; fixing compiler errors is
planned in follow-up work.
As we move toward a bytecode compiler and a bytecode virtual machine, we
are replacing the left part of the pipeline with the new AST
representation.

The bytecode module was previously gated by an experimental feature,
thea idea being that this feature would enable the whole bytcode
compiler pipeline. However, for now, we only have a new AST
representation, and it's being used in the mainline Nickel parser (and
soon, in the typechecker, etc.). Thus we need access to the new AST
representation by default, and it doesn't make much sense to gate it
behind a feature.

We'll reintroduce the feature once we have a prototype compiler and a
bytecode virtual machine, when it will then make sense to use the
feature to toggle between the legacy tree-walking interpreter and the
new bytecode compiler.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

1 participant