Skip to content

Commit

Permalink
[compiler]: compile match expr
Browse files Browse the repository at this point in the history
  • Loading branch information
muqiuhan committed Apr 16, 2024
1 parent d7b4a77 commit f362efa
Show file tree
Hide file tree
Showing 42 changed files with 458 additions and 359 deletions.
2 changes: 1 addition & 1 deletion FAQ
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
libparser.so: undefined reference to `yy::parser::parse()'
---------------
The error message like this:
*/ld: build/linux/x86_64/release/libparser.so: undefined reference to `yy::parser::parse()'
*/ld: build/linux/x86_64/release/libparser.so: undefined reference to `yy::parser::Parse()'
*/ld: build/linux/x86_64/release/libparser.so: undefined reference to `yy::parser::~parser()'
*/ld: build/linux/x86_64/release/libparser.so: undefined reference to `Program'
*/ld: build/linux/x86_64/release/libparser.so: undefined reference to `yy::parser::parser()'
Expand Down
2 changes: 1 addition & 1 deletion README
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ To build and run with xmake:
Features
----------
o- Typechecking
o- Pattern match
o- Pattern Match
o- Garbage Collection
o- Polymorphism

Expand Down
6 changes: 3 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ data Bool = [ True, False ]
data List = [ Nil, Cons Int List ]
let main(argv) = {
match argv with {
Match argv with {
| True => { 0 }
| Nil => { 1 }
}
Expand All @@ -62,7 +62,7 @@ let main(argv) = {
data List = [ Nil, Cons Int List ]
let main(argv) = {
match argv with {
Match argv with {
| Nil => { 0 }
| Cons x xs => { 0 }
}
Expand Down Expand Up @@ -93,7 +93,7 @@ let main(argv) = {
- [Finite-state machine](https://en.wikipedia.org/wiki/Finite-state_machine)
- [Implementing Fun tional Languages: a tutorial](https://www.microsoft.com/en-us/research/wp-content/uploads/1992/01/student.pdf)
- [The G-machine: A fast, graph-reduction evaluator](https://link.springer.com/chapter/10.1007/3-540-15975-4_50)
- [Panic better using modern C++](https://buildingblock.ai/panic)
- [Panic better using modern C++](https://buildingblock.ai/Panic)
- [Hindley–Milner type system](https://en.wikipedia.org/wiki/Hindley%E2%80%93Milner_type_system)
- [Unification](https://en.wikipedia.org/wiki/Unification_(computer_science))
- [Compiling a Functional Language Using C++](https://danilafe.com/blog/00_compiler_intro/)
Expand Down
1 change: 1 addition & 0 deletions base/base.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
void a() {}
Empty file removed base/stdlib.cpp
Empty file.
6 changes: 3 additions & 3 deletions build.ninja
Original file line number Diff line number Diff line change
Expand Up @@ -91,7 +91,7 @@ build build/.objs/swi/linux/x86_64/debug/repl/main.cpp.o: cxx repl/main.cpp

# build target: swc
build swc: phony build/linux/x86_64/debug/swc
build build/linux/x86_64/debug/swc: ld build/.objs/swc/linux/x86_64/debug/compiler/compiler.cpp.o build/.objs/swc/linux/x86_64/debug/compiler/ast/ast.cpp.o build/.objs/swc/linux/x86_64/debug/compiler/ast/dump.cpp.o build/.objs/swc/linux/x86_64/debug/compiler/ast/g-machine.cpp.o build/.objs/swc/linux/x86_64/debug/compiler/ast/type.cpp.o build/.objs/swc/linux/x86_64/debug/compiler/diagnostics/reporter.cpp.o build/.objs/swc/linux/x86_64/debug/compiler/diagnostics/utils.cpp.o build/.objs/swc/linux/x86_64/debug/compiler/diagnostics/diagnostics.cpp.o build/.objs/swc/linux/x86_64/debug/compiler/g-machine/binop.cpp.o build/.objs/swc/linux/x86_64/debug/compiler/g-machine/environment.cpp.o build/.objs/swc/linux/x86_64/debug/compiler/g-machine/instruction.cpp.o build/.objs/swc/linux/x86_64/debug/compiler/lexer/lexer.cpp.o build/.objs/swc/linux/x86_64/debug/compiler/lexer/flex_lexer.cpp.o build/.objs/swc/linux/x86_64/debug/compiler/parser/parser.cpp.o build/.objs/swc/linux/x86_64/debug/compiler/parser/bison_parser.cpp.o build/.objs/swc/linux/x86_64/debug/compiler/type/dump.cpp.o build/.objs/swc/linux/x86_64/debug/compiler/type/environment.cpp.o build/.objs/swc/linux/x86_64/debug/compiler/type/type.cpp.o || $
build build/linux/x86_64/debug/swc: ld build/.objs/swc/linux/x86_64/debug/compiler/compiler.cpp.o build/.objs/swc/linux/x86_64/debug/compiler/ast/ast.cpp.o build/.objs/swc/linux/x86_64/debug/compiler/ast/Dump.cpp.o build/.objs/swc/linux/x86_64/debug/compiler/ast/g-machine.cpp.o build/.objs/swc/linux/x86_64/debug/compiler/ast/type.cpp.o build/.objs/swc/linux/x86_64/debug/compiler/diagnostics/reporter.cpp.o build/.objs/swc/linux/x86_64/debug/compiler/diagnostics/utils.cpp.o build/.objs/swc/linux/x86_64/debug/compiler/diagnostics/diagnostics.cpp.o build/.objs/swc/linux/x86_64/debug/compiler/g-machine/binop.cpp.o build/.objs/swc/linux/x86_64/debug/compiler/g-machine/environment.cpp.o build/.objs/swc/linux/x86_64/debug/compiler/g-machine/instruction.cpp.o build/.objs/swc/linux/x86_64/debug/compiler/lexer/lexer.cpp.o build/.objs/swc/linux/x86_64/debug/compiler/lexer/flex_lexer.cpp.o build/.objs/swc/linux/x86_64/debug/compiler/parser/parser.cpp.o build/.objs/swc/linux/x86_64/debug/compiler/parser/bison_parser.cpp.o build/.objs/swc/linux/x86_64/debug/compiler/type/Dump.cpp.o build/.objs/swc/linux/x86_64/debug/compiler/type/environment.cpp.o build/.objs/swc/linux/x86_64/debug/compiler/type/type.cpp.o || $
build/linux/x86_64/debug/libstdlib.so
ARGS = -m64 -Lbuild/linux/x86_64/debug -Wl,-rpath=$ORIGIN -lc++ -lstdlib

Expand All @@ -101,7 +101,7 @@ build build/.objs/swc/linux/x86_64/debug/compiler/compiler.cpp.o: cxx compiler/c
build build/.objs/swc/linux/x86_64/debug/compiler/ast/ast.cpp.o: cxx compiler/ast/ast.cpp
ARGS = -m64 -g -O0 -std=c++20 -Icompiler -Icompiler/ast -Icompiler/type -Icompiler/lexer -Icompiler/parser -Icompiler/diagnostics -Icompiler/utils

build build/.objs/swc/linux/x86_64/debug/compiler/ast/dump.cpp.o: cxx compiler/ast/dump.cpp
build build/.objs/swc/linux/x86_64/debug/compiler/ast/Dump.cpp.o: cxx compiler/ast/Dump.cpp
ARGS = -m64 -g -O0 -std=c++20 -Icompiler -Icompiler/ast -Icompiler/type -Icompiler/lexer -Icompiler/parser -Icompiler/diagnostics -Icompiler/utils

build build/.objs/swc/linux/x86_64/debug/compiler/ast/g-machine.cpp.o: cxx compiler/ast/g-machine.cpp
Expand Down Expand Up @@ -140,7 +140,7 @@ build build/.objs/swc/linux/x86_64/debug/compiler/parser/parser.cpp.o: cxx compi
build build/.objs/swc/linux/x86_64/debug/compiler/parser/bison_parser.cpp.o: cxx compiler/parser/bison_parser.cpp
ARGS = -m64 -g -O0 -std=c++20 -Icompiler -Icompiler/ast -Icompiler/type -Icompiler/lexer -Icompiler/parser -Icompiler/diagnostics -Icompiler/utils

build build/.objs/swc/linux/x86_64/debug/compiler/type/dump.cpp.o: cxx compiler/type/dump.cpp
build build/.objs/swc/linux/x86_64/debug/compiler/type/Dump.cpp.o: cxx compiler/type/Dump.cpp
ARGS = -m64 -g -O0 -std=c++20 -Icompiler -Icompiler/ast -Icompiler/type -Icompiler/lexer -Icompiler/parser -Icompiler/diagnostics -Icompiler/utils

build build/.objs/swc/linux/x86_64/debug/compiler/type/environment.cpp.o: cxx compiler/type/environment.cpp
Expand Down
26 changes: 15 additions & 11 deletions compiler/ast/ast.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ using namespace swallow::compiler::utils;

namespace swallow::compiler::ast
{
auto Binop::operatorsToString(const utils::Binop op) noexcept -> std::string
auto Binop::OperatorToString(utils::Binop op) noexcept -> std::string
{
switch (op)
{
Expand All @@ -52,10 +52,10 @@ namespace swallow::compiler::ast
return {"/"};
}

utils::panic("operatorsToString failed!!!");
utils::Panic("OperatorToString failed!!!");
}

void dump(const std::vector<Definition::Ptr> &Program) noexcept
void Dump(const std::vector<Definition::Ptr> &Program) noexcept
{
for (const auto &definition : Program)
{
Expand All @@ -67,14 +67,15 @@ namespace swallow::compiler::ast
std::cout << " " << param;

std::cout << ":" << '\n';
fn->Body->dump(1, std::cout);
fn->Body->Dump(1, std::cout);
}
}

} // namespace swallow::compiler::ast

namespace swallow::compiler::type
{
void typecheck(const std::vector<ast::Definition::Ptr> &program) noexcept
void TypeCheck(const std::vector<ast::Definition::Ptr> &program) noexcept
{
Manager typeManager;
Environment typeEnvironment;
Expand All @@ -83,15 +84,18 @@ namespace swallow::compiler::type
auto binopType = Type::Ptr(
new Arrow(intType, Type::Ptr(new type::Arrow(intType, intType))));

typeEnvironment.bind("+", binopType);
typeEnvironment.bind("-", binopType);
typeEnvironment.bind("*", binopType);
typeEnvironment.bind("/", binopType);
typeEnvironment.Bind("+", binopType);
typeEnvironment.Bind("-", binopType);
typeEnvironment.Bind("*", binopType);
typeEnvironment.Bind("/", binopType);

for (const auto &definition : program)
definition->PreScanTypes(typeManager, typeEnvironment);

for (const auto &definition : program)
definition->scanDefinitionType(typeManager, typeEnvironment);
definition->TypeCheck(typeManager, typeEnvironment);

for (const auto &definition : program)
definition->typecheck(typeManager, typeEnvironment);
definition->Resolve(typeManager);
}
} // namespace swallow::compiler::type
Loading

0 comments on commit f362efa

Please sign in to comment.