This commit is contained in:
2026-01-15 23:25:19 +08:00
parent 211a837468
commit 0248f47218
18 changed files with 79 additions and 42 deletions

1
.gitignore vendored
View File

@@ -23,6 +23,7 @@ Makefile
# Generated files
*.log
*.out
.cache/
# macOS
.DS_Store

View File

@@ -1,37 +1,58 @@
cmake_minimum_required(VERSION 3.30)
project(camellya)
set(CMAKE_CXX_STANDARD 23)
set(CMAKE_CXX_STANDARD 20)
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
option(CAMELLYA_BUILD_TESTS "Build tests" ON)
option(CAMELLYA_BUILD_STATIC "Build static library" ON)
option(CAMELLYA_BUILD_CLI "Build command line interface" ON)
# Library sources
set(LIB_SOURCES
library.cpp
lexer.cpp
parser.cpp
value.cpp
interpreter.cpp
state.cpp
src/lexer.cpp
src/parser.cpp
src/value.cpp
src/interpreter.cpp
src/state.cpp
)
# Library headers
set(LIB_HEADERS
library.h
lexer.h
parser.h
ast.h
value.h
interpreter.h
state.h
src/camellya.h
src/lexer.h
src/parser.h
src/ast.h
src/value.h
src/interpreter.h
src/state.h
)
# Build static library
add_library(camellya STATIC ${LIB_SOURCES} ${LIB_HEADERS})
if(CAMELLYA_BUILD_STATIC)
add_library(libcamellya STATIC ${LIB_SOURCES} ${LIB_HEADERS})
elseif()
add_library(libcamellya SHARED ${LIB_SOURCES} ${LIB_HEADERS})
endif()
target_include_directories(libcamellya PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/src)
if(CAMELLYA_BUILD_CLI)
add_executable(camellya
cli/main.cpp
)
target_link_libraries(camellya
PRIVATE
libcamellya
)
endif()
if(CAMELLYA_BUILD_TESTS)
include(FetchContent)
FetchContent_Declare(
Catch2
GIT_REPOSITORY https://github.com/catchorg/Catch2.git
GIT_TAG v3.6.0
GIT_TAG v3.12.0
)
FetchContent_MakeAvailable(Catch2)
@@ -49,8 +70,9 @@ target_include_directories(camellya_tests
target_link_libraries(camellya_tests
PRIVATE
camellya
libcamellya
Catch2::Catch2WithMain
)
add_test(NAME camellya_tests COMMAND camellya_tests)
endif()

18
cli/main.cpp Normal file
View File

@@ -0,0 +1,18 @@
#include "camellya.h"
#include <iostream>
#include <format>
#include <chrono>
int main(int argc, char** argv) {
if(argc < 2){
std::cout << std::format("Usage: camellya <script> \n") << std::endl;
return 0;
}
std::chrono::high_resolution_clock::time_point start = std::chrono::high_resolution_clock::now();
camellya::State state;
state.do_file(argv[1]);
std::chrono::high_resolution_clock::time_point end = std::chrono::high_resolution_clock::now();
std::chrono::duration<double> duration = end - start;
std::cout << std::format("Execution completed in {} seconds. \n", duration.count()) << std::endl;
return 0;
}

View File

@@ -1,4 +0,0 @@
#include "library.h"
// Implementation file for Camellya scripting language
// All implementation is in separate source files

View File

View File

@@ -1,6 +1,6 @@
#include <catch2/catch_test_macros.hpp>
#include <catch2/benchmark/catch_benchmark.hpp>
#include "library.h"
#include "camellya.h"
#include <memory>