(BREAKING) "use" keyword, stdlib seperate

This commit is contained in:
2026-01-28 17:03:40 +11:00
parent 4b86fee7b5
commit 6002bd922b
14 changed files with 97 additions and 76 deletions

View File

@@ -22,14 +22,11 @@ namespace ArgParser {
std::cout << " -t type or --type type\n";
std::cout << " Specifies the type of output.\n";
std::cout << " Currently supported options:\n";
std::cout << " ground, native (BETA) (Requires --nostdlib)\n";
std::cout << " ground, native (BETA)\n";
std::cout << " Choosing the 'ground' option outputs the compiled program as a .grnd textual representation file.\n";
std::cout << " Choosing the 'native' option uses Ground's ground->asm compiler to create a native executable.\n";
std::cout << " This feature is currently in beta, as Ground's ground->asm compiler is not fully complete.\n";
std::cout << " This feature requires the '--nostdlib' flag as Ground's ground->asm compiler does not support functions.\n";
std::cout << " See https://sols.dev/docs#nativecompiler for more details\n";
std::cout << " --nostdlib\n";
std::cout << " Excludes the Solstice stdlib from compilation.\n";
}
Args parseArgs(int argc, char** argv) {
@@ -44,9 +41,6 @@ namespace ArgParser {
printHelp();
exit(1);
}
else if (strcmp(argv[i], "--nostdlib") == 0) {
nostdlib = true;
}
else if (strcmp(argv[i], "-o") == 0 || strcmp(argv[i], "--output") == 0) {
i++;
if (i < argc) {

View File

@@ -4,9 +4,6 @@
#include <cstring>
namespace ArgParser {
extern bool nostdlib;
enum class ArgType {
FILE, OUTPUT, OUTPUTTYPE
};

View File

@@ -1,13 +1,13 @@
#include "parser.h"
#include "error.h"
#include "lexer.h"
#include "solstice_stdlib.h"
#include "argparser.h"
#include <groundvm.h>
#include <cstring>
#include <string>
#include <regex>
#include <cstdlib>
#include <fstream>
#define parseOneToken(token) Parser({token}).parse().children[0]
@@ -261,15 +261,6 @@ namespace Solstice {
const std::vector<SolGroundCodeBlock> SolNode::generateCode() {
std::vector<SolGroundCodeBlock> code;
if (nodeType == SolNodeType::Root) {
// Compile and insert standard library
if (!ArgParser::nostdlib) {
auto parsedStdlib = Parser(Lexer(getStdLib()).lex()).parse();
parsedStdlib.nodeType = SolNodeType::None;
code = parsedStdlib.generateCode();
}
}
// Process object member access
for (size_t i = 0; i < children.size(); i++) {
SolNode& child = children[i];
@@ -932,6 +923,31 @@ namespace Solstice {
code.push_back(codeBlock);
break;
}
case SolNodeType::Use: {
SolGroundCodeBlock codeBlock;
char* solsticeLibsEnv = getenv("SOLSTICE_LIBS");
std::string filePath;
if (solsticeLibsEnv == NULL) {
filePath = "/usr/lib/solstice/" + outputId + ".sols";
} else {
filePath = std::string(solsticeLibsEnv) + "/" + outputId + ".sols";
}
std::ifstream file(filePath);
if (file.good()) {
std::ostringstream ss;
ss << file.rdbuf();
SolNode fileNode = Parser(Lexer(ss.str()).lex()).parse();
fileNode.nodeType = SolNodeType::None;
auto fileCode = fileNode.generateCode();
code.insert(code.end(), fileCode.begin(), fileCode.end());
} else {
file.close();
Error::syntaxError("Library " + outputId + " does not exist");
}
break;
}
default: {}
}
return code;
@@ -1082,6 +1098,9 @@ namespace Solstice {
if (in == "new") {
return SolNodeType::New;
}
if (in == "use") {
return SolNodeType::Use;
}
if (in == "{") {
return SolNodeType::CodeBlockStart;
}
@@ -1786,6 +1805,23 @@ namespace Solstice {
rootNode.addNode(inNode);
break;
}
case SolNodeType::Use: {
SolNode useNode(SolNodeType::Use);
useNode.line = tokenObj.line;
useNode.lineContent = tokenObj.lineContent;
auto tokenopt = consume();
if (tokenopt) {
Token token = tokenopt.value();
if (getNodeType(token.value) != SolNodeType::Identifier) {
Error::syntaxError("Expected identifier after 'use'", tokenObj.line, tokenObj.lineContent);
}
useNode.outputId = token.value;
rootNode.addNode(useNode);
} else {
Error::syntaxError("Expected identifier after 'use'", tokenObj.line, tokenObj.lineContent);
}
break;
}
}
}
return rootNode;

View File

@@ -57,7 +57,7 @@ namespace Solstice {
enum class SolNodeType {
Add, Subtract, Multiply, Divide, Equal, Inequal, Greater, Lesser, EqGreater, EqLesser, Set, While, If, Value, Identifier, None, Root, CodeBlock, CodeBlockStart, CodeBlockEnd, FunctionDef, FunctionCall, Expression, BracketStart, BracketEnd, Puts, Return, InlineGround, Struct, New, In
Add, Subtract, Multiply, Divide, Equal, Inequal, Greater, Lesser, EqGreater, EqLesser, Set, While, If, Value, Identifier, None, Root, CodeBlock, CodeBlockStart, CodeBlockEnd, FunctionDef, FunctionCall, Expression, BracketStart, BracketEnd, Puts, Return, InlineGround, Struct, New, In, Use
};
enum class SolDataType {

View File

@@ -1,50 +0,0 @@
#include <string>
std::string getStdLib() {
return R"(
// Solstice stdlib
def input(string msg) string {
retval = ""
ground {
print $msg
input &retval
}
return retval
}
def print(string msg) string {
ground {
print $msg
}
return msg
}
def println(string msg) string {
ground {
println $msg
}
return msg
}
def stringToInt(string in) int {
result = 0
ground {
stoi $in &result
}
return result
}
def intToString(int in) string {
result = ""
ground {
tostring $in &result
}
return result
}
// End Solstice stdlib
)";
}

View File

@@ -1,3 +0,0 @@
#include <string>
std::string getStdLib();