mirror of
https://github.com/RGBCube/serenity
synced 2025-05-25 15:35:06 +00:00
JSSpecCompiler: Introduce Function and ExecutionContext classes
Currently, they are not extremely useful, but the plan is to store all function-local state in JSSpecCompiler::Function and all "translation unit" state in ExecutionContext.
This commit is contained in:
parent
f05d291b41
commit
cd8f4aaa7d
9 changed files with 74 additions and 9 deletions
|
@ -312,11 +312,11 @@ protected:
|
||||||
class FunctionPointer : public Node {
|
class FunctionPointer : public Node {
|
||||||
public:
|
public:
|
||||||
FunctionPointer(StringView function_name)
|
FunctionPointer(StringView function_name)
|
||||||
: m_function_name(function_name)
|
: m_function(function_name)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
StringView m_function_name;
|
Variant<StringView, FunctionRef> m_function;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void dump_tree(StringBuilder& builder) override;
|
void dump_tree(StringBuilder& builder) override;
|
||||||
|
|
|
@ -8,6 +8,7 @@
|
||||||
#include <AK/TemporaryChange.h>
|
#include <AK/TemporaryChange.h>
|
||||||
|
|
||||||
#include "AST/AST.h"
|
#include "AST/AST.h"
|
||||||
|
#include "Function.h"
|
||||||
|
|
||||||
namespace JSSpecCompiler {
|
namespace JSSpecCompiler {
|
||||||
|
|
||||||
|
@ -131,7 +132,13 @@ void Variable::dump_tree(StringBuilder& builder)
|
||||||
|
|
||||||
void FunctionPointer::dump_tree(StringBuilder& builder)
|
void FunctionPointer::dump_tree(StringBuilder& builder)
|
||||||
{
|
{
|
||||||
dump_node(builder, "Func {}", m_function_name);
|
m_function.visit(
|
||||||
|
[&](StringView name) {
|
||||||
|
dump_node(builder, "Func external \"{}\"", name);
|
||||||
|
},
|
||||||
|
[&](FunctionRef function) {
|
||||||
|
dump_node(builder, "Func local \"{}\"", function->m_name);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,6 +5,7 @@ set(SOURCES
|
||||||
Parser/SpecParser.cpp
|
Parser/SpecParser.cpp
|
||||||
Parser/TextParser.cpp
|
Parser/TextParser.cpp
|
||||||
Parser/XMLUtils.cpp
|
Parser/XMLUtils.cpp
|
||||||
|
Function.cpp
|
||||||
main.cpp
|
main.cpp
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
@ -35,6 +35,7 @@ class FunctionCall;
|
||||||
class SlotName;
|
class SlotName;
|
||||||
class Variable;
|
class Variable;
|
||||||
class FunctionPointer;
|
class FunctionPointer;
|
||||||
|
using FunctionPointerRef = NonnullRefPtr<FunctionPointer>;
|
||||||
|
|
||||||
// Parser/SpecParser.h
|
// Parser/SpecParser.h
|
||||||
class AlgorithmStep;
|
class AlgorithmStep;
|
||||||
|
@ -42,4 +43,9 @@ class AlgorithmStepList;
|
||||||
class Algorithm;
|
class Algorithm;
|
||||||
class SpecFunction;
|
class SpecFunction;
|
||||||
|
|
||||||
|
// Function.h
|
||||||
|
class ExecutionContext;
|
||||||
|
class Function;
|
||||||
|
using FunctionRef = Function*;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
19
Meta/Lagom/Tools/CodeGenerators/JSSpecCompiler/Function.cpp
Normal file
19
Meta/Lagom/Tools/CodeGenerators/JSSpecCompiler/Function.cpp
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2023, Dan Klishch <danilklishch@gmail.com>
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: BSD-2-Clause
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "Function.h"
|
||||||
|
#include "AST/AST.h"
|
||||||
|
|
||||||
|
namespace JSSpecCompiler {
|
||||||
|
|
||||||
|
Function::Function(ExecutionContext* context, StringView name, Tree ast)
|
||||||
|
: m_context(context)
|
||||||
|
, m_name(name)
|
||||||
|
, m_ast(move(ast))
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
32
Meta/Lagom/Tools/CodeGenerators/JSSpecCompiler/Function.h
Normal file
32
Meta/Lagom/Tools/CodeGenerators/JSSpecCompiler/Function.h
Normal file
|
@ -0,0 +1,32 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2023, Dan Klishch <danilklishch@gmail.com>
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: BSD-2-Clause
|
||||||
|
*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <AK/HashMap.h>
|
||||||
|
#include <AK/RefCounted.h>
|
||||||
|
#include <AK/RefPtr.h>
|
||||||
|
#include <AK/StringView.h>
|
||||||
|
|
||||||
|
#include "Forward.h"
|
||||||
|
|
||||||
|
namespace JSSpecCompiler {
|
||||||
|
|
||||||
|
class ExecutionContext {
|
||||||
|
public:
|
||||||
|
HashMap<StringView, FunctionPointerRef> m_functions;
|
||||||
|
};
|
||||||
|
|
||||||
|
class Function : public RefCounted<Function> {
|
||||||
|
public:
|
||||||
|
Function(ExecutionContext* context, StringView name, Tree ast);
|
||||||
|
|
||||||
|
ExecutionContext* m_context;
|
||||||
|
StringView m_name;
|
||||||
|
Tree m_ast;
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
|
@ -103,11 +103,11 @@ ParseErrorOr<Algorithm> Algorithm::create(XML::Node const* node)
|
||||||
return algorithm;
|
return algorithm;
|
||||||
}
|
}
|
||||||
|
|
||||||
ParseErrorOr<Function> Function::create(XML::Node const* element)
|
ParseErrorOr<SpecFunction> SpecFunction::create(XML::Node const* element)
|
||||||
{
|
{
|
||||||
VERIFY(element->as_element().name == tag_emu_clause);
|
VERIFY(element->as_element().name == tag_emu_clause);
|
||||||
|
|
||||||
Function result;
|
SpecFunction result;
|
||||||
result.m_id = TRY(get_attribute_by_name(element, attribute_id));
|
result.m_id = TRY(get_attribute_by_name(element, attribute_id));
|
||||||
result.m_name = TRY(get_attribute_by_name(element, attribute_aoid));
|
result.m_name = TRY(get_attribute_by_name(element, attribute_aoid));
|
||||||
|
|
||||||
|
@ -156,7 +156,7 @@ ParseErrorOr<Function> Function::create(XML::Node const* element)
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
ParseErrorOr<void> Function::parse_definition(XML::Node const* element)
|
ParseErrorOr<void> SpecFunction::parse_definition(XML::Node const* element)
|
||||||
{
|
{
|
||||||
auto tokens = TRY(tokenize_tree(element));
|
auto tokens = TRY(tokenize_tree(element));
|
||||||
TextParser parser(tokens.tokens, element);
|
TextParser parser(tokens.tokens, element);
|
||||||
|
|
|
@ -40,13 +40,13 @@ public:
|
||||||
Tree m_tree = error_tree;
|
Tree m_tree = error_tree;
|
||||||
};
|
};
|
||||||
|
|
||||||
class Function {
|
class SpecFunction {
|
||||||
public:
|
public:
|
||||||
struct Argument {
|
struct Argument {
|
||||||
StringView name;
|
StringView name;
|
||||||
};
|
};
|
||||||
|
|
||||||
static ParseErrorOr<Function> create(XML::Node const* element);
|
static ParseErrorOr<SpecFunction> create(XML::Node const* element);
|
||||||
|
|
||||||
ParseErrorOr<void> parse_definition(XML::Node const* element);
|
ParseErrorOr<void> parse_definition(XML::Node const* element);
|
||||||
|
|
||||||
|
|
|
@ -25,7 +25,7 @@ ErrorOr<int> serenity_main(Main::Arguments)
|
||||||
}
|
}
|
||||||
auto document = maybe_document.release_value();
|
auto document = maybe_document.release_value();
|
||||||
|
|
||||||
auto maybe_function = JSSpecCompiler::Function::create(&document.root());
|
auto maybe_function = JSSpecCompiler::SpecFunction::create(&document.root());
|
||||||
if (maybe_function.is_error()) {
|
if (maybe_function.is_error()) {
|
||||||
outln("{}", maybe_function.error()->to_string());
|
outln("{}", maybe_function.error()->to_string());
|
||||||
return 1;
|
return 1;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue