summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorAmlal El Mahrouss <amlal@nekernel.org>2026-01-13 22:31:13 +0100
committerAmlal El Mahrouss <amlal@nekernel.org>2026-01-13 22:31:13 +0100
commit4449344b1743f87af4a224a81d9b482264cfa253 (patch)
tree14d383e7da29e6b499e7c9dd606d22c3ac66063c
parent68dcaf3c8909ae09e2197a069f0fb84cfd4a5444 (diff)
chore: language frontend improvements and stdlib development
in-progress. Signed-off-by: Amlal El Mahrouss <amlal@nekernel.org>
-rw-r--r--doc/specs/NECTAR_LANG.md10
-rw-r--r--include/CompilerKit/AST.h7
-rw-r--r--include/GenericsLibrary/iterator.nhh (renamed from include/LibGL/iterator.nhh)2
-rw-r--r--include/GenericsLibrary/ostream.nhh (renamed from include/LibGL/iostream.nhh)15
-rw-r--r--include/LibNectarCore/.gitignore1
-rw-r--r--include/LibNectarCore/__abi.h24
-rw-r--r--include/LibNectarCore/__power64.inc40
-rw-r--r--include/LibNectarCore/base_alloc.h43
-rw-r--r--include/LibNectarCore/base_exception.h35
-rw-r--r--include/LibNectarCore/base_math.h98
-rw-r--r--include/LibNectarCore/base_process.h44
-rw-r--r--include/LibNectarCore/defines.h80
-rw-r--r--include/LibNectarCore/filesystem.h18
-rwxr-xr-xinclude/LibNectarCore/mkhdrs.sh15
-rw-r--r--include/LibNectarCore/new.h65
-rw-r--r--include/LibNectarCore/utility.h27
-rw-r--r--src/CompilerKit/src/Compilers/NectarCompiler+AMD64.cc62
-rw-r--r--test/test_samples/iostream.ncpp10
-rw-r--r--test/test_samples/return_value.ncpp6
-rw-r--r--test/test_samples/test_ostream.ncpp8
-rw-r--r--test/test_samples/test_struct.ncpp18
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