From 0489092ac538610a3db7dee2e000bc63db11be67 Mon Sep 17 00:00:00 2001
From: Ferenc Szontágh <szf@fsociety.hu>
Date: Sat, 12 Apr 2025 18:07:50 +0000
Subject: [PATCH] rename the interpreter
---
cli/main.cpp | 52 ++++++++---------
src/ScriptExceptionMacros.h | 8 +-
cmake/options.h.in | 6 +
src/ScriptInterpreter.cpp | 24 ++++----
src/Builtins/PrintModule.hpp | 2
src/BaseFunction.hpp | 4
CMakeLists.txt | 11 ++-
src/ScriptInterpreter.hpp | 24 ++++----
8 files changed, 68 insertions(+), 63 deletions(-)
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 6d747b0..95bdf33 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -1,5 +1,9 @@
-cmake_minimum_required(VERSION 3.16)
-project(sonyscript LANGUAGES CXX)
+cmake_minimum_required(VERSION 3.5)
+project(
+ voidscript
+ LANGUAGES CXX
+ VERSION 0.0.1
+ )
set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
@@ -27,6 +31,7 @@
message(STATUS "CMAKE_BUILD_TYPE: ${CMAKE_BUILD_TYPE}")
if (CMAKE_BUILD_TYPE STREQUAL "Debug")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g")
+ set(DEBUG_BUILD ON)
endif()
configure_file("cmake/options.h.in" "include/options.h" @ONLY)
@@ -36,7 +41,7 @@
file(GLOB_RECURSE SOURCES
src/main.cpp
- src/SScriptInterpreter.cpp
+ src/ScriptInterpreter.cpp
src/Lexer.cpp
)
diff --git a/cli/main.cpp b/cli/main.cpp
index 1e8a582..882134c 100644
--- a/cli/main.cpp
+++ b/cli/main.cpp
@@ -2,51 +2,47 @@
#include <fstream>
#include "Builtins/PrintModule.hpp"
-#include "SScriptInterpreter.hpp"
+#include "ScriptInterpreter.hpp"
static bool DEBUG = false;
int main(int argc, char * argv[]) {
- SScriptInterpreter interp;
- interp.registerFunction("print", std::make_shared<PrintFunction>());
-
-
if (argc < 2) {
- std::cerr << "Usage: " << argv[0] << " [-d / --debug] <script_file>" << std::endl;
- return 1;
- }
- if (argc > 2) {
- if (std::string(argv[1]) == "-d" || std::string(argv[1]) == "--debug") {
- DEBUG = true;
- } else {
- std::cerr << "Usage: " << argv[0] << " [-d / --debug] <script_file>" << std::endl;
- return 1;
- }
- }
- if (argc > 3) {
- std::cerr << "Error: Too many arguments." << std::endl;
+ std::cerr << "Usage: " << argv[0] << " [-d / --debug] <script_file>\n";
return 1;
}
- if (!std::filesystem::exists(argv[2])) {
- std::cerr << "Error: File " << argv[2] << " does not exist." << std::endl;
+ std::string file;
+ if (argc == 2) {
+ file = argv[1];
+ } else if (argc == 3 && (std::string(argv[1]) == "-d" || std::string(argv[1]) == "--debug")) {
+ DEBUG = true;
+ file = argv[2];
+ } else {
+ std::cerr << "Usage: " << argv[0] << " [-d / --debug] <script_file>\n";
return 1;
}
- // get the absolute path of the file
- const std::string filename = std::filesystem::canonical(argv[2]).string();
+
+ if (!std::filesystem::exists(file)) {
+ std::cerr << "Error: File " << file << " does not exist.\n";
+ return 1;
+ }
+
+ const std::string filename = std::filesystem::canonical(file).string();
try {
- std::ifstream file(filename);
- if (!file.is_open()) {
- std::cerr << "Error: Could not open file " << filename << std::endl;
+ std::ifstream input(filename);
+ if (!input.is_open()) {
+ std::cerr << "Error: Could not open file " << filename << "\n";
return 1;
}
- std::string content((std::istreambuf_iterator<char>(file)), std::istreambuf_iterator<char>());
-
+ std::string content((std::istreambuf_iterator<char>(input)), std::istreambuf_iterator<char>());
+ ScriptInterpreter interp;
+ interp.registerFunction("print", std::make_shared<PrintFunction>());
interp.executeScript(content, filename, DEBUG);
} catch (const std::exception & e) {
- std::cerr << "Parser error: " << e.what() << std::endl;
+ std::cerr << "Parser error: " << e.what() << "\n";
return 1;
}
diff --git a/cmake/options.h.in b/cmake/options.h.in
index 7f4db26..384a0f4 100644
--- a/cmake/options.h.in
+++ b/cmake/options.h.in
@@ -9,4 +9,8 @@
const char COMMENT_CHARACTER = '@COMMENT_CHARACTER@';
const static char * PARSER_OPEN_TAG = "<?void";
const static char * PARSER_CLOSE_TAG = "?>";
-#cmakedefine BUILD_TYPE @CMAKE_BUILD_TYPE @
+const static char * VERSION_MINOR = "@CMAKE_PROJECT_VERSION_MINOR@";
+const static char * VERSION_MAJOR = "@CMAKE_PROJECT_VERSION_MAJOR@";
+const static char * VERSION_PATCH = "@CMAKE_PROJECT_VERSION_PATCH@";
+const static char * VERSION_STRING = "@CMAKE_PROJECT_VERSION@-@CMAKE_BUILD_TYPE@-@CMAKE_SYSTEM@";
+#cmakedefine DEBUG_BUILD
diff --git a/src/BaseFunction.hpp b/src/BaseFunction.hpp
index fb82971..a870da6 100644
--- a/src/BaseFunction.hpp
+++ b/src/BaseFunction.hpp
@@ -8,7 +8,7 @@
#include "Value.hpp"
-class SScriptInterpreter;
+class ScriptInterpreter;
class BaseFunction {
protected:
@@ -18,7 +18,7 @@
virtual void validate(const std::vector<Token> & tokens, size_t & i) const = 0;
virtual Value call(const std::vector<Value> & args, bool debug = false) const = 0;
- template <typename FuncClass> void registerFunctionTo(SScriptInterpreter & interp) {
+ template <typename FuncClass> void registerFunctionTo(ScriptInterpreter & interp) {
FuncClass::registerTo(interp);
}
};
diff --git a/src/Builtins/PrintModule.hpp b/src/Builtins/PrintModule.hpp
index e3a53e4..0b4ad56 100644
--- a/src/Builtins/PrintModule.hpp
+++ b/src/Builtins/PrintModule.hpp
@@ -5,7 +5,7 @@
#include "BaseFunction.hpp"
#include "ScriptExceptionMacros.h"
-#include "SScriptInterpreter.hpp"
+#include "ScriptInterpreter.hpp"
#include "Token.hpp"
#include "Value.hpp"
diff --git a/src/ScriptExceptionMacros.h b/src/ScriptExceptionMacros.h
index 8d9a7a6..31fa7da 100644
--- a/src/ScriptExceptionMacros.h
+++ b/src/ScriptExceptionMacros.h
@@ -2,18 +2,18 @@
#define SCRIPT_EXCEPTION_MACROS_H
#define THROW_UNEXPECTED_TOKEN_ERROR(token, expected) \
- SScriptInterpreter::throwUnexpectedTokenError(token, expected, __FILE__, __LINE__)
+ ScriptInterpreter::throwUnexpectedTokenError(token, expected, __FILE__, __LINE__)
#define THROW_UNDEFINED_VARIABLE_ERROR(name, token) \
- SScriptInterpreter::throwUndefinedVariableError(name, token, __FILE__, __LINE__)
+ ScriptInterpreter::throwUndefinedVariableError(name, token, __FILE__, __LINE__)
#define THROW_VARIABLE_TYPE_MISSMATCH_ERROR(target_variable_name, target_variable_type, source_variable_name, \
source_variable_type, token) \
- SScriptInterpreter::throwVariableTypeMissmatchError(target_variable_name, target_variable_type, \
+ ScriptInterpreter::throwVariableTypeMissmatchError(target_variable_name, target_variable_type, \
source_variable_name, source_variable_type, token, __FILE__, \
__LINE__)
#define THROW_VARIABLE_REDEFINITION_ERROR(name, token) \
- SScriptInterpreter::throwVariableRedefinitionError(name, token, __FILE__, __LINE__)
+ ScriptInterpreter::throwVariableRedefinitionError(name, token, __FILE__, __LINE__)
#endif // SCRIPT_EXCEPTION_MACROS_H
diff --git a/src/SScriptInterpreter.cpp b/src/ScriptInterpreter.cpp
similarity index 91%
rename from src/SScriptInterpreter.cpp
rename to src/ScriptInterpreter.cpp
index bc71f5b..28d557c 100644
--- a/src/SScriptInterpreter.cpp
+++ b/src/ScriptInterpreter.cpp
@@ -1,4 +1,4 @@
-#include "SScriptInterpreter.hpp"
+#include "ScriptInterpreter.hpp"
#include <iostream>
#include <stdexcept>
@@ -9,11 +9,11 @@
#include "ScriptExceptionMacros.h"
#include "Value.hpp"
-void SScriptInterpreter::registerFunction(const std::string & name, std::shared_ptr<BaseFunction> fn) {
+void ScriptInterpreter::registerFunction(const std::string & name, std::shared_ptr<BaseFunction> fn) {
functionObjects[name] = std::move(fn);
}
-Value SScriptInterpreter::evaluateExpression(const Token & token) const {
+Value ScriptInterpreter::evaluateExpression(const Token & token) const {
if (token.type == TokenType::StringLiteral) {
return Value::fromString(token.lexeme);
}
@@ -46,7 +46,7 @@
return Value();
}
-std::vector<Value> SScriptInterpreter::parseArguments(const std::vector<Token> & tokens,
+std::vector<Value> ScriptInterpreter::parseArguments(const std::vector<Token> & tokens,
std::size_t & current_index) const {
std::vector<Value> args;
@@ -82,7 +82,7 @@
return args;
}
-void SScriptInterpreter::handleStringDeclaration(const std::vector<Token> & tokens, std::size_t & i) {
+void ScriptInterpreter::handleStringDeclaration(const std::vector<Token> & tokens, std::size_t & i) {
const auto varName = tokens[i].lexeme;
const auto varType = tokens[i].variableType;
@@ -116,7 +116,7 @@
}
}
-void SScriptInterpreter::handleNumberDeclaration(const std::vector<Token> & tokens, std::size_t & i, TokenType type) {
+void ScriptInterpreter::handleNumberDeclaration(const std::vector<Token> & tokens, std::size_t & i, TokenType type) {
const auto varName = tokens[i].lexeme;
const auto varType = tokens[i].variableType;
@@ -162,7 +162,7 @@
}
}
-void SScriptInterpreter::handleFunctionCall(const std::vector<Token> & tokens, std::size_t & i) {
+void ScriptInterpreter::handleFunctionCall(const std::vector<Token> & tokens, std::size_t & i) {
std::string funcName = tokens[i].lexeme;
auto it = functionObjects.find(funcName);
if (it == functionObjects.end()) {
@@ -176,7 +176,7 @@
}
}
-void SScriptInterpreter::handleVariableReference(const std::vector<Token> & tokens, std::size_t & i) {
+void ScriptInterpreter::handleVariableReference(const std::vector<Token> & tokens, std::size_t & i) {
//THROW_UNEXPECTED_TOKEN_ERROR(tokens[i], "function call or variable assignment (not yet implemented)");
const auto varName = tokens[i].lexeme;
const auto varType = tokens[i].variableType;
@@ -198,15 +198,15 @@
}
}
-void SScriptInterpreter::handleComment(std::size_t & i) {
+void ScriptInterpreter::handleComment(std::size_t & i) {
i++; // Skip comment token
}
-void SScriptInterpreter::handleSemicolon(std::size_t & i) {
+void ScriptInterpreter::handleSemicolon(std::size_t & i) {
i++; // Skip semicolon token
}
-void SScriptInterpreter::expectSemicolon(const std::vector<Token> & tokens, std::size_t & i,
+void ScriptInterpreter::expectSemicolon(const std::vector<Token> & tokens, std::size_t & i,
const std::string & message) const {
if (i >= tokens.size() || tokens[i].type != TokenType::Semicolon) {
THROW_UNEXPECTED_TOKEN_ERROR(tokens[i - 1], "; " + message);
@@ -215,7 +215,7 @@
}
}
-void SScriptInterpreter::executeScript(const std::string & source, const std::string & filename, bool debug) {
+void ScriptInterpreter::executeScript(const std::string & source, const std::string & filename, bool debug) {
Lexer lexer(source, filename);
auto tokens = lexer.tokenize();
diff --git a/src/SScriptInterpreter.hpp b/src/ScriptInterpreter.hpp
similarity index 86%
rename from src/SScriptInterpreter.hpp
rename to src/ScriptInterpreter.hpp
index f9cb33f..2791e02 100644
--- a/src/SScriptInterpreter.hpp
+++ b/src/ScriptInterpreter.hpp
@@ -12,7 +12,7 @@
using FunctionValidator = std::function<void(const std::vector<Token> &, size_t &)>;
-class SScriptInterpreter {
+class ScriptInterpreter {
public:
void registerFunction(const std::string & name, std::shared_ptr<BaseFunction> fn);
void executeScript(const std::string & source, const std::string & filenaneame, bool debug = false);
@@ -23,10 +23,10 @@
"unexpected token: '" + token.lexeme + "' type: " + tokenTypeNames.at(token.type) +
(expected.empty() ? "" : ", expected: '" + expected + "'") + " in file: " + token.file + ":" +
std::to_string(token.lineNumber) + ":" + std::to_string(token.columnNumber);
-#if BUILD_TYPE == Debug
+#ifdef DEBUG_BUILD
const std::string error_message = file + ":" + std::to_string(line) + "\n" + error_content;
#else
- const std::string error_message = error_content;
+ const std::string& error_message = error_content;
#endif
throw std::runtime_error(error_message);
};
@@ -35,19 +35,19 @@
const int & line = 0) {
const std::string error_content = "undefined variable: '$" + name + "' in file: " + token.file + ":" +
std::to_string(token.lineNumber) + ":" + std::to_string(token.columnNumber);
-#if BUILD_TYPE == Debug
+#ifdef DEBUG_BUILD
const std::string error_message = file + ":" + std::to_string(line) + "\n" + error_content;
#else
- const std::string error_message = error_content;
+ const std::string& error_message = error_content;
#endif
throw std::runtime_error(error_message);
}
static void throwVariableTypeMissmatchError(const std::string & target_variable_name,
- const std::string & target_type,
- const std::string & source_variable_name,
- const std::string & source_type, const Token & token,
- const std::string & file = "", const int & line = 0) {
+ const std::string & target_type,
+ const std::string & source_variable_name,
+ const std::string & source_type, const Token & token,
+ const std::string & file = "", const int & line = 0) {
std::string error_content =
"variable type missmatch: '$" + target_variable_name + "' declared type: '" + target_type + "'";
if (!source_variable_name.empty()) {
@@ -59,7 +59,7 @@
error_content += " in file: " + token.file + ":" + std::to_string(token.lineNumber) + ":" +
std::to_string(token.columnNumber);
-#if BUILD_TYPE == Debug
+#ifdef DEBUG_BUILD
const std::string error_message = file + ":" + std::to_string(line) + "\n" + error_content;
#else
const std::string error_message = error_content;
@@ -71,10 +71,10 @@
const std::string & file = "", const int line = 0) {
const std::string error_content = "variable alread defined: " + name + " in file: " + token.file + ":" +
std::to_string(token.lineNumber) + ":" + std::to_string(token.columnNumber);
-#if BUILD_TYPE == Debug
+#ifdef DEBUG_BUILD
const std::string error_message = file + ":" + std::to_string(line) + "\n" + error_content;
#else
- const std::string error_message = error_content;
+ const std::string& error_message = error_content;
#endif
throw std::runtime_error(error_message);
}
--
Gitblit v1.9.3