diff options
| author | Amlal El Mahrouss <amlal@nekernel.org> | 2026-01-13 03:33:51 +0100 |
|---|---|---|
| committer | Amlal El Mahrouss <amlal@nekernel.org> | 2026-01-13 03:33:51 +0100 |
| commit | 0d7337aef0eb32f49b25ea7ce7b12af727121381 (patch) | |
| tree | 2eeedcbb0efcea8be14ec46813c82e4c5836e5f6 /src/CompilerKit | |
| parent | ef7f9bead82e73ff3efd4577a20e5170b017a859 (diff) | |
chore: nectar: Frontend improvements and syntax updates.
Signed-off-by: Amlal El Mahrouss <amlal@nekernel.org>
Diffstat (limited to 'src/CompilerKit')
| -rw-r--r-- | src/CompilerKit/src/Compilers/NectarCompiler+AMD64.cc | 59 |
1 files changed, 32 insertions, 27 deletions
diff --git a/src/CompilerKit/src/Compilers/NectarCompiler+AMD64.cc b/src/CompilerKit/src/Compilers/NectarCompiler+AMD64.cc index 3284094..56ae555 100644 --- a/src/CompilerKit/src/Compilers/NectarCompiler+AMD64.cc +++ b/src/CompilerKit/src/Compilers/NectarCompiler+AMD64.cc @@ -225,15 +225,17 @@ class CompilerFrontendNectarAMD64 final CK_COMPILER_FRONTEND { public: /// \brief Parse NECTAR namespaces and objects. /// \param CompilerKit::SyntaxLeafList::SyntaxLeaf the leaf to build upon. - CompilerKit::SyntaxLeafList::SyntaxLeaf CompileClasses(CompilerKit::STLString& text, - const CompilerKit::STLString& file, - CompilerKit::SyntaxLeafList::SyntaxLeaf&); + CompilerKit::SyntaxLeafList::SyntaxLeaf CompileLayout(CompilerKit::STLString& text, + const CompilerKit::STLString& file, + CompilerKit::SyntaxLeafList::SyntaxLeaf&); }; /// @internal compiler variables static CompilerFrontendNectarAMD64* kFrontend = nullptr; +static std::vector<CompilerKit::STLString> kCurrentImportDirs{}; + static std::vector<CompilerKit::STLString> kRegisterList = { "rbx", "rsi", "r10", "r11", "r12", "r13", "r14", "r15", "xmm12", "xmm13", "xmm14", "xmm15", }; @@ -566,11 +568,15 @@ CompilerKit::SyntaxLeafList::SyntaxLeaf CompilerFrontendNectarAMD64::Compile( valueOfVar = text.substr(text.find("-=") + 2); } else if (keyword.first.fKeywordKind == CompilerKit::KeywordKind::kKeywordKindVariableAssign) { - valueOfVar = text.substr(text.find("=") + 1); + valueOfVar = text.substr(text.find(":=") + 2); } else if (keyword.first.fKeywordKind == CompilerKit::KeywordKind::kKeywordKindEndInstr) { break; } + if (valueOfVar.empty()) { + CompilerKit::Detail::print_error("Undefined Right-Value for variable", file); + } + while (valueOfVar.find(";") != CompilerKit::STLString::npos && keyword.first.fKeywordKind != CompilerKit::KeywordKind::kKeywordKindEndInstr) { valueOfVar.erase(valueOfVar.find(";")); @@ -585,7 +591,7 @@ CompilerKit::SyntaxLeafList::SyntaxLeaf CompilerFrontendNectarAMD64::Compile( varName.erase(varName.find("-=")); } else if (keyword.first.fKeywordKind == CompilerKit::KeywordKind::kKeywordKindVariableAssign) { - varName.erase(varName.find("=")); + varName.erase(varName.find(":=")); } else if (keyword.first.fKeywordKind == CompilerKit::KeywordKind::kKeywordKindEndInstr) { varName.erase(varName.find(";")); } @@ -619,9 +625,7 @@ CompilerKit::SyntaxLeafList::SyntaxLeaf CompilerFrontendNectarAMD64::Compile( } if (keyword.second > 0 && kKeywords[keyword.second - 1].fKeywordKind == - CompilerKit::KeywordKind::kKeywordKindType || - kKeywords[keyword.second - 1].fKeywordKind == - CompilerKit::KeywordKind::kKeywordKindTypePtr) { + CompilerKit::KeywordKind::kKeywordKindType) { syntax_tree.fUserValue += "\n"; continue; } @@ -686,10 +690,6 @@ CompilerKit::SyntaxLeafList::SyntaxLeaf CompilerFrontendNectarAMD64::Compile( break; } - case CompilerKit::KeywordKind::kKeywordKindImport: - case CompilerKit::KeywordKind::kKeywordKindExport: { - break; - } case CompilerKit::KeywordKind::kKeywordKindReturn: { try { auto pos = text.find("return"); @@ -733,12 +733,12 @@ CompilerKit::SyntaxLeafList::SyntaxLeaf CompilerFrontendNectarAMD64::Compile( } } - return this->CompileClasses(text, file, syntax_tree); + return this->CompileLayout(text, file, syntax_tree); } -/// \brief Parse NECTAR namespaces and objects. +/// \brief Parse NECTAR objects. /// \param CompilerKit::SyntaxLeafList::SyntaxLeaf the leaf to build upon. -CompilerKit::SyntaxLeafList::SyntaxLeaf CompilerFrontendNectarAMD64::CompileClasses( +CompilerKit::SyntaxLeafList::SyntaxLeaf CompilerFrontendNectarAMD64::CompileLayout( CompilerKit::STLString& text, const CompilerKit::STLString& file, CompilerKit::SyntaxLeafList::SyntaxLeaf& syntax_tree) { // Handle class entry @@ -910,7 +910,10 @@ static CompilerKit::STLString nectar_mangle_name(const CompilerKit::STLString& i if (inClass) { mangled += "M_" + identifierCopy; } else { - mangled += "F_" + identifierCopy; + if (identifierCopy != "main") + mangled += "F_" + identifierCopy; + else + return identifierCopy; } // Add argument types if provided @@ -1216,31 +1219,26 @@ class AssemblyNectarInterfaceAMD64 final CK_ASSEMBLY_INTERFACE { NECTAR_MODULE(CompilerNectarAMD64) { bool skip = false; - kKeywords.emplace_back("if", CompilerKit::KeywordKind::kKeywordKindIf); - kKeywords.emplace_back("else", CompilerKit::KeywordKind::kKeywordKindElse); - kKeywords.emplace_back("else if", CompilerKit::KeywordKind::kKeywordKindElseIf); kKeywords.emplace_back("struct", CompilerKit::KeywordKind::kKeywordKindClass); - kKeywords.emplace_back("typedef", CompilerKit::KeywordKind::kKeywordKindTypedef); - kKeywords.emplace_back("import", CompilerKit::KeywordKind::kKeywordKindImport); - kKeywords.emplace_back("export", CompilerKit::KeywordKind::kKeywordKindExport); kKeywords.emplace_back("{", CompilerKit::KeywordKind::kKeywordKindBodyStart); kKeywords.emplace_back("}", CompilerKit::KeywordKind::kKeywordKindBodyEnd); kKeywords.emplace_back("let", CompilerKit::KeywordKind::kKeywordKindType); kKeywords.emplace_back("(", CompilerKit::KeywordKind::kKeywordKindFunctionStart); kKeywords.emplace_back(")", CompilerKit::KeywordKind::kKeywordKindFunctionEnd); - kKeywords.emplace_back("=", CompilerKit::KeywordKind::kKeywordKindVariableAssign); + kKeywords.emplace_back(":=", CompilerKit::KeywordKind::kKeywordKindVariableAssign); kKeywords.emplace_back("+=", CompilerKit::KeywordKind::kKeywordKindVariableInc); kKeywords.emplace_back("-=", CompilerKit::KeywordKind::kKeywordKindVariableDec); kKeywords.emplace_back("const", CompilerKit::KeywordKind::kKeywordKindConstant); - kKeywords.emplace_back("*", CompilerKit::KeywordKind::kKeywordKindPtr); 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("return", CompilerKit::KeywordKind::kKeywordKindReturn); - kKeywords.emplace_back("/*", CompilerKit::KeywordKind::kKeywordKindCommentMultiLineStart); - kKeywords.emplace_back("*/", CompilerKit::KeywordKind::kKeywordKindCommentMultiLineEnd); - kKeywords.emplace_back("//", CompilerKit::KeywordKind::kKeywordKindCommentInline); + + kKeywords.emplace_back("if", CompilerKit::KeywordKind::kKeywordKindIf); + kKeywords.emplace_back("else", CompilerKit::KeywordKind::kKeywordKindElse); + kKeywords.emplace_back("==", CompilerKit::KeywordKind::kKeywordKindEq); kKeywords.emplace_back("!=", CompilerKit::KeywordKind::kKeywordKindNotEq); kKeywords.emplace_back(">=", CompilerKit::KeywordKind::kKeywordKindGreaterEq); @@ -1281,6 +1279,13 @@ NECTAR_MODULE(CompilerNectarAMD64) { return NECTAR_SUCCESS; } + if (strcmp(argv[index], "-nec-import-dir") == 0) { + kCurrentImportDirs.push_back(argv[index + 1]); + skip = true; + + continue; + } + if (strcmp(argv[index], "-nec-max-err") == 0) { try { kErrorLimit = std::strtol(argv[index + 1], nullptr, 10); |
