diff options
| author | Amlal El Mahrouss <amlal@nekernel.org> | 2026-01-13 22:31:13 +0100 |
|---|---|---|
| committer | Amlal El Mahrouss <amlal@nekernel.org> | 2026-01-13 22:31:13 +0100 |
| commit | 4449344b1743f87af4a224a81d9b482264cfa253 (patch) | |
| tree | 14d383e7da29e6b499e7c9dd606d22c3ac66063c | |
| parent | 68dcaf3c8909ae09e2197a069f0fb84cfd4a5444 (diff) | |
chore: language frontend improvements and stdlib development
in-progress.
Signed-off-by: Amlal El Mahrouss <amlal@nekernel.org>
21 files changed, 82 insertions, 546 deletions
diff --git a/doc/specs/NECTAR_LANG.md b/doc/specs/NECTAR_LANG.md index cdb760f..736f455 100644 --- a/doc/specs/NECTAR_LANG.md +++ b/doc/specs/NECTAR_LANG.md @@ -6,9 +6,10 @@ =================================== -- ABI: PEF -- Influenced by: C, C++ -- Typing System: Weak +- ABI: PEF based. +- Typing System: Weak. +- Output: NeKernel Assembler. +- Platforms: POSIX, NeKernel, Windows. =================================== @@ -20,7 +21,8 @@ - `*` Unchecked pointer type. - `.` Checked pointer access. - `->` UnChecked pointer access. -- `struct` Plain Old Data data Structure, implement Trees, Heaps, etc.. +- `impl` Implementation data structure, useful for proxies, iterators, etc. +- `struct` Data implementation of `impl` -- useful to store fields and such. - `let` Pointer/Reference variable declaration. - `const` const `let` declaration. diff --git a/include/CompilerKit/AST.h b/include/CompilerKit/AST.h index b991bd0..d586bbc 100644 --- a/include/CompilerKit/AST.h +++ b/include/CompilerKit/AST.h @@ -34,8 +34,9 @@ enum struct KeywordKind { kKeywordKindArgSeparator, kKeywordKindBodyStart, kKeywordKindBodyEnd, - kKeywordKindClass, - kKeywordKindGenerics, + kKeywordKindImpl, + kKeywordKindNew, + kKeywordKindDelete, kKeywordKindPtrAccess, kKeywordKindAccess, kKeywordKindIf, @@ -46,7 +47,7 @@ enum struct KeywordKind { kKeywordKindVariableInc, kKeywordKindConstant, kKeywordKindTypedef, - kKeywordKindEndInstr, + kKeywordKindEndLine, // Optional in Nectar. kKeywordKindSpecifier, kKeywordKindInvalid, kKeywordKindReturn, diff --git a/include/LibGL/iterator.nhh b/include/GenericsLibrary/iterator.nhh index a038421..13db042 100644 --- a/include/LibGL/iterator.nhh +++ b/include/GenericsLibrary/iterator.nhh @@ -6,7 +6,7 @@ #ifndef NECTAR_LIBNECTAR_ITERATOR_NHH #define NECTAR_LIBNECTAR_ITERATOR_NHH -struct iterator_traits +impl iterator_traits { let begin(let it) { diff --git a/include/LibGL/iostream.nhh b/include/GenericsLibrary/ostream.nhh index 9e14174..6561f80 100644 --- a/include/LibGL/iostream.nhh +++ b/include/GenericsLibrary/ostream.nhh @@ -6,18 +6,25 @@ #ifndef NECTAR_LIBNECTAR_IOSTREAM_NHH #define NECTAR_LIBNECTAR_IOSTREAM_NHH -import printf, scanf; +#include <GenericsLibrary/iterator.nhh> -struct ostream +impl ostream { + let write(let data, let size) { - return nil; + let fd_ := __fd(); + let written := __write(fd_, data, size); + + return written; } let read(let region, let size) { - return nil; + let fd_ := __fd(); + let readen := __read(fd_, data, size); + + return readen; } }; diff --git a/include/LibNectarCore/.gitignore b/include/LibNectarCore/.gitignore deleted file mode 100644 index e3f10ea..0000000 --- a/include/LibNectarCore/.gitignore +++ /dev/null @@ -1 +0,0 @@ -libc++/ diff --git a/include/LibNectarCore/__abi.h b/include/LibNectarCore/__abi.h deleted file mode 100644 index a35639d..0000000 --- a/include/LibNectarCore/__abi.h +++ /dev/null @@ -1,24 +0,0 @@ -// Copyright 2024-2025, Amlal El Mahrouss (amlal@nekernel.org) -// Licensed under the Apache License, Version 2.0 (See accompanying -// file LICENSE or copy at http://www.apache.org/licenses/LICENSE-2.0) -// Official repository: https://github.com/nekernel-org/nectar - -#ifndef NECTAR_LIBNECTAR_ABI_H -#define NECTAR_LIBNECTAR_ABI_H - -#include <LibNectarCore/base_process.h> -#include <LibNectarCore/defines.h> - -__init_decl() - - static constexpr int32_t __unreachable_code = 34; - -inline void __compilerkit_unreachable(void) { - signal(__unreachable_code); - - while (1); -} - -__fini_decl() - -#endif // NECTAR_LIBNECTAR_ABI_H diff --git a/include/LibNectarCore/__power64.inc b/include/LibNectarCore/__power64.inc deleted file mode 100644 index 8b65ad7..0000000 --- a/include/LibNectarCore/__power64.inc +++ /dev/null @@ -1,40 +0,0 @@ -# Path: LibC++/__power64.inc -# Language: CompilerKit POWER Assembly support for GNU. -# Build Date: 2024-6-4 - -#ifdef __NECTAR__ - -#ifdef __ASSEMBLER__ - -#define lda li -#define sta stw -#define ldw li - -#define r0 0 -#define r1 1 -#define r2 2 -#define r3 3 -#define r4 4 -#define r5 5 -#define r6 6 -#define r7 7 -#define r8 8 -#define r9 9 -#define r10 10 -#define r11 11 -#define r12 12 -#define r13 13 -#define r14 14 -#define r15 15 -#define r16 16 -#define r17 17 -#define r18 18 -#define r19 19 -#define r20 20 - -#define nop mr 0, 0 - -#endif - -#endif - diff --git a/include/LibNectarCore/base_alloc.h b/include/LibNectarCore/base_alloc.h deleted file mode 100644 index e68efdb..0000000 --- a/include/LibNectarCore/base_alloc.h +++ /dev/null @@ -1,43 +0,0 @@ -// Copyright 2024-2025, Amlal El Mahrouss (amlal@nekernel.org) -// Licensed under the Apache License, Version 2.0 (See accompanying -// file LICENSE or copy at http://www.apache.org/licenses/LICENSE-2.0) -// Official repository: https://github.com/nekernel-org/nectar - -#ifndef NECTAR_LIBNECTAR_BASE_ALLOC_H -#define NECTAR_LIBNECTAR_BASE_ALLOC_H - -#include <LibNectarCore/defines.h> - -/// @brief allocate a new class. -/// @tparam KindClass the class type to allocate. -template <class KindClass, typename... Args> -inline KindClass* allocate(Args&&... args) { - return new KindClass(forward(args)...); -} - -/// @brief allocate a new class. -/// @note aborts on error. -/// @tparam KindClass the class type to allocate. -template <class KindClass, typename... Args> -inline KindClass* allocate_nothrow(Args&&... args) noexcept { - return allocate(forward(args)...); -} - -/// @brief free a class. -/// @tparam KindClass the class type to allocate. -template <class KindClass> -inline void release(KindClass ptr) { - if (!ptr) return; - - delete ptr; -} - -/// @brief destroy and free a class. -/// @note aborts on error. -/// @tparam KindClass the class type to allocate. -template <class KindClass> -inline void release_nothrow(KindClass ptr) noexcept { - release(ptr); -} - -#endif // NECTAR_LIBNECTAR_BASE_ALLOC_H diff --git a/include/LibNectarCore/base_exception.h b/include/LibNectarCore/base_exception.h deleted file mode 100644 index 992f76f..0000000 --- a/include/LibNectarCore/base_exception.h +++ /dev/null @@ -1,35 +0,0 @@ -// Copyright 2024-2025, Amlal El Mahrouss (amlal@nekernel.org) -// Licensed under the Apache License, Version 2.0 (See accompanying -// file LICENSE or copy at http://www.apache.org/licenses/LICENSE-2.0) -// Official repository: https://github.com/nekernel-org/nectar - -#ifndef NECTAR_LIBCXX_BASE_EXCEPTION_H -#define NECTAR_LIBCXX_BASE_EXCEPTION_H - -#include <LibNectarCore/__abi.h> -#include <LibNectarCore/base_process.h> -#include <LibNectarCore/defines.h> - -/// @author Amlal El Mahrouss (amlal@nekernel.org) - -inline constexpr int __terminate_id = 33; - -/// @note This function is internal, don't call it. -extern void __unwind_object_list(); - -inline void __throw_general(const char* what) { - __unwind_object_list(); - exit(__terminate_id); -} - -inline void __throw_domain_error(const char* what) { - __throw_general(what); - __builtin_unreachable(); // prevent from continuing. -} - -inline void __throw_bad_array_new_length(const char* what) { - __throw_general(what); - __builtin_unreachable(); // prevent from continuing. -} - -#endif // NECTAR_LIBCXX_BASE_EXCEPTION_H diff --git a/include/LibNectarCore/base_math.h b/include/LibNectarCore/base_math.h deleted file mode 100644 index af31764..0000000 --- a/include/LibNectarCore/base_math.h +++ /dev/null @@ -1,98 +0,0 @@ -// Copyright 2024-2025, Amlal El Mahrouss (amlal@nekernel.org) -// Licensed under the Apache License, Version 2.0 (See accompanying -// file LICENSE or copy at http://www.apache.org/licenses/LICENSE-2.0) -// Official repository: https://github.com/nekernel-org/nectar - -#ifndef NECTAR_LIBCXX_BASE_MATH_H -#define NECTAR_LIBCXX_BASE_MATH_H - -#include <LibNectarCore/defines.h> - -#ifndef NAN -#define NAN (__builtin_nanf("")) -#endif // !NAN - -/// @file base_math.h -/// @brief Base Mathematic functions. - -#ifdef __LIBCXX_USE_DOUBLE__ -typedef double real_type; -#else -typedef float real_type; -#endif - -inline constexpr static auto not_a_number = NAN; - -/// =========================================================== /// -/// @brief Power of Exponent function. -/// =========================================================== /// -template <size_t Exponent> -inline real_type pow(real_type in) { - if (Exponent == 0) return 1; // Any number to the power of 0 is 1. - if (Exponent == 1) return in; // Any number to the power of 1 is itself. - - real_type result = 1; - - for (auto i = 0UL; i < Exponent; ++i) result *= in; - - return result; -} - -/// =========================================================== /// -/// @brief Square root function. -/// =========================================================== /// -inline real_type sqrt(real_type in) { - if (in == 0) return 0; - if (in == not_a_number) return not_a_number; - - auto constexpr const static Base = 2; - - auto x = in / Base; - - for (int i = 0; i < 10; ++i) { - x = (x + in / x) / Base; - } - - return x; -} - -/// =========================================================== /// -/// @brief Square of function, with Base template argument. -/// @param of Base argument to find the square of. -/// =========================================================== /// -template <size_t Base> -inline real_type surd(real_type in) { - if (in == 0) return 0; - if (in == 1) return 1; - - if (Base == 1) return in; - if (Base == 2) return sqrt(in); - - return not_a_number; -} - -/// =========================================================== /// -/// @brief Linear interpolation equation solver. -/// @param from where? -/// @param to to? -/// @param Updated diff value according to difference. -/// =========================================================== /// -inline real_type lerp(real_type to, real_type from, real_type stat) { - real_type diff = (to - from); - return from + (diff * stat); -} - -using real_domain = double; - -struct complex_domain final { - double Re; - double Im; -}; - -typename<class Result> using callable_type = Result (*)(size_t n, ...); - -#ifdef __cpp_lib_base_math -#define __cpp_lib_base_math 1 -#endif - -#endif // NECTAR_LIBCXX_BASE_MATH_H diff --git a/include/LibNectarCore/base_process.h b/include/LibNectarCore/base_process.h deleted file mode 100644 index f6fd539..0000000 --- a/include/LibNectarCore/base_process.h +++ /dev/null @@ -1,44 +0,0 @@ -// Copyright 2024-2025, Amlal El Mahrouss (amlal@nekernel.org) -// Licensed under the Apache License, Version 2.0 (See accompanying -// file LICENSE or copy at http://www.apache.org/licenses/LICENSE-2.0) -// Official repository: https://github.com/nekernel-org/nectar - -#ifndef NECTAR_LIBCXX_BASE_PROCESS_H -#define NECTAR_LIBCXX_BASE_PROCESS_H - -#include <LibNectarCore/defines.h> - -__init_decl() - - /// @brief CRT exit, with exit code (!!! exits all threads. !!!) - /// @param code the exit code. - /// @return the return > 0 for non successful. - extern int exit_(int code); - -/// @brief CRT signal handler. -/// @param code the signal code. -extern void signal_(int code); - -extern void (*__atexit_cdecl_ptr)(void); -extern void (**__atexit_lst_ptr)(void); -extern size_t __atexit_lst_cnt; - -__fini_decl() - - inline int signal(int code) { - signal_(code); - return -1; -} - -inline int32_t exit(const int32_t& code) { - for (auto idx = 0UL; idx < __atexit_lst_cnt; ++idx) { - __atexit_lst_ptr[idx](); - } - - if (__atexit_cdecl_ptr) __atexit_cdecl_ptr(); - - exit_(code); - return -1; -} - -#endif // NECTAR_LIBCXX_BASE_PROCESS_H diff --git a/include/LibNectarCore/defines.h b/include/LibNectarCore/defines.h deleted file mode 100644 index 061769c..0000000 --- a/include/LibNectarCore/defines.h +++ /dev/null @@ -1,80 +0,0 @@ -// Copyright 2024-2025, Amlal El Mahrouss (amlal@nekernel.org) -// Licensed under the Apache License, Version 2.0 (See accompanying -// file LICENSE or copy at http://www.apache.org/licenses/LICENSE-2.0) -// Official repository: https://github.com/nekernel-org/nectar - -#ifndef __NECTAR_DEFINES_H__ -#define __NECTAR_DEFINES_H__ - -#define __ATTRIBUTE(X) __attribute__((X)) - -typedef __SIZE_TYPE__ size_t; -typedef __INT64_TYPE__ ssize_t; -typedef __INT32_TYPE__ int32_t; - -typedef void* ptr_type; -typedef __SIZE_TYPE__ size_type; - -typedef __INT64_TYPE__ ptrdiff_t; -typedef size_t uintptr_t; -typedef void* voidptr_t; -typedef void* any_t; -typedef char* caddr_t; - -#ifndef NULL -#define NULL ((voidptr_t) 0) -#endif // !null - -#define __alloca(sz) __ck_alloca(sz) - -#define __deref(ptr) (*(ptr)) - -#ifdef __cplusplus -#define __init_decl() extern "C" { -#define __fini_decl() \ - } \ - ; -#else -#define __init_decl() -#define __fini_decl() -#endif - -#if __has_builtin(__builtin_alloca) -#define alloca(sz) __builtin_alloca(sz) -#ifdef __alloca -#undef __alloca -#endif -#define __alloca alloca -#else -#warning !! alloca not detected !! -#endif - -typedef long long off_t; -typedef unsigned long long uoff_t; - -typedef union float_cast { - struct { - unsigned int mantissa : 23; - unsigned int exponent : 8; - unsigned int sign : 1; - }; - - float f; -} __ATTRIBUTE(packed) float_cast_t; - -typedef union double_cast { - struct { - unsigned long long int mantissa : 52; - unsigned int exponent : 11; - unsigned int sign : 1; - }; - - double f; -} __ATTRIBUTE(packed) double_cast_t; - -namespace std { -struct placement_t; -struct nothrow_t; -} // namespace std - -#endif /* __NECTAR_DEFINES_H__ */ diff --git a/include/LibNectarCore/filesystem.h b/include/LibNectarCore/filesystem.h deleted file mode 100644 index daac4c1..0000000 --- a/include/LibNectarCore/filesystem.h +++ /dev/null @@ -1,18 +0,0 @@ -// Copyright 2024-2025, Amlal El Mahrouss (amlal@nekernel.org) -// Licensed under the Apache License, Version 2.0 (See accompanying -// file LICENSE or copy at http://www.apache.org/licenses/LICENSE-2.0) -// Official repository: https://github.com/nekernel-org/nectar - -#ifndef __NECTAR_FS_H__ -#define __NECTAR_FS_H__ - -class path; -class filesystem_error; -class directory_entry; -class directory_iterator; - -#ifndef __nec_lib_filesystem -#define __nec_lib_filesystem 201703L -#endif - -#endif // __NECTAR_FS_H__ diff --git a/include/LibNectarCore/mkhdrs.sh b/include/LibNectarCore/mkhdrs.sh deleted file mode 100755 index b6b9f75..0000000 --- a/include/LibNectarCore/mkhdrs.sh +++ /dev/null @@ -1,15 +0,0 @@ -#! /bin/sh - -outputDir=libcnec/ - -mkdir -p $outputDir - -for f in *.h; do - -#This line splits the file name on the delimiter "." -baseName=`echo $f | cut -d "." -f 1` - -cp $f $outputDir$baseName - -done - diff --git a/include/LibNectarCore/new.h b/include/LibNectarCore/new.h deleted file mode 100644 index 58ea424..0000000 --- a/include/LibNectarCore/new.h +++ /dev/null @@ -1,65 +0,0 @@ -// Copyright 2024-2025, Amlal El Mahrouss (amlal@nekernel.org) -// Licensed under the Apache License, Version 2.0 (See accompanying -// file LICENSE or copy at http://www.apache.org/licenses/LICENSE-2.0) -// Official repository: https://github.com/nekernel-org/nectar - -#ifndef NECTAR_LIBNECTAR_NEW_H -#define NECTAR_LIBNECTAR_NEW_H - -#include <LibNectarCore/defines.h> - -struct nothrow_t final { - explicit nothrow_t() = default; - ~nothrow_t() = default; -}; - -struct placement_t final { - explicit placement_t() = default; - ~placement_t() = default; - - void* __base{}; - int32_t __align{}; - size_t __size{}; -}; - -// AMLALE: Define the placement_t feature. -#ifndef __nectar_has_placement -#define __nectar_has_placement 1 -#endif - -// AMLALE: Define nothrow -#ifndef __nectar_has_nothrow -#define __nectar_has_nothrow 1 -#endif - -void* operator new(size_t); -void* operator new[](size_t); - -/// \brief placement_t new and delete operators. Governs how the memory shall be placed. -/// \note This is a feature that shall be used wisely, failure to do so will produce Undefined -/// Behaviors at runtime. -void* operator pnew(struct placement_t*); -void operator pdelete(struct placement_t*, void*); - -/// \brief For all offsets within the base range and alignement 'align' -/// \brief Allocate offsets with respect to the `base` interval, apply alignement of `align` value. -/// Return `offsets` of length n as an aligned value within the domain of `base`. -using placeable_callable_type = void* /*offsets*/ (*) (void* base, size_t n, const int& align); - -/// \note This should NOT fail, failure to meet the conditions will cause the program's state to be -/// aborted. -/// \brief Set the placement policy of future memory allocations. -template <class PlaceableCallable> -void set_placement_policy(const PlaceableCallable&) noexcept; - -void* operator new(size_t, const nothrow_t&) noexcept; -void* operator new(size_t, void*) noexcept; -void* operator new[](size_t, const nothrow_t&) noexcept; -void* operator new[](size_t, void*) noexcept; - -void operator delete(void*) noexcept; -void operator delete(void*, size_t) noexcept; - -void operator delete[](void*) noexcept; - -#endif // NECTAR_LIBNECTAR_NEW_H diff --git a/include/LibNectarCore/utility.h b/include/LibNectarCore/utility.h deleted file mode 100644 index 834b1a6..0000000 --- a/include/LibNectarCore/utility.h +++ /dev/null @@ -1,27 +0,0 @@ -// Copyright 2024-2025, Amlal El Mahrouss (amlal@nekernel.org) -// Licensed under the Apache License, Version 2.0 (See accompanying -// file LICENSE or copy at http://www.apache.org/licenses/LICENSE-2.0) -// Official repository: https://github.com/nekernel-org/nectar - -#ifndef LIBNECTAR_UTILITY_H -#define LIBNECTAR_UTILITY_H - -/// @brief Forward object. -/// @tparam Args the object type. -/// @param arg the object. -/// @return object's rvalue -template <typename Args> -inline auto forward(Args& arg) -> Args&& { - return static_cast<const Args&&>(arg); -} - -/// @brief Move object. -/// @tparam Args the object type. -/// @param arg the object. -/// @return object's rvalue -template <typename Args> -inline auto move(Args&& arg) -> Args&& { - return static_cast<Args&&>(arg); -} - -#endif // LIBNECTAR_UTILITY_H diff --git a/src/CompilerKit/src/Compilers/NectarCompiler+AMD64.cc b/src/CompilerKit/src/Compilers/NectarCompiler+AMD64.cc index 825c5c2..64403fe 100644 --- a/src/CompilerKit/src/Compilers/NectarCompiler+AMD64.cc +++ b/src/CompilerKit/src/Compilers/NectarCompiler+AMD64.cc @@ -26,6 +26,7 @@ #include <cstdlib> #include <filesystem> #include <ios> +#include "CompilerKit/Detail/Config.h" /* NeKernel NECTAR Compiler Driver. */ /* This is part of the CompilerKit. */ @@ -311,17 +312,8 @@ CompilerKit::SyntaxLeafList::SyntaxLeaf CompilerFrontendNectarAMD64::Compile( if (text.find(keyword.first.fKeywordName) == CompilerKit::STLString::npos) continue; switch (keyword.first.fKeywordKind) { - case CompilerKit::KeywordKind::kKeywordKindClass: { + case CompilerKit::KeywordKind::kKeywordKindImpl: { ++kOnClassScope; - auto symbol_name_cls = text.substr(text.find(keyword.first.fKeywordName)); - - for (auto& key : symbol_name_cls) { - if (key == ' ') key = '_'; - if (key == ':') key = '$'; - } - - syntax_tree.fUserValue += "public_segment .data64 __NECTAR_" + symbol_name_cls + "\n"; - break; } case CompilerKit::KeywordKind::kKeywordKindIf: { @@ -488,6 +480,16 @@ CompilerKit::SyntaxLeafList::SyntaxLeaf CompilerFrontendNectarAMD64::Compile( break; } + case CompilerKit::KeywordKind::kKeywordKindDelete: { + if (auto pos = syntax_tree.fUserValue.find(keyword.first.fKeywordName); pos != CompilerKit::STLString::npos) + syntax_tree.fUserValue.replace(pos, keyword.first.fKeywordName.size(), "__operator_release"); + continue; + } + case CompilerKit::KeywordKind::kKeywordKindNew: { + if (auto pos = syntax_tree.fUserValue.find(keyword.first.fKeywordName); pos != CompilerKit::STLString::npos) + syntax_tree.fUserValue.replace(pos, keyword.first.fKeywordName.size(), "__operator_retain"); + continue; + } case CompilerKit::KeywordKind::kKeywordKindAccess: case CompilerKit::KeywordKind::kKeywordKindPtrAccess: { CompilerKit::STLString valueOfVar = @@ -549,13 +551,14 @@ CompilerKit::SyntaxLeafList::SyntaxLeaf CompilerFrontendNectarAMD64::Compile( arg += ch; } - if (!nectar_get_variable_ref(nameVar).empty()) + if (!nectar_get_variable_ref(nameVar).empty()) { syntax_tree.fUserValue += - "call " + nectar_get_variable_ref(nameVar) + " offset " + method + "\n"; + "call " + nectar_get_variable_ref(nameVar) + (keyword.first.fKeywordName.ends_with('>') ? " ptr offset " : " offset ") + method + "\n"; + } break; } - case CompilerKit::KeywordKind::kKeywordKindEndInstr: + case CompilerKit::KeywordKind::kKeywordKindEndLine: case CompilerKit::KeywordKind::kKeywordKindVariableInc: case CompilerKit::KeywordKind::kKeywordKindVariableDec: case CompilerKit::KeywordKind::kKeywordKindVariableAssign: { @@ -569,7 +572,7 @@ CompilerKit::SyntaxLeafList::SyntaxLeaf CompilerFrontendNectarAMD64::Compile( } else if (keyword.first.fKeywordKind == CompilerKit::KeywordKind::kKeywordKindVariableAssign) { valueOfVar = text.substr(text.find(keyword.first.fKeywordName) + keyword.first.fKeywordName.size()); - } else if (keyword.first.fKeywordKind == CompilerKit::KeywordKind::kKeywordKindEndInstr) { + } else if (keyword.first.fKeywordKind == CompilerKit::KeywordKind::kKeywordKindEndLine) { break; } @@ -578,7 +581,7 @@ CompilerKit::SyntaxLeafList::SyntaxLeaf CompilerFrontendNectarAMD64::Compile( } while (valueOfVar.find(";") != CompilerKit::STLString::npos && - keyword.first.fKeywordKind != CompilerKit::KeywordKind::kKeywordKindEndInstr) { + keyword.first.fKeywordKind != CompilerKit::KeywordKind::kKeywordKindEndLine) { valueOfVar.erase(valueOfVar.find(";")); } @@ -592,7 +595,7 @@ CompilerKit::SyntaxLeafList::SyntaxLeaf CompilerFrontendNectarAMD64::Compile( } else if (keyword.first.fKeywordKind == CompilerKit::KeywordKind::kKeywordKindVariableAssign) { varName.erase(varName.find(keyword.first.fKeywordName)); - } else if (keyword.first.fKeywordKind == CompilerKit::KeywordKind::kKeywordKindEndInstr) { + } else if (keyword.first.fKeywordKind == CompilerKit::KeywordKind::kKeywordKindEndLine) { varName.erase(varName.find(";")); } @@ -630,7 +633,7 @@ CompilerKit::SyntaxLeafList::SyntaxLeaf CompilerFrontendNectarAMD64::Compile( continue; } - if (keyword.first.fKeywordKind == CompilerKit::KeywordKind::kKeywordKindEndInstr) { + if (keyword.first.fKeywordKind == CompilerKit::KeywordKind::kKeywordKindEndLine) { syntax_tree.fUserValue += "\n"; continue; } @@ -671,14 +674,10 @@ CompilerKit::SyntaxLeafList::SyntaxLeaf CompilerFrontendNectarAMD64::Compile( nectar_allocate_stack_variable(varName); if (valueOfVar.find(".") != CompilerKit::STLString::npos) { - auto value = nectar_get_variable_ref(valueOfVar.substr(0, valueOfVar.find("."))); - value += " offset "; - + auto value = "offset "; valueOfVar.replace(0, valueOfVar.find(".") + 1, value); } else if (valueOfVar.find("->") != CompilerKit::STLString::npos) { - auto value = nectar_get_variable_ref(valueOfVar.substr(0, valueOfVar.find("->"))); - value += " offset "; - + auto value = "ptr offset "; valueOfVar.replace(0, valueOfVar.find("->") + 2, value); } @@ -690,6 +689,9 @@ CompilerKit::SyntaxLeafList::SyntaxLeaf CompilerFrontendNectarAMD64::Compile( break; } + case CompilerKit::KeywordKind::kKeywordKindCommentInline: { + break; + } case CompilerKit::KeywordKind::kKeywordKindReturn: { try { auto pos = text.find("return"); @@ -741,9 +743,8 @@ CompilerKit::SyntaxLeafList::SyntaxLeaf CompilerFrontendNectarAMD64::Compile( CompilerKit::SyntaxLeafList::SyntaxLeaf CompilerFrontendNectarAMD64::CompileLayout( CompilerKit::STLString& text, const CompilerKit::STLString& file, CompilerKit::SyntaxLeafList::SyntaxLeaf& syntax_tree) { - // Handle class entry - if ((text.find("struct") != CompilerKit::STLString::npos)) { - CompilerKit::STLString keyword = "struct"; + if ((text.find("impl") != CompilerKit::STLString::npos)) { + CompilerKit::STLString keyword = "impl"; auto classPos = text.find(keyword) + keyword.length(); auto bracePos = text.find("{"); @@ -1219,7 +1220,7 @@ class AssemblyNectarInterfaceAMD64 final CK_ASSEMBLY_INTERFACE { NECTAR_MODULE(CompilerNectarAMD64) { bool skip = false; - kKeywords.emplace_back("struct", CompilerKit::KeywordKind::kKeywordKindClass); + kKeywords.emplace_back("impl", CompilerKit::KeywordKind::kKeywordKindImpl); kKeywords.emplace_back("{", CompilerKit::KeywordKind::kKeywordKindBodyStart); kKeywords.emplace_back("}", CompilerKit::KeywordKind::kKeywordKindBodyEnd); kKeywords.emplace_back("(", CompilerKit::KeywordKind::kKeywordKindFunctionStart); @@ -1229,11 +1230,16 @@ NECTAR_MODULE(CompilerNectarAMD64) { kKeywords.emplace_back("-=", CompilerKit::KeywordKind::kKeywordKindVariableDec); kKeywords.emplace_back("const", CompilerKit::KeywordKind::kKeywordKindConstant); kKeywords.emplace_back("let", CompilerKit::KeywordKind::kKeywordKindVariable); + kKeywords.emplace_back("retain", CompilerKit::KeywordKind::kKeywordKindNew); + kKeywords.emplace_back("release", CompilerKit::KeywordKind::kKeywordKindDelete); + kKeywords.emplace_back("new", CompilerKit::KeywordKind::kKeywordKindNew); + kKeywords.emplace_back("delete", CompilerKit::KeywordKind::kKeywordKindDelete); kKeywords.emplace_back("->", CompilerKit::KeywordKind::kKeywordKindPtrAccess); kKeywords.emplace_back(".", CompilerKit::KeywordKind::kKeywordKindAccess); kKeywords.emplace_back(",", CompilerKit::KeywordKind::kKeywordKindArgSeparator); - kKeywords.emplace_back(";", CompilerKit::KeywordKind::kKeywordKindEndInstr); + kKeywords.emplace_back(";", CompilerKit::KeywordKind::kKeywordKindEndLine); + kKeywords.emplace_back("//", CompilerKit::KeywordKind::kKeywordKindCommentInline); kKeywords.emplace_back("return", CompilerKit::KeywordKind::kKeywordKindReturn); kKeywords.emplace_back("if", CompilerKit::KeywordKind::kKeywordKindIf); diff --git a/test/test_samples/iostream.ncpp b/test/test_samples/iostream.ncpp deleted file mode 100644 index 9f46fa6..0000000 --- a/test/test_samples/iostream.ncpp +++ /dev/null @@ -1,10 +0,0 @@ -#include "../../include/LibGL/iostream.nhh" - -let main() -{ - let io := iostream{}; - let first_number := io.read_once(); - first_number -= io.read_once(); - - return first_number; -}
\ No newline at end of file diff --git a/test/test_samples/return_value.ncpp b/test/test_samples/return_value.ncpp deleted file mode 100644 index 0144df9..0000000 --- a/test/test_samples/return_value.ncpp +++ /dev/null @@ -1,6 +0,0 @@ - -let main() -{ - let six_seven := 67; - return six_seven; -} diff --git a/test/test_samples/test_ostream.ncpp b/test/test_samples/test_ostream.ncpp new file mode 100644 index 0000000..a89618b --- /dev/null +++ b/test/test_samples/test_ostream.ncpp @@ -0,0 +1,8 @@ +#include <GenericsLibrary/iostream.nhh> + +let main() +{ + let io := ostream{}; + let arr := io.read(0, 0); + return arr[0]; +}
\ No newline at end of file diff --git a/test/test_samples/test_struct.ncpp b/test/test_samples/test_struct.ncpp new file mode 100644 index 0000000..372171e --- /dev/null +++ b/test/test_samples/test_struct.ncpp @@ -0,0 +1,18 @@ +impl ostream +{ + let print_fd_() + { + return 0; + } +}; + +let main() +{ + let io := new; + let first_number := io->print_fd_(); + first_number -= io.print_fd_(); + + io := delete; + + return first_number; +}
\ No newline at end of file |
