1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-05-30 17:48:12 +00:00

JSSpecCompiler: Add function call canonicalization pass

It simplifies ladders of BinaryOperators nodes in the function call
arguments into nice and neat FunctionCall node. Ladders initially appear
since I do not want to complicate expression parser, so it interprets
`f(a, b, c, d)` as `f "function_call_operator" (a, (b, (c, d))))`.
This commit is contained in:
Dan Klishch 2023-08-18 13:12:53 -04:00 committed by Andrew Kaster
parent 1c4cd34320
commit 72794e7843
4 changed files with 71 additions and 2 deletions

View file

@ -9,12 +9,16 @@
#include <LibMain/Main.h>
#include <LibXML/Parser/Parser.h>
#include "Compiler/FunctionCallCanonicalizationPass.h"
#include "Function.h"
#include "Parser/SpecParser.h"
ErrorOr<int> serenity_main(Main::Arguments)
{
using namespace JSSpecCompiler;
ExecutionContext context;
auto input = TRY(TRY(Core::File::standard_input())->read_until_eof());
XML::Parser parser { StringView(input.bytes()) };
@ -30,8 +34,12 @@ ErrorOr<int> serenity_main(Main::Arguments)
outln("{}", maybe_function.error()->to_string());
return 1;
}
auto function = maybe_function.value();
auto spec_function = maybe_function.value();
out("{}", function.m_algorithm.m_tree);
auto function = make_ref_counted<JSSpecCompiler::Function>(&context, spec_function.m_name, spec_function.m_algorithm.m_tree);
FunctionCallCanonicalizationPass(function).run();
out("{}", function->m_ast);
return 0;
}