From 93cbc7db3a584fb8b955f559dfa742b2d2339caa Mon Sep 17 00:00:00 2001 From: abdussamedulutas Date: Wed, 27 May 2026 10:29:30 +0300 Subject: [PATCH 1/3] Gemini --- CMakeLists.txt | 22 + build/.ninja_deps | Bin 0 -> 29656 bytes build/.ninja_log | 16 + build/CMakeCache.txt | 360 +++++ build/CMakeFiles/4.3.2/CMakeCXXCompiler.cmake | 102 ++ .../4.3.2/CMakeDetermineCompilerABI_CXX.bin | Bin 0 -> 16048 bytes build/CMakeFiles/4.3.2/CMakeSystem.cmake | 15 + .../CompilerIdCXX/CMakeCXXCompilerId.cpp | 949 +++++++++++++ build/CMakeFiles/CMakeConfigureLog.yaml | 1189 +++++++++++++++++ build/CMakeFiles/InstallScripts.json | 7 + build/CMakeFiles/TargetDirectories.txt | 3 + build/CMakeFiles/cmake.check_cache | 1 + build/CMakeFiles/rules.ninja | 96 ++ build/build.ninja | 249 ++++ build/cmake_install.cmake | 66 + fikirler.md => docs/fikirler.md | 0 issues.md => docs/issues.md | 0 prcontext.md => docs/prcontext.md | 0 todo.md => docs/todo.md | 0 Final.sqt => examples/Final.sqt | 0 source.sqt => examples/source.sqt | 0 scripts/build.sh | 9 + compile.sh => scripts/compile.sh | 0 src/core/sourcefile.cpp | 69 + src/core/sourcefile.hpp | 68 +- src/lexer/lexer.cpp | 346 +++++ src/lexer/lexer.hpp | 510 +------ src/parser/ast.hpp | 48 +- src/parser/ast_decl.hpp | 143 -- src/parser/ast_expr.hpp | 287 ---- src/parser/ast_stmt.hpp | 307 ----- src/parser/nodes/binary_expr.cpp | 23 + src/parser/nodes/binary_expr.hpp | 17 + src/parser/nodes/declarations.cpp | 53 + src/parser/nodes/declarations.hpp | 33 + src/parser/nodes/expressions.cpp | 67 + src/parser/nodes/expressions.hpp | 43 + src/parser/nodes/identifier.cpp | 23 + src/parser/nodes/identifier.hpp | 16 + src/parser/nodes/literal.cpp | 34 + src/parser/nodes/literal.hpp | 20 + src/parser/nodes/program.cpp | 26 + src/parser/nodes/program.hpp | 13 + src/parser/nodes/statements.cpp | 140 ++ src/parser/nodes/statements.hpp | 82 ++ src/parser/parser.cpp | 599 +++++++++ src/parser/parser.hpp | 26 - src/parser/parser_core.hpp | 409 ------ src/parser/parser_decl.hpp | 159 --- src/parser/parser_stmt.hpp | 322 ----- src/tokenizer/tokenizer.cpp | 176 +++ src/tokenizer/tokenizer.hpp | 432 +----- 52 files changed, 4894 insertions(+), 2681 deletions(-) create mode 100644 CMakeLists.txt create mode 100644 build/.ninja_deps create mode 100644 build/.ninja_log create mode 100644 build/CMakeCache.txt create mode 100644 build/CMakeFiles/4.3.2/CMakeCXXCompiler.cmake create mode 100755 build/CMakeFiles/4.3.2/CMakeDetermineCompilerABI_CXX.bin create mode 100644 build/CMakeFiles/4.3.2/CMakeSystem.cmake create mode 100644 build/CMakeFiles/4.3.2/CompilerIdCXX/CMakeCXXCompilerId.cpp create mode 100644 build/CMakeFiles/CMakeConfigureLog.yaml create mode 100644 build/CMakeFiles/InstallScripts.json create mode 100644 build/CMakeFiles/TargetDirectories.txt create mode 100644 build/CMakeFiles/cmake.check_cache create mode 100644 build/CMakeFiles/rules.ninja create mode 100644 build/build.ninja create mode 100644 build/cmake_install.cmake rename fikirler.md => docs/fikirler.md (100%) rename issues.md => docs/issues.md (100%) rename prcontext.md => docs/prcontext.md (100%) rename todo.md => docs/todo.md (100%) rename Final.sqt => examples/Final.sqt (100%) rename source.sqt => examples/source.sqt (100%) create mode 100755 scripts/build.sh rename compile.sh => scripts/compile.sh (100%) create mode 100644 src/core/sourcefile.cpp create mode 100644 src/lexer/lexer.cpp delete mode 100644 src/parser/ast_decl.hpp delete mode 100644 src/parser/ast_expr.hpp delete mode 100644 src/parser/ast_stmt.hpp create mode 100644 src/parser/nodes/binary_expr.cpp create mode 100644 src/parser/nodes/binary_expr.hpp create mode 100644 src/parser/nodes/declarations.cpp create mode 100644 src/parser/nodes/declarations.hpp create mode 100644 src/parser/nodes/expressions.cpp create mode 100644 src/parser/nodes/expressions.hpp create mode 100644 src/parser/nodes/identifier.cpp create mode 100644 src/parser/nodes/identifier.hpp create mode 100644 src/parser/nodes/literal.cpp create mode 100644 src/parser/nodes/literal.hpp create mode 100644 src/parser/nodes/program.cpp create mode 100644 src/parser/nodes/program.hpp create mode 100644 src/parser/nodes/statements.cpp create mode 100644 src/parser/nodes/statements.hpp create mode 100644 src/parser/parser.cpp delete mode 100644 src/parser/parser_core.hpp delete mode 100644 src/parser/parser_decl.hpp delete mode 100644 src/parser/parser_stmt.hpp create mode 100644 src/tokenizer/tokenizer.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..37cdcf9 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,22 @@ +cmake_minimum_required(VERSION 3.16) +project(saqut VERSION 0.1 LANGUAGES CXX) + +set(CMAKE_CXX_STANDARD 20) +set(CMAKE_CXX_STANDARD_REQUIRED ON) + +add_compile_options(-Wall -Wextra) + +if(CMAKE_BUILD_TYPE STREQUAL "Debug" OR NOT CMAKE_BUILD_TYPE) + add_compile_options(-g -O0) + message(STATUS "Debug modu aktif") +else() + add_compile_options(-O3) + message(STATUS "Release modu aktif") +endif() + +# Tüm kaynak dosyaları topla +file(GLOB_RECURSE SOURCES "src/*.cpp") + +add_executable(saqut ${SOURCES}) + +target_include_directories(saqut PRIVATE src) diff --git a/build/.ninja_deps b/build/.ninja_deps new file mode 100644 index 0000000000000000000000000000000000000000..2ce38af872bdaf90b1cfbb5d8c86fabbc9536808 GIT binary patch literal 29656 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 literal 0 HcmV?d00001 diff --git a/build/.ninja_log b/build/.ninja_log new file mode 100644 index 0000000..fb0be1e --- /dev/null +++ b/build/.ninja_log @@ -0,0 +1,16 @@ +# ninja log v7 +1 1875 1779866878396024286 CMakeFiles/saqut.dir/src/parser/nodes/identifier.cpp.o eb96bb4b1eb4ad80 +1 1743 1779866878396133191 CMakeFiles/saqut.dir/src/parser/nodes/literal.cpp.o 78f2c4da7c9b2281 +1 1835 1779866851291850429 CMakeFiles/saqut.dir/src/parser/nodes/binary_expr.cpp.o d2e2bb2f8a63c6d2 +3 1976 1779866851293202930 CMakeFiles/saqut.dir/src/parser/nodes/program.cpp.o ac5bbcd74d87561a +1 1828 1779866851291959426 CMakeFiles/saqut.dir/src/parser/nodes/declarations.cpp.o b6c56f04a257f685 +1 1991 1779866851292085983 CMakeFiles/saqut.dir/src/parser/nodes/expressions.cpp.o 4057e3d63c63a1ab +6 2108 1779866851296202934 CMakeFiles/saqut.dir/src/parser/nodes/statements.cpp.o b5c20724bbf3648c +1 2478 1779866878395241768 CMakeFiles/saqut.dir/src/main.cpp.o 110c26cb1d0c3a23 +2967 3100 1779866359829193015 saqut 78d8bacf305cfc59 +1 1450 1779866851291202927 CMakeFiles/saqut.dir/src/lexer/lexer.cpp.o 90eeec811f2137e6 +0 1481 1779866851290202926 CMakeFiles/saqut.dir/src/core/sourcefile.cpp.o da6f5fc90e87e6b1 +1 1410 1779866878396365249 CMakeFiles/saqut.dir/src/tokenizer/tokenizer.cpp.o a01677f8bb4f4dbc +1 1579 1779866878396233551 CMakeFiles/saqut.dir/src/parser/parser.cpp.o 2c65b7be26cead32 +1 1163 1779866916763301383 CMakeFiles/saqut.dir/src/parser/parser.cpp.o 2c65b7be26cead32 +1163 1283 1779866917925303269 saqut 89052e51305cb697 diff --git a/build/CMakeCache.txt b/build/CMakeCache.txt new file mode 100644 index 0000000..98eaaae --- /dev/null +++ b/build/CMakeCache.txt @@ -0,0 +1,360 @@ +# This is the CMakeCache file. +# For build in directory: /home/saqut/Masaüstü/saqutcompiler/build +# It was generated by CMake: /usr/bin/cmake +# You can edit this file to change values found and used by cmake. +# If you do not want to change any of the values, simply exit the editor. +# If you do want to change a value, simply edit, save, and exit the editor. +# The syntax for the file is as follows: +# KEY:TYPE=VALUE +# KEY is the name of a variable in the cache. +# TYPE is a hint to GUIs for the type of VALUE, DO NOT EDIT TYPE!. +# VALUE is the current value for the KEY. + +######################## +# EXTERNAL cache entries +######################## + +//Path to a program. +CMAKE_ADDR2LINE:FILEPATH=/usr/bin/addr2line + +//Path to a program. +CMAKE_AR:FILEPATH=/usr/bin/ar + +//Choose the type of build, options are: None Debug Release RelWithDebInfo +// MinSizeRel ... +CMAKE_BUILD_TYPE:STRING=Debug + +//CXX compiler +CMAKE_CXX_COMPILER:FILEPATH=/usr/bin/c++ + +//A wrapper around 'ar' adding the appropriate '--plugin' option +// for the GCC compiler +CMAKE_CXX_COMPILER_AR:FILEPATH=/usr/bin/gcc-ar + +//A wrapper around 'ranlib' adding the appropriate '--plugin' option +// for the GCC compiler +CMAKE_CXX_COMPILER_RANLIB:FILEPATH=/usr/bin/gcc-ranlib + +//Flags used by the CXX compiler during all build types. +CMAKE_CXX_FLAGS:STRING= + +//Flags used by the CXX compiler during DEBUG builds. +CMAKE_CXX_FLAGS_DEBUG:STRING=-g + +//Flags used by the CXX compiler during MINSIZEREL builds. +CMAKE_CXX_FLAGS_MINSIZEREL:STRING=-Os -DNDEBUG + +//Flags used by the CXX compiler during RELEASE builds. +CMAKE_CXX_FLAGS_RELEASE:STRING=-O3 -DNDEBUG + +//Flags used by the CXX compiler during RELWITHDEBINFO builds. +CMAKE_CXX_FLAGS_RELWITHDEBINFO:STRING=-O2 -g -DNDEBUG + +//Path to a program. +CMAKE_DLLTOOL:FILEPATH=CMAKE_DLLTOOL-NOTFOUND + +//Flags used by the linker during all build types. +CMAKE_EXE_LINKER_FLAGS:STRING= + +//Flags used by the linker during DEBUG builds. +CMAKE_EXE_LINKER_FLAGS_DEBUG:STRING= + +//Flags used by the linker during MINSIZEREL builds. +CMAKE_EXE_LINKER_FLAGS_MINSIZEREL:STRING= + +//Flags used by the linker during RELEASE builds. +CMAKE_EXE_LINKER_FLAGS_RELEASE:STRING= + +//Flags used by the linker during RELWITHDEBINFO builds. +CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO:STRING= + +//Enable/Disable output of build database during the build. +CMAKE_EXPORT_BUILD_DATABASE:BOOL= + +//Enable/Disable output of compile commands during generation. +CMAKE_EXPORT_COMPILE_COMMANDS:BOOL= + +//Value Computed by CMake. +CMAKE_FIND_PACKAGE_REDIRECTS_DIR:STATIC=/home/saqut/Masaüstü/saqutcompiler/build/CMakeFiles/pkgRedirects + +//Install path prefix, prepended onto install directories. +CMAKE_INSTALL_PREFIX:PATH=/usr/local + +//Path to a program. +CMAKE_LINKER:FILEPATH=/usr/bin/ld + +//Program used to build from build.ninja files. +CMAKE_MAKE_PROGRAM:FILEPATH=/usr/bin/ninja + +//Flags used by the linker during the creation of modules during +// all build types. +CMAKE_MODULE_LINKER_FLAGS:STRING= + +//Flags used by the linker during the creation of modules during +// DEBUG builds. +CMAKE_MODULE_LINKER_FLAGS_DEBUG:STRING= + +//Flags used by the linker during the creation of modules during +// MINSIZEREL builds. +CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL:STRING= + +//Flags used by the linker during the creation of modules during +// RELEASE builds. +CMAKE_MODULE_LINKER_FLAGS_RELEASE:STRING= + +//Flags used by the linker during the creation of modules during +// RELWITHDEBINFO builds. +CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO:STRING= + +//Path to a program. +CMAKE_NM:FILEPATH=/usr/bin/nm + +//Path to a program. +CMAKE_OBJCOPY:FILEPATH=/usr/bin/objcopy + +//Path to a program. +CMAKE_OBJDUMP:FILEPATH=/usr/bin/objdump + +//Value Computed by CMake +CMAKE_PROJECT_COMPAT_VERSION:STATIC= + +//Value Computed by CMake +CMAKE_PROJECT_DESCRIPTION:STATIC= + +//Value Computed by CMake +CMAKE_PROJECT_HOMEPAGE_URL:STATIC= + +//Value Computed by CMake +CMAKE_PROJECT_NAME:STATIC=saqut + +//Value Computed by CMake +CMAKE_PROJECT_SPDX_LICENSE:STATIC= + +//Value Computed by CMake +CMAKE_PROJECT_VERSION:STATIC=0.1 + +//Value Computed by CMake +CMAKE_PROJECT_VERSION_MAJOR:STATIC=0 + +//Value Computed by CMake +CMAKE_PROJECT_VERSION_MINOR:STATIC=1 + +//Value Computed by CMake +CMAKE_PROJECT_VERSION_PATCH:STATIC= + +//Value Computed by CMake +CMAKE_PROJECT_VERSION_TWEAK:STATIC= + +//Path to a program. +CMAKE_RANLIB:FILEPATH=/usr/bin/ranlib + +//Path to a program. +CMAKE_READELF:FILEPATH=/usr/bin/readelf + +//Flags used by the linker during the creation of shared libraries +// during all build types. +CMAKE_SHARED_LINKER_FLAGS:STRING= + +//Flags used by the linker during the creation of shared libraries +// during DEBUG builds. +CMAKE_SHARED_LINKER_FLAGS_DEBUG:STRING= + +//Flags used by the linker during the creation of shared libraries +// during MINSIZEREL builds. +CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL:STRING= + +//Flags used by the linker during the creation of shared libraries +// during RELEASE builds. +CMAKE_SHARED_LINKER_FLAGS_RELEASE:STRING= + +//Flags used by the linker during the creation of shared libraries +// during RELWITHDEBINFO builds. +CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO:STRING= + +//If set, runtime paths are not added when installing shared libraries, +// but are added when building. +CMAKE_SKIP_INSTALL_RPATH:BOOL=NO + +//If set, runtime paths are not added when using shared libraries. +CMAKE_SKIP_RPATH:BOOL=NO + +//Flags used by the archiver during the creation of static libraries +// during all build types. +CMAKE_STATIC_LINKER_FLAGS:STRING= + +//Flags used by the archiver during the creation of static libraries +// during DEBUG builds. +CMAKE_STATIC_LINKER_FLAGS_DEBUG:STRING= + +//Flags used by the archiver during the creation of static libraries +// during MINSIZEREL builds. +CMAKE_STATIC_LINKER_FLAGS_MINSIZEREL:STRING= + +//Flags used by the archiver during the creation of static libraries +// during RELEASE builds. +CMAKE_STATIC_LINKER_FLAGS_RELEASE:STRING= + +//Flags used by the archiver during the creation of static libraries +// during RELWITHDEBINFO builds. +CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO:STRING= + +//Path to a program. +CMAKE_STRIP:FILEPATH=/usr/bin/strip + +//Path to a program. +CMAKE_TAPI:FILEPATH=CMAKE_TAPI-NOTFOUND + +//If this value is on, makefiles will be generated without the +// .SILENT directive, and all commands will be echoed to the console +// during the make. This is useful for debugging only. With Visual +// Studio IDE projects all commands are done without /nologo. +CMAKE_VERBOSE_MAKEFILE:BOOL=FALSE + +//Value Computed by CMake +saqut_BINARY_DIR:STATIC=/home/saqut/Masaüstü/saqutcompiler/build + +//Value Computed by CMake +saqut_IS_TOP_LEVEL:STATIC=ON + +//Value Computed by CMake +saqut_SOURCE_DIR:STATIC=/home/saqut/Masaüstü/saqutcompiler + + +######################## +# INTERNAL cache entries +######################## + +//ADVANCED property for variable: CMAKE_ADDR2LINE +CMAKE_ADDR2LINE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_AR +CMAKE_AR-ADVANCED:INTERNAL=1 +//This is the directory where this CMakeCache.txt was created +CMAKE_CACHEFILE_DIR:INTERNAL=/home/saqut/Masaüstü/saqutcompiler/build +//Major version of cmake used to create the current loaded cache +CMAKE_CACHE_MAJOR_VERSION:INTERNAL=4 +//Minor version of cmake used to create the current loaded cache +CMAKE_CACHE_MINOR_VERSION:INTERNAL=3 +//Patch version of cmake used to create the current loaded cache +CMAKE_CACHE_PATCH_VERSION:INTERNAL=2 +//Path to CMake executable. +CMAKE_COMMAND:INTERNAL=/usr/bin/cmake +//Path to cpack program executable. +CMAKE_CPACK_COMMAND:INTERNAL=/usr/bin/cpack +//Path to ctest program executable. +CMAKE_CTEST_COMMAND:INTERNAL=/usr/bin/ctest +//ADVANCED property for variable: CMAKE_CXX_COMPILER +CMAKE_CXX_COMPILER-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_COMPILER_AR +CMAKE_CXX_COMPILER_AR-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_COMPILER_RANLIB +CMAKE_CXX_COMPILER_RANLIB-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_FLAGS +CMAKE_CXX_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_FLAGS_DEBUG +CMAKE_CXX_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_FLAGS_MINSIZEREL +CMAKE_CXX_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_FLAGS_RELEASE +CMAKE_CXX_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_FLAGS_RELWITHDEBINFO +CMAKE_CXX_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_DLLTOOL +CMAKE_DLLTOOL-ADVANCED:INTERNAL=1 +//Path to cache edit program executable. +CMAKE_EDIT_COMMAND:INTERNAL=/usr/bin/ccmake +//Executable file format +CMAKE_EXECUTABLE_FORMAT:INTERNAL=ELF +//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS +CMAKE_EXE_LINKER_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_DEBUG +CMAKE_EXE_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_MINSIZEREL +CMAKE_EXE_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_RELEASE +CMAKE_EXE_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO +CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_EXPORT_BUILD_DATABASE +CMAKE_EXPORT_BUILD_DATABASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_EXPORT_COMPILE_COMMANDS +CMAKE_EXPORT_COMPILE_COMMANDS-ADVANCED:INTERNAL=1 +//Name of external makefile project generator. +CMAKE_EXTRA_GENERATOR:INTERNAL= +//Name of generator. +CMAKE_GENERATOR:INTERNAL=Ninja +//Generator instance identifier. +CMAKE_GENERATOR_INSTANCE:INTERNAL= +//Name of generator platform. +CMAKE_GENERATOR_PLATFORM:INTERNAL= +//Name of generator toolset. +CMAKE_GENERATOR_TOOLSET:INTERNAL= +//Source directory with the top level CMakeLists.txt file for this +// project +CMAKE_HOME_DIRECTORY:INTERNAL=/home/saqut/Masaüstü/saqutcompiler +//Install .so files without execute permission. +CMAKE_INSTALL_SO_NO_EXE:INTERNAL=0 +//ADVANCED property for variable: CMAKE_LINKER +CMAKE_LINKER-ADVANCED:INTERNAL=1 +//Name of CMakeLists files to read +CMAKE_LIST_FILE_NAME:INTERNAL=CMakeLists.txt +//ADVANCED property for variable: CMAKE_MAKE_PROGRAM +CMAKE_MAKE_PROGRAM-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS +CMAKE_MODULE_LINKER_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_DEBUG +CMAKE_MODULE_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL +CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_RELEASE +CMAKE_MODULE_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO +CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_NM +CMAKE_NM-ADVANCED:INTERNAL=1 +//number of local generators +CMAKE_NUMBER_OF_MAKEFILES:INTERNAL=1 +//ADVANCED property for variable: CMAKE_OBJCOPY +CMAKE_OBJCOPY-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_OBJDUMP +CMAKE_OBJDUMP-ADVANCED:INTERNAL=1 +//Platform information initialized +CMAKE_PLATFORM_INFO_INITIALIZED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_RANLIB +CMAKE_RANLIB-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_READELF +CMAKE_READELF-ADVANCED:INTERNAL=1 +//Path to CMake installation. +CMAKE_ROOT:INTERNAL=/usr/share/cmake +//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS +CMAKE_SHARED_LINKER_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_DEBUG +CMAKE_SHARED_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL +CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_RELEASE +CMAKE_SHARED_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO +CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SKIP_INSTALL_RPATH +CMAKE_SKIP_INSTALL_RPATH-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SKIP_RPATH +CMAKE_SKIP_RPATH-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS +CMAKE_STATIC_LINKER_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_DEBUG +CMAKE_STATIC_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_MINSIZEREL +CMAKE_STATIC_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_RELEASE +CMAKE_STATIC_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO +CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STRIP +CMAKE_STRIP-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_TAPI +CMAKE_TAPI-ADVANCED:INTERNAL=1 +//uname command +CMAKE_UNAME:INTERNAL=/usr/bin/uname +//ADVANCED property for variable: CMAKE_VERBOSE_MAKEFILE +CMAKE_VERBOSE_MAKEFILE-ADVANCED:INTERNAL=1 + diff --git a/build/CMakeFiles/4.3.2/CMakeCXXCompiler.cmake b/build/CMakeFiles/4.3.2/CMakeCXXCompiler.cmake new file mode 100644 index 0000000..3adb7e2 --- /dev/null +++ b/build/CMakeFiles/4.3.2/CMakeCXXCompiler.cmake @@ -0,0 +1,102 @@ +set(CMAKE_CXX_COMPILER "/usr/bin/c++") +set(CMAKE_CXX_COMPILER_ARG1 "") +set(CMAKE_CXX_COMPILER_ID "GNU") +set(CMAKE_CXX_COMPILER_VERSION "16.1.1") +set(CMAKE_CXX_COMPILER_VERSION_INTERNAL "") +set(CMAKE_CXX_COMPILER_WRAPPER "") +set(CMAKE_CXX_STANDARD_COMPUTED_DEFAULT "20") +set(CMAKE_CXX_EXTENSIONS_COMPUTED_DEFAULT "ON") +set(CMAKE_CXX_STANDARD_LATEST "26") +set(CMAKE_CXX_COMPILE_FEATURES "cxx_std_98;cxx_template_template_parameters;cxx_std_11;cxx_alias_templates;cxx_alignas;cxx_alignof;cxx_attributes;cxx_auto_type;cxx_constexpr;cxx_decltype;cxx_decltype_incomplete_return_types;cxx_default_function_template_args;cxx_defaulted_functions;cxx_defaulted_move_initializers;cxx_delegating_constructors;cxx_deleted_functions;cxx_enum_forward_declarations;cxx_explicit_conversions;cxx_extended_friend_declarations;cxx_extern_templates;cxx_final;cxx_func_identifier;cxx_generalized_initializers;cxx_inheriting_constructors;cxx_inline_namespaces;cxx_lambdas;cxx_local_type_template_args;cxx_long_long_type;cxx_noexcept;cxx_nonstatic_member_init;cxx_nullptr;cxx_override;cxx_range_for;cxx_raw_string_literals;cxx_reference_qualified_functions;cxx_right_angle_brackets;cxx_rvalue_references;cxx_sizeof_member;cxx_static_assert;cxx_strong_enums;cxx_thread_local;cxx_trailing_return_types;cxx_unicode_literals;cxx_uniform_initialization;cxx_unrestricted_unions;cxx_user_literals;cxx_variadic_macros;cxx_variadic_templates;cxx_std_14;cxx_aggregate_default_initializers;cxx_attribute_deprecated;cxx_binary_literals;cxx_contextual_conversions;cxx_decltype_auto;cxx_digit_separators;cxx_generic_lambdas;cxx_lambda_init_captures;cxx_relaxed_constexpr;cxx_return_type_deduction;cxx_variable_templates;cxx_std_17;cxx_std_20;cxx_std_23;cxx_std_26") +set(CMAKE_CXX98_COMPILE_FEATURES "cxx_std_98;cxx_template_template_parameters") +set(CMAKE_CXX11_COMPILE_FEATURES "cxx_std_11;cxx_alias_templates;cxx_alignas;cxx_alignof;cxx_attributes;cxx_auto_type;cxx_constexpr;cxx_decltype;cxx_decltype_incomplete_return_types;cxx_default_function_template_args;cxx_defaulted_functions;cxx_defaulted_move_initializers;cxx_delegating_constructors;cxx_deleted_functions;cxx_enum_forward_declarations;cxx_explicit_conversions;cxx_extended_friend_declarations;cxx_extern_templates;cxx_final;cxx_func_identifier;cxx_generalized_initializers;cxx_inheriting_constructors;cxx_inline_namespaces;cxx_lambdas;cxx_local_type_template_args;cxx_long_long_type;cxx_noexcept;cxx_nonstatic_member_init;cxx_nullptr;cxx_override;cxx_range_for;cxx_raw_string_literals;cxx_reference_qualified_functions;cxx_right_angle_brackets;cxx_rvalue_references;cxx_sizeof_member;cxx_static_assert;cxx_strong_enums;cxx_thread_local;cxx_trailing_return_types;cxx_unicode_literals;cxx_uniform_initialization;cxx_unrestricted_unions;cxx_user_literals;cxx_variadic_macros;cxx_variadic_templates") +set(CMAKE_CXX14_COMPILE_FEATURES "cxx_std_14;cxx_aggregate_default_initializers;cxx_attribute_deprecated;cxx_binary_literals;cxx_contextual_conversions;cxx_decltype_auto;cxx_digit_separators;cxx_generic_lambdas;cxx_lambda_init_captures;cxx_relaxed_constexpr;cxx_return_type_deduction;cxx_variable_templates") +set(CMAKE_CXX17_COMPILE_FEATURES "cxx_std_17") +set(CMAKE_CXX20_COMPILE_FEATURES "cxx_std_20") +set(CMAKE_CXX23_COMPILE_FEATURES "cxx_std_23") +set(CMAKE_CXX26_COMPILE_FEATURES "cxx_std_26") + +set(CMAKE_CXX_PLATFORM_ID "Linux") +set(CMAKE_CXX_SIMULATE_ID "") +set(CMAKE_CXX_COMPILER_FRONTEND_VARIANT "GNU") +set(CMAKE_CXX_COMPILER_APPLE_SYSROOT "") +set(CMAKE_CXX_SIMULATE_VERSION "") +set(CMAKE_CXX_COMPILER_ARCHITECTURE_ID "x86_64") + + + + +set(CMAKE_AR "/usr/bin/ar") +set(CMAKE_CXX_COMPILER_AR "/usr/bin/gcc-ar") +set(CMAKE_RANLIB "/usr/bin/ranlib") +set(CMAKE_CXX_COMPILER_RANLIB "/usr/bin/gcc-ranlib") +set(CMAKE_LINKER "/usr/bin/ld") +set(CMAKE_LINKER_LINK "") +set(CMAKE_LINKER_LLD "") +set(CMAKE_CXX_COMPILER_LINKER "/usr/bin/ld") +set(CMAKE_CXX_COMPILER_LINKER_ID "GNU") +set(CMAKE_CXX_COMPILER_LINKER_VERSION 2.46.0) +set(CMAKE_CXX_COMPILER_LINKER_FRONTEND_VARIANT GNU) +set(CMAKE_MT "") +set(CMAKE_TAPI "CMAKE_TAPI-NOTFOUND") +set(CMAKE_COMPILER_IS_GNUCXX 1) +set(CMAKE_CXX_COMPILER_LOADED 1) +set(CMAKE_CXX_COMPILER_WORKS TRUE) +set(CMAKE_CXX_ABI_COMPILED TRUE) + +set(CMAKE_CXX_COMPILER_ENV_VAR "CXX") + +set(CMAKE_CXX_COMPILER_ID_RUN 1) +set(CMAKE_CXX_SOURCE_FILE_EXTENSIONS C;M;c++;cc;cpp;cxx;m;mm;mpp;CPP;ixx;cppm;ccm;cxxm;c++m) +set(CMAKE_CXX_IGNORE_EXTENSIONS inl;h;hpp;HPP;H;o;O;obj;OBJ;def;DEF;rc;RC) + +foreach (lang IN ITEMS C OBJC OBJCXX) + if (CMAKE_${lang}_COMPILER_ID_RUN) + foreach(extension IN LISTS CMAKE_${lang}_SOURCE_FILE_EXTENSIONS) + list(REMOVE_ITEM CMAKE_CXX_SOURCE_FILE_EXTENSIONS ${extension}) + endforeach() + endif() +endforeach() + +set(CMAKE_CXX_LINKER_PREFERENCE 30) +set(CMAKE_CXX_LINKER_PREFERENCE_PROPAGATES 1) +set(CMAKE_CXX_LINKER_DEPFILE_SUPPORTED TRUE) +set(CMAKE_LINKER_PUSHPOP_STATE_SUPPORTED TRUE) +set(CMAKE_CXX_LINKER_PUSHPOP_STATE_SUPPORTED TRUE) + +# Save compiler ABI information. +set(CMAKE_CXX_SIZEOF_DATA_PTR "8") +set(CMAKE_CXX_COMPILER_ABI "ELF") +set(CMAKE_CXX_BYTE_ORDER "LITTLE_ENDIAN") +set(CMAKE_CXX_LIBRARY_ARCHITECTURE "") + +if(CMAKE_CXX_SIZEOF_DATA_PTR) + set(CMAKE_SIZEOF_VOID_P "${CMAKE_CXX_SIZEOF_DATA_PTR}") +endif() + +if(CMAKE_CXX_COMPILER_ABI) + set(CMAKE_INTERNAL_PLATFORM_ABI "${CMAKE_CXX_COMPILER_ABI}") +endif() + +if(CMAKE_CXX_LIBRARY_ARCHITECTURE) + set(CMAKE_LIBRARY_ARCHITECTURE "") +endif() + +set(CMAKE_CXX_CL_SHOWINCLUDES_PREFIX "") +if(CMAKE_CXX_CL_SHOWINCLUDES_PREFIX) + set(CMAKE_CL_SHOWINCLUDES_PREFIX "${CMAKE_CXX_CL_SHOWINCLUDES_PREFIX}") +endif() + + + + + +set(CMAKE_CXX_IMPLICIT_INCLUDE_DIRECTORIES "/usr/include/c++/16.1.1;/usr/include/c++/16.1.1/x86_64-pc-linux-gnu;/usr/include/c++/16.1.1/backward;/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include;/usr/local/include;/usr/include") +set(CMAKE_CXX_IMPLICIT_LINK_LIBRARIES "stdc++;m;gcc_s;gcc;atomic_asneeded;c;gcc_s;gcc") +set(CMAKE_CXX_IMPLICIT_LINK_DIRECTORIES "/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1;/usr/lib;/lib") +set(CMAKE_CXX_IMPLICIT_LINK_FRAMEWORK_DIRECTORIES "") +set(CMAKE_CXX_COMPILER_CLANG_RESOURCE_DIR "") + +set(CMAKE_CXX_COMPILER_IMPORT_STD "") +set(CMAKE_CXX_COMPILER_IMPORT_STD_ERROR_MESSAGE "Experimental `import std` support not enabled when detecting toolchain; it must be set before `CXX` is enabled (usually a `project()` call)") +set(CMAKE_CXX_STDLIB_MODULES_JSON "") diff --git a/build/CMakeFiles/4.3.2/CMakeDetermineCompilerABI_CXX.bin b/build/CMakeFiles/4.3.2/CMakeDetermineCompilerABI_CXX.bin new file mode 100755 index 0000000000000000000000000000000000000000..8c9df67f268068d473ba8a39871bd2a48f396e26 GIT binary patch literal 16048 zcmeHOT}&L;6~4O|o76vG2O1ow@eoy(ql7VFOo=Pv zv*X46d8qm@SK2-IeCK@U-Z^t;_s-0{Ka3CdM<|=|f{p`u)o36+ zD1Su_uw;9wJq^iFH2GbUuMm%=pNCypZC3uPUF9+sRk}fvd8i_9op|fSV|j(zW6Al% zoZ#mf%4bl18EjZsqAwPd_!((J?M@k!D4ugwg6&-(UQlY}&yw3a`GJ@IZ`vCn-bD%+ zlsryYa(ko1YovY#We4?>B_H3{fJZ}#Jnk-dSe>BuHaqVcoo|*A3XA=%hYy~sT~Np`d!%A}h!PHuLtd9Jggxuab#baGb4dD0eOE_mtGBadK~I#A7)YEvm- zqSlIdO5p>8iJo4wO+VZ&xZ0*4!2^!UbAvT35zxZ1#TV9_0KI zouTmc&*Q6Zx5C%x`euBE0@lQoopILd0{DWa{2BxJdBRtYDLam3JV#vK^5HZjrRjxK6c=)!lv~FDb_?U6& zW|a|n!?=3etA_wbC_qhdb+UGU-v%H1x6m~PW-)ts%vkLDP=~6q^nth2SnfIic(LIf zfYwsQV)2dYM*)aTT;Av}^dlxFH*}15Z3=wHAjZ;D*Nvsw)i>j}u*=Kw>&6SlxrS@I zgs6ROOI_`+S0eFSgx13$RDXh&*SAD#Uk_S7E3+8O4bMZL6g6_C_BEkm0e-d;z8t?b z0jHyMu1aSIyA_r&17QZj41^g7GZ1DV%s`ldFau!*!VH8N2s7}nGl1{0?p6}R{l||M z;8j|F(oD~I?s!Y*gx`NSalAiy)SEYLH*crM-9(Q$FdR?x4R;IaC;7>F&o=Weyxtoh zOpJ~W#?AO}U!r>$Jfz)9I^(boVS+R_H9ZdRHqDOq2@%;>^;LYQi@jXk zj!-A?ohg>clP5%Et}e1~$F`aa@S+QG3nN-Kk2;g5%0&au>G^!#XRb7 z(c(j1Q#gk=K~QiVBbGI?^L^RN3KrW*Hj->0$zmH-rYSJDyG}SP+LVR)|0t^d04QB= zlio>uxDAy3=FC zR=rhgYia9fX+MlNxpyg;k1gWQ#h?r3HzIZmUN5eZ!@VFY`R@lj3U}WlcvI{vO;AUC zA%Nq(J>opxneqfwBBD`fF@^B?`ntsL6+9l5Rfwmcf^qozVSGvY? z(tnqzYf|z3-P2u|O-uZXVvW`XGwTO{*Fpa||BT-RTmxLh z7*X+J?ME@iiK6{Osp_83#snU>tr3IJO%+-Wz~p9)ibP6-B&J9E@$WiM1NSgK_Es z*UDX`*0KqHY!h6ZOu1gGo`;3=@D$GUtSJFN5|-iTP6E2IBH#3~W(wEj7r-^0H>WcB zq?Iw#UfwO3*6f@}<+C#x+q2VpOJxsSmG79A>ss)%Fz31RV$!v;wwa#IX6J$8(@gO6 z%3OPgtnb>rr%v@kD^A9CyL%FPYGy{5-yCf1aB`D*)Ax`P(Kdx{JbE;f&J?tpb}ZN> z0QScu%V*Cxo|mzGE}hZ?(t`fV-GXP6m>`IQ=`qdz6Wv4daVG9zfJdKWX51jq=sO|I zzSG0qLy2Bt4h$ae=^iwX_xGQSkD8<1J@6D%n0DIoEZE?19QH7zot!yau+tF7zlR~_ z--keZ9MXlnIc??AxH$r|3Y5S`h!P7nGRSO#3v8;u2d}cH*sj_)0iDQUo5@0ffxGR+ zsIYCL;?@kI7v{5`l?3UzN=|bvm-lRaDmSYqXC2th;-rP{Ib*v8C!Z@*Ot86j#zF$daXg`W_8ff6%;;`j=2*9rICdZU*U57k0G2- z;T#4oXIVDe=S61t4=69NybS(FHu#(EyJHsm`b!5WH(*Y~?ejd1CC}%$U7lZYj2KjK zj>deR$FaOXjyPY!wwcfKF#|B1`Z1s9g)Dg<2rjY&`#%CG&e@pH^E8$`zvce3A4`0x zfpb9Cc^=5JMKvp*|NHw-u*g6KV>6%Up)A+Qk=qX*{~54jT%HG){&(sWk>}eK=8p6K z{QzGh9?NF~2_rLy6F&;@`Tvt8-w!Z>kAwARh|k9_G_sJqNGc10Srr$chFxU-MRH)t z2HRtu<)46C>*Mphd5!j~vLCp}!aB=qfa2KY_Iduu z`(1foE8j0MkH_I(fE)4gd4Jo=ApoHqRHF3Fe3pL$i=WT))HUMs?+gcE9!n(q`65Q1 zElO&nvMBKg*a~FC`1rM$GHApP`eR%EvYpx|_mYYE!Rw#-e#zHPi42t(1ze$yVH}vH o-tqg3_ix;HsBRRz@q%(X5S-gpR-DsU=AXtt7AW-rLO>P&1TbSgRR910 literal 0 HcmV?d00001 diff --git a/build/CMakeFiles/4.3.2/CMakeSystem.cmake b/build/CMakeFiles/4.3.2/CMakeSystem.cmake new file mode 100644 index 0000000..0594f3b --- /dev/null +++ b/build/CMakeFiles/4.3.2/CMakeSystem.cmake @@ -0,0 +1,15 @@ +set(CMAKE_HOST_SYSTEM "Linux-7.0.9-1-MANJARO") +set(CMAKE_HOST_SYSTEM_NAME "Linux") +set(CMAKE_HOST_SYSTEM_VERSION "7.0.9-1-MANJARO") +set(CMAKE_HOST_SYSTEM_PROCESSOR "x86_64") + + + +set(CMAKE_SYSTEM "Linux-7.0.9-1-MANJARO") +set(CMAKE_SYSTEM_NAME "Linux") +set(CMAKE_SYSTEM_VERSION "7.0.9-1-MANJARO") +set(CMAKE_SYSTEM_PROCESSOR "x86_64") + +set(CMAKE_CROSSCOMPILING "FALSE") + +set(CMAKE_SYSTEM_LOADED 1) diff --git a/build/CMakeFiles/4.3.2/CompilerIdCXX/CMakeCXXCompilerId.cpp b/build/CMakeFiles/4.3.2/CompilerIdCXX/CMakeCXXCompilerId.cpp new file mode 100644 index 0000000..b35f567 --- /dev/null +++ b/build/CMakeFiles/4.3.2/CompilerIdCXX/CMakeCXXCompilerId.cpp @@ -0,0 +1,949 @@ +/* This source file must have a .cpp extension so that all C++ compilers + recognize the extension without flags. Borland does not know .cxx for + example. */ +#ifndef __cplusplus +# error "A C compiler has been selected for C++." +#endif + +#if !defined(__has_include) +/* If the compiler does not have __has_include, pretend the answer is + always no. */ +# define __has_include(x) 0 +#endif + + +/* Version number components: V=Version, R=Revision, P=Patch + Version date components: YYYY=Year, MM=Month, DD=Day */ + +#if defined(__INTEL_COMPILER) || defined(__ICC) +# define COMPILER_ID "Intel" +# if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +# endif +# if defined(__GNUC__) +# define SIMULATE_ID "GNU" +# endif + /* __INTEL_COMPILER = VRP prior to 2021, and then VVVV for 2021 and later, + except that a few beta releases use the old format with V=2021. */ +# if __INTEL_COMPILER < 2021 || __INTEL_COMPILER == 202110 || __INTEL_COMPILER == 202111 +# define COMPILER_VERSION_MAJOR DEC(__INTEL_COMPILER/100) +# define COMPILER_VERSION_MINOR DEC(__INTEL_COMPILER/10 % 10) +# if defined(__INTEL_COMPILER_UPDATE) +# define COMPILER_VERSION_PATCH DEC(__INTEL_COMPILER_UPDATE) +# else +# define COMPILER_VERSION_PATCH DEC(__INTEL_COMPILER % 10) +# endif +# else +# define COMPILER_VERSION_MAJOR DEC(__INTEL_COMPILER) +# define COMPILER_VERSION_MINOR DEC(__INTEL_COMPILER_UPDATE) + /* The third version component from --version is an update index, + but no macro is provided for it. */ +# define COMPILER_VERSION_PATCH DEC(0) +# endif +# if defined(__INTEL_COMPILER_BUILD_DATE) + /* __INTEL_COMPILER_BUILD_DATE = YYYYMMDD */ +# define COMPILER_VERSION_TWEAK DEC(__INTEL_COMPILER_BUILD_DATE) +# endif +# if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +# endif +# if defined(__GNUC__) +# define SIMULATE_VERSION_MAJOR DEC(__GNUC__) +# elif defined(__GNUG__) +# define SIMULATE_VERSION_MAJOR DEC(__GNUG__) +# endif +# if defined(__GNUC_MINOR__) +# define SIMULATE_VERSION_MINOR DEC(__GNUC_MINOR__) +# endif +# if defined(__GNUC_PATCHLEVEL__) +# define SIMULATE_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) +# endif + +#elif (defined(__clang__) && defined(__INTEL_CLANG_COMPILER)) || defined(__INTEL_LLVM_COMPILER) +# define COMPILER_ID "IntelLLVM" +#if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +#endif +#if defined(__GNUC__) +# define SIMULATE_ID "GNU" +#endif +/* __INTEL_LLVM_COMPILER = VVVVRP prior to 2021.2.0, VVVVRRPP for 2021.2.0 and + * later. Look for 6 digit vs. 8 digit version number to decide encoding. + * VVVV is no smaller than the current year when a version is released. + */ +#if __INTEL_LLVM_COMPILER < 1000000L +# define COMPILER_VERSION_MAJOR DEC(__INTEL_LLVM_COMPILER/100) +# define COMPILER_VERSION_MINOR DEC(__INTEL_LLVM_COMPILER/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__INTEL_LLVM_COMPILER % 10) +#else +# define COMPILER_VERSION_MAJOR DEC(__INTEL_LLVM_COMPILER/10000) +# define COMPILER_VERSION_MINOR DEC(__INTEL_LLVM_COMPILER/100 % 100) +# define COMPILER_VERSION_PATCH DEC(__INTEL_LLVM_COMPILER % 100) +#endif +#if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +#endif +#if defined(__GNUC__) +# define SIMULATE_VERSION_MAJOR DEC(__GNUC__) +#elif defined(__GNUG__) +# define SIMULATE_VERSION_MAJOR DEC(__GNUG__) +#endif +#if defined(__GNUC_MINOR__) +# define SIMULATE_VERSION_MINOR DEC(__GNUC_MINOR__) +#endif +#if defined(__GNUC_PATCHLEVEL__) +# define SIMULATE_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) +#endif + +#elif defined(__PATHCC__) +# define COMPILER_ID "PathScale" +# define COMPILER_VERSION_MAJOR DEC(__PATHCC__) +# define COMPILER_VERSION_MINOR DEC(__PATHCC_MINOR__) +# if defined(__PATHCC_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__PATHCC_PATCHLEVEL__) +# endif + +#elif defined(__BORLANDC__) && defined(__CODEGEARC_VERSION__) +# define COMPILER_ID "Embarcadero" +# define COMPILER_VERSION_MAJOR HEX(__CODEGEARC_VERSION__>>24 & 0x00FF) +# define COMPILER_VERSION_MINOR HEX(__CODEGEARC_VERSION__>>16 & 0x00FF) +# define COMPILER_VERSION_PATCH DEC(__CODEGEARC_VERSION__ & 0xFFFF) + +#elif defined(__BORLANDC__) +# define COMPILER_ID "Borland" + /* __BORLANDC__ = 0xVRR */ +# define COMPILER_VERSION_MAJOR HEX(__BORLANDC__>>8) +# define COMPILER_VERSION_MINOR HEX(__BORLANDC__ & 0xFF) + +#elif defined(__WATCOMC__) && __WATCOMC__ < 1200 +# define COMPILER_ID "Watcom" + /* __WATCOMC__ = VVRR */ +# define COMPILER_VERSION_MAJOR DEC(__WATCOMC__ / 100) +# define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10) +# if (__WATCOMC__ % 10) > 0 +# define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10) +# endif + +#elif defined(__WATCOMC__) +# define COMPILER_ID "OpenWatcom" + /* __WATCOMC__ = VVRP + 1100 */ +# define COMPILER_VERSION_MAJOR DEC((__WATCOMC__ - 1100) / 100) +# define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10) +# if (__WATCOMC__ % 10) > 0 +# define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10) +# endif + +#elif defined(__SUNPRO_CC) +# define COMPILER_ID "SunPro" +# if __SUNPRO_CC >= 0x5100 + /* __SUNPRO_CC = 0xVRRP */ +# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_CC>>12) +# define COMPILER_VERSION_MINOR HEX(__SUNPRO_CC>>4 & 0xFF) +# define COMPILER_VERSION_PATCH HEX(__SUNPRO_CC & 0xF) +# else + /* __SUNPRO_CC = 0xVRP */ +# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_CC>>8) +# define COMPILER_VERSION_MINOR HEX(__SUNPRO_CC>>4 & 0xF) +# define COMPILER_VERSION_PATCH HEX(__SUNPRO_CC & 0xF) +# endif + +#elif defined(__HP_aCC) +# define COMPILER_ID "HP" + /* __HP_aCC = VVRRPP */ +# define COMPILER_VERSION_MAJOR DEC(__HP_aCC/10000) +# define COMPILER_VERSION_MINOR DEC(__HP_aCC/100 % 100) +# define COMPILER_VERSION_PATCH DEC(__HP_aCC % 100) + +#elif defined(__DECCXX) +# define COMPILER_ID "Compaq" + /* __DECCXX_VER = VVRRTPPPP */ +# define COMPILER_VERSION_MAJOR DEC(__DECCXX_VER/10000000) +# define COMPILER_VERSION_MINOR DEC(__DECCXX_VER/100000 % 100) +# define COMPILER_VERSION_PATCH DEC(__DECCXX_VER % 10000) + +#elif defined(__IBMCPP__) && defined(__COMPILER_VER__) +# define COMPILER_ID "zOS" + /* __IBMCPP__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMCPP__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMCPP__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMCPP__ % 10) + +#elif defined(__open_xl__) && defined(__clang__) +# define COMPILER_ID "IBMClang" +# define COMPILER_VERSION_MAJOR DEC(__open_xl_version__) +# define COMPILER_VERSION_MINOR DEC(__open_xl_release__) +# define COMPILER_VERSION_PATCH DEC(__open_xl_modification__) +# define COMPILER_VERSION_TWEAK DEC(__open_xl_ptf_fix_level__) +# define COMPILER_VERSION_INTERNAL_STR __clang_version__ + + +#elif defined(__ibmxl__) && defined(__clang__) +# define COMPILER_ID "XLClang" +# define COMPILER_VERSION_MAJOR DEC(__ibmxl_version__) +# define COMPILER_VERSION_MINOR DEC(__ibmxl_release__) +# define COMPILER_VERSION_PATCH DEC(__ibmxl_modification__) +# define COMPILER_VERSION_TWEAK DEC(__ibmxl_ptf_fix_level__) + + +#elif defined(__IBMCPP__) && !defined(__COMPILER_VER__) && __IBMCPP__ >= 800 +# define COMPILER_ID "XL" + /* __IBMCPP__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMCPP__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMCPP__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMCPP__ % 10) + +#elif defined(__IBMCPP__) && !defined(__COMPILER_VER__) && __IBMCPP__ < 800 +# define COMPILER_ID "VisualAge" + /* __IBMCPP__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMCPP__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMCPP__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMCPP__ % 10) + +#elif defined(__NVCOMPILER) +# define COMPILER_ID "NVHPC" +# define COMPILER_VERSION_MAJOR DEC(__NVCOMPILER_MAJOR__) +# define COMPILER_VERSION_MINOR DEC(__NVCOMPILER_MINOR__) +# if defined(__NVCOMPILER_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__NVCOMPILER_PATCHLEVEL__) +# endif + +#elif defined(__PGI) +# define COMPILER_ID "PGI" +# define COMPILER_VERSION_MAJOR DEC(__PGIC__) +# define COMPILER_VERSION_MINOR DEC(__PGIC_MINOR__) +# if defined(__PGIC_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__PGIC_PATCHLEVEL__) +# endif + +#elif defined(__clang__) && defined(__cray__) +# define COMPILER_ID "CrayClang" +# define COMPILER_VERSION_MAJOR DEC(__cray_major__) +# define COMPILER_VERSION_MINOR DEC(__cray_minor__) +# define COMPILER_VERSION_PATCH DEC(__cray_patchlevel__) +# define COMPILER_VERSION_INTERNAL_STR __clang_version__ + + +#elif defined(_CRAYC) +# define COMPILER_ID "Cray" +# define COMPILER_VERSION_MAJOR DEC(_RELEASE_MAJOR) +# define COMPILER_VERSION_MINOR DEC(_RELEASE_MINOR) + +#elif defined(__TI_COMPILER_VERSION__) +# define COMPILER_ID "TI" + /* __TI_COMPILER_VERSION__ = VVVRRRPPP */ +# define COMPILER_VERSION_MAJOR DEC(__TI_COMPILER_VERSION__/1000000) +# define COMPILER_VERSION_MINOR DEC(__TI_COMPILER_VERSION__/1000 % 1000) +# define COMPILER_VERSION_PATCH DEC(__TI_COMPILER_VERSION__ % 1000) + +#elif defined(__CLANG_FUJITSU) +# define COMPILER_ID "FujitsuClang" +# define COMPILER_VERSION_MAJOR DEC(__FCC_major__) +# define COMPILER_VERSION_MINOR DEC(__FCC_minor__) +# define COMPILER_VERSION_PATCH DEC(__FCC_patchlevel__) +# define COMPILER_VERSION_INTERNAL_STR __clang_version__ + + +#elif defined(__FUJITSU) +# define COMPILER_ID "Fujitsu" +# if defined(__FCC_version__) +# define COMPILER_VERSION __FCC_version__ +# elif defined(__FCC_major__) +# define COMPILER_VERSION_MAJOR DEC(__FCC_major__) +# define COMPILER_VERSION_MINOR DEC(__FCC_minor__) +# define COMPILER_VERSION_PATCH DEC(__FCC_patchlevel__) +# endif +# if defined(__fcc_version) +# define COMPILER_VERSION_INTERNAL DEC(__fcc_version) +# elif defined(__FCC_VERSION) +# define COMPILER_VERSION_INTERNAL DEC(__FCC_VERSION) +# endif + + +#elif defined(__ghs__) +# define COMPILER_ID "GHS" +/* __GHS_VERSION_NUMBER = VVVVRP */ +# ifdef __GHS_VERSION_NUMBER +# define COMPILER_VERSION_MAJOR DEC(__GHS_VERSION_NUMBER / 100) +# define COMPILER_VERSION_MINOR DEC(__GHS_VERSION_NUMBER / 10 % 10) +# define COMPILER_VERSION_PATCH DEC(__GHS_VERSION_NUMBER % 10) +# endif + +#elif defined(__TASKING__) +# define COMPILER_ID "Tasking" + # define COMPILER_VERSION_MAJOR DEC(__VERSION__/1000) + # define COMPILER_VERSION_MINOR DEC(__VERSION__ % 100) +# define COMPILER_VERSION_INTERNAL DEC(__VERSION__) + +#elif defined(__ORANGEC__) +# define COMPILER_ID "OrangeC" +# define COMPILER_VERSION_MAJOR DEC(__ORANGEC_MAJOR__) +# define COMPILER_VERSION_MINOR DEC(__ORANGEC_MINOR__) +# define COMPILER_VERSION_PATCH DEC(__ORANGEC_PATCHLEVEL__) + +#elif defined(__RENESAS__) +# define COMPILER_ID "Renesas" +/* __RENESAS_VERSION__ = 0xVVRRPP00 */ +# define COMPILER_VERSION_MAJOR HEX(__RENESAS_VERSION__ >> 24 & 0xFF) +# define COMPILER_VERSION_MINOR HEX(__RENESAS_VERSION__ >> 16 & 0xFF) +# define COMPILER_VERSION_PATCH HEX(__RENESAS_VERSION__ >> 8 & 0xFF) + +#elif defined(__SCO_VERSION__) +# define COMPILER_ID "SCO" + +#elif defined(__ARMCC_VERSION) && !defined(__clang__) +# define COMPILER_ID "ARMCC" +#if __ARMCC_VERSION >= 1000000 + /* __ARMCC_VERSION = VRRPPPP */ + # define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/1000000) + # define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 100) + # define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000) +#else + /* __ARMCC_VERSION = VRPPPP */ + # define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/100000) + # define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 10) + # define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000) +#endif + + +#elif defined(__clang__) && defined(__apple_build_version__) +# define COMPILER_ID "AppleClang" +# if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +# endif +# define COMPILER_VERSION_MAJOR DEC(__clang_major__) +# define COMPILER_VERSION_MINOR DEC(__clang_minor__) +# define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__) +# if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +# endif +# define COMPILER_VERSION_TWEAK DEC(__apple_build_version__) + +#elif defined(__clang__) && defined(__ARMCOMPILER_VERSION) +# define COMPILER_ID "ARMClang" + # define COMPILER_VERSION_MAJOR DEC(__ARMCOMPILER_VERSION/1000000) + # define COMPILER_VERSION_MINOR DEC(__ARMCOMPILER_VERSION/10000 % 100) + # define COMPILER_VERSION_PATCH DEC(__ARMCOMPILER_VERSION/100 % 100) +# define COMPILER_VERSION_INTERNAL DEC(__ARMCOMPILER_VERSION) + +#elif defined(__clang__) && defined(__ti__) +# define COMPILER_ID "TIClang" + # define COMPILER_VERSION_MAJOR DEC(__ti_major__) + # define COMPILER_VERSION_MINOR DEC(__ti_minor__) + # define COMPILER_VERSION_PATCH DEC(__ti_patchlevel__) +# define COMPILER_VERSION_INTERNAL DEC(__ti_version__) + +#elif defined(__clang__) +# define COMPILER_ID "Clang" +# if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +# endif +# define COMPILER_VERSION_MAJOR DEC(__clang_major__) +# define COMPILER_VERSION_MINOR DEC(__clang_minor__) +# define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__) +# if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +# endif + +#elif defined(__LCC__) && (defined(__GNUC__) || defined(__GNUG__) || defined(__MCST__)) +# define COMPILER_ID "LCC" +# define COMPILER_VERSION_MAJOR DEC(__LCC__ / 100) +# define COMPILER_VERSION_MINOR DEC(__LCC__ % 100) +# if defined(__LCC_MINOR__) +# define COMPILER_VERSION_PATCH DEC(__LCC_MINOR__) +# endif +# if defined(__GNUC__) && defined(__GNUC_MINOR__) +# define SIMULATE_ID "GNU" +# define SIMULATE_VERSION_MAJOR DEC(__GNUC__) +# define SIMULATE_VERSION_MINOR DEC(__GNUC_MINOR__) +# if defined(__GNUC_PATCHLEVEL__) +# define SIMULATE_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) +# endif +# endif + +#elif defined(__GNUC__) || defined(__GNUG__) +# define COMPILER_ID "GNU" +# if defined(__GNUC__) +# define COMPILER_VERSION_MAJOR DEC(__GNUC__) +# else +# define COMPILER_VERSION_MAJOR DEC(__GNUG__) +# endif +# if defined(__GNUC_MINOR__) +# define COMPILER_VERSION_MINOR DEC(__GNUC_MINOR__) +# endif +# if defined(__GNUC_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) +# endif + +#elif defined(_MSC_VER) +# define COMPILER_ID "MSVC" + /* _MSC_VER = VVRR */ +# define COMPILER_VERSION_MAJOR DEC(_MSC_VER / 100) +# define COMPILER_VERSION_MINOR DEC(_MSC_VER % 100) +# if defined(_MSC_FULL_VER) +# if _MSC_VER >= 1400 + /* _MSC_FULL_VER = VVRRPPPPP */ +# define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 100000) +# else + /* _MSC_FULL_VER = VVRRPPPP */ +# define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 10000) +# endif +# endif +# if defined(_MSC_BUILD) +# define COMPILER_VERSION_TWEAK DEC(_MSC_BUILD) +# endif + +#elif defined(_ADI_COMPILER) +# define COMPILER_ID "ADSP" +#if defined(__VERSIONNUM__) + /* __VERSIONNUM__ = 0xVVRRPPTT */ +# define COMPILER_VERSION_MAJOR DEC(__VERSIONNUM__ >> 24 & 0xFF) +# define COMPILER_VERSION_MINOR DEC(__VERSIONNUM__ >> 16 & 0xFF) +# define COMPILER_VERSION_PATCH DEC(__VERSIONNUM__ >> 8 & 0xFF) +# define COMPILER_VERSION_TWEAK DEC(__VERSIONNUM__ & 0xFF) +#endif + +#elif defined(__IAR_SYSTEMS_ICC__) || defined(__IAR_SYSTEMS_ICC) +# define COMPILER_ID "IAR" +# if defined(__VER__) && defined(__ICCARM__) +# define COMPILER_VERSION_MAJOR DEC((__VER__) / 1000000) +# define COMPILER_VERSION_MINOR DEC(((__VER__) / 1000) % 1000) +# define COMPILER_VERSION_PATCH DEC((__VER__) % 1000) +# define COMPILER_VERSION_INTERNAL DEC(__IAR_SYSTEMS_ICC__) +# elif defined(__VER__) && (defined(__ICCAVR__) || defined(__ICCRX__) || defined(__ICCRH850__) || defined(__ICCRL78__) || defined(__ICC430__) || defined(__ICCRISCV__) || defined(__ICCV850__) || defined(__ICC8051__) || defined(__ICCSTM8__)) +# define COMPILER_VERSION_MAJOR DEC((__VER__) / 100) +# define COMPILER_VERSION_MINOR DEC((__VER__) - (((__VER__) / 100)*100)) +# define COMPILER_VERSION_PATCH DEC(__SUBVERSION__) +# define COMPILER_VERSION_INTERNAL DEC(__IAR_SYSTEMS_ICC__) +# endif + +#elif defined(__DCC__) && defined(_DIAB_TOOL) +# define COMPILER_ID "Diab" + # define COMPILER_VERSION_MAJOR DEC(__VERSION_MAJOR_NUMBER__) + # define COMPILER_VERSION_MINOR DEC(__VERSION_MINOR_NUMBER__) + # define COMPILER_VERSION_PATCH DEC(__VERSION_ARCH_FEATURE_NUMBER__) + # define COMPILER_VERSION_TWEAK DEC(__VERSION_BUG_FIX_NUMBER__) + + + +/* These compilers are either not known or too old to define an + identification macro. Try to identify the platform and guess that + it is the native compiler. */ +#elif defined(__hpux) || defined(__hpua) +# define COMPILER_ID "HP" + +#else /* unknown compiler */ +# define COMPILER_ID "" +#endif + +/* Construct the string literal in pieces to prevent the source from + getting matched. Store it in a pointer rather than an array + because some compilers will just produce instructions to fill the + array rather than assigning a pointer to a static array. */ +char const* info_compiler = "INFO" ":" "compiler[" COMPILER_ID "]"; +#ifdef SIMULATE_ID +char const* info_simulate = "INFO" ":" "simulate[" SIMULATE_ID "]"; +#endif + +#ifdef __QNXNTO__ +char const* qnxnto = "INFO" ":" "qnxnto[]"; +#endif + +#if defined(__CRAYXT_COMPUTE_LINUX_TARGET) +char const *info_cray = "INFO" ":" "compiler_wrapper[CrayPrgEnv]"; +#endif + +#define STRINGIFY_HELPER(X) #X +#define STRINGIFY(X) STRINGIFY_HELPER(X) + +/* Identify known platforms by name. */ +#if defined(__linux) || defined(__linux__) || defined(linux) +# define PLATFORM_ID "Linux" + +#elif defined(__MSYS__) +# define PLATFORM_ID "MSYS" + +#elif defined(__CYGWIN__) +# define PLATFORM_ID "Cygwin" + +#elif defined(__MINGW32__) +# define PLATFORM_ID "MinGW" + +#elif defined(__APPLE__) +# define PLATFORM_ID "Darwin" + +#elif defined(_WIN32) || defined(__WIN32__) || defined(WIN32) +# define PLATFORM_ID "Windows" + +#elif defined(__FreeBSD__) || defined(__FreeBSD) +# define PLATFORM_ID "FreeBSD" + +#elif defined(__NetBSD__) || defined(__NetBSD) +# define PLATFORM_ID "NetBSD" + +#elif defined(__OpenBSD__) || defined(__OPENBSD) +# define PLATFORM_ID "OpenBSD" + +#elif defined(__sun) || defined(sun) +# define PLATFORM_ID "SunOS" + +#elif defined(_AIX) || defined(__AIX) || defined(__AIX__) || defined(__aix) || defined(__aix__) +# define PLATFORM_ID "AIX" + +#elif defined(__hpux) || defined(__hpux__) +# define PLATFORM_ID "HP-UX" + +#elif defined(__HAIKU__) +# define PLATFORM_ID "Haiku" + +#elif defined(__BeOS) || defined(__BEOS__) || defined(_BEOS) +# define PLATFORM_ID "BeOS" + +#elif defined(__QNX__) || defined(__QNXNTO__) +# define PLATFORM_ID "QNX" + +#elif defined(__tru64) || defined(_tru64) || defined(__TRU64__) +# define PLATFORM_ID "Tru64" + +#elif defined(__riscos) || defined(__riscos__) +# define PLATFORM_ID "RISCos" + +#elif defined(__sinix) || defined(__sinix__) || defined(__SINIX__) +# define PLATFORM_ID "SINIX" + +#elif defined(__UNIX_SV__) +# define PLATFORM_ID "UNIX_SV" + +#elif defined(__bsdos__) +# define PLATFORM_ID "BSDOS" + +#elif defined(_MPRAS) || defined(MPRAS) +# define PLATFORM_ID "MP-RAS" + +#elif defined(__osf) || defined(__osf__) +# define PLATFORM_ID "OSF1" + +#elif defined(_SCO_SV) || defined(SCO_SV) || defined(sco_sv) +# define PLATFORM_ID "SCO_SV" + +#elif defined(__ultrix) || defined(__ultrix__) || defined(_ULTRIX) +# define PLATFORM_ID "ULTRIX" + +#elif defined(__XENIX__) || defined(_XENIX) || defined(XENIX) +# define PLATFORM_ID "Xenix" + +#elif defined(__WATCOMC__) +# if defined(__LINUX__) +# define PLATFORM_ID "Linux" + +# elif defined(__DOS__) +# define PLATFORM_ID "DOS" + +# elif defined(__OS2__) +# define PLATFORM_ID "OS2" + +# elif defined(__WINDOWS__) +# define PLATFORM_ID "Windows3x" + +# elif defined(__VXWORKS__) +# define PLATFORM_ID "VxWorks" + +# else /* unknown platform */ +# define PLATFORM_ID +# endif + +#elif defined(__INTEGRITY) +# if defined(INT_178B) +# define PLATFORM_ID "Integrity178" + +# else /* regular Integrity */ +# define PLATFORM_ID "Integrity" +# endif + +# elif defined(_ADI_COMPILER) +# define PLATFORM_ID "ADSP" + +#else /* unknown platform */ +# define PLATFORM_ID + +#endif + +/* For windows compilers MSVC and Intel we can determine + the architecture of the compiler being used. This is because + the compilers do not have flags that can change the architecture, + but rather depend on which compiler is being used +*/ +#if defined(_WIN32) && defined(_MSC_VER) +# if defined(_M_IA64) +# define ARCHITECTURE_ID "IA64" + +# elif defined(_M_ARM64EC) +# define ARCHITECTURE_ID "ARM64EC" + +# elif defined(_M_X64) || defined(_M_AMD64) +# define ARCHITECTURE_ID "x64" + +# elif defined(_M_IX86) +# define ARCHITECTURE_ID "X86" + +# elif defined(_M_ARM64) +# define ARCHITECTURE_ID "ARM64" + +# elif defined(_M_ARM) +# if _M_ARM == 4 +# define ARCHITECTURE_ID "ARMV4I" +# elif _M_ARM == 5 +# define ARCHITECTURE_ID "ARMV5I" +# else +# define ARCHITECTURE_ID "ARMV" STRINGIFY(_M_ARM) +# endif + +# elif defined(_M_MIPS) +# define ARCHITECTURE_ID "MIPS" + +# elif defined(_M_SH) +# define ARCHITECTURE_ID "SHx" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__WATCOMC__) +# if defined(_M_I86) +# define ARCHITECTURE_ID "I86" + +# elif defined(_M_IX86) +# define ARCHITECTURE_ID "X86" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__IAR_SYSTEMS_ICC__) || defined(__IAR_SYSTEMS_ICC) +# if defined(__ICCARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__ICCRX__) +# define ARCHITECTURE_ID "RX" + +# elif defined(__ICCRH850__) +# define ARCHITECTURE_ID "RH850" + +# elif defined(__ICCRL78__) +# define ARCHITECTURE_ID "RL78" + +# elif defined(__ICCRISCV__) +# define ARCHITECTURE_ID "RISCV" + +# elif defined(__ICCAVR__) +# define ARCHITECTURE_ID "AVR" + +# elif defined(__ICC430__) +# define ARCHITECTURE_ID "MSP430" + +# elif defined(__ICCV850__) +# define ARCHITECTURE_ID "V850" + +# elif defined(__ICC8051__) +# define ARCHITECTURE_ID "8051" + +# elif defined(__ICCSTM8__) +# define ARCHITECTURE_ID "STM8" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__ghs__) +# if defined(__PPC64__) +# define ARCHITECTURE_ID "PPC64" + +# elif defined(__ppc__) +# define ARCHITECTURE_ID "PPC" + +# elif defined(__ARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__x86_64__) +# define ARCHITECTURE_ID "x64" + +# elif defined(__i386__) +# define ARCHITECTURE_ID "X86" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__clang__) && defined(__ti__) +# if defined(__ARM_ARCH) +# define ARCHITECTURE_ID "ARM" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__TI_COMPILER_VERSION__) +# if defined(__TI_ARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__MSP430__) +# define ARCHITECTURE_ID "MSP430" + +# elif defined(__TMS320C28XX__) +# define ARCHITECTURE_ID "TMS320C28x" + +# elif defined(__TMS320C6X__) || defined(_TMS320C6X) +# define ARCHITECTURE_ID "TMS320C6x" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +# elif defined(__ADSPSHARC__) +# define ARCHITECTURE_ID "SHARC" + +# elif defined(__ADSPBLACKFIN__) +# define ARCHITECTURE_ID "Blackfin" + +#elif defined(__TASKING__) + +# if defined(__CTC__) || defined(__CPTC__) +# define ARCHITECTURE_ID "TriCore" + +# elif defined(__CMCS__) +# define ARCHITECTURE_ID "MCS" + +# elif defined(__CARM__) || defined(__CPARM__) +# define ARCHITECTURE_ID "ARM" + +# elif defined(__CARC__) +# define ARCHITECTURE_ID "ARC" + +# elif defined(__C51__) +# define ARCHITECTURE_ID "8051" + +# elif defined(__CPCP__) +# define ARCHITECTURE_ID "PCP" + +# else +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__RENESAS__) +# if defined(__CCRX__) +# define ARCHITECTURE_ID "RX" + +# elif defined(__CCRL__) +# define ARCHITECTURE_ID "RL78" + +# elif defined(__CCRH__) +# define ARCHITECTURE_ID "RH850" + +# else +# define ARCHITECTURE_ID "" +# endif + +#else +# define ARCHITECTURE_ID +#endif + +/* Convert integer to decimal digit literals. */ +#define DEC(n) \ + ('0' + (((n) / 10000000)%10)), \ + ('0' + (((n) / 1000000)%10)), \ + ('0' + (((n) / 100000)%10)), \ + ('0' + (((n) / 10000)%10)), \ + ('0' + (((n) / 1000)%10)), \ + ('0' + (((n) / 100)%10)), \ + ('0' + (((n) / 10)%10)), \ + ('0' + ((n) % 10)) + +/* Convert integer to hex digit literals. */ +#define HEX(n) \ + ('0' + ((n)>>28 & 0xF)), \ + ('0' + ((n)>>24 & 0xF)), \ + ('0' + ((n)>>20 & 0xF)), \ + ('0' + ((n)>>16 & 0xF)), \ + ('0' + ((n)>>12 & 0xF)), \ + ('0' + ((n)>>8 & 0xF)), \ + ('0' + ((n)>>4 & 0xF)), \ + ('0' + ((n) & 0xF)) + +/* Construct a string literal encoding the version number. */ +#ifdef COMPILER_VERSION +char const* info_version = "INFO" ":" "compiler_version[" COMPILER_VERSION "]"; + +/* Construct a string literal encoding the version number components. */ +#elif defined(COMPILER_VERSION_MAJOR) +char const info_version[] = { + 'I', 'N', 'F', 'O', ':', + 'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','[', + COMPILER_VERSION_MAJOR, +# ifdef COMPILER_VERSION_MINOR + '.', COMPILER_VERSION_MINOR, +# ifdef COMPILER_VERSION_PATCH + '.', COMPILER_VERSION_PATCH, +# ifdef COMPILER_VERSION_TWEAK + '.', COMPILER_VERSION_TWEAK, +# endif +# endif +# endif + ']','\0'}; +#endif + +/* Construct a string literal encoding the internal version number. */ +#ifdef COMPILER_VERSION_INTERNAL +char const info_version_internal[] = { + 'I', 'N', 'F', 'O', ':', + 'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','_', + 'i','n','t','e','r','n','a','l','[', + COMPILER_VERSION_INTERNAL,']','\0'}; +#elif defined(COMPILER_VERSION_INTERNAL_STR) +char const* info_version_internal = "INFO" ":" "compiler_version_internal[" COMPILER_VERSION_INTERNAL_STR "]"; +#endif + +/* Construct a string literal encoding the version number components. */ +#ifdef SIMULATE_VERSION_MAJOR +char const info_simulate_version[] = { + 'I', 'N', 'F', 'O', ':', + 's','i','m','u','l','a','t','e','_','v','e','r','s','i','o','n','[', + SIMULATE_VERSION_MAJOR, +# ifdef SIMULATE_VERSION_MINOR + '.', SIMULATE_VERSION_MINOR, +# ifdef SIMULATE_VERSION_PATCH + '.', SIMULATE_VERSION_PATCH, +# ifdef SIMULATE_VERSION_TWEAK + '.', SIMULATE_VERSION_TWEAK, +# endif +# endif +# endif + ']','\0'}; +#endif + +/* Construct the string literal in pieces to prevent the source from + getting matched. Store it in a pointer rather than an array + because some compilers will just produce instructions to fill the + array rather than assigning a pointer to a static array. */ +char const* info_platform = "INFO" ":" "platform[" PLATFORM_ID "]"; +char const* info_arch = "INFO" ":" "arch[" ARCHITECTURE_ID "]"; + + + +#define CXX_STD_98 199711L +#define CXX_STD_11 201103L +#define CXX_STD_14 201402L +#define CXX_STD_17 201703L +#define CXX_STD_20 202002L +#define CXX_STD_23 202302L + +#if defined(__INTEL_COMPILER) && defined(_MSVC_LANG) +# if _MSVC_LANG > CXX_STD_17 +# define CXX_STD _MSVC_LANG +# elif _MSVC_LANG == CXX_STD_17 && defined(__cpp_aggregate_paren_init) +# define CXX_STD CXX_STD_20 +# elif _MSVC_LANG > CXX_STD_14 && __cplusplus > CXX_STD_17 +# define CXX_STD CXX_STD_20 +# elif _MSVC_LANG > CXX_STD_14 +# define CXX_STD CXX_STD_17 +# elif defined(__INTEL_CXX11_MODE__) && defined(__cpp_aggregate_nsdmi) +# define CXX_STD CXX_STD_14 +# elif defined(__INTEL_CXX11_MODE__) +# define CXX_STD CXX_STD_11 +# else +# define CXX_STD CXX_STD_98 +# endif +#elif defined(_MSC_VER) && defined(_MSVC_LANG) +# if _MSVC_LANG > __cplusplus +# define CXX_STD _MSVC_LANG +# else +# define CXX_STD __cplusplus +# endif +#elif defined(__NVCOMPILER) +# if __cplusplus == CXX_STD_17 && defined(__cpp_aggregate_paren_init) +# define CXX_STD CXX_STD_20 +# else +# define CXX_STD __cplusplus +# endif +#elif defined(__INTEL_COMPILER) || defined(__PGI) +# if __cplusplus == CXX_STD_11 && defined(__cpp_namespace_attributes) +# define CXX_STD CXX_STD_17 +# elif __cplusplus == CXX_STD_11 && defined(__cpp_aggregate_nsdmi) +# define CXX_STD CXX_STD_14 +# else +# define CXX_STD __cplusplus +# endif +#elif (defined(__IBMCPP__) || defined(__ibmxl__)) && defined(__linux__) +# if __cplusplus == CXX_STD_11 && defined(__cpp_aggregate_nsdmi) +# define CXX_STD CXX_STD_14 +# else +# define CXX_STD __cplusplus +# endif +#elif __cplusplus == 1 && defined(__GXX_EXPERIMENTAL_CXX0X__) +# define CXX_STD CXX_STD_11 +#else +# define CXX_STD __cplusplus +#endif + +const char* info_language_standard_default = "INFO" ":" "standard_default[" +#if CXX_STD > CXX_STD_23 + "26" +#elif CXX_STD > CXX_STD_20 + "23" +#elif CXX_STD > CXX_STD_17 + "20" +#elif CXX_STD > CXX_STD_14 + "17" +#elif CXX_STD > CXX_STD_11 + "14" +#elif CXX_STD >= CXX_STD_11 + "11" +#else + "98" +#endif +"]"; + +const char* info_language_extensions_default = "INFO" ":" "extensions_default[" +#if (defined(__clang__) || defined(__GNUC__) || defined(__xlC__) || \ + defined(__TI_COMPILER_VERSION__) || defined(__RENESAS__)) && \ + !defined(__STRICT_ANSI__) + "ON" +#else + "OFF" +#endif +"]"; + +/*--------------------------------------------------------------------------*/ + +int main(int argc, char* argv[]) +{ + int require = 0; + require += info_compiler[argc]; + require += info_platform[argc]; + require += info_arch[argc]; +#ifdef COMPILER_VERSION_MAJOR + require += info_version[argc]; +#endif +#if defined(COMPILER_VERSION_INTERNAL) || defined(COMPILER_VERSION_INTERNAL_STR) + require += info_version_internal[argc]; +#endif +#ifdef SIMULATE_ID + require += info_simulate[argc]; +#endif +#ifdef SIMULATE_VERSION_MAJOR + require += info_simulate_version[argc]; +#endif +#if defined(__CRAYXT_COMPUTE_LINUX_TARGET) + require += info_cray[argc]; +#endif + require += info_language_standard_default[argc]; + require += info_language_extensions_default[argc]; + (void)argv; + return require; +} diff --git a/build/CMakeFiles/CMakeConfigureLog.yaml b/build/CMakeFiles/CMakeConfigureLog.yaml new file mode 100644 index 0000000..44ef88f --- /dev/null +++ b/build/CMakeFiles/CMakeConfigureLog.yaml @@ -0,0 +1,1189 @@ + +--- +events: + - + kind: "find-v1" + backtrace: + - "/usr/share/cmake/Modules/CMakeDetermineSystem.cmake:12 (find_program)" + - "CMakeLists.txt:2 (project)" + mode: "program" + variable: "CMAKE_UNAME" + description: "Path to a program." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "uname" + candidate_directories: + - "/home/saqut/.vscode/extensions/vadimcn.vscode-lldb-1.12.0/bin/" + - "/home/saqut/.local/bin/" + - "/usr/local/bin/" + - "/usr/bin/" + - "/bin/" + - "/usr/local/sbin/" + - "/opt/cuda/bin/" + - "/var/lib/flatpak/exports/bin/" + - "/usr/lib/jvm/default/bin/" + - "/usr/bin/site_perl/" + - "/usr/bin/vendor_perl/" + - "/usr/bin/core_perl/" + searched_directories: + - "/home/saqut/.vscode/extensions/vadimcn.vscode-lldb-1.12.0/bin/uname" + - "/home/saqut/.local/bin/uname" + - "/usr/local/bin/uname" + found: "/usr/bin/uname" + search_context: + ENV{PATH}: + - "/home/saqut/.vscode/extensions/vadimcn.vscode-lldb-1.12.0/bin" + - "/home/saqut/.local/bin" + - "/usr/local/bin" + - "/usr/bin" + - "/bin" + - "/usr/local/sbin" + - "/opt/cuda/bin" + - "/var/lib/flatpak/exports/bin" + - "/usr/lib/jvm/default/bin" + - "/usr/bin/site_perl" + - "/usr/bin/vendor_perl" + - "/usr/bin/core_perl" + - + kind: "message-v1" + backtrace: + - "/usr/share/cmake/Modules/CMakeDetermineSystem.cmake:212 (message)" + - "CMakeLists.txt:2 (project)" + message: | + The system is: Linux - 7.0.9-1-MANJARO - x86_64 + - + kind: "find-v1" + backtrace: + - "/usr/share/cmake/Modules/CMakeNinjaFindMake.cmake:5 (find_program)" + - "CMakeLists.txt:2 (project)" + mode: "program" + variable: "CMAKE_MAKE_PROGRAM" + description: "Program used to build from build.ninja files." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "ninja-build" + - "ninja" + - "samu" + candidate_directories: + - "/home/saqut/.vscode/extensions/vadimcn.vscode-lldb-1.12.0/bin/" + - "/home/saqut/.local/bin/" + - "/usr/local/bin/" + - "/usr/bin/" + - "/bin/" + - "/usr/local/sbin/" + - "/opt/cuda/bin/" + - "/var/lib/flatpak/exports/bin/" + - "/usr/lib/jvm/default/bin/" + - "/usr/bin/site_perl/" + - "/usr/bin/vendor_perl/" + - "/usr/bin/core_perl/" + searched_directories: + - "/home/saqut/.vscode/extensions/vadimcn.vscode-lldb-1.12.0/bin/ninja-build" + - "/home/saqut/.vscode/extensions/vadimcn.vscode-lldb-1.12.0/bin/ninja" + - "/home/saqut/.vscode/extensions/vadimcn.vscode-lldb-1.12.0/bin/samu" + - "/home/saqut/.local/bin/ninja-build" + - "/home/saqut/.local/bin/ninja" + - "/home/saqut/.local/bin/samu" + - "/usr/local/bin/ninja-build" + - "/usr/local/bin/ninja" + - "/usr/local/bin/samu" + - "/usr/bin/ninja-build" + found: "/usr/bin/ninja" + search_context: + ENV{PATH}: + - "/home/saqut/.vscode/extensions/vadimcn.vscode-lldb-1.12.0/bin" + - "/home/saqut/.local/bin" + - "/usr/local/bin" + - "/usr/bin" + - "/bin" + - "/usr/local/sbin" + - "/opt/cuda/bin" + - "/var/lib/flatpak/exports/bin" + - "/usr/lib/jvm/default/bin" + - "/usr/bin/site_perl" + - "/usr/bin/vendor_perl" + - "/usr/bin/core_perl" + - + kind: "find-v1" + backtrace: + - "/usr/share/cmake/Modules/CMakeDetermineCompiler.cmake:73 (find_program)" + - "/usr/share/cmake/Modules/CMakeDetermineCXXCompiler.cmake:69 (_cmake_find_compiler)" + - "CMakeLists.txt:2 (project)" + mode: "program" + variable: "CMAKE_CXX_COMPILER" + description: "CXX compiler" + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "c++" + - "CC" + - "g++" + - "aCC" + - "cl" + - "bcc" + - "xlC" + - "icpx" + - "icx" + - "clang++" + candidate_directories: + - "/home/saqut/.vscode/extensions/vadimcn.vscode-lldb-1.12.0/bin/" + - "/home/saqut/.local/bin/" + - "/usr/local/bin/" + - "/usr/bin/" + - "/bin/" + - "/usr/local/sbin/" + - "/opt/cuda/bin/" + - "/var/lib/flatpak/exports/bin/" + - "/usr/lib/jvm/default/bin/" + - "/usr/bin/site_perl/" + - "/usr/bin/vendor_perl/" + - "/usr/bin/core_perl/" + searched_directories: + - "/home/saqut/.vscode/extensions/vadimcn.vscode-lldb-1.12.0/bin/c++" + - "/home/saqut/.local/bin/c++" + - "/usr/local/bin/c++" + found: "/usr/bin/c++" + search_context: + ENV{PATH}: + - "/home/saqut/.vscode/extensions/vadimcn.vscode-lldb-1.12.0/bin" + - "/home/saqut/.local/bin" + - "/usr/local/bin" + - "/usr/bin" + - "/bin" + - "/usr/local/sbin" + - "/opt/cuda/bin" + - "/var/lib/flatpak/exports/bin" + - "/usr/lib/jvm/default/bin" + - "/usr/bin/site_perl" + - "/usr/bin/vendor_perl" + - "/usr/bin/core_perl" + - + kind: "find-v1" + backtrace: + - "/usr/share/cmake/Modules/CMakeDetermineCompilerId.cmake:468 (find_file)" + - "/usr/share/cmake/Modules/CMakeDetermineCompilerId.cmake:506 (CMAKE_DETERMINE_COMPILER_ID_WRITE)" + - "/usr/share/cmake/Modules/CMakeDetermineCompilerId.cmake:8 (CMAKE_DETERMINE_COMPILER_ID_BUILD)" + - "/usr/share/cmake/Modules/CMakeDetermineCompilerId.cmake:64 (__determine_compiler_id_test)" + - "/usr/share/cmake/Modules/CMakeDetermineCXXCompiler.cmake:125 (CMAKE_DETERMINE_COMPILER_ID)" + - "CMakeLists.txt:2 (project)" + mode: "file" + variable: "src_in" + description: "Path to a file." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: true + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "CMakeCXXCompilerId.cpp.in" + candidate_directories: + - "/usr/share/cmake/Modules/" + found: "/usr/share/cmake/Modules/CMakeCXXCompilerId.cpp.in" + search_context: + ENV{PATH}: + - "/home/saqut/.vscode/extensions/vadimcn.vscode-lldb-1.12.0/bin" + - "/home/saqut/.local/bin" + - "/usr/local/bin" + - "/usr/bin" + - "/bin" + - "/usr/local/sbin" + - "/opt/cuda/bin" + - "/var/lib/flatpak/exports/bin" + - "/usr/lib/jvm/default/bin" + - "/usr/bin/site_perl" + - "/usr/bin/vendor_perl" + - "/usr/bin/core_perl" + - + kind: "message-v1" + backtrace: + - "/usr/share/cmake/Modules/CMakeDetermineCompilerId.cmake:17 (message)" + - "/usr/share/cmake/Modules/CMakeDetermineCompilerId.cmake:64 (__determine_compiler_id_test)" + - "/usr/share/cmake/Modules/CMakeDetermineCXXCompiler.cmake:125 (CMAKE_DETERMINE_COMPILER_ID)" + - "CMakeLists.txt:2 (project)" + message: | + Compiling the CXX compiler identification source file "CMakeCXXCompilerId.cpp" succeeded. + Compiler: /usr/bin/c++ + Build flags: + Id flags: + + The output was: + 0 + + + Compilation of the CXX compiler identification source "CMakeCXXCompilerId.cpp" produced "a.out" + + The CXX compiler identification is GNU, found in: + /home/saqut/Masaüstü/saqutcompiler/build/CMakeFiles/4.3.2/CompilerIdCXX/a.out + + - + kind: "find-v1" + backtrace: + - "/usr/share/cmake/Modules/CMakeFindBinUtils.cmake:243 (find_program)" + - "/usr/share/cmake/Modules/CMakeDetermineCXXCompiler.cmake:206 (include)" + - "CMakeLists.txt:2 (project)" + mode: "program" + variable: "CMAKE_AR" + description: "Path to a program." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: false + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: false + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "ar" + candidate_directories: + - "/usr/bin/" + - "/home/saqut/.vscode/extensions/vadimcn.vscode-lldb-1.12.0/bin/" + - "/home/saqut/.local/bin/" + - "/usr/local/bin/" + - "/bin/" + - "/usr/local/sbin/" + - "/opt/cuda/bin/" + - "/var/lib/flatpak/exports/bin/" + - "/usr/lib/jvm/default/bin/" + - "/usr/bin/site_perl/" + - "/usr/bin/vendor_perl/" + - "/usr/bin/core_perl/" + found: "/usr/bin/ar" + search_context: + ENV{PATH}: + - "/home/saqut/.vscode/extensions/vadimcn.vscode-lldb-1.12.0/bin" + - "/home/saqut/.local/bin" + - "/usr/local/bin" + - "/usr/bin" + - "/bin" + - "/usr/local/sbin" + - "/opt/cuda/bin" + - "/var/lib/flatpak/exports/bin" + - "/usr/lib/jvm/default/bin" + - "/usr/bin/site_perl" + - "/usr/bin/vendor_perl" + - "/usr/bin/core_perl" + - + kind: "find-v1" + backtrace: + - "/usr/share/cmake/Modules/CMakeFindBinUtils.cmake:243 (find_program)" + - "/usr/share/cmake/Modules/CMakeDetermineCXXCompiler.cmake:206 (include)" + - "CMakeLists.txt:2 (project)" + mode: "program" + variable: "CMAKE_RANLIB" + description: "Path to a program." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: false + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: false + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "ranlib" + candidate_directories: + - "/usr/bin/" + - "/home/saqut/.vscode/extensions/vadimcn.vscode-lldb-1.12.0/bin/" + - "/home/saqut/.local/bin/" + - "/usr/local/bin/" + - "/bin/" + - "/usr/local/sbin/" + - "/opt/cuda/bin/" + - "/var/lib/flatpak/exports/bin/" + - "/usr/lib/jvm/default/bin/" + - "/usr/bin/site_perl/" + - "/usr/bin/vendor_perl/" + - "/usr/bin/core_perl/" + found: "/usr/bin/ranlib" + search_context: + ENV{PATH}: + - "/home/saqut/.vscode/extensions/vadimcn.vscode-lldb-1.12.0/bin" + - "/home/saqut/.local/bin" + - "/usr/local/bin" + - "/usr/bin" + - "/bin" + - "/usr/local/sbin" + - "/opt/cuda/bin" + - "/var/lib/flatpak/exports/bin" + - "/usr/lib/jvm/default/bin" + - "/usr/bin/site_perl" + - "/usr/bin/vendor_perl" + - "/usr/bin/core_perl" + - + kind: "find-v1" + backtrace: + - "/usr/share/cmake/Modules/CMakeFindBinUtils.cmake:243 (find_program)" + - "/usr/share/cmake/Modules/CMakeDetermineCXXCompiler.cmake:206 (include)" + - "CMakeLists.txt:2 (project)" + mode: "program" + variable: "CMAKE_STRIP" + description: "Path to a program." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: false + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: false + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "strip" + candidate_directories: + - "/usr/bin/" + - "/home/saqut/.vscode/extensions/vadimcn.vscode-lldb-1.12.0/bin/" + - "/home/saqut/.local/bin/" + - "/usr/local/bin/" + - "/bin/" + - "/usr/local/sbin/" + - "/opt/cuda/bin/" + - "/var/lib/flatpak/exports/bin/" + - "/usr/lib/jvm/default/bin/" + - "/usr/bin/site_perl/" + - "/usr/bin/vendor_perl/" + - "/usr/bin/core_perl/" + found: "/usr/bin/strip" + search_context: + ENV{PATH}: + - "/home/saqut/.vscode/extensions/vadimcn.vscode-lldb-1.12.0/bin" + - "/home/saqut/.local/bin" + - "/usr/local/bin" + - "/usr/bin" + - "/bin" + - "/usr/local/sbin" + - "/opt/cuda/bin" + - "/var/lib/flatpak/exports/bin" + - "/usr/lib/jvm/default/bin" + - "/usr/bin/site_perl" + - "/usr/bin/vendor_perl" + - "/usr/bin/core_perl" + - + kind: "find-v1" + backtrace: + - "/usr/share/cmake/Modules/CMakeFindBinUtils.cmake:243 (find_program)" + - "/usr/share/cmake/Modules/CMakeDetermineCXXCompiler.cmake:206 (include)" + - "CMakeLists.txt:2 (project)" + mode: "program" + variable: "CMAKE_LINKER" + description: "Path to a program." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: false + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: false + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "ld" + candidate_directories: + - "/usr/bin/" + - "/home/saqut/.vscode/extensions/vadimcn.vscode-lldb-1.12.0/bin/" + - "/home/saqut/.local/bin/" + - "/usr/local/bin/" + - "/bin/" + - "/usr/local/sbin/" + - "/opt/cuda/bin/" + - "/var/lib/flatpak/exports/bin/" + - "/usr/lib/jvm/default/bin/" + - "/usr/bin/site_perl/" + - "/usr/bin/vendor_perl/" + - "/usr/bin/core_perl/" + found: "/usr/bin/ld" + search_context: + ENV{PATH}: + - "/home/saqut/.vscode/extensions/vadimcn.vscode-lldb-1.12.0/bin" + - "/home/saqut/.local/bin" + - "/usr/local/bin" + - "/usr/bin" + - "/bin" + - "/usr/local/sbin" + - "/opt/cuda/bin" + - "/var/lib/flatpak/exports/bin" + - "/usr/lib/jvm/default/bin" + - "/usr/bin/site_perl" + - "/usr/bin/vendor_perl" + - "/usr/bin/core_perl" + - + kind: "find-v1" + backtrace: + - "/usr/share/cmake/Modules/CMakeFindBinUtils.cmake:243 (find_program)" + - "/usr/share/cmake/Modules/CMakeDetermineCXXCompiler.cmake:206 (include)" + - "CMakeLists.txt:2 (project)" + mode: "program" + variable: "CMAKE_NM" + description: "Path to a program." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: false + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: false + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "nm" + candidate_directories: + - "/usr/bin/" + - "/home/saqut/.vscode/extensions/vadimcn.vscode-lldb-1.12.0/bin/" + - "/home/saqut/.local/bin/" + - "/usr/local/bin/" + - "/bin/" + - "/usr/local/sbin/" + - "/opt/cuda/bin/" + - "/var/lib/flatpak/exports/bin/" + - "/usr/lib/jvm/default/bin/" + - "/usr/bin/site_perl/" + - "/usr/bin/vendor_perl/" + - "/usr/bin/core_perl/" + found: "/usr/bin/nm" + search_context: + ENV{PATH}: + - "/home/saqut/.vscode/extensions/vadimcn.vscode-lldb-1.12.0/bin" + - "/home/saqut/.local/bin" + - "/usr/local/bin" + - "/usr/bin" + - "/bin" + - "/usr/local/sbin" + - "/opt/cuda/bin" + - "/var/lib/flatpak/exports/bin" + - "/usr/lib/jvm/default/bin" + - "/usr/bin/site_perl" + - "/usr/bin/vendor_perl" + - "/usr/bin/core_perl" + - + kind: "find-v1" + backtrace: + - "/usr/share/cmake/Modules/CMakeFindBinUtils.cmake:243 (find_program)" + - "/usr/share/cmake/Modules/CMakeDetermineCXXCompiler.cmake:206 (include)" + - "CMakeLists.txt:2 (project)" + mode: "program" + variable: "CMAKE_OBJDUMP" + description: "Path to a program." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: false + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: false + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "objdump" + candidate_directories: + - "/usr/bin/" + - "/home/saqut/.vscode/extensions/vadimcn.vscode-lldb-1.12.0/bin/" + - "/home/saqut/.local/bin/" + - "/usr/local/bin/" + - "/bin/" + - "/usr/local/sbin/" + - "/opt/cuda/bin/" + - "/var/lib/flatpak/exports/bin/" + - "/usr/lib/jvm/default/bin/" + - "/usr/bin/site_perl/" + - "/usr/bin/vendor_perl/" + - "/usr/bin/core_perl/" + found: "/usr/bin/objdump" + search_context: + ENV{PATH}: + - "/home/saqut/.vscode/extensions/vadimcn.vscode-lldb-1.12.0/bin" + - "/home/saqut/.local/bin" + - "/usr/local/bin" + - "/usr/bin" + - "/bin" + - "/usr/local/sbin" + - "/opt/cuda/bin" + - "/var/lib/flatpak/exports/bin" + - "/usr/lib/jvm/default/bin" + - "/usr/bin/site_perl" + - "/usr/bin/vendor_perl" + - "/usr/bin/core_perl" + - + kind: "find-v1" + backtrace: + - "/usr/share/cmake/Modules/CMakeFindBinUtils.cmake:243 (find_program)" + - "/usr/share/cmake/Modules/CMakeDetermineCXXCompiler.cmake:206 (include)" + - "CMakeLists.txt:2 (project)" + mode: "program" + variable: "CMAKE_OBJCOPY" + description: "Path to a program." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: false + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: false + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "objcopy" + candidate_directories: + - "/usr/bin/" + - "/home/saqut/.vscode/extensions/vadimcn.vscode-lldb-1.12.0/bin/" + - "/home/saqut/.local/bin/" + - "/usr/local/bin/" + - "/bin/" + - "/usr/local/sbin/" + - "/opt/cuda/bin/" + - "/var/lib/flatpak/exports/bin/" + - "/usr/lib/jvm/default/bin/" + - "/usr/bin/site_perl/" + - "/usr/bin/vendor_perl/" + - "/usr/bin/core_perl/" + found: "/usr/bin/objcopy" + search_context: + ENV{PATH}: + - "/home/saqut/.vscode/extensions/vadimcn.vscode-lldb-1.12.0/bin" + - "/home/saqut/.local/bin" + - "/usr/local/bin" + - "/usr/bin" + - "/bin" + - "/usr/local/sbin" + - "/opt/cuda/bin" + - "/var/lib/flatpak/exports/bin" + - "/usr/lib/jvm/default/bin" + - "/usr/bin/site_perl" + - "/usr/bin/vendor_perl" + - "/usr/bin/core_perl" + - + kind: "find-v1" + backtrace: + - "/usr/share/cmake/Modules/CMakeFindBinUtils.cmake:243 (find_program)" + - "/usr/share/cmake/Modules/CMakeDetermineCXXCompiler.cmake:206 (include)" + - "CMakeLists.txt:2 (project)" + mode: "program" + variable: "CMAKE_READELF" + description: "Path to a program." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: false + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: false + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "readelf" + candidate_directories: + - "/usr/bin/" + - "/home/saqut/.vscode/extensions/vadimcn.vscode-lldb-1.12.0/bin/" + - "/home/saqut/.local/bin/" + - "/usr/local/bin/" + - "/bin/" + - "/usr/local/sbin/" + - "/opt/cuda/bin/" + - "/var/lib/flatpak/exports/bin/" + - "/usr/lib/jvm/default/bin/" + - "/usr/bin/site_perl/" + - "/usr/bin/vendor_perl/" + - "/usr/bin/core_perl/" + found: "/usr/bin/readelf" + search_context: + ENV{PATH}: + - "/home/saqut/.vscode/extensions/vadimcn.vscode-lldb-1.12.0/bin" + - "/home/saqut/.local/bin" + - "/usr/local/bin" + - "/usr/bin" + - "/bin" + - "/usr/local/sbin" + - "/opt/cuda/bin" + - "/var/lib/flatpak/exports/bin" + - "/usr/lib/jvm/default/bin" + - "/usr/bin/site_perl" + - "/usr/bin/vendor_perl" + - "/usr/bin/core_perl" + - + kind: "find-v1" + backtrace: + - "/usr/share/cmake/Modules/CMakeFindBinUtils.cmake:243 (find_program)" + - "/usr/share/cmake/Modules/CMakeDetermineCXXCompiler.cmake:206 (include)" + - "CMakeLists.txt:2 (project)" + mode: "program" + variable: "CMAKE_DLLTOOL" + description: "Path to a program." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: false + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: false + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "dlltool" + candidate_directories: + - "/usr/bin/" + - "/home/saqut/.vscode/extensions/vadimcn.vscode-lldb-1.12.0/bin/" + - "/home/saqut/.local/bin/" + - "/usr/local/bin/" + - "/bin/" + - "/usr/local/sbin/" + - "/opt/cuda/bin/" + - "/var/lib/flatpak/exports/bin/" + - "/usr/lib/jvm/default/bin/" + - "/usr/bin/site_perl/" + - "/usr/bin/vendor_perl/" + - "/usr/bin/core_perl/" + searched_directories: + - "/usr/bin/dlltool" + - "/home/saqut/.vscode/extensions/vadimcn.vscode-lldb-1.12.0/bin/dlltool" + - "/home/saqut/.local/bin/dlltool" + - "/usr/local/bin/dlltool" + - "/bin/dlltool" + - "/usr/local/sbin/dlltool" + - "/opt/cuda/bin/dlltool" + - "/var/lib/flatpak/exports/bin/dlltool" + - "/usr/lib/jvm/default/bin/dlltool" + - "/usr/bin/site_perl/dlltool" + - "/usr/bin/vendor_perl/dlltool" + - "/usr/bin/core_perl/dlltool" + found: false + search_context: + ENV{PATH}: + - "/home/saqut/.vscode/extensions/vadimcn.vscode-lldb-1.12.0/bin" + - "/home/saqut/.local/bin" + - "/usr/local/bin" + - "/usr/bin" + - "/bin" + - "/usr/local/sbin" + - "/opt/cuda/bin" + - "/var/lib/flatpak/exports/bin" + - "/usr/lib/jvm/default/bin" + - "/usr/bin/site_perl" + - "/usr/bin/vendor_perl" + - "/usr/bin/core_perl" + - + kind: "find-v1" + backtrace: + - "/usr/share/cmake/Modules/CMakeFindBinUtils.cmake:243 (find_program)" + - "/usr/share/cmake/Modules/CMakeDetermineCXXCompiler.cmake:206 (include)" + - "CMakeLists.txt:2 (project)" + mode: "program" + variable: "CMAKE_ADDR2LINE" + description: "Path to a program." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: false + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: false + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "addr2line" + candidate_directories: + - "/usr/bin/" + - "/home/saqut/.vscode/extensions/vadimcn.vscode-lldb-1.12.0/bin/" + - "/home/saqut/.local/bin/" + - "/usr/local/bin/" + - "/bin/" + - "/usr/local/sbin/" + - "/opt/cuda/bin/" + - "/var/lib/flatpak/exports/bin/" + - "/usr/lib/jvm/default/bin/" + - "/usr/bin/site_perl/" + - "/usr/bin/vendor_perl/" + - "/usr/bin/core_perl/" + found: "/usr/bin/addr2line" + search_context: + ENV{PATH}: + - "/home/saqut/.vscode/extensions/vadimcn.vscode-lldb-1.12.0/bin" + - "/home/saqut/.local/bin" + - "/usr/local/bin" + - "/usr/bin" + - "/bin" + - "/usr/local/sbin" + - "/opt/cuda/bin" + - "/var/lib/flatpak/exports/bin" + - "/usr/lib/jvm/default/bin" + - "/usr/bin/site_perl" + - "/usr/bin/vendor_perl" + - "/usr/bin/core_perl" + - + kind: "find-v1" + backtrace: + - "/usr/share/cmake/Modules/CMakeFindBinUtils.cmake:243 (find_program)" + - "/usr/share/cmake/Modules/CMakeDetermineCXXCompiler.cmake:206 (include)" + - "CMakeLists.txt:2 (project)" + mode: "program" + variable: "CMAKE_TAPI" + description: "Path to a program." + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: false + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: false + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "tapi" + candidate_directories: + - "/usr/bin/" + - "/home/saqut/.vscode/extensions/vadimcn.vscode-lldb-1.12.0/bin/" + - "/home/saqut/.local/bin/" + - "/usr/local/bin/" + - "/bin/" + - "/usr/local/sbin/" + - "/opt/cuda/bin/" + - "/var/lib/flatpak/exports/bin/" + - "/usr/lib/jvm/default/bin/" + - "/usr/bin/site_perl/" + - "/usr/bin/vendor_perl/" + - "/usr/bin/core_perl/" + searched_directories: + - "/usr/bin/tapi" + - "/home/saqut/.vscode/extensions/vadimcn.vscode-lldb-1.12.0/bin/tapi" + - "/home/saqut/.local/bin/tapi" + - "/usr/local/bin/tapi" + - "/bin/tapi" + - "/usr/local/sbin/tapi" + - "/opt/cuda/bin/tapi" + - "/var/lib/flatpak/exports/bin/tapi" + - "/usr/lib/jvm/default/bin/tapi" + - "/usr/bin/site_perl/tapi" + - "/usr/bin/vendor_perl/tapi" + - "/usr/bin/core_perl/tapi" + found: false + search_context: + ENV{PATH}: + - "/home/saqut/.vscode/extensions/vadimcn.vscode-lldb-1.12.0/bin" + - "/home/saqut/.local/bin" + - "/usr/local/bin" + - "/usr/bin" + - "/bin" + - "/usr/local/sbin" + - "/opt/cuda/bin" + - "/var/lib/flatpak/exports/bin" + - "/usr/lib/jvm/default/bin" + - "/usr/bin/site_perl" + - "/usr/bin/vendor_perl" + - "/usr/bin/core_perl" + - + kind: "find-v1" + backtrace: + - "/usr/share/cmake/Modules/Compiler/GNU-FindBinUtils.cmake:18 (find_program)" + - "/usr/share/cmake/Modules/CMakeDetermineCXXCompiler.cmake:207 (include)" + - "CMakeLists.txt:2 (project)" + mode: "program" + variable: "CMAKE_CXX_COMPILER_AR" + description: "A wrapper around 'ar' adding the appropriate '--plugin' option for the GCC compiler" + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: false + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: false + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "gcc-ar-16.1" + - "gcc-ar-16" + - "gcc-ar16" + - "gcc-ar" + candidate_directories: + - "/usr/bin/" + - "/home/saqut/.vscode/extensions/vadimcn.vscode-lldb-1.12.0/bin/" + - "/home/saqut/.local/bin/" + - "/usr/local/bin/" + - "/bin/" + - "/usr/local/sbin/" + - "/opt/cuda/bin/" + - "/var/lib/flatpak/exports/bin/" + - "/usr/lib/jvm/default/bin/" + - "/usr/bin/site_perl/" + - "/usr/bin/vendor_perl/" + - "/usr/bin/core_perl/" + searched_directories: + - "/usr/bin/gcc-ar-16.1" + - "/home/saqut/.vscode/extensions/vadimcn.vscode-lldb-1.12.0/bin/gcc-ar-16.1" + - "/home/saqut/.local/bin/gcc-ar-16.1" + - "/usr/local/bin/gcc-ar-16.1" + - "/bin/gcc-ar-16.1" + - "/usr/local/sbin/gcc-ar-16.1" + - "/opt/cuda/bin/gcc-ar-16.1" + - "/var/lib/flatpak/exports/bin/gcc-ar-16.1" + - "/usr/lib/jvm/default/bin/gcc-ar-16.1" + - "/usr/bin/site_perl/gcc-ar-16.1" + - "/usr/bin/vendor_perl/gcc-ar-16.1" + - "/usr/bin/core_perl/gcc-ar-16.1" + - "/usr/bin/gcc-ar-16" + - "/home/saqut/.vscode/extensions/vadimcn.vscode-lldb-1.12.0/bin/gcc-ar-16" + - "/home/saqut/.local/bin/gcc-ar-16" + - "/usr/local/bin/gcc-ar-16" + - "/bin/gcc-ar-16" + - "/usr/local/sbin/gcc-ar-16" + - "/opt/cuda/bin/gcc-ar-16" + - "/var/lib/flatpak/exports/bin/gcc-ar-16" + - "/usr/lib/jvm/default/bin/gcc-ar-16" + - "/usr/bin/site_perl/gcc-ar-16" + - "/usr/bin/vendor_perl/gcc-ar-16" + - "/usr/bin/core_perl/gcc-ar-16" + - "/usr/bin/gcc-ar16" + - "/home/saqut/.vscode/extensions/vadimcn.vscode-lldb-1.12.0/bin/gcc-ar16" + - "/home/saqut/.local/bin/gcc-ar16" + - "/usr/local/bin/gcc-ar16" + - "/bin/gcc-ar16" + - "/usr/local/sbin/gcc-ar16" + - "/opt/cuda/bin/gcc-ar16" + - "/var/lib/flatpak/exports/bin/gcc-ar16" + - "/usr/lib/jvm/default/bin/gcc-ar16" + - "/usr/bin/site_perl/gcc-ar16" + - "/usr/bin/vendor_perl/gcc-ar16" + - "/usr/bin/core_perl/gcc-ar16" + found: "/usr/bin/gcc-ar" + search_context: + ENV{PATH}: + - "/home/saqut/.vscode/extensions/vadimcn.vscode-lldb-1.12.0/bin" + - "/home/saqut/.local/bin" + - "/usr/local/bin" + - "/usr/bin" + - "/bin" + - "/usr/local/sbin" + - "/opt/cuda/bin" + - "/var/lib/flatpak/exports/bin" + - "/usr/lib/jvm/default/bin" + - "/usr/bin/site_perl" + - "/usr/bin/vendor_perl" + - "/usr/bin/core_perl" + - + kind: "find-v1" + backtrace: + - "/usr/share/cmake/Modules/Compiler/GNU-FindBinUtils.cmake:30 (find_program)" + - "/usr/share/cmake/Modules/CMakeDetermineCXXCompiler.cmake:207 (include)" + - "CMakeLists.txt:2 (project)" + mode: "program" + variable: "CMAKE_CXX_COMPILER_RANLIB" + description: "A wrapper around 'ranlib' adding the appropriate '--plugin' option for the GCC compiler" + settings: + SearchFramework: "NEVER" + SearchAppBundle: "NEVER" + CMAKE_FIND_USE_CMAKE_PATH: false + CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: false + CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: true + CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: true + CMAKE_FIND_USE_INSTALL_PREFIX: true + names: + - "gcc-ranlib-16.1" + - "gcc-ranlib-16" + - "gcc-ranlib16" + - "gcc-ranlib" + candidate_directories: + - "/usr/bin/" + - "/home/saqut/.vscode/extensions/vadimcn.vscode-lldb-1.12.0/bin/" + - "/home/saqut/.local/bin/" + - "/usr/local/bin/" + - "/bin/" + - "/usr/local/sbin/" + - "/opt/cuda/bin/" + - "/var/lib/flatpak/exports/bin/" + - "/usr/lib/jvm/default/bin/" + - "/usr/bin/site_perl/" + - "/usr/bin/vendor_perl/" + - "/usr/bin/core_perl/" + searched_directories: + - "/usr/bin/gcc-ranlib-16.1" + - "/home/saqut/.vscode/extensions/vadimcn.vscode-lldb-1.12.0/bin/gcc-ranlib-16.1" + - "/home/saqut/.local/bin/gcc-ranlib-16.1" + - "/usr/local/bin/gcc-ranlib-16.1" + - "/bin/gcc-ranlib-16.1" + - "/usr/local/sbin/gcc-ranlib-16.1" + - "/opt/cuda/bin/gcc-ranlib-16.1" + - "/var/lib/flatpak/exports/bin/gcc-ranlib-16.1" + - "/usr/lib/jvm/default/bin/gcc-ranlib-16.1" + - "/usr/bin/site_perl/gcc-ranlib-16.1" + - "/usr/bin/vendor_perl/gcc-ranlib-16.1" + - "/usr/bin/core_perl/gcc-ranlib-16.1" + - "/usr/bin/gcc-ranlib-16" + - "/home/saqut/.vscode/extensions/vadimcn.vscode-lldb-1.12.0/bin/gcc-ranlib-16" + - "/home/saqut/.local/bin/gcc-ranlib-16" + - "/usr/local/bin/gcc-ranlib-16" + - "/bin/gcc-ranlib-16" + - "/usr/local/sbin/gcc-ranlib-16" + - "/opt/cuda/bin/gcc-ranlib-16" + - "/var/lib/flatpak/exports/bin/gcc-ranlib-16" + - "/usr/lib/jvm/default/bin/gcc-ranlib-16" + - "/usr/bin/site_perl/gcc-ranlib-16" + - "/usr/bin/vendor_perl/gcc-ranlib-16" + - "/usr/bin/core_perl/gcc-ranlib-16" + - "/usr/bin/gcc-ranlib16" + - "/home/saqut/.vscode/extensions/vadimcn.vscode-lldb-1.12.0/bin/gcc-ranlib16" + - "/home/saqut/.local/bin/gcc-ranlib16" + - "/usr/local/bin/gcc-ranlib16" + - "/bin/gcc-ranlib16" + - "/usr/local/sbin/gcc-ranlib16" + - "/opt/cuda/bin/gcc-ranlib16" + - "/var/lib/flatpak/exports/bin/gcc-ranlib16" + - "/usr/lib/jvm/default/bin/gcc-ranlib16" + - "/usr/bin/site_perl/gcc-ranlib16" + - "/usr/bin/vendor_perl/gcc-ranlib16" + - "/usr/bin/core_perl/gcc-ranlib16" + found: "/usr/bin/gcc-ranlib" + search_context: + ENV{PATH}: + - "/home/saqut/.vscode/extensions/vadimcn.vscode-lldb-1.12.0/bin" + - "/home/saqut/.local/bin" + - "/usr/local/bin" + - "/usr/bin" + - "/bin" + - "/usr/local/sbin" + - "/opt/cuda/bin" + - "/var/lib/flatpak/exports/bin" + - "/usr/lib/jvm/default/bin" + - "/usr/bin/site_perl" + - "/usr/bin/vendor_perl" + - "/usr/bin/core_perl" + - + kind: "try_compile-v1" + backtrace: + - "/usr/share/cmake/Modules/CMakeDetermineCompilerABI.cmake:83 (try_compile)" + - "/usr/share/cmake/Modules/CMakeTestCXXCompiler.cmake:26 (CMAKE_DETERMINE_COMPILER_ABI)" + - "CMakeLists.txt:2 (project)" + checks: + - "Detecting CXX compiler ABI info" + directories: + source: "/home/saqut/Masa\u00fcst\u00fc/saqutcompiler/build/CMakeFiles/CMakeScratch/TryCompile-lntpv4" + binary: "/home/saqut/Masa\u00fcst\u00fc/saqutcompiler/build/CMakeFiles/CMakeScratch/TryCompile-lntpv4" + cmakeVariables: + CMAKE_CXX_FLAGS: "" + CMAKE_CXX_FLAGS_DEBUG: "-g" + CMAKE_CXX_SCAN_FOR_MODULES: "OFF" + CMAKE_CXX_STDLIB_MODULES_JSON: "" + CMAKE_EXE_LINKER_FLAGS: "" + buildResult: + variable: "CMAKE_CXX_ABI_COMPILED" + cached: true + stdout: | + Change Dir: '/home/saqut/Masaüstü/saqutcompiler/build/CMakeFiles/CMakeScratch/TryCompile-lntpv4' + + Run Build Command(s): /usr/bin/ninja -v cmTC_ff321 + [1/2] /usr/bin/c++ -v -o CMakeFiles/cmTC_ff321.dir/CMakeCXXCompilerABI.cpp.o -c /usr/share/cmake/Modules/CMakeCXXCompilerABI.cpp + Using built-in specs. + COLLECT_GCC=/usr/bin/c++ + Target: x86_64-pc-linux-gnu + Configured with: /build/gcc/src/gcc/configure --enable-languages=ada,c,c++,d,fortran,go,lto,m2,objc,obj-c++,rust,cobol --enable-bootstrap --prefix=/usr --libdir=/usr/lib --libexecdir=/usr/lib --mandir=/usr/share/man --infodir=/usr/share/info --with-bugurl=https://gitlab.archlinux.org/archlinux/packaging/packages/gcc/-/issues --with-build-config=bootstrap-lto --with-linker-hash-style=gnu --with-system-zlib --enable-cet=auto --enable-checking=release --enable-clocale=gnu --enable-default-pie --enable-default-ssp --enable-gnu-indirect-function --enable-gnu-unique-object --enable-libstdcxx-backtrace --enable-link-serialization=1 --enable-linker-build-id --enable-lto --enable-multilib --enable-plugin --enable-shared --enable-threads=posix --disable-libssp --disable-libstdcxx-pch --disable-werror --disable-fixincludes + Thread model: posix + Supported LTO compression algorithms: zlib zstd + gcc version 16.1.1 20260430 (GCC) + COLLECT_GCC_OPTIONS='-v' '-o' 'CMakeFiles/cmTC_ff321.dir/CMakeCXXCompilerABI.cpp.o' '-c' '-shared-libgcc' '-mtune=generic' '-march=x86-64' '-dumpdir' 'CMakeFiles/cmTC_ff321.dir/' + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/cc1plus -quiet -v -D_GNU_SOURCE /usr/share/cmake/Modules/CMakeCXXCompilerABI.cpp -quiet -dumpdir CMakeFiles/cmTC_ff321.dir/ -dumpbase CMakeCXXCompilerABI.cpp.cpp -dumpbase-ext .cpp -mtune=generic -march=x86-64 -version -o /tmp/ccSiM3Hl.s + GNU C++20 (GCC) version 16.1.1 20260430 (x86_64-pc-linux-gnu) + compiled by GNU C version 16.1.1 20260430, GMP version 6.3.0, MPFR version 4.2.2, MPC version 1.4.1, isl version isl-0.27-GMP + + GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072 + ignoring nonexistent directory "/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include-fixed" + ignoring nonexistent directory "/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../x86_64-pc-linux-gnu/include" + #include "..." search starts here: + #include <...> search starts here: + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../include/c++/16.1.1 + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../include/c++/16.1.1/x86_64-pc-linux-gnu + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../include/c++/16.1.1/backward + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include + /usr/local/include + /usr/include + End of search list. + Compiler executable checksum: d47d0c990a24bc0dbaf3bd00656bd5f3 + COLLECT_GCC_OPTIONS='-v' '-o' 'CMakeFiles/cmTC_ff321.dir/CMakeCXXCompilerABI.cpp.o' '-c' '-shared-libgcc' '-mtune=generic' '-march=x86-64' '-dumpdir' 'CMakeFiles/cmTC_ff321.dir/' + as -v --64 -o CMakeFiles/cmTC_ff321.dir/CMakeCXXCompilerABI.cpp.o /tmp/ccSiM3Hl.s + GNU assembler version 2.46.0 (x86_64-pc-linux-gnu) using BFD version (GNU Binutils) 2.46.0 + COMPILER_PATH=/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/:/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/:/usr/lib/gcc/x86_64-pc-linux-gnu/:/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/:/usr/lib/gcc/x86_64-pc-linux-gnu/ + LIBRARY_PATH=/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/:/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/:/lib/../lib/:/usr/lib/../lib/:/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../:/lib/:/usr/lib/ + COLLECT_GCC_OPTIONS='-v' '-o' 'CMakeFiles/cmTC_ff321.dir/CMakeCXXCompilerABI.cpp.o' '-c' '-shared-libgcc' '-mtune=generic' '-march=x86-64' '-dumpdir' 'CMakeFiles/cmTC_ff321.dir/CMakeCXXCompilerABI.cpp.' + [2/2] : && /usr/bin/c++ -v -Wl,-v CMakeFiles/cmTC_ff321.dir/CMakeCXXCompilerABI.cpp.o -o cmTC_ff321 && : + Using built-in specs. + COLLECT_GCC=/usr/bin/c++ + COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/lto-wrapper + Target: x86_64-pc-linux-gnu + Configured with: /build/gcc/src/gcc/configure --enable-languages=ada,c,c++,d,fortran,go,lto,m2,objc,obj-c++,rust,cobol --enable-bootstrap --prefix=/usr --libdir=/usr/lib --libexecdir=/usr/lib --mandir=/usr/share/man --infodir=/usr/share/info --with-bugurl=https://gitlab.archlinux.org/archlinux/packaging/packages/gcc/-/issues --with-build-config=bootstrap-lto --with-linker-hash-style=gnu --with-system-zlib --enable-cet=auto --enable-checking=release --enable-clocale=gnu --enable-default-pie --enable-default-ssp --enable-gnu-indirect-function --enable-gnu-unique-object --enable-libstdcxx-backtrace --enable-link-serialization=1 --enable-linker-build-id --enable-lto --enable-multilib --enable-plugin --enable-shared --enable-threads=posix --disable-libssp --disable-libstdcxx-pch --disable-werror --disable-fixincludes + Thread model: posix + Supported LTO compression algorithms: zlib zstd + gcc version 16.1.1 20260430 (GCC) + COMPILER_PATH=/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/:/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/:/usr/lib/gcc/x86_64-pc-linux-gnu/:/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/:/usr/lib/gcc/x86_64-pc-linux-gnu/ + LIBRARY_PATH=/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/:/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/:/lib/../lib/:/usr/lib/../lib/:/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../:/lib/:/usr/lib/ + COLLECT_GCC_OPTIONS='-v' '-o' 'cmTC_ff321' '-shared-libgcc' '-mtune=generic' '-march=x86-64' '-dumpdir' 'cmTC_ff321.' + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/collect2 -plugin /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/liblto_plugin.so -plugin-opt=/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/lto-wrapper -plugin-opt=-fresolution=/tmp/ccgqnPZN.res -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-latomic_asneeded -plugin-opt=-pass-through=-lc -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lgcc --build-id --eh-frame-hdr --hash-style=gnu -m elf_x86_64 -dynamic-linker /lib64/ld-linux-x86-64.so.2 -pie -o cmTC_ff321 /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/Scrt1.o /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/crti.o /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtbeginS.o -L/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1 -L/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib -L/lib/../lib -L/usr/lib/../lib -L/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../.. -L/lib -L/usr/lib -v CMakeFiles/cmTC_ff321.dir/CMakeCXXCompilerABI.cpp.o -lstdc++ -lm -lgcc_s -lgcc -latomic_asneeded -lc -lgcc_s -lgcc /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtendS.o /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/crtn.o + collect2 version 16.1.1 20260430 + /usr/bin/ld -plugin /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/liblto_plugin.so -plugin-opt=/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/lto-wrapper -plugin-opt=-fresolution=/tmp/ccgqnPZN.res -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-latomic_asneeded -plugin-opt=-pass-through=-lc -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lgcc --build-id --eh-frame-hdr --hash-style=gnu -m elf_x86_64 -dynamic-linker /lib64/ld-linux-x86-64.so.2 -pie -o cmTC_ff321 /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/Scrt1.o /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/crti.o /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtbeginS.o -L/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1 -L/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib -L/lib/../lib -L/usr/lib/../lib -L/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../.. -L/lib -L/usr/lib -v CMakeFiles/cmTC_ff321.dir/CMakeCXXCompilerABI.cpp.o -lstdc++ -lm -lgcc_s -lgcc -latomic_asneeded -lc -lgcc_s -lgcc /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtendS.o /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/crtn.o + GNU ld (GNU Binutils) 2.46.0 + COLLECT_GCC_OPTIONS='-v' '-o' 'cmTC_ff321' '-shared-libgcc' '-mtune=generic' '-march=x86-64' '-dumpdir' 'cmTC_ff321.' + + exitCode: 0 + - + kind: "message-v1" + backtrace: + - "/usr/share/cmake/Modules/CMakeDetermineCompilerABI.cmake:217 (message)" + - "/usr/share/cmake/Modules/CMakeTestCXXCompiler.cmake:26 (CMAKE_DETERMINE_COMPILER_ABI)" + - "CMakeLists.txt:2 (project)" + message: | + Parsed CXX implicit include dir info: rv=done + found start of include info + found start of implicit include info + add: [/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../include/c++/16.1.1] + add: [/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../include/c++/16.1.1/x86_64-pc-linux-gnu] + add: [/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../include/c++/16.1.1/backward] + add: [/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include] + add: [/usr/local/include] + add: [/usr/include] + end of search list found + collapse include dir [/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../include/c++/16.1.1] ==> [/usr/include/c++/16.1.1] + collapse include dir [/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../include/c++/16.1.1/x86_64-pc-linux-gnu] ==> [/usr/include/c++/16.1.1/x86_64-pc-linux-gnu] + collapse include dir [/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../include/c++/16.1.1/backward] ==> [/usr/include/c++/16.1.1/backward] + collapse include dir [/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include] ==> [/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include] + collapse include dir [/usr/local/include] ==> [/usr/local/include] + collapse include dir [/usr/include] ==> [/usr/include] + implicit include dirs: [/usr/include/c++/16.1.1;/usr/include/c++/16.1.1/x86_64-pc-linux-gnu;/usr/include/c++/16.1.1/backward;/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include;/usr/local/include;/usr/include] + + + - + kind: "message-v1" + backtrace: + - "/usr/share/cmake/Modules/CMakeDetermineCompilerABI.cmake:253 (message)" + - "/usr/share/cmake/Modules/CMakeTestCXXCompiler.cmake:26 (CMAKE_DETERMINE_COMPILER_ABI)" + - "CMakeLists.txt:2 (project)" + message: | + Parsed CXX implicit link information: + link line regex: [^( *|.*[/\\])(ld[0-9]*(|\\.[a-rt-z][a-z]*|\\.s[a-np-z][a-z]*|\\.so[a-z]+)|CMAKE_LINK_STARTFILE-NOTFOUND|([^/\\]+-)?ld|collect2)[^/\\]*( |$)] + linker tool regex: [^[ ]*(->|"|[0-9]+>[ -]*Build:[ 0-9]+ ms[ ]*)?[ ]*(([^"]*[/\\])?(ld[0-9]*(|\\.[a-rt-z][a-z]*|\\.s[a-np-z][a-z]*|\\.so[a-z]+)))("|,| |$)] + ignore line: [Change Dir: '/home/saqut/Masaüstü/saqutcompiler/build/CMakeFiles/CMakeScratch/TryCompile-lntpv4'] + ignore line: [] + ignore line: [Run Build Command(s): /usr/bin/ninja -v cmTC_ff321] + ignore line: [[1/2] /usr/bin/c++ -v -o CMakeFiles/cmTC_ff321.dir/CMakeCXXCompilerABI.cpp.o -c /usr/share/cmake/Modules/CMakeCXXCompilerABI.cpp] + ignore line: [Using built-in specs.] + ignore line: [COLLECT_GCC=/usr/bin/c++] + ignore line: [Target: x86_64-pc-linux-gnu] + ignore line: [Configured with: /build/gcc/src/gcc/configure --enable-languages=ada c c++ d fortran go lto m2 objc obj-c++ rust cobol --enable-bootstrap --prefix=/usr --libdir=/usr/lib --libexecdir=/usr/lib --mandir=/usr/share/man --infodir=/usr/share/info --with-bugurl=https://gitlab.archlinux.org/archlinux/packaging/packages/gcc/-/issues --with-build-config=bootstrap-lto --with-linker-hash-style=gnu --with-system-zlib --enable-cet=auto --enable-checking=release --enable-clocale=gnu --enable-default-pie --enable-default-ssp --enable-gnu-indirect-function --enable-gnu-unique-object --enable-libstdcxx-backtrace --enable-link-serialization=1 --enable-linker-build-id --enable-lto --enable-multilib --enable-plugin --enable-shared --enable-threads=posix --disable-libssp --disable-libstdcxx-pch --disable-werror --disable-fixincludes] + ignore line: [Thread model: posix] + ignore line: [Supported LTO compression algorithms: zlib zstd] + ignore line: [gcc version 16.1.1 20260430 (GCC) ] + ignore line: [COLLECT_GCC_OPTIONS='-v' '-o' 'CMakeFiles/cmTC_ff321.dir/CMakeCXXCompilerABI.cpp.o' '-c' '-shared-libgcc' '-mtune=generic' '-march=x86-64' '-dumpdir' 'CMakeFiles/cmTC_ff321.dir/'] + ignore line: [ /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/cc1plus -quiet -v -D_GNU_SOURCE /usr/share/cmake/Modules/CMakeCXXCompilerABI.cpp -quiet -dumpdir CMakeFiles/cmTC_ff321.dir/ -dumpbase CMakeCXXCompilerABI.cpp.cpp -dumpbase-ext .cpp -mtune=generic -march=x86-64 -version -o /tmp/ccSiM3Hl.s] + ignore line: [GNU C++20 (GCC) version 16.1.1 20260430 (x86_64-pc-linux-gnu)] + ignore line: [ compiled by GNU C version 16.1.1 20260430 GMP version 6.3.0 MPFR version 4.2.2 MPC version 1.4.1 isl version isl-0.27-GMP] + ignore line: [] + ignore line: [GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072] + ignore line: [ignoring nonexistent directory "/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include-fixed"] + ignore line: [ignoring nonexistent directory "/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../x86_64-pc-linux-gnu/include"] + ignore line: [#include "..." search starts here:] + ignore line: [#include <...> search starts here:] + ignore line: [ /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../include/c++/16.1.1] + ignore line: [ /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../include/c++/16.1.1/x86_64-pc-linux-gnu] + ignore line: [ /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../include/c++/16.1.1/backward] + ignore line: [ /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/include] + ignore line: [ /usr/local/include] + ignore line: [ /usr/include] + ignore line: [End of search list.] + ignore line: [Compiler executable checksum: d47d0c990a24bc0dbaf3bd00656bd5f3] + ignore line: [COLLECT_GCC_OPTIONS='-v' '-o' 'CMakeFiles/cmTC_ff321.dir/CMakeCXXCompilerABI.cpp.o' '-c' '-shared-libgcc' '-mtune=generic' '-march=x86-64' '-dumpdir' 'CMakeFiles/cmTC_ff321.dir/'] + ignore line: [ as -v --64 -o CMakeFiles/cmTC_ff321.dir/CMakeCXXCompilerABI.cpp.o /tmp/ccSiM3Hl.s] + ignore line: [GNU assembler version 2.46.0 (x86_64-pc-linux-gnu) using BFD version (GNU Binutils) 2.46.0] + ignore line: [COMPILER_PATH=/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/:/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/:/usr/lib/gcc/x86_64-pc-linux-gnu/:/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/:/usr/lib/gcc/x86_64-pc-linux-gnu/] + ignore line: [LIBRARY_PATH=/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/:/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/:/lib/../lib/:/usr/lib/../lib/:/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../:/lib/:/usr/lib/] + ignore line: [COLLECT_GCC_OPTIONS='-v' '-o' 'CMakeFiles/cmTC_ff321.dir/CMakeCXXCompilerABI.cpp.o' '-c' '-shared-libgcc' '-mtune=generic' '-march=x86-64' '-dumpdir' 'CMakeFiles/cmTC_ff321.dir/CMakeCXXCompilerABI.cpp.'] + ignore line: [[2/2] : && /usr/bin/c++ -v -Wl -v CMakeFiles/cmTC_ff321.dir/CMakeCXXCompilerABI.cpp.o -o cmTC_ff321 && :] + ignore line: [Using built-in specs.] + ignore line: [COLLECT_GCC=/usr/bin/c++] + ignore line: [COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/lto-wrapper] + ignore line: [Target: x86_64-pc-linux-gnu] + ignore line: [Configured with: /build/gcc/src/gcc/configure --enable-languages=ada c c++ d fortran go lto m2 objc obj-c++ rust cobol --enable-bootstrap --prefix=/usr --libdir=/usr/lib --libexecdir=/usr/lib --mandir=/usr/share/man --infodir=/usr/share/info --with-bugurl=https://gitlab.archlinux.org/archlinux/packaging/packages/gcc/-/issues --with-build-config=bootstrap-lto --with-linker-hash-style=gnu --with-system-zlib --enable-cet=auto --enable-checking=release --enable-clocale=gnu --enable-default-pie --enable-default-ssp --enable-gnu-indirect-function --enable-gnu-unique-object --enable-libstdcxx-backtrace --enable-link-serialization=1 --enable-linker-build-id --enable-lto --enable-multilib --enable-plugin --enable-shared --enable-threads=posix --disable-libssp --disable-libstdcxx-pch --disable-werror --disable-fixincludes] + ignore line: [Thread model: posix] + ignore line: [Supported LTO compression algorithms: zlib zstd] + ignore line: [gcc version 16.1.1 20260430 (GCC) ] + ignore line: [COMPILER_PATH=/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/:/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/:/usr/lib/gcc/x86_64-pc-linux-gnu/:/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/:/usr/lib/gcc/x86_64-pc-linux-gnu/] + ignore line: [LIBRARY_PATH=/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/:/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/:/lib/../lib/:/usr/lib/../lib/:/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../:/lib/:/usr/lib/] + ignore line: [COLLECT_GCC_OPTIONS='-v' '-o' 'cmTC_ff321' '-shared-libgcc' '-mtune=generic' '-march=x86-64' '-dumpdir' 'cmTC_ff321.'] + link line: [ /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/collect2 -plugin /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/liblto_plugin.so -plugin-opt=/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/lto-wrapper -plugin-opt=-fresolution=/tmp/ccgqnPZN.res -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-latomic_asneeded -plugin-opt=-pass-through=-lc -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lgcc --build-id --eh-frame-hdr --hash-style=gnu -m elf_x86_64 -dynamic-linker /lib64/ld-linux-x86-64.so.2 -pie -o cmTC_ff321 /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/Scrt1.o /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/crti.o /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtbeginS.o -L/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1 -L/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib -L/lib/../lib -L/usr/lib/../lib -L/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../.. -L/lib -L/usr/lib -v CMakeFiles/cmTC_ff321.dir/CMakeCXXCompilerABI.cpp.o -lstdc++ -lm -lgcc_s -lgcc -latomic_asneeded -lc -lgcc_s -lgcc /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtendS.o /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/crtn.o] + arg [/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/collect2] ==> ignore + arg [-plugin] ==> ignore + arg [/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/liblto_plugin.so] ==> ignore + arg [-plugin-opt=/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/lto-wrapper] ==> ignore + arg [-plugin-opt=-fresolution=/tmp/ccgqnPZN.res] ==> ignore + arg [-plugin-opt=-pass-through=-lgcc_s] ==> ignore + arg [-plugin-opt=-pass-through=-lgcc] ==> ignore + arg [-plugin-opt=-pass-through=-latomic_asneeded] ==> ignore + arg [-plugin-opt=-pass-through=-lc] ==> ignore + arg [-plugin-opt=-pass-through=-lgcc_s] ==> ignore + arg [-plugin-opt=-pass-through=-lgcc] ==> ignore + arg [--build-id] ==> ignore + arg [--eh-frame-hdr] ==> ignore + arg [--hash-style=gnu] ==> ignore + arg [-m] ==> ignore + arg [elf_x86_64] ==> ignore + arg [-dynamic-linker] ==> ignore + arg [/lib64/ld-linux-x86-64.so.2] ==> ignore + arg [-pie] ==> ignore + arg [-o] ==> ignore + arg [cmTC_ff321] ==> ignore + arg [/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/Scrt1.o] ==> obj [/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/Scrt1.o] + arg [/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/crti.o] ==> obj [/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/crti.o] + arg [/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtbeginS.o] ==> obj [/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtbeginS.o] + arg [-L/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1] ==> dir [/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1] + arg [-L/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib] ==> dir [/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib] + arg [-L/lib/../lib] ==> dir [/lib/../lib] + arg [-L/usr/lib/../lib] ==> dir [/usr/lib/../lib] + arg [-L/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../..] ==> dir [/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../..] + arg [-L/lib] ==> dir [/lib] + arg [-L/usr/lib] ==> dir [/usr/lib] + arg [-v] ==> ignore + arg [CMakeFiles/cmTC_ff321.dir/CMakeCXXCompilerABI.cpp.o] ==> ignore + arg [-lstdc++] ==> lib [stdc++] + arg [-lm] ==> lib [m] + arg [-lgcc_s] ==> lib [gcc_s] + arg [-lgcc] ==> lib [gcc] + arg [-latomic_asneeded] ==> lib [atomic_asneeded] + arg [-lc] ==> lib [c] + arg [-lgcc_s] ==> lib [gcc_s] + arg [-lgcc] ==> lib [gcc] + arg [/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtendS.o] ==> obj [/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtendS.o] + arg [/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/crtn.o] ==> obj [/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/crtn.o] + ignore line: [collect2 version 16.1.1 20260430] + ignore line: [/usr/bin/ld -plugin /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/liblto_plugin.so -plugin-opt=/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/lto-wrapper -plugin-opt=-fresolution=/tmp/ccgqnPZN.res -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-latomic_asneeded -plugin-opt=-pass-through=-lc -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lgcc --build-id --eh-frame-hdr --hash-style=gnu -m elf_x86_64 -dynamic-linker /lib64/ld-linux-x86-64.so.2 -pie -o cmTC_ff321 /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/Scrt1.o /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/crti.o /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtbeginS.o -L/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1 -L/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib -L/lib/../lib -L/usr/lib/../lib -L/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../.. -L/lib -L/usr/lib -v CMakeFiles/cmTC_ff321.dir/CMakeCXXCompilerABI.cpp.o -lstdc++ -lm -lgcc_s -lgcc -latomic_asneeded -lc -lgcc_s -lgcc /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtendS.o /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/crtn.o] + linker tool for 'CXX': /usr/bin/ld + collapse obj [/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/Scrt1.o] ==> [/usr/lib/Scrt1.o] + collapse obj [/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/crti.o] ==> [/usr/lib/crti.o] + collapse obj [/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/crtn.o] ==> [/usr/lib/crtn.o] + collapse library dir [/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1] ==> [/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1] + collapse library dir [/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib] ==> [/usr/lib] + collapse library dir [/lib/../lib] ==> [/lib] + collapse library dir [/usr/lib/../lib] ==> [/usr/lib] + collapse library dir [/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../..] ==> [/usr/lib] + collapse library dir [/lib] ==> [/lib] + collapse library dir [/usr/lib] ==> [/usr/lib] + implicit libs: [stdc++;m;gcc_s;gcc;atomic_asneeded;c;gcc_s;gcc] + implicit objs: [/usr/lib/Scrt1.o;/usr/lib/crti.o;/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtbeginS.o;/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtendS.o;/usr/lib/crtn.o] + implicit dirs: [/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1;/usr/lib;/lib] + implicit fwks: [] + + + - + kind: "message-v1" + backtrace: + - "/usr/share/cmake/Modules/Internal/CMakeDetermineLinkerId.cmake:38 (message)" + - "/usr/share/cmake/Modules/CMakeDetermineCompilerABI.cmake:299 (cmake_determine_linker_id)" + - "/usr/share/cmake/Modules/CMakeTestCXXCompiler.cmake:26 (CMAKE_DETERMINE_COMPILER_ABI)" + - "CMakeLists.txt:2 (project)" + message: | + Running the CXX compiler's linker: "/usr/bin/ld" "-v" + GNU ld (GNU Binutils) 2.46.0 +... diff --git a/build/CMakeFiles/InstallScripts.json b/build/CMakeFiles/InstallScripts.json new file mode 100644 index 0000000..e713609 --- /dev/null +++ b/build/CMakeFiles/InstallScripts.json @@ -0,0 +1,7 @@ +{ + "InstallScripts" : + [ + "/home/saqut/Masa\u00fcst\u00fc/saqutcompiler/build/cmake_install.cmake" + ], + "Parallel" : false +} diff --git a/build/CMakeFiles/TargetDirectories.txt b/build/CMakeFiles/TargetDirectories.txt new file mode 100644 index 0000000..014db8d --- /dev/null +++ b/build/CMakeFiles/TargetDirectories.txt @@ -0,0 +1,3 @@ +/home/saqut/Masaüstü/saqutcompiler/build/CMakeFiles/saqut.dir +/home/saqut/Masaüstü/saqutcompiler/build/CMakeFiles/edit_cache.dir +/home/saqut/Masaüstü/saqutcompiler/build/CMakeFiles/rebuild_cache.dir diff --git a/build/CMakeFiles/cmake.check_cache b/build/CMakeFiles/cmake.check_cache new file mode 100644 index 0000000..3dccd73 --- /dev/null +++ b/build/CMakeFiles/cmake.check_cache @@ -0,0 +1 @@ +# This file is generated by cmake for dependency checking of the CMakeCache.txt file diff --git a/build/CMakeFiles/rules.ninja b/build/CMakeFiles/rules.ninja new file mode 100644 index 0000000..bae535b --- /dev/null +++ b/build/CMakeFiles/rules.ninja @@ -0,0 +1,96 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Ninja" Generator, CMake Version 4.3 + +# This file contains all the rules used to get the outputs files +# built from the input files. +# It is included in the main 'build.ninja'. + +# ============================================================================= +# Project: saqut +# Configurations: Debug +# ============================================================================= +# ============================================================================= + +############################################# +# Rule for generating CXX dependencies. + +rule CXX_SCAN__saqut_Debug + depfile = $DEP_FILE + command = /usr/bin/c++ $DEFINES $INCLUDES $FLAGS -E -x c++ $in -MT $DYNDEP_INTERMEDIATE_FILE -MD -MF $DEP_FILE -fmodules-ts -fdeps-file=$DYNDEP_INTERMEDIATE_FILE -fdeps-target=$OBJ_FILE -fdeps-format=p1689r5 -o $PREPROCESSED_OUTPUT_FILE + description = Scanning $in for CXX dependencies + + +############################################# +# Rule to generate ninja dyndep files for CXX. + +rule CXX_DYNDEP__saqut_Debug + command = /usr/bin/cmake -E cmake_ninja_dyndep --tdi=CMakeFiles/saqut.dir/CXXDependInfo.json --lang=CXX --modmapfmt=gcc --dd=$out @$out.rsp + description = Generating CXX dyndep file $out + rspfile = $out.rsp + rspfile_content = $in + restat = 1 + + +############################################# +# Rule for compiling CXX files. + +rule CXX_COMPILER__saqut_scanned_Debug + depfile = $DEP_FILE + deps = gcc + command = ${LAUNCHER}${CODE_CHECK}/usr/bin/c++ $DEFINES $INCLUDES $FLAGS -MD -MT $out -MF $DEP_FILE -fmodules-ts -fmodule-mapper=$DYNDEP_MODULE_MAP_FILE -MD -fdeps-format=p1689r5 -x c++ -o $out -c $in + description = Building CXX object $out + + +############################################# +# Rule for compiling CXX files. + +rule CXX_COMPILER__saqut_unscanned_Debug + depfile = $DEP_FILE + deps = gcc + command = ${LAUNCHER}${CODE_CHECK}/usr/bin/c++ $DEFINES $INCLUDES $FLAGS -MD -MT $out -MF $DEP_FILE -o $out -c $in + description = Building CXX object $out + + +############################################# +# Rule for linking CXX executable. + +rule CXX_EXECUTABLE_LINKER__saqut_Debug + depfile = $DEP_FILE + deps = gcc + command = $PRE_LINK && /usr/bin/c++ $FLAGS $LINK_FLAGS $in -o $TARGET_FILE $LINK_PATH $LINK_LIBRARIES && $POST_BUILD + description = Linking CXX executable $TARGET_FILE + restat = $RESTAT + + +############################################# +# Rule for running custom commands. + +rule CUSTOM_COMMAND + command = $COMMAND + description = $DESC + + +############################################# +# Rule for re-running cmake. + +rule RERUN_CMAKE + command = /usr/bin/cmake --regenerate-during-build -S/home/saqut/Masaüstü/saqutcompiler -B/home/saqut/Masaüstü/saqutcompiler/build + description = Re-running CMake... + generator = 1 + + +############################################# +# Rule for cleaning all built files. + +rule CLEAN + command = /usr/bin/ninja $FILE_ARG -t clean $TARGETS + description = Cleaning all built files... + + +############################################# +# Rule for printing all primary targets available. + +rule HELP + command = /usr/bin/ninja -t targets + description = All primary targets available: + diff --git a/build/build.ninja b/build/build.ninja new file mode 100644 index 0000000..e1adc35 --- /dev/null +++ b/build/build.ninja @@ -0,0 +1,249 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Ninja" Generator, CMake Version 4.3 + +# This file contains all the build statements describing the +# compilation DAG. + +# ============================================================================= +# Write statements declared in CMakeLists.txt: +# +# Which is the root file. +# ============================================================================= + +# ============================================================================= +# Project: saqut +# Configurations: Debug +# ============================================================================= + +############################################# +# Minimal version of Ninja required by this file + +ninja_required_version = 1.5 + + +############################################# +# Set configuration variable for custom commands. + +CONFIGURATION = Debug +# ============================================================================= +# Include auxiliary files. + + +############################################# +# Include rules file. + +include CMakeFiles/rules.ninja + +# ============================================================================= + +############################################# +# Logical path to working directory; prefix for absolute paths. + +cmake_ninja_workdir = /home/saqut/Masaüstü/saqutcompiler/build/ +# ============================================================================= +# Object build statements for EXECUTABLE target saqut + + +############################################# +# Order-only phony target for saqut + +build cmake_object_order_depends_target_saqut: phony || . + +build CMakeFiles/saqut.dir/src/core/sourcefile.cpp.o: CXX_COMPILER__saqut_unscanned_Debug /home/saqut/Masaüstü/saqutcompiler/src/core/sourcefile.cpp || cmake_object_order_depends_target_saqut + CONFIG = Debug + DEP_FILE = CMakeFiles/saqut.dir/src/core/sourcefile.cpp.o.d + FLAGS = -g -std=gnu++20 -Wall -Wextra -g -O0 + INCLUDES = -I/home/saqut/Masaüstü/saqutcompiler/src + OBJECT_DIR = CMakeFiles/saqut.dir + OBJECT_FILE_DIR = CMakeFiles/saqut.dir/src/core + TARGET_SUPPORT_DIR = CMakeFiles/saqut.dir + +build CMakeFiles/saqut.dir/src/lexer/lexer.cpp.o: CXX_COMPILER__saqut_unscanned_Debug /home/saqut/Masaüstü/saqutcompiler/src/lexer/lexer.cpp || cmake_object_order_depends_target_saqut + CONFIG = Debug + DEP_FILE = CMakeFiles/saqut.dir/src/lexer/lexer.cpp.o.d + FLAGS = -g -std=gnu++20 -Wall -Wextra -g -O0 + INCLUDES = -I/home/saqut/Masaüstü/saqutcompiler/src + OBJECT_DIR = CMakeFiles/saqut.dir + OBJECT_FILE_DIR = CMakeFiles/saqut.dir/src/lexer + TARGET_SUPPORT_DIR = CMakeFiles/saqut.dir + +build CMakeFiles/saqut.dir/src/main.cpp.o: CXX_COMPILER__saqut_unscanned_Debug /home/saqut/Masaüstü/saqutcompiler/src/main.cpp || cmake_object_order_depends_target_saqut + CONFIG = Debug + DEP_FILE = CMakeFiles/saqut.dir/src/main.cpp.o.d + FLAGS = -g -std=gnu++20 -Wall -Wextra -g -O0 + INCLUDES = -I/home/saqut/Masaüstü/saqutcompiler/src + OBJECT_DIR = CMakeFiles/saqut.dir + OBJECT_FILE_DIR = CMakeFiles/saqut.dir/src + TARGET_SUPPORT_DIR = CMakeFiles/saqut.dir + +build CMakeFiles/saqut.dir/src/parser/nodes/binary_expr.cpp.o: CXX_COMPILER__saqut_unscanned_Debug /home/saqut/Masaüstü/saqutcompiler/src/parser/nodes/binary_expr.cpp || cmake_object_order_depends_target_saqut + CONFIG = Debug + DEP_FILE = CMakeFiles/saqut.dir/src/parser/nodes/binary_expr.cpp.o.d + FLAGS = -g -std=gnu++20 -Wall -Wextra -g -O0 + INCLUDES = -I/home/saqut/Masaüstü/saqutcompiler/src + OBJECT_DIR = CMakeFiles/saqut.dir + OBJECT_FILE_DIR = CMakeFiles/saqut.dir/src/parser/nodes + TARGET_SUPPORT_DIR = CMakeFiles/saqut.dir + +build CMakeFiles/saqut.dir/src/parser/nodes/declarations.cpp.o: CXX_COMPILER__saqut_unscanned_Debug /home/saqut/Masaüstü/saqutcompiler/src/parser/nodes/declarations.cpp || cmake_object_order_depends_target_saqut + CONFIG = Debug + DEP_FILE = CMakeFiles/saqut.dir/src/parser/nodes/declarations.cpp.o.d + FLAGS = -g -std=gnu++20 -Wall -Wextra -g -O0 + INCLUDES = -I/home/saqut/Masaüstü/saqutcompiler/src + OBJECT_DIR = CMakeFiles/saqut.dir + OBJECT_FILE_DIR = CMakeFiles/saqut.dir/src/parser/nodes + TARGET_SUPPORT_DIR = CMakeFiles/saqut.dir + +build CMakeFiles/saqut.dir/src/parser/nodes/expressions.cpp.o: CXX_COMPILER__saqut_unscanned_Debug /home/saqut/Masaüstü/saqutcompiler/src/parser/nodes/expressions.cpp || cmake_object_order_depends_target_saqut + CONFIG = Debug + DEP_FILE = CMakeFiles/saqut.dir/src/parser/nodes/expressions.cpp.o.d + FLAGS = -g -std=gnu++20 -Wall -Wextra -g -O0 + INCLUDES = -I/home/saqut/Masaüstü/saqutcompiler/src + OBJECT_DIR = CMakeFiles/saqut.dir + OBJECT_FILE_DIR = CMakeFiles/saqut.dir/src/parser/nodes + TARGET_SUPPORT_DIR = CMakeFiles/saqut.dir + +build CMakeFiles/saqut.dir/src/parser/nodes/identifier.cpp.o: CXX_COMPILER__saqut_unscanned_Debug /home/saqut/Masaüstü/saqutcompiler/src/parser/nodes/identifier.cpp || cmake_object_order_depends_target_saqut + CONFIG = Debug + DEP_FILE = CMakeFiles/saqut.dir/src/parser/nodes/identifier.cpp.o.d + FLAGS = -g -std=gnu++20 -Wall -Wextra -g -O0 + INCLUDES = -I/home/saqut/Masaüstü/saqutcompiler/src + OBJECT_DIR = CMakeFiles/saqut.dir + OBJECT_FILE_DIR = CMakeFiles/saqut.dir/src/parser/nodes + TARGET_SUPPORT_DIR = CMakeFiles/saqut.dir + +build CMakeFiles/saqut.dir/src/parser/nodes/literal.cpp.o: CXX_COMPILER__saqut_unscanned_Debug /home/saqut/Masaüstü/saqutcompiler/src/parser/nodes/literal.cpp || cmake_object_order_depends_target_saqut + CONFIG = Debug + DEP_FILE = CMakeFiles/saqut.dir/src/parser/nodes/literal.cpp.o.d + FLAGS = -g -std=gnu++20 -Wall -Wextra -g -O0 + INCLUDES = -I/home/saqut/Masaüstü/saqutcompiler/src + OBJECT_DIR = CMakeFiles/saqut.dir + OBJECT_FILE_DIR = CMakeFiles/saqut.dir/src/parser/nodes + TARGET_SUPPORT_DIR = CMakeFiles/saqut.dir + +build CMakeFiles/saqut.dir/src/parser/nodes/program.cpp.o: CXX_COMPILER__saqut_unscanned_Debug /home/saqut/Masaüstü/saqutcompiler/src/parser/nodes/program.cpp || cmake_object_order_depends_target_saqut + CONFIG = Debug + DEP_FILE = CMakeFiles/saqut.dir/src/parser/nodes/program.cpp.o.d + FLAGS = -g -std=gnu++20 -Wall -Wextra -g -O0 + INCLUDES = -I/home/saqut/Masaüstü/saqutcompiler/src + OBJECT_DIR = CMakeFiles/saqut.dir + OBJECT_FILE_DIR = CMakeFiles/saqut.dir/src/parser/nodes + TARGET_SUPPORT_DIR = CMakeFiles/saqut.dir + +build CMakeFiles/saqut.dir/src/parser/nodes/statements.cpp.o: CXX_COMPILER__saqut_unscanned_Debug /home/saqut/Masaüstü/saqutcompiler/src/parser/nodes/statements.cpp || cmake_object_order_depends_target_saqut + CONFIG = Debug + DEP_FILE = CMakeFiles/saqut.dir/src/parser/nodes/statements.cpp.o.d + FLAGS = -g -std=gnu++20 -Wall -Wextra -g -O0 + INCLUDES = -I/home/saqut/Masaüstü/saqutcompiler/src + OBJECT_DIR = CMakeFiles/saqut.dir + OBJECT_FILE_DIR = CMakeFiles/saqut.dir/src/parser/nodes + TARGET_SUPPORT_DIR = CMakeFiles/saqut.dir + +build CMakeFiles/saqut.dir/src/parser/parser.cpp.o: CXX_COMPILER__saqut_unscanned_Debug /home/saqut/Masaüstü/saqutcompiler/src/parser/parser.cpp || cmake_object_order_depends_target_saqut + CONFIG = Debug + DEP_FILE = CMakeFiles/saqut.dir/src/parser/parser.cpp.o.d + FLAGS = -g -std=gnu++20 -Wall -Wextra -g -O0 + INCLUDES = -I/home/saqut/Masaüstü/saqutcompiler/src + OBJECT_DIR = CMakeFiles/saqut.dir + OBJECT_FILE_DIR = CMakeFiles/saqut.dir/src/parser + TARGET_SUPPORT_DIR = CMakeFiles/saqut.dir + +build CMakeFiles/saqut.dir/src/tokenizer/tokenizer.cpp.o: CXX_COMPILER__saqut_unscanned_Debug /home/saqut/Masaüstü/saqutcompiler/src/tokenizer/tokenizer.cpp || cmake_object_order_depends_target_saqut + CONFIG = Debug + DEP_FILE = CMakeFiles/saqut.dir/src/tokenizer/tokenizer.cpp.o.d + FLAGS = -g -std=gnu++20 -Wall -Wextra -g -O0 + INCLUDES = -I/home/saqut/Masaüstü/saqutcompiler/src + OBJECT_DIR = CMakeFiles/saqut.dir + OBJECT_FILE_DIR = CMakeFiles/saqut.dir/src/tokenizer + TARGET_SUPPORT_DIR = CMakeFiles/saqut.dir + + +# ============================================================================= +# Link build statements for EXECUTABLE target saqut + + +############################################# +# Link the executable saqut + +build saqut: CXX_EXECUTABLE_LINKER__saqut_Debug CMakeFiles/saqut.dir/src/core/sourcefile.cpp.o CMakeFiles/saqut.dir/src/lexer/lexer.cpp.o CMakeFiles/saqut.dir/src/main.cpp.o CMakeFiles/saqut.dir/src/parser/nodes/binary_expr.cpp.o CMakeFiles/saqut.dir/src/parser/nodes/declarations.cpp.o CMakeFiles/saqut.dir/src/parser/nodes/expressions.cpp.o CMakeFiles/saqut.dir/src/parser/nodes/identifier.cpp.o CMakeFiles/saqut.dir/src/parser/nodes/literal.cpp.o CMakeFiles/saqut.dir/src/parser/nodes/program.cpp.o CMakeFiles/saqut.dir/src/parser/nodes/statements.cpp.o CMakeFiles/saqut.dir/src/parser/parser.cpp.o CMakeFiles/saqut.dir/src/tokenizer/tokenizer.cpp.o + CONFIG = Debug + DEP_FILE = CMakeFiles/saqut.dir/link.d + FLAGS = -g + LINK_FLAGS = -Wl,--dependency-file=CMakeFiles/saqut.dir/link.d + OBJECT_DIR = CMakeFiles/saqut.dir + POST_BUILD = : + PRE_LINK = : + TARGET_FILE = saqut + TARGET_PDB = saqut.dbg + TARGET_SUPPORT_DIR = CMakeFiles/saqut.dir + + +############################################# +# Utility command for edit_cache + +build CMakeFiles/edit_cache.util: CUSTOM_COMMAND + COMMAND = cd /home/saqut/Masaüstü/saqutcompiler/build && /usr/bin/ccmake -S/home/saqut/Masaüstü/saqutcompiler -B/home/saqut/Masaüstü/saqutcompiler/build + DESC = Running CMake cache editor... + pool = console + restat = 1 + +build edit_cache: phony CMakeFiles/edit_cache.util + + +############################################# +# Utility command for rebuild_cache + +build CMakeFiles/rebuild_cache.util: CUSTOM_COMMAND + COMMAND = cd /home/saqut/Masaüstü/saqutcompiler/build && /usr/bin/cmake --regenerate-during-build -S/home/saqut/Masaüstü/saqutcompiler -B/home/saqut/Masaüstü/saqutcompiler/build + DESC = Running CMake to regenerate build system... + pool = console + restat = 1 + +build rebuild_cache: phony CMakeFiles/rebuild_cache.util + +# ============================================================================= +# Target aliases. + +# ============================================================================= +# Folder targets. + +# ============================================================================= + +############################################# +# Folder: /home/saqut/Masaüstü/saqutcompiler/build + +build all: phony saqut + +# ============================================================================= +# Built-in targets + + +############################################# +# Re-run CMake if any of its inputs changed. + +build build.ninja /home/saqut/Masaüstü/saqutcompiler/build/cmake_install.cmake: RERUN_CMAKE | /home/saqut/Masaüstü/saqutcompiler/CMakeLists.txt /usr/share/cmake/Modules/CMakeCXXInformation.cmake /usr/share/cmake/Modules/CMakeCommonLanguageInclude.cmake /usr/share/cmake/Modules/CMakeGenericSystem.cmake /usr/share/cmake/Modules/CMakeInitializeConfigs.cmake /usr/share/cmake/Modules/CMakeLanguageInformation.cmake /usr/share/cmake/Modules/CMakeSystemSpecificInformation.cmake /usr/share/cmake/Modules/CMakeSystemSpecificInitialize.cmake /usr/share/cmake/Modules/Compiler/CMakeCommonCompilerMacros.cmake /usr/share/cmake/Modules/Compiler/GNU-CXX.cmake /usr/share/cmake/Modules/Compiler/GNU.cmake /usr/share/cmake/Modules/Internal/CMakeCXXLinkerInformation.cmake /usr/share/cmake/Modules/Internal/CMakeCommonLinkerInformation.cmake /usr/share/cmake/Modules/Linker/GNU-CXX.cmake /usr/share/cmake/Modules/Linker/GNU.cmake /usr/share/cmake/Modules/Platform/Linker/GNU.cmake /usr/share/cmake/Modules/Platform/Linker/Linux-GNU-CXX.cmake /usr/share/cmake/Modules/Platform/Linker/Linux-GNU.cmake /usr/share/cmake/Modules/Platform/Linux-GNU-CXX.cmake /usr/share/cmake/Modules/Platform/Linux-GNU.cmake /usr/share/cmake/Modules/Platform/Linux-Initialize.cmake /usr/share/cmake/Modules/Platform/Linux.cmake /usr/share/cmake/Modules/Platform/UnixPaths.cmake CMakeCache.txt CMakeFiles/4.3.2/CMakeCXXCompiler.cmake CMakeFiles/4.3.2/CMakeSystem.cmake + pool = console + + +############################################# +# A missing CMake input file is not an error. + +build /home/saqut/Masaüstü/saqutcompiler/CMakeLists.txt /usr/share/cmake/Modules/CMakeCXXInformation.cmake /usr/share/cmake/Modules/CMakeCommonLanguageInclude.cmake /usr/share/cmake/Modules/CMakeGenericSystem.cmake /usr/share/cmake/Modules/CMakeInitializeConfigs.cmake /usr/share/cmake/Modules/CMakeLanguageInformation.cmake /usr/share/cmake/Modules/CMakeSystemSpecificInformation.cmake /usr/share/cmake/Modules/CMakeSystemSpecificInitialize.cmake /usr/share/cmake/Modules/Compiler/CMakeCommonCompilerMacros.cmake /usr/share/cmake/Modules/Compiler/GNU-CXX.cmake /usr/share/cmake/Modules/Compiler/GNU.cmake /usr/share/cmake/Modules/Internal/CMakeCXXLinkerInformation.cmake /usr/share/cmake/Modules/Internal/CMakeCommonLinkerInformation.cmake /usr/share/cmake/Modules/Linker/GNU-CXX.cmake /usr/share/cmake/Modules/Linker/GNU.cmake /usr/share/cmake/Modules/Platform/Linker/GNU.cmake /usr/share/cmake/Modules/Platform/Linker/Linux-GNU-CXX.cmake /usr/share/cmake/Modules/Platform/Linker/Linux-GNU.cmake /usr/share/cmake/Modules/Platform/Linux-GNU-CXX.cmake /usr/share/cmake/Modules/Platform/Linux-GNU.cmake /usr/share/cmake/Modules/Platform/Linux-Initialize.cmake /usr/share/cmake/Modules/Platform/Linux.cmake /usr/share/cmake/Modules/Platform/UnixPaths.cmake CMakeCache.txt CMakeFiles/4.3.2/CMakeCXXCompiler.cmake CMakeFiles/4.3.2/CMakeSystem.cmake: phony + + +############################################# +# Clean all the built files. + +build clean: CLEAN + + +############################################# +# Print all primary targets available. + +build help: HELP + + +############################################# +# Make the all target the default. + +default all diff --git a/build/cmake_install.cmake b/build/cmake_install.cmake new file mode 100644 index 0000000..65da676 --- /dev/null +++ b/build/cmake_install.cmake @@ -0,0 +1,66 @@ +# Install script for directory: /home/saqut/Masaüstü/saqutcompiler + +# Set the install prefix +if(NOT DEFINED CMAKE_INSTALL_PREFIX) + set(CMAKE_INSTALL_PREFIX "/usr/local") +endif() +string(REGEX REPLACE "/$" "" CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}") + +# Set the install configuration name. +if(NOT DEFINED CMAKE_INSTALL_CONFIG_NAME) + if(BUILD_TYPE) + string(REGEX REPLACE "^[^A-Za-z0-9_]+" "" + CMAKE_INSTALL_CONFIG_NAME "${BUILD_TYPE}") + else() + set(CMAKE_INSTALL_CONFIG_NAME "Debug") + endif() + message(STATUS "Install configuration: \"${CMAKE_INSTALL_CONFIG_NAME}\"") +endif() + +# Set the component getting installed. +if(NOT CMAKE_INSTALL_COMPONENT) + if(COMPONENT) + message(STATUS "Install component: \"${COMPONENT}\"") + set(CMAKE_INSTALL_COMPONENT "${COMPONENT}") + else() + set(CMAKE_INSTALL_COMPONENT) + endif() +endif() + +# Install shared libraries without execute permission? +if(NOT DEFINED CMAKE_INSTALL_SO_NO_EXE) + set(CMAKE_INSTALL_SO_NO_EXE "0") +endif() + +# Is this installation the result of a crosscompile? +if(NOT DEFINED CMAKE_CROSSCOMPILING) + set(CMAKE_CROSSCOMPILING "FALSE") +endif() + +# Set path to fallback-tool for dependency-resolution. +if(NOT DEFINED CMAKE_OBJDUMP) + set(CMAKE_OBJDUMP "/usr/bin/objdump") +endif() + +string(REPLACE ";" "\n" CMAKE_INSTALL_MANIFEST_CONTENT + "${CMAKE_INSTALL_MANIFEST_FILES}") +if(CMAKE_INSTALL_LOCAL_ONLY) + file(WRITE "/home/saqut/Masaüstü/saqutcompiler/build/install_local_manifest.txt" + "${CMAKE_INSTALL_MANIFEST_CONTENT}") +endif() +if(CMAKE_INSTALL_COMPONENT) + if(CMAKE_INSTALL_COMPONENT MATCHES "^[a-zA-Z0-9_.+-]+$") + set(CMAKE_INSTALL_MANIFEST "install_manifest_${CMAKE_INSTALL_COMPONENT}.txt") + else() + string(MD5 CMAKE_INST_COMP_HASH "${CMAKE_INSTALL_COMPONENT}") + set(CMAKE_INSTALL_MANIFEST "install_manifest_${CMAKE_INST_COMP_HASH}.txt") + unset(CMAKE_INST_COMP_HASH) + endif() +else() + set(CMAKE_INSTALL_MANIFEST "install_manifest.txt") +endif() + +if(NOT CMAKE_INSTALL_LOCAL_ONLY) + file(WRITE "/home/saqut/Masaüstü/saqutcompiler/build/${CMAKE_INSTALL_MANIFEST}" + "${CMAKE_INSTALL_MANIFEST_CONTENT}") +endif() diff --git a/fikirler.md b/docs/fikirler.md similarity index 100% rename from fikirler.md rename to docs/fikirler.md diff --git a/issues.md b/docs/issues.md similarity index 100% rename from issues.md rename to docs/issues.md diff --git a/prcontext.md b/docs/prcontext.md similarity index 100% rename from prcontext.md rename to docs/prcontext.md diff --git a/todo.md b/docs/todo.md similarity index 100% rename from todo.md rename to docs/todo.md diff --git a/Final.sqt b/examples/Final.sqt similarity index 100% rename from Final.sqt rename to examples/Final.sqt diff --git a/source.sqt b/examples/source.sqt similarity index 100% rename from source.sqt rename to examples/source.sqt diff --git a/scripts/build.sh b/scripts/build.sh new file mode 100755 index 0000000..1e9496e --- /dev/null +++ b/scripts/build.sh @@ -0,0 +1,9 @@ +#!/bin/bash +set -e +PROJECT_ROOT="$( cd "$( dirname "${BASH_SOURCE[0]}" )/.." &> /dev/null && pwd )" +BUILD_DIR="$PROJECT_ROOT/build" +mkdir -p "$BUILD_DIR" +cd "$BUILD_DIR" +cmake -G Ninja -DCMAKE_BUILD_TYPE=Debug .. +ninja +echo "Derleme başarılı: build/saqut" diff --git a/compile.sh b/scripts/compile.sh similarity index 100% rename from compile.sh rename to scripts/compile.sh diff --git a/src/core/sourcefile.cpp b/src/core/sourcefile.cpp new file mode 100644 index 0000000..2cbfa05 --- /dev/null +++ b/src/core/sourcefile.cpp @@ -0,0 +1,69 @@ +#include "core/sourcefile.hpp" + +void SourceFile::setText(const std::string& path, const std::string& source) { + filePath = path; + text = source; + computeLineStarts(); +} + +int SourceFile::lineCount() const { + return static_cast(lineStarts.size()); +} + +std::string SourceFile::getLine(int line) const { + if (line < 1 || line > lineCount()) return ""; + int start = lineStarts[line - 1]; + int end; + if (line < lineCount()) { + end = lineStarts[line] - 1; // Satır sonu (\n) hariç + // \r\n varsa bir karakter daha geri + if (end > start && text[end - 1] == '\r') end--; + } else { + end = static_cast(text.length()); + } + return text.substr(start, end - start); +} + +SourceLocation SourceFile::offsetToLocation(int offset) const { + // Geçersiz offset kontrolü + if (offset < 0 || offset > static_cast(text.length())) { + return SourceLocation{filePath, 0, 0, -1}; + } + + // Binary search: offset'in hangi satıra ait olduğunu bul + // lineStarts içinde offset'ten büyük ilk elemanı bul + auto it = std::upper_bound(lineStarts.begin(), lineStarts.end(), offset); + int lineIndex = static_cast(it - lineStarts.begin()) - 1; + + // lineIndex geçerli değilse + if (lineIndex < 0) { + lineIndex = 0; + } else if (lineIndex >= static_cast(lineStarts.size())) { + lineIndex = static_cast(lineStarts.size()) - 1; + } + + int lineStart = lineStarts[lineIndex]; + int line = lineIndex + 1; // 1-tabanlı + int column = offset - lineStart + 1; // 1-tabanlı + + return SourceLocation{filePath, line, column, offset}; +} + +SourceFile::LocationRange SourceFile::rangeFromOffsets(int startOffset, int endOffset) const { + return {offsetToLocation(startOffset), offsetToLocation(endOffset)}; +} + +void SourceFile::computeLineStarts() { + lineStarts.clear(); + lineStarts.push_back(0); // 1. satır offset 0 + + for (int i = 0; i < static_cast(text.length()); i++) { + if (text[i] == '\n') { + // \r\n kontrolü: \r'yi atla, \n'den sonraki karakter yeni satır + int nextStart = i + 1; + if (nextStart < static_cast(text.length())) { + lineStarts.push_back(nextStart); + } + } + } +} diff --git a/src/core/sourcefile.hpp b/src/core/sourcefile.hpp index 3205438..0c36cac 100644 --- a/src/core/sourcefile.hpp +++ b/src/core/sourcefile.hpp @@ -54,58 +54,17 @@ public: SourceFile() = default; // text verisini yeni satır dizisini de hesapla - void setText(const std::string& path, const std::string& source) { - filePath = path; - text = source; - computeLineStarts(); - } + void setText(const std::string& path, const std::string& source); // Kaynak kodun toplam satır sayısı - int lineCount() const { - return static_cast(lineStarts.size()); - } + int lineCount() const; // Belirtilen offset'teki satırın tam metnini döndür - std::string getLine(int line) const { - if (line < 1 || line > lineCount()) return ""; - int start = lineStarts[line - 1]; - int end; - if (line < lineCount()) { - end = lineStarts[line] - 1; // Satır sonu (\n) hariç - // \r\n varsa bir karakter daha geri - if (end > start && text[end - 1] == '\r') end--; - } else { - end = static_cast(text.length()); - } - return text.substr(start, end - start); - } + std::string getLine(int line) const; // Offset'ten (line, column) dönüşümü // Binary search ile O(log n) - SourceLocation offsetToLocation(int offset) const { - // Geçersiz offset kontrolü - if (offset < 0 || offset > static_cast(text.length())) { - return SourceLocation{filePath, 0, 0, -1}; - } - - // Binary search: offset'in hangi satıra ait olduğunu bul - // lineStarts içinde offset'ten büyük ilk elemanı bul - auto it = std::upper_bound(lineStarts.begin(), lineStarts.end(), offset); - int lineIndex = static_cast(it - lineStarts.begin()) - 1; - - // lineIndex geçerli değilse - if (lineIndex < 0) { - lineIndex = 0; - } else if (lineIndex >= static_cast(lineStarts.size())) { - lineIndex = static_cast(lineStarts.size()) - 1; - } - - int lineStart = lineStarts[lineIndex]; - int line = lineIndex + 1; // 1-tabanlı - int column = offset - lineStart + 1; // 1-tabanlı - - return SourceLocation{filePath, line, column, offset}; - } + SourceLocation offsetToLocation(int offset) const; // Bir aralığın başlangıç ve bitiş konumlarını döndür struct LocationRange { @@ -113,28 +72,13 @@ public: SourceLocation end; }; - LocationRange rangeFromOffsets(int startOffset, int endOffset) const { - return {offsetToLocation(startOffset), offsetToLocation(endOffset)}; - } + LocationRange rangeFromOffsets(int startOffset, int endOffset) const; private: // lineStarts vektörünü hesapla // Her \n karakterinden sonraki offset bir sonraki satırın başlangıcıdır // İlk satır her zaman offset 0'dan başlar - void computeLineStarts() { - lineStarts.clear(); - lineStarts.push_back(0); // 1. satır offset 0 - - for (int i = 0; i < static_cast(text.length()); i++) { - if (text[i] == '\n') { - // \r\n kontrolü: \r'yi atla, \n'den sonraki karakter yeni satır - int nextStart = i + 1; - if (nextStart < static_cast(text.length())) { - lineStarts.push_back(nextStart); - } - } - } - } + void computeLineStarts(); }; #endif // SAQUT_CORE_SOURCEFILE diff --git a/src/lexer/lexer.cpp b/src/lexer/lexer.cpp new file mode 100644 index 0000000..e00bbee --- /dev/null +++ b/src/lexer/lexer.cpp @@ -0,0 +1,346 @@ +#include "lexer/lexer.hpp" + +// -------------------------------------------------------------------------- +// beginPosition: Mevcut offset'i yığına kaydet. +// İç içe çağrılabilir: 3 kere beginPosition → 3 elemanlı yığın. +// -------------------------------------------------------------------------- +void Lexer::beginPosition() { + offsetMap.push_back(getLastPosition()); +} + +// -------------------------------------------------------------------------- +// getLastPosition: Yığının tepesindeki konumu döndür. +// Yığın boşsa mevcut offset'i döndür (başlangıç durumu). +// -------------------------------------------------------------------------- +int Lexer::getLastPosition() { + if (offsetMap.empty()) return offset; + return offsetMap.back(); +} + +// -------------------------------------------------------------------------- +// acceptPosition: Yığındaki son geçici konumu kalıcı yap. +// Örnek: offsetMap=[5,10], offset=15 → offsetMap.back()=10 olur. +// Bu sayede include() denemesi başarılı olduğunda konum ilerletilmiş olur. +// -------------------------------------------------------------------------- +void Lexer::acceptPosition() { + int t = offsetMap.back(); + setLastPosition(t); +} + +// -------------------------------------------------------------------------- +// setLastPosition: Yığının tepesini veya offset'i değiştir. +// -------------------------------------------------------------------------- +void Lexer::setLastPosition(int n) { + if (offsetMap.empty()) + offset = n; + else + offsetMap.back() = n; +} + +// -------------------------------------------------------------------------- +// isEnd: Dosya sonuna gelindi mi? offset >= size. +// -------------------------------------------------------------------------- +bool Lexer::isEnd() { + return size <= getOffset(); +} + +// -------------------------------------------------------------------------- +// rejectPosition: Yığındaki son konumu at. Başarısız include() denemesi sonrası. +// -------------------------------------------------------------------------- +void Lexer::rejectPosition() { + offsetMap.pop_back(); +} + +// -------------------------------------------------------------------------- +// positionRange: Yığındaki en dış ve en iç konumu [start, end] olarak döndür. +// UYARI: new int[2] ile heap'te tahsis eder. Çağıran sorumludur. +// TODO: std::pair veya yapı kullanarak tahsisi kaldır. +// -------------------------------------------------------------------------- +int* Lexer::positionRange() { + int len = offsetMap.size(); + if (len == 0) + return new int[2]{0, offset}; + if (len == 1) + return new int[2]{offset, offsetMap[0]}; + return new int[2]{offsetMap[len - 2], offsetMap[len - 1]}; +} + +// -------------------------------------------------------------------------- +// getPositionRange: positionRange() aralığındaki metni string olarak döndür. +// -------------------------------------------------------------------------- +std::string Lexer::getPositionRange() { + int* a = positionRange(); + std::string mem; + for (int i = a[0]; i < a[1]; i++) + mem.push_back(input.at(i)); + return mem; +} + +// -------------------------------------------------------------------------- +// include: Belirtilen kelime mevcut konumda başlıyor mu? +// -------------------------------------------------------------------------- +bool Lexer::include(std::string word, bool accept) { + beginPosition(); + for (size_t i = 0; i < word.size(); i++) { + if (isEnd()) { + rejectPosition(); + return false; + } + if (word[i] != getchar()) { + rejectPosition(); + return false; + } + nextChar(); + } + if (accept) + acceptPosition(); + else + rejectPosition(); + return true; +} + +// -------------------------------------------------------------------------- +// getOffset / setOffset: Konum erişimcileri. +// -------------------------------------------------------------------------- +int Lexer::getOffset() { + return getLastPosition(); +} + +int Lexer::setOffset(int n) { + setLastPosition(n); + return getLastPosition(); +} + +// -------------------------------------------------------------------------- +// getchar(additionalOffset): offset + ek kadar ilerideki karakteri oku. +// -------------------------------------------------------------------------- +char Lexer::getchar(int additionalOffset) { + int target = getOffset() + additionalOffset; + if (target >= size) { + std::cerr << "Lexer hatası: sınır aşımı\n"; + return '\0'; + } + return input.at(target); +} + +char Lexer::getchar() { + int target = getOffset(); + if (target >= size) { + std::cerr << "Lexer hatası: sınır aşımı\n"; + return '\0'; + } + return input.at(target); +} + +// -------------------------------------------------------------------------- +// nextChar / toChar: Konum ilerletme. +// -------------------------------------------------------------------------- +void Lexer::nextChar() { + if (!isEnd()) + setOffset(getOffset() + 1); +} + +void Lexer::toChar(int n) { + if (!isEnd()) + setOffset(getOffset() + n); +} + +// -------------------------------------------------------------------------- +// getLocation: Mevcut offset'in SourceLocation'ını döndür. +// -------------------------------------------------------------------------- +SourceLocation Lexer::getLocation() { + return sourceFile.offsetToLocation(getOffset()); +} + +// -------------------------------------------------------------------------- +// setSourceText: Yeni kaynak kodu yükle ve SourceFile'ı güncelle. +// -------------------------------------------------------------------------- +void Lexer::setSourceText(const std::string& path, const std::string& text) { + sourceFile.setText(path, text); + setText(text); +} + +// -------------------------------------------------------------------------- +// setText: Yeni kaynak kodu yükle. input ve size'ı günceller. +// -------------------------------------------------------------------------- +void Lexer::setText(std::string text) { + input = text; + size = static_cast(text.length()); +} + +// -------------------------------------------------------------------------- +// skipWhiteSpace: Boşluk, sekme, satırsonu, satırbaşı karakterlerini atla. +// -------------------------------------------------------------------------- +void Lexer::skipWhiteSpace() { + while (!isEnd()) { + switch (getchar()) { + case '\r': // carriage return (Windows satırsonu \r\n) + case '\n': // line feed (Unix satırsonu) + case '\b': // backspace + case '\t': // tab + case ' ': // boşluk + nextChar(); + break; + default: + return; + } + } +} + +// -------------------------------------------------------------------------- +// isNumeric: Mevcut karakter bir rakam mı? (0-9) +// -------------------------------------------------------------------------- +bool Lexer::isNumeric() { + char c = getchar(); + return (c >= '0' && c <= '9'); +} + +// -------------------------------------------------------------------------- +// readNumeric: Tam bir sayı literal'ı oku. +// -------------------------------------------------------------------------- +INumber Lexer::readNumeric() { + INumber num; + num.start = getLastPosition(); + num.startLoc = getLocation(); + + // --- Adım 1: İsteğe bağlı işaret --- + if (getchar() == '-') { + nextChar(); + num.positive = false; + } else if (getchar() == '+') { + nextChar(); + num.positive = true; + } else { + num.positive = true; + } + + // --- Adım 2: İlk karakter '0' ise özel format kontrolü --- + bool nextDot = false; + if (getchar() == '0') { + num.token.push_back('0'); + nextChar(); + char c = getchar(); + switch (c) { + case 'x': case 'X': // Hex: 0xFF, 0X1A + num.token.push_back(c); + num.base = 16; + nextChar(); + break; + case 'b': case 'B': // Binary: 0b1010 + num.token.push_back(c); + num.base = 2; + nextChar(); + break; + case '.': // Float: 0.5, 0.0 + num.token.push_back(c); + num.base = 10; + nextDot = true; + num.isFloat = true; + nextChar(); + break; + case '0': case '1': case '2': case '3': case '4': + case '5': case '6': case '7': + // Octal: 0777 — sonraki karakter octal rakam ise devam et + num.base = 8; + break; + default: + num.end = getLastPosition(); + num.endLoc = getLocation(); + return num; + } + } else { + num.base = 10; + } + + // --- Adım 3: Ana okuma döngüsü --- + while (!isEnd()) { + char c = getchar(); + switch (c) { + case '0': + case '1': + num.token.push_back(c); + break; + case '2': case '3': case '4': case '5': + case '6': case '7': + if (num.base >= 8) + num.token.push_back(c); + else { + num.end = getLastPosition(); + num.endLoc = getLocation(); + return num; + } + break; + case '8': case '9': + if (num.base >= 10) + num.token.push_back(c); + else { + num.end = getLastPosition(); + num.endLoc = getLocation(); + return num; + } + break; + case 'a': case 'A': case 'b': case 'B': + case 'c': case 'C': case 'd': case 'D': + case 'f': case 'F': + if (num.base >= 16) + num.token.push_back(c); + else { + num.end = getLastPosition(); + num.endLoc = getLocation(); + return num; + } + break; + case '.': + if (!nextDot) { + if (num.token.empty()) + num.token += "0."; + else + num.token.push_back('.'); + nextDot = true; + num.isFloat = true; + } else { + num.end = getLastPosition(); + num.endLoc = getLocation(); + return num; + } + break; + case 'e': case 'E': + if (num.base == 16) { + num.token.push_back(c); + break; + } + if (num.base == 10) { + num.hasEpsilon = true; + num.token.push_back(c); + nextChar(); + c = getchar(); + if (c == '+' || c == '-') { + num.token.push_back(c); + nextChar(); + } + while (!isEnd()) { + c = getchar(); + if (c >= '0' && c <= '9') { + num.token.push_back(c); + nextChar(); + } else { + num.end = getLastPosition(); + num.endLoc = getLocation(); + return num; + } + } + break; + } + num.end = getLastPosition(); + num.endLoc = getLocation(); + return num; + default: + num.end = getLastPosition(); + return num; + } + nextChar(); + } + num.end = getLastPosition(); + num.endLoc = getLocation(); + return num; +} diff --git a/src/lexer/lexer.hpp b/src/lexer/lexer.hpp index e12f898..3a45220 100644 --- a/src/lexer/lexer.hpp +++ b/src/lexer/lexer.hpp @@ -15,46 +15,6 @@ // 4. Boşluk karakterlerini atlar // 5. Satır/sütun bilgisi sağlar (hata mesajları için temel) // -// ADR-006: Neden Kendi Lexer'ımız? -// - std::istringstream veya regex kullanmak yerine, tam kontrol sağlayan -// sıfırdan bir lexer yazdık. -// - Backtracking: offsetMap ile konum yığını tutar, denenen bir eşleşme -// başarısız olursa geri alınabilir. Bu özellik std::istream'de yoktur. -// - Performans: Sanal fonksiyon çağrısı yok, her şey inline. -// - Hata ayıklama: Her karakter okuması kontrol edilebilir. -// -// TASARIM KARARLARI: -// 1. offsetMap (std::vector): İç içe backtracking için yığın. -// beginPosition() → yığına mevcut konumu ekler -// acceptPosition() → yığındaki son konumu kalıcı yapar -// rejectPosition() → yığındaki son konumu atar (geri al) -// Bu sayede "dene, başarısız olursa geri al" patterni çalışır. -// -// 2. getchar() iki overload: -// - getchar(): mevcut konumdaki karakteri okur -// - getchar(int offset): mevcut konum + offset'teki karakteri okur -// İkincisi özellikle keyword kontrolünde önemlidir: -// "do" kelimesini gördükten sonra, bunun "double"ın başlangıcı olmadığını -// kontrol etmek için keyword sonrası karaktere bakılır. -// -// 3. isEnd(): offset >= size ile kontrol. offset her zaman [0, size] aralığında. -// size konumunda EOF (end of file) anlamına gelir. -// -// 4. readNumeric(): C/C++/Java sayı formatlarını destekler: -// - Decimal: 42, -3, +7 -// - Hex: 0xFF, 0X1A -// - Binary: 0b1010, 0B1100 -// - Octal: 0777 (0 ile başlayan ve 8-9 içermeyen) -// - Float: 3.14, .5, 1e10, 2.5E-3 -// - Negatif/Pozitif: -42, +3 (baştaki işaret) -// -// BİLİNEN SINIRLAMALAR (TODO): -// TODO: Satır/sütun takibi eklenmeli (şu anda sadece offset var) -// TODO: Unicode/UTF-8 desteği (şu anda sadece ASCII) -// TODO: ' char literal'ı okunamıyor -// TODO: Sayısal alt çizgi (_) ayracı: 1_000_000 formatı -// TODO: Binary floating point: 0b1.1p10 formatı (C99 hexfloat) -// // ============================================================================ #ifndef SAQUT_LEXER @@ -69,25 +29,7 @@ // ============================================================================ // INumber — Ara Sayısal Veri Yapısı // ============================================================================ -// -// Lexer'ın readNumeric() fonksiyonu tarafından döndürülür. -// Tokenizer bu yapıyı NumberToken'a dönüştürür. -// -// Neden ayrı bir struct? Lexer katmanı Token sınıflarından haberdar değil. -// Bağımlılık yönü: Lexer ← Tokenizer. Lexer hiçbir üst katmanı include etmez. -// -// ALANLAR: -// start, end : Kaynak koddaki başlangıç/bitiş konumları (offset) -// token : Sayının ham string hali (örn: "0xFF", "3.14", "1e10") -// isFloat : Ondalıklı sayı mı? (nokta veya epsilon içeriyor mu) -// hasEpsilon : Bilimsel gösterim mi? (e/E içeriyor mu) -// base : Sayı tabanı: 2, 8, 10, veya 16 -// - 0x/0X ile başlarsa 16 -// - 0b/0B ile başlarsa 2 -// - 0 ile başlayıp 8-9 içermiyorsa 8 -// - diğer her şey 10 -// positive : Pozitif mi? (başında - işareti yoksa true) -// + struct INumber { int start = 0; // Kaynak koddaki başlangıç offset'i int end = 0; // Kaynak koddaki bitiş offset'i @@ -103,21 +45,7 @@ struct INumber { // ============================================================================ // Lexer — Karakter Seviyesinde Tarayıcı // ============================================================================ -// -// Derleyici pipeline'ının en alt katmanı. Ham string üzerinde çalışır. -// Üst katmanlara (Tokenizer) karakter okuma ve konum yönetimi hizmeti sunar. -// -// DURUM DEĞİŞKENLERİ: -// input : Taranan kaynak kodun tamamı (string kopyası, değişmez) -// size : input.length() önbelleği (performans: her seferinde hesaplamaz) -// offset : Mevcut okuma konumu. 0 = ilk karakter, size = EOF -// offsetMap : Backtracking yığını. İç içe beginPosition/acceptPosition/rejectPosition -// -// PERFORMANS NOTU: -// Tüm metotlar inline tanımlanmıştır. Sanal fonksiyon çağrısı yoktur. -// offset değişiklikleri O(1)'dir. -// include() metodu O(n) karakter karşılaştırması yapar (n = kelime uzunluğu). -// + class Lexer { public: // --- Ham Veri --- @@ -127,14 +55,6 @@ public: std::vector offsetMap; // Backtracking yığını // --- Pozisyon Yönetimi (Backtracking API) --- - // - // Kullanım örneği: - // lexer.beginPosition(); // konumu kaydet - // if (lexer.include("for", false)) // dene (false = eşleşse de geri al) - // lexer.acceptPosition(); // başarılı → kalıcı yap - // else - // lexer.rejectPosition(); // başarısız → geri al - void beginPosition(); // Şu anki konumu yığına kaydet int getLastPosition(); // Yığındaki son konumu döndür void acceptPosition(); // Yığındaki son konumu kalıcı yap (apply) @@ -147,10 +67,6 @@ public: std::string getPositionRange(); // Pozisyon aralığındaki metni döndür // --- Desen Eşleme --- - // include(): Belirtilen kelime mevcut konumda başlıyor mu? - // accept=true (varsayılan): eşleşirse konum ilerletilir - // accept=false: eşleşse bile konum geri alınır (keyword kontrolü için) - // Örnek: include("for", false) → "for" ile başlıyor mu? konumu değiştirme. bool include(std::string word, bool accept = true); // --- Konum Okuma/Yazma --- @@ -164,7 +80,6 @@ public: void toChar(int n); // offset'i n kadar ilerlet // --- Üst Seviye İşlemler --- - // --- Konum Bilgisi (SourceFile üzerinden) --- SourceFile sourceFile; // Kaynak kod ve satır başı offset'leri SourceLocation getLocation(); // Mevcut offset'in SourceLocation'ını döndür void setSourceText(const std::string& path, const std::string& text); @@ -175,423 +90,4 @@ public: INumber readNumeric(); // Sayı literal'ı oku ve INumber olarak döndür }; -// ============================================================================ -// GERÇEKLEME (Implementation) -// ============================================================================ -// Tüm metotlar inline olarak aşağıda tanımlanmıştır. -// Derleme modeli: header-only. main.cpp bu dosyayı include eder. -// ============================================================================ - -// -------------------------------------------------------------------------- -// beginPosition: Mevcut offset'i yığına kaydet. -// İç içe çağrılabilir: 3 kere beginPosition → 3 elemanlı yığın. -// -------------------------------------------------------------------------- -inline void Lexer::beginPosition() { - offsetMap.push_back(getLastPosition()); -} - -// -------------------------------------------------------------------------- -// getLastPosition: Yığının tepesindeki konumu döndür. -// Yığın boşsa mevcut offset'i döndür (başlangıç durumu). -// -------------------------------------------------------------------------- -inline int Lexer::getLastPosition() { - if (offsetMap.empty()) return offset; - return offsetMap.back(); -} - -// -------------------------------------------------------------------------- -// acceptPosition: Yığındaki son geçici konumu kalıcı yap. -// Örnek: offsetMap=[5,10], offset=15 → offsetMap.back()=10 olur. -// Bu sayede include() denemesi başarılı olduğunda konum ilerletilmiş olur. -// -------------------------------------------------------------------------- -inline void Lexer::acceptPosition() { - int t = offsetMap.back(); - setLastPosition(t); -} - -// -------------------------------------------------------------------------- -// setLastPosition: Yığının tepesini veya offset'i değiştir. -// -------------------------------------------------------------------------- -inline void Lexer::setLastPosition(int n) { - if (offsetMap.empty()) - offset = n; - else - offsetMap.back() = n; -} - -// -------------------------------------------------------------------------- -// isEnd: Dosya sonuna gelindi mi? offset >= size. -// -------------------------------------------------------------------------- -inline bool Lexer::isEnd() { - return size <= getOffset(); -} - -// -------------------------------------------------------------------------- -// rejectPosition: Yığındaki son konumu at. Başarısız include() denemesi sonrası. -// -------------------------------------------------------------------------- -inline void Lexer::rejectPosition() { - offsetMap.pop_back(); -} - -// -------------------------------------------------------------------------- -// positionRange: Yığındaki en dış ve en iç konumu [start, end] olarak döndür. -// UYARI: new int[2] ile heap'te tahsis eder. Çağıran sorumludur. -// TODO: std::pair veya yapı kullanarak tahsisi kaldır. -// -------------------------------------------------------------------------- -inline int* Lexer::positionRange() { - int len = offsetMap.size(); - if (len == 0) - return new int[2]{0, offset}; - if (len == 1) - return new int[2]{offset, offsetMap[0]}; - return new int[2]{offsetMap[len - 2], offsetMap[len - 1]}; -} - -// -------------------------------------------------------------------------- -// getPositionRange: positionRange() aralığındaki metni string olarak döndür. -// -------------------------------------------------------------------------- -inline std::string Lexer::getPositionRange() { - int* a = positionRange(); - std::string mem; - for (int i = a[0]; i < a[1]; i++) - mem.push_back(input.at(i)); - return mem; -} - -// -------------------------------------------------------------------------- -// include: Belirtilen kelime mevcut konumda başlıyor mu? -// -// Algoritma: -// 1. beginPosition() ile konumu kaydet -// 2. Kelimenin her karakterini sırayla karşılaştır -// 3. Eşleşmezse veya EOF olursa → rejectPosition() ve false dön -// 4. Tüm karakterler eşleşirse: -// - accept=true ise → acceptPosition() (konum kalıcı ilerler) -// - accept=false ise → rejectPosition() (konum eski haline döner) -// 5. true dön -// -// Neden accept parametresi var? -// Tokenizer scope() fonksiyonu, keyword'leri kontrol ederken accept=false -// kullanır. Çünkü bir keyword eşleşmesi, aynı zamanda daha uzun bir -// keyword'ün parçası olabilir (örn: "do", "double"ın başlangıcı). -// Eğer include("do", true) kullanılırsa, konum ilerler ve geri alınamaz. -// -------------------------------------------------------------------------- -inline bool Lexer::include(std::string word, bool accept) { - beginPosition(); - for (size_t i = 0; i < word.size(); i++) { - if (isEnd()) { - rejectPosition(); - return false; - } - if (word[i] != getchar()) { - rejectPosition(); - return false; - } - nextChar(); - } - if (accept) - acceptPosition(); - else - rejectPosition(); - return true; -} - -// -------------------------------------------------------------------------- -// getOffset / setOffset: Konum erişimcileri. -// -------------------------------------------------------------------------- -inline int Lexer::getOffset() { - return getLastPosition(); -} - -inline int Lexer::setOffset(int n) { - setLastPosition(n); - return getLastPosition(); -} - -// -------------------------------------------------------------------------- -// getchar(additionalOffset): offset + ek kadar ilerideki karakteri oku. -// Sınır kontrolü yapar: target >= size ise '\0' döndürür ve hata mesajı basar. -// Bu metot özellikle keyword sınır kontrolünde kullanılır: -// "do" eşleşti, sıradaki karakter 'u' ise bu "double" olabilir → keyword değil -// -------------------------------------------------------------------------- -inline char Lexer::getchar(int additionalOffset) { - int target = getOffset() + additionalOffset; - if (target >= size) { - std::cerr << "Lexer hatası: sınır aşımı\n"; - return '\0'; - } - return input.at(target); -} - -inline char Lexer::getchar() { - int target = getOffset(); - if (target >= size) { - std::cerr << "Lexer hatası: sınır aşımı\n"; - return '\0'; - } - return input.at(target); -} - -// -------------------------------------------------------------------------- -// nextChar / toChar: Konum ilerletme. -// EOF kontrolü yapar — dosya sonundaysa ilerlemez. -// -------------------------------------------------------------------------- -inline void Lexer::nextChar() { - if (!isEnd()) - setOffset(getOffset() + 1); -} - -inline void Lexer::toChar(int n) { - if (!isEnd()) - setOffset(getOffset() + n); -} - -// -------------------------------------------------------------------------- -// getLocation: Mevcut offset'in SourceLocation'ını döndür. -// sourceFile bağlı değilse offset+dosya adı olmadan temel bilgi döndür. -// -------------------------------------------------------------------------- -inline SourceLocation Lexer::getLocation() { - return sourceFile.offsetToLocation(getOffset()); -} - -// -------------------------------------------------------------------------- -// setSourceText: Yeni kaynak kodu yükle ve SourceFile'ı güncelle. -// Aynı anda Lexer ve SourceFile'ı hazırlar. -// -------------------------------------------------------------------------- -inline void Lexer::setSourceText(const std::string& path, const std::string& text) { - sourceFile.setText(path, text); - setText(text); -} - -// -------------------------------------------------------------------------- -// setText: Yeni kaynak kodu yükle. input ve size'ı günceller. -// -------------------------------------------------------------------------- -inline void Lexer::setText(std::string text) { - input = text; - size = text.length(); -} - -// -------------------------------------------------------------------------- -// skipWhiteSpace: Boşluk, sekme, satırsonu, satırbaşı karakterlerini atla. -// Yorum satırlarını atlamaz — bu Tokenizer'ın işi. -// -------------------------------------------------------------------------- -inline void Lexer::skipWhiteSpace() { - while (!isEnd()) { - switch (getchar()) { - case '\r': // carriage return (Windows satırsonu \r\n) - case '\n': // line feed (Unix satırsonu) - case '\b': // backspace - case '\t': // tab - case ' ': // boşluk - nextChar(); - break; - default: - return; - } - } -} - -// -------------------------------------------------------------------------- -// isNumeric: Mevcut karakter bir rakam mı? (0-9) -// Pointer aritmetiği veya ASCII tablosu karşılaştırması yerine basit aralık -// kontrolü. Performans: O(1), branchless (modern derleyiciler optimize eder). -// -------------------------------------------------------------------------- -inline bool Lexer::isNumeric() { - char c = getchar(); - return (c >= '0' && c <= '9'); -} - -// -------------------------------------------------------------------------- -// readNumeric: Tam bir sayı literal'ı oku. -// -// Desteklenen formatlar (öncelik sırasıyla): -// 1. İşaret: -42, +3 (baştaki isteğe bağlı işaret) -// 2. 0x/0X: Hex (0xFF, 0X1A) -// 3. 0b/0B: Binary (0b1010) -// 4. 0 ile başlayan: Octal (0777) veya Float (0.5) -// 5. Ondalık: 42, 3.14 -// 6. Bilimsel: 1e10, 2.5E-3, 1.0e+5 -// -// Algoritma: -// 1. İsteğe bağlı işareti oku (+ veya -) -// 2. İlk karakter '0' ise → özel durum (hex/bin/octal/float kontrolü) -// 3. Ana döngü: rakamları, hex harflerini (a-f/A-F), nokta (.), epsilon (e/E) oku -// 4. Her karakterde taban uygunluğunu kontrol et (örn: octal'da 8-9 geçersiz) -// 5. İlk karakter '0' değilse → doğrudan decimal -// -// Özel durum: "0" takip eden karakter yoksa → tek haneli sayı, base=10. -// "0xFF" → hex, "0b10" → binary, "077" → octal, "0.5" → float. -// -// TODO: Hex float desteği (0x1.ffp10) — C99 standardı -// TODO: Sayısal ayraç: 1_000_000 — C++14/Java 7 -// -------------------------------------------------------------------------- -inline INumber Lexer::readNumeric() { - INumber num; - num.start = getLastPosition(); - num.startLoc = getLocation(); - - // --- Adım 1: İsteğe bağlı işaret --- - if (getchar() == '-') { - nextChar(); - num.positive = false; - } else if (getchar() == '+') { - nextChar(); - num.positive = true; - } else { - num.positive = true; - } - - // --- Adım 2: İlk karakter '0' ise özel format kontrolü --- - bool nextDot = false; - if (getchar() == '0') { - num.token.push_back('0'); - nextChar(); - char c = getchar(); - switch (c) { - case 'x': case 'X': // Hex: 0xFF, 0X1A - num.token.push_back(c); - num.base = 16; - nextChar(); - break; - case 'b': case 'B': // Binary: 0b1010 - num.token.push_back(c); - num.base = 2; - nextChar(); - break; - case '.': // Float: 0.5, 0.0 - num.token.push_back(c); - num.base = 10; - nextDot = true; - num.isFloat = true; - nextChar(); - break; - case '0': case '1': case '2': case '3': case '4': - case '5': case '6': case '7': - // Octal: 0777 — sonraki karakter octal rakam ise devam et - num.base = 8; - break; - default: - // Sadece "0" — takip eden karakter rakam değil. - // Hemen dön: base=10 (varsayılan). - // BUG FIX (commit 438bc0e): Eskiden bu dalda sıradaki karakter - // token'a ekleniyor ve base=8 yapılıyordu. Bu, "0;" durumunda - // ';' karakterinin sayıya eklenmesine neden oluyordu. - num.end = getLastPosition(); - num.endLoc = getLocation(); - return num; - } - } else { - num.base = 10; - } - - // --- Adım 3: Ana okuma döngüsü --- - // Bu döngü, geçerli tabana uygun tüm karakterleri okur. - // Her karakter tipi için taban uygunluğu kontrol edilir: - // - 0-1: tüm tabanlar - // - 2-7: base >= 8 - // - 8-9: base >= 10 - // - a-f/A-F: base >= 16 - // - . (nokta): sadece ondalık, sadece bir kere - // - e/E: sadece ondalık ve hex (hex'te epsilon yok, direkt okunur) - while (!isEnd()) { - char c = getchar(); - switch (c) { - case '0': - case '1': - num.token.push_back(c); - break; - case '2': case '3': case '4': case '5': - case '6': case '7': - if (num.base >= 8) - num.token.push_back(c); - else { - num.end = getLastPosition(); - num.endLoc = getLocation(); - return num; - } - break; - case '8': case '9': - if (num.base >= 10) - num.token.push_back(c); - else { - num.end = getLastPosition(); - num.endLoc = getLocation(); - return num; - } - break; - case 'a': case 'A': case 'b': case 'B': - case 'c': case 'C': case 'd': case 'D': - case 'f': case 'F': - if (num.base >= 16) - num.token.push_back(c); - else { - num.end = getLastPosition(); - num.endLoc = getLocation(); - return num; - } - break; - case '.': - // Nokta: Sadece bir kere izin verilir. - // .5 gibi başıboş noktalı sayılar için "0." öneki eklenir. - if (!nextDot) { - if (num.token.empty()) - num.token += "0."; - else - num.token.push_back('.'); - nextDot = true; - num.isFloat = true; - } else { - // İkinci nokta → sayı bitti - num.end = getLastPosition(); - num.endLoc = getLocation(); - return num; - } - break; - case 'e': case 'E': - // Epsilon (bilimsel gösterim): - // - Hex tabanda: epsilon DEĞİL, hex hanesi olarak okunur. - // - Decimal tabanda: 1e10, 2.5E-3 formatı. - if (num.base == 16) { - num.token.push_back(c); - break; - } - if (num.base == 10) { - num.hasEpsilon = true; - num.token.push_back(c); - nextChar(); - c = getchar(); - // İsteğe bağlı işaret: e+10, E-3 - if (c == '+' || c == '-') { - num.token.push_back(c); - nextChar(); - } - // Epsilon sonrası rakamları oku - while (!isEnd()) { - c = getchar(); - if (c >= '0' && c <= '9') { - num.token.push_back(c); - nextChar(); - } else { - num.end = getLastPosition(); - num.endLoc = getLocation(); - return num; - } - } - break; - } - num.end = getLastPosition(); - num.endLoc = getLocation(); - return num; - default: - // Tanınmayan karakter → sayı bitti - num.end = getLastPosition(); - return num; - } - nextChar(); - } - num.end = getLastPosition(); - num.endLoc = getLocation(); - return num; -} - -#endif // SAQUT_LEXER \ No newline at end of file +#endif // SAQUT_LEXER diff --git a/src/parser/ast.hpp b/src/parser/ast.hpp index 8549003..d1910a1 100644 --- a/src/parser/ast.hpp +++ b/src/parser/ast.hpp @@ -1,45 +1,13 @@ -// ============================================================================ -// saQut Compiler — Soyut Sözdizim Ağacı (Aggregator) -// ============================================================================ -// -// DİZİN: src/parser/ast.hpp -// KATMAN: Katman 3 — Parser'ın ürettiği, IR'nin tükettiği -// -// Bu dosya bir AGGREGATOR'dür. Tüm AST düğüm sınıflarını tek bir include -// ile kullanılabilir yapar. -// -// AST DÜĞÜM HİYERARŞİSİ: -// ASTNode (soyut taban) — ast_node.hpp -// ├── ProgramNode : Kök düğüm — ast_decl.hpp -// ├── FunctionDeclNode : Fonksiyon tanımı — ast_decl.hpp -// ├── StructDeclNode : struct tanımı — ast_decl.hpp -// ├── VariableDeclNode : Değişken tanımı — ast_decl.hpp -// ├── BlockNode : { ... } bloğu — ast_stmt.hpp -// ├── IfStatementNode : if/else — ast_stmt.hpp -// ├── WhileStatementNode : while — ast_stmt.hpp -// ├── ForStatementNode : for — ast_stmt.hpp -// ├── DoWhileStatementNode : do-while — ast_stmt.hpp -// ├── ReturnStatementNode : return — ast_stmt.hpp -// ├── BreakStatementNode : break — ast_stmt.hpp -// ├── ContinueStatementNode : continue — ast_stmt.hpp -// ├── ExpressionStatementNode: expression; — ast_stmt.hpp -// ├── BinaryExpressionNode : a + b — ast_expr.hpp -// ├── LiteralNode : 42, "hello" — ast_expr.hpp -// ├── IdentifierNode : değişken ismi — ast_expr.hpp -// ├── PostfixNode : a++ — ast_expr.hpp -// ├── CallExpressionNode : f(x) — ast_expr.hpp -// ├── MemberAccessNode : a.b — ast_expr.hpp -// └── IndexExpressionNode : a[i] — ast_expr.hpp -// -// ============================================================================ - #ifndef SAQUT_AST #define SAQUT_AST #include "parser/ast_node.hpp" -#include "parser/ast_json.hpp" -#include "parser/ast_expr.hpp" -#include "parser/ast_stmt.hpp" -#include "parser/ast_decl.hpp" +#include "parser/nodes/program.hpp" +#include "parser/nodes/declarations.hpp" +#include "parser/nodes/statements.hpp" +#include "parser/nodes/binary_expr.hpp" +#include "parser/nodes/literal.hpp" +#include "parser/nodes/identifier.hpp" +#include "parser/nodes/expressions.hpp" -#endif // SAQUT_AST +#endif diff --git a/src/parser/ast_decl.hpp b/src/parser/ast_decl.hpp deleted file mode 100644 index 5602698..0000000 --- a/src/parser/ast_decl.hpp +++ /dev/null @@ -1,143 +0,0 @@ -// ============================================================================ -// saQut Compiler — AST Deklarasyon Düğümleri -// ============================================================================ -// -// DİZİN: src/parser/ast_decl.hpp -// İÇERİK: ProgramNode, FunctionDeclNode, VariableDeclNode, StructDeclNode -// -// ============================================================================ - -#ifndef SAQUT_AST_DECL -#define SAQUT_AST_DECL - -#include -#include -#include -#include "parser/ast_node.hpp" -#include "parser/ast_json.hpp" -class ProgramNode : public ASTNode { -public: - ProgramNode() { kind = ASTKind::Program; } - - void log(int indent = 0) override { - std::cout << padRight("", indent) << "Program\n"; - for (auto* c : getChildren()) c->log(indent + 2); - } - - std::string toJson(int depth = 0) override { - std::string in = jsonIndent(depth); - std::ostringstream ss; - ss << in << "{\n" - << in << " \"kind\": \"Program\",\n" - << in << " \"children\": [\n" - << childrenToJson(this, depth + 3) - << in << " ]\n" - << in << "}"; - return ss.str(); - } -}; - -class FunctionDeclNode : public ASTNode { -public: - std::string name; - std::string returnType; - - FunctionDeclNode() { kind = ASTKind::FunctionDecl; } - - void log(int indent = 0) override { - std::cout << padRight("", indent) - << "FunctionDecl " << returnType << " " << name << "()\n"; - for (auto* c : getChildren()) c->log(indent + 2); - } - - std::string toJson(int depth = 0) override { - std::string in = jsonIndent(depth); - std::ostringstream ss; - ss << in << "{\n" - << in << " \"kind\": \"FunctionDecl\",\n" - << in << " \"name\": \"" << jsonEscape(name) << "\",\n" - << in << " \"returnType\": \"" << jsonEscape(returnType) << "\",\n" - << in << " \"location\": " << loc.toJson() << ",\n" - << in << " \"children\": [\n" - << childrenToJson(this, depth + 3) - << in << " ]\n" - << in << "}"; - return ss.str(); - } -}; - -class VariableDeclNode : public ASTNode { -public: - std::string varType; - std::string name; - ASTNode* initExpr = nullptr; - - VariableDeclNode() { kind = ASTKind::VariableDecl; } - - std::string toJson(int depth = 0) override { - std::string in = jsonIndent(depth); - std::ostringstream ss; - ss << in << "{\n" - << in << " \"kind\": \"VariableDecl\",\n" - << in << " \"name\": \"" << jsonEscape(name) << "\",\n" - << in << " \"varType\": \"" << jsonEscape(varType) << "\",\n" - << in << " \"location\": " << loc.toJson() << ""; - if (initExpr) { - ss << ",\n" << in << " \"initExpr\":\n" - << initExpr->toJson(depth + 2); - } - // Çoklu değişken bildirimindeki kardeşler (int a, b, c;) - if (!getChildren().empty()) { - ss << ",\n" << in << " \"declarators\": [\n"; - for (size_t i = 0; i < getChildren().size(); i++) { - ss << ((VariableDeclNode*)getChildren()[i])->toJson(depth + 2); - if (i + 1 < getChildren().size()) ss << ","; - ss << "\n"; - } - ss << in << " ]"; - } - ss << "\n" << in << "}"; - return ss.str(); - } - - void log(int indent = 0) override { - std::cout << padRight("", indent) - << "VariableDecl " << varType << " " << name; - if (initExpr) { - std::cout << " =\n"; - initExpr->log(indent + 4); - } else { - std::cout << "\n"; - } - // Kardeş değişkenleri de logla - for (auto* child : getChildren()) { - child->log(indent); - } - } -}; - -class StructDeclNode : public ASTNode { -public: - std::string name; - - StructDeclNode() { kind = ASTKind::StructDecl; } - - void log(int indent = 0) override { - std::cout << padRight("", indent) << "StructDecl " << name << "\n"; - for (auto* c : getChildren()) c->log(indent + 2); - } - - std::string toJson(int depth = 0) override { - std::string in = jsonIndent(depth); - std::ostringstream ss; - ss << in << "{\n" - << in << " \"kind\": \"StructDecl\",\n" - << in << " \"name\": \"" << jsonEscape(name) << "\",\n" - << in << " \"children\": [\n" - << childrenToJson(this, depth + 3) - << in << " ]\n" - << in << "}"; - return ss.str(); - } -}; -#endif // SAQUT_AST_DECL diff --git a/src/parser/ast_expr.hpp b/src/parser/ast_expr.hpp deleted file mode 100644 index 4455260..0000000 --- a/src/parser/ast_expr.hpp +++ /dev/null @@ -1,287 +0,0 @@ -// ============================================================================ -// saQut Compiler — AST İfade Düğümleri -// ============================================================================ -// -// DİZİN: src/parser/ast_expr.hpp -// İÇERİK: BinaryExpr, Literal, Identifier, Postfix, -// CallExpression, MemberAccess, IndexExpression -// -// ============================================================================ - -#ifndef SAQUT_AST_EXPR -#define SAQUT_AST_EXPR - -#include -#include -#include -#include "parser/ast_node.hpp" -#include "parser/ast_json.hpp" -class BinaryExpressionNode : public ASTNode { -public: - TokenType Operator; - ASTNode* Left = nullptr; - ASTNode* Right = nullptr; - - BinaryExpressionNode() { kind = ASTKind::BinaryExpression; } - - void log(int indent = 0) override { - auto it = OPERATOR_MAP_STRREV.find(Operator); - std::string sym = (it != OPERATOR_MAP_STRREV.end()) ? std::string(it->second) : "?"; - std::string val; - auto it2 = OPERATOR_MAP_REV.find(Operator); - if (it2 != OPERATOR_MAP_REV.end()) val = std::string(it2->second); - - std::cout << padRight("", indent) << "BinaryExpr " << sym - << " (" << val << ")\n"; - if (Right) Right->log(indent + 2); - if (Left) Left->log(indent + 2); - } - - std::string toJson(int depth = 0) override { - std::string in = jsonIndent(depth); - std::string opSym = "?"; - auto it = OPERATOR_MAP_REV.find(Operator); - if (it != OPERATOR_MAP_REV.end()) opSym = std::string(it->second); - - std::ostringstream ss; - ss << in << "{\n" - << in << " \"kind\": \"BinaryExpression\",\n" - << in << " \"operator\": \"" << jsonEscape(opSym) << "\",\n" - << in << " \"location\": " << loc.toJson() << ""; - if (Left) { - ss << ",\n" << in << " \"left\":\n" - << Left->toJson(depth + 2); - } - if (Right) { - ss << ",\n" << in << " \"right\":\n" - << Right->toJson(depth + 2); - } - ss << "\n" << in << "}"; - return ss.str(); - } -}; - -// LiteralType enum'u ve literalTypeToString ast_node.hpp'de tanımlıdır. - -class LiteralNode : public ASTNode { -public: - Token* lexerToken = nullptr; - ParserToken parserToken; - - LiteralType literalType = LiteralType::INTEGER; - int literalBase = 10; // 10, 16, 8, 2 (sadece INTEGER/FLOAT için) - bool isFloatValue = false; // Ondalıklı mı? (sadece INTEGER/FLOAT için) - - LiteralNode() { kind = ASTKind::Literal; } - - void log(int indent = 0) override { - std::cout << padRight("", indent) - << "Literal {" << parserToken.token->token << "} " - << literalTypeToString(literalType); - if (literalType == LiteralType::INTEGER && literalBase != 10) - std::cout << " (base " << literalBase << ")"; - std::cout << "\n"; - } - - std::string toJson(int depth = 0) override { - std::string in = jsonIndent(depth); - std::string val = parserToken.token ? parserToken.token->token : "?"; - std::ostringstream ss; - ss << in << "{\n" - << in << " \"kind\": \"Literal\",\n" - << in << " \"literalType\": \"" << literalTypeToString(literalType) << "\",\n" - << in << " \"value\": \"" << jsonEscape(val) << "\""; - if (literalType == LiteralType::INTEGER && literalBase != 10) { - ss << ",\n" << in << " \"base\": " << literalBase; - } - if (literalType == LiteralType::FLOAT) { - ss << ",\n" << in << " \"isFloat\": true"; - } - ss << ",\n" << in << " \"location\": " << loc.toJson() << "\n" - << in << "}"; - return ss.str(); - } -}; - -class IdentifierNode : public ASTNode { -public: - Token* lexerToken = nullptr; - ParserToken parserToken; - - IdentifierNode() { kind = ASTKind::Identifier; } - - void log(int indent = 0) override { - std::cout << padRight("", indent) - << "Identifier {" << parserToken.token->token << "}\n"; - } - - std::string toJson(int depth = 0) override { - std::string in = jsonIndent(depth); - std::string name = parserToken.token ? parserToken.token->token : "?"; - std::ostringstream ss; - ss << in << "{\n" - << in << " \"kind\": \"Identifier\",\n" - << in << " \"name\": \"" << jsonEscape(name) << "\",\n" - << in << " \"location\": " << loc.toJson() << "\n" - << in << "}"; - return ss.str(); - } -}; - -class PostfixNode : public ASTNode { -public: - ASTNode* operand = nullptr; - TokenType Operator; - - PostfixNode() { kind = ASTKind::Postfix; } - - void log(int indent = 0) override { - auto it = OPERATOR_MAP_STRREV.find(Operator); - std::string sym = (it != OPERATOR_MAP_STRREV.end()) ? std::string(it->second) : "?"; - std::cout << padRight("", indent) << "Postfix " << sym; - auto it2 = OPERATOR_MAP_REV.find(Operator); - if (it2 != OPERATOR_MAP_REV.end()) - std::cout << " (" << it2->second << ")"; - std::cout << "\n"; - if (operand) operand->log(indent + 2); - } - - std::string toJson(int depth = 0) override { - std::string in = jsonIndent(depth); - std::string opSym = "?"; - auto it = OPERATOR_MAP_REV.find(Operator); - if (it != OPERATOR_MAP_REV.end()) opSym = std::string(it->second); - - std::ostringstream ss; - ss << in << "{\n" - << in << " \"kind\": \"Postfix\",\n" - << in << " \"operator\": \"" << jsonEscape(opSym) << "\""; - if (operand) { - ss << ",\n" << in << " \"operand\":\n" - << operand->toJson(depth + 2); - } - ss << "\n" << in << "}"; - return ss.str(); - } -}; - -class CallExpressionNode : public ASTNode { -public: - ASTNode* callee = nullptr; - std::vector arguments; - - CallExpressionNode() { kind = ASTKind::Call; } - - void log(int indent = 0) override { - std::cout << padRight("", indent) << "Call\n"; - if (callee) { - std::cout << padRight("", indent + 2) << "Callee:\n"; - callee->log(indent + 4); - } - std::cout << padRight("", indent + 2) << "Args (" << arguments.size() << "):\n"; - for (auto* a : arguments) a->log(indent + 4); - } - - std::string toJson(int depth = 0) override { - std::string in = jsonIndent(depth); - std::ostringstream ss; - ss << in << "{\n" - << in << " \"kind\": \"Call\""; - if (callee) { - ss << ",\n" << in << " \"callee\":\n" - << callee->toJson(depth + 2); - } - ss << ",\n" << in << " \"arguments\": [\n"; - for (size_t i = 0; i < arguments.size(); i++) { - ss << arguments[i]->toJson(depth + 3); - if (i + 1 < arguments.size()) ss << ","; - ss << "\n"; - } - ss << in << " ]\n" << in << "}"; - return ss.str(); - } -}; - -// ============================================================================ -// MemberAccessNode — Üye Erişimi a.b veya a->b -// ============================================================================ - - -class MemberAccessNode : public ASTNode { -public: - ASTNode* object = nullptr; - std::string member; - bool arrow = false; - - MemberAccessNode() { kind = ASTKind::MemberAccess; } - - void log(int indent = 0) override { - std::cout << padRight("", indent) << "MemberAccess " - << (arrow ? "->" : ".") << " " << member << "\n"; - if (object) object->log(indent + 2); - } - - std::string toJson(int depth = 0) override { - std::string in = jsonIndent(depth); - std::ostringstream ss; - ss << in << "{\n" - << in << " \"kind\": \"MemberAccess\",\n" - << in << " \"member\": \"" << jsonEscape(member) << "\",\n" - << in << " \"arrow\": " << (arrow ? "true" : "false"); - if (object) { - ss << ",\n" << in << " \"object\":\n" - << object->toJson(depth + 2); - } - ss << "\n" << in << "}"; - return ss.str(); - } -}; - -// ============================================================================ -// IndexExpressionNode — Dizi Erişimi a[i] -// ============================================================================ - - -class IndexExpressionNode : public ASTNode { -public: - ASTNode* object = nullptr; - ASTNode* index = nullptr; - - IndexExpressionNode() { kind = ASTKind::IndexExpression; } - - void log(int indent = 0) override { - std::cout << padRight("", indent) << "IndexExpression\n"; - if (object) { - std::cout << padRight("", indent + 2) << "Object:\n"; - object->log(indent + 4); - } - if (index) { - std::cout << padRight("", indent + 2) << "Index:\n"; - index->log(indent + 4); - } - } - - std::string toJson(int depth = 0) override { - std::string in = jsonIndent(depth); - std::ostringstream ss; - ss << in << "{\n" - << in << " \"kind\": \"IndexExpression\""; - if (object) { - ss << ",\n" << in << " \"object\":\n" - << object->toJson(depth + 2); - } - if (index) { - ss << ",\n" << in << " \"index\":\n" - << index->toJson(depth + 2); - } - ss << "\n" << in << "}"; - return ss.str(); - } -}; - -// ============================================================================ -// StructDeclNode — struct Tanımı -// ============================================================================ - - -#endif // SAQUT_AST_EXPR diff --git a/src/parser/ast_stmt.hpp b/src/parser/ast_stmt.hpp deleted file mode 100644 index b60aaf9..0000000 --- a/src/parser/ast_stmt.hpp +++ /dev/null @@ -1,307 +0,0 @@ -// ============================================================================ -// saQut Compiler — AST Deyim Düğümleri -// ============================================================================ -// -// DİZİN: src/parser/ast_stmt.hpp -// İÇERİK: Block, If, While, For, DoWhile, -// Return, Break, Continue, ExpressionStatement -// -// ============================================================================ - -#ifndef SAQUT_AST_STMT -#define SAQUT_AST_STMT - -#include -#include -#include -#include "parser/ast_node.hpp" -#include "parser/ast_json.hpp" -class BlockNode : public ASTNode { -public: - BlockNode() { kind = ASTKind::Block; } - - void log(int indent = 0) override { - std::cout << padRight("", indent) << "Block\n"; - for (auto* c : getChildren()) c->log(indent + 2); - } - - std::string toJson(int depth = 0) override { - std::string in = jsonIndent(depth); - std::ostringstream ss; - ss << in << "{\n" - << in << " \"kind\": \"Block\",\n" - << in << " \"children\": [\n" - << childrenToJson(this, depth + 3) - << in << " ]\n" - << in << "}"; - return ss.str(); - } -}; - -class IfStatementNode : public ASTNode { -public: - ASTNode* condition = nullptr; - ASTNode* thenBranch = nullptr; - ASTNode* elseBranch = nullptr; - - IfStatementNode() { kind = ASTKind::IfStatement; } - - void log(int indent = 0) override { - std::cout << padRight("", indent) << "IfStatement\n"; - std::cout << padRight("", indent + 2) << "Condition:\n"; - if (condition) condition->log(indent + 4); - std::cout << padRight("", indent + 2) << "Then:\n"; - if (thenBranch) thenBranch->log(indent + 4); - if (elseBranch) { - std::cout << padRight("", indent + 2) << "Else:\n"; - elseBranch->log(indent + 4); - } - } - - std::string toJson(int depth = 0) override { - std::string in = jsonIndent(depth); - std::ostringstream ss; - ss << in << "{\n" - << in << " \"kind\": \"IfStatement\""; - if (condition) { - ss << ",\n" << in << " \"condition\":\n" - << condition->toJson(depth + 2); - } - if (thenBranch) { - ss << ",\n" << in << " \"then\":\n" - << thenBranch->toJson(depth + 2); - } - if (elseBranch) { - ss << ",\n" << in << " \"else\":\n" - << elseBranch->toJson(depth + 2); - } - ss << "\n" << in << "}"; - return ss.str(); - } -}; - -class WhileStatementNode : public ASTNode { -public: - ASTNode* condition = nullptr; - ASTNode* body = nullptr; - - WhileStatementNode() { kind = ASTKind::WhileStatement; } - - void log(int indent = 0) override { - std::cout << padRight("", indent) << "WhileStatement\n"; - std::cout << padRight("", indent + 2) << "Condition:\n"; - if (condition) condition->log(indent + 4); - std::cout << padRight("", indent + 2) << "Body:\n"; - if (body) body->log(indent + 4); - } - - std::string toJson(int depth = 0) override { - std::string in = jsonIndent(depth); - std::ostringstream ss; - ss << in << "{\n" - << in << " \"kind\": \"WhileStatement\""; - if (condition) { - ss << ",\n" << in << " \"condition\":\n" - << condition->toJson(depth + 2); - } - if (body) { - ss << ",\n" << in << " \"body\":\n" - << body->toJson(depth + 2); - } - ss << "\n" << in << "}"; - return ss.str(); - } -}; - -class ForStatementNode : public ASTNode { -public: - ASTNode* init = nullptr; - ASTNode* condition = nullptr; - ASTNode* update = nullptr; - ASTNode* body = nullptr; - - ForStatementNode() { kind = ASTKind::ForStatement; } - - void log(int indent = 0) override { - std::cout << padRight("", indent) << "ForStatement\n"; - if (init) { - std::cout << padRight("", indent + 2) << "Init:\n"; - init->log(indent + 4); - } - if (condition) { - std::cout << padRight("", indent + 2) << "Condition:\n"; - condition->log(indent + 4); - } - if (update) { - std::cout << padRight("", indent + 2) << "Update:\n"; - update->log(indent + 4); - } - std::cout << padRight("", indent + 2) << "Body:\n"; - if (body) body->log(indent + 4); - } - - std::string toJson(int depth = 0) override { - std::string in = jsonIndent(depth); - std::ostringstream ss; - ss << in << "{\n" - << in << " \"kind\": \"ForStatement\""; - if (init) { - ss << ",\n" << in << " \"init\":\n" - << init->toJson(depth + 2); - } - if (condition) { - ss << ",\n" << in << " \"condition\":\n" - << condition->toJson(depth + 2); - } - if (update) { - ss << ",\n" << in << " \"update\":\n" - << update->toJson(depth + 2); - } - if (body) { - ss << ",\n" << in << " \"body\":\n" - << body->toJson(depth + 2); - } - ss << "\n" << in << "}"; - return ss.str(); - } -}; - -class DoWhileStatementNode : public ASTNode { -public: - ASTNode* condition = nullptr; - ASTNode* body = nullptr; - - DoWhileStatementNode() { kind = ASTKind::DoWhileStatement; } - - void log(int indent = 0) override { - std::cout << padRight("", indent) << "DoWhileStatement\n"; - std::cout << padRight("", indent + 2) << "Body:\n"; - if (body) body->log(indent + 4); - std::cout << padRight("", indent + 2) << "Condition:\n"; - if (condition) condition->log(indent + 4); - } - - std::string toJson(int depth = 0) override { - std::string in = jsonIndent(depth); - std::ostringstream ss; - ss << in << "{\n" - << in << " \"kind\": \"DoWhileStatement\""; - if (body) { - ss << ",\n" << in << " \"body\":\n" - << body->toJson(depth + 2); - } - if (condition) { - ss << ",\n" << in << " \"condition\":\n" - << condition->toJson(depth + 2); - } - ss << "\n" << in << "}"; - return ss.str(); - } -}; - -// ============================================================================ -// ReturnStatementNode — return [ifade] -// ============================================================================ - -class ReturnStatementNode : public ASTNode { -public: - ASTNode* value = nullptr; - - ReturnStatementNode() { kind = ASTKind::ReturnStatement; } - - void log(int indent = 0) override { - std::cout << padRight("", indent) << "ReturnStatement"; - if (value) { - std::cout << "\n"; - value->log(indent + 2); - } else { - std::cout << " (void)\n"; - } - } - - std::string toJson(int depth = 0) override { - std::string in = jsonIndent(depth); - std::ostringstream ss; - ss << in << "{\n" - << in << " \"kind\": \"ReturnStatement\""; - if (value) { - ss << ",\n" << in << " \"value\":\n" - << value->toJson(depth + 2); - } - ss << "\n" << in << "}"; - return ss.str(); - } -}; - -// ============================================================================ -// BreakStatementNode — break -// ============================================================================ - -class BreakStatementNode : public ASTNode { -public: - BreakStatementNode() { kind = ASTKind::BreakStatement; } - - void log(int indent = 0) override { - std::cout << padRight("", indent) << "BreakStatement\n"; - } - - std::string toJson(int depth = 0) override { - std::string in = jsonIndent(depth); - return in + "{\n" + in + " \"kind\": \"BreakStatement\"\n" + in + "}"; - } -}; - -// ============================================================================ -// ContinueStatementNode — continue -// ============================================================================ - -class ContinueStatementNode : public ASTNode { -public: - ContinueStatementNode() { kind = ASTKind::ContinueStatement; } - - void log(int indent = 0) override { - std::cout << padRight("", indent) << "ContinueStatement\n"; - } - - std::string toJson(int depth = 0) override { - std::string in = jsonIndent(depth); - return in + "{\n" + in + " \"kind\": \"ContinueStatement\"\n" + in + "}"; - } -}; - -// ============================================================================ -// ExpressionStatementNode — İfadeyi Statement Olarak Sarma -// ============================================================================ - -class ExpressionStatementNode : public ASTNode { -public: - ASTNode* expression = nullptr; - - ExpressionStatementNode() { kind = ASTKind::ExpressionStatement; } - - void log(int indent = 0) override { - std::cout << padRight("", indent) << "ExpressionStatement\n"; - if (expression) expression->log(indent + 2); - } - - std::string toJson(int depth = 0) override { - std::string in = jsonIndent(depth); - std::ostringstream ss; - ss << in << "{\n" - << in << " \"kind\": \"ExpressionStatement\",\n" - << in << " \"location\": " << loc.toJson() << ""; - if (expression) { - ss << ",\n" << in << " \"expression\":\n" - << expression->toJson(depth + 2); - } - ss << "\n" << in << "}"; - return ss.str(); - } -}; - - -// ============================================================================ -// CallExpressionNode — Fonksiyon Çağrısı f(a, b, ...) -// ============================================================================ - -#endif // SAQUT_AST_STMT diff --git a/src/parser/nodes/binary_expr.cpp b/src/parser/nodes/binary_expr.cpp new file mode 100644 index 0000000..d15731b --- /dev/null +++ b/src/parser/nodes/binary_expr.cpp @@ -0,0 +1,23 @@ +#include "parser/nodes/binary_expr.hpp" +#include "parser/ast_json.hpp" + +BinaryExpressionNode::BinaryExpressionNode() { + kind = ASTKind::BinaryExpression; +} + +void BinaryExpressionNode::log(int indent) { + std::string in = jsonIndent(indent); + std::cout << in << "BinaryExpression (" << (OPERATOR_MAP_REV.count(Operator) ? OPERATOR_MAP_REV.at(Operator) : "?") << ")\n"; + if (Left) Left->log(indent + 1); + if (Right) Right->log(indent + 1); +} + +std::string BinaryExpressionNode::toJson(int depth) { + JsonObject obj(depth); + obj.add("kind", "BinaryExpression"); + obj.add("operator", std::string(OPERATOR_MAP_REV.count(Operator) ? OPERATOR_MAP_REV.at(Operator) : "?")); + if (Left) obj.addRaw("left", Left->toJson(depth + 1)); + if (Right) obj.addRaw("right", Right->toJson(depth + 1)); + obj.addRaw("location", loc.toJson()); + return obj.str(); +} diff --git a/src/parser/nodes/binary_expr.hpp b/src/parser/nodes/binary_expr.hpp new file mode 100644 index 0000000..c760937 --- /dev/null +++ b/src/parser/nodes/binary_expr.hpp @@ -0,0 +1,17 @@ +#ifndef SAQUT_AST_BINARY_EXPR +#define SAQUT_AST_BINARY_EXPR + +#include "parser/ast_node.hpp" + +class BinaryExpressionNode : public ASTNode { +public: + TokenType Operator; + ASTNode* Left = nullptr; + ASTNode* Right = nullptr; + + BinaryExpressionNode(); + void log(int indent = 0) override; + std::string toJson(int depth = 0) override; +}; + +#endif diff --git a/src/parser/nodes/declarations.cpp b/src/parser/nodes/declarations.cpp new file mode 100644 index 0000000..4edc7d2 --- /dev/null +++ b/src/parser/nodes/declarations.cpp @@ -0,0 +1,53 @@ +#include "parser/nodes/declarations.hpp" +#include "parser/ast_json.hpp" + +// FunctionDeclNode +FunctionDeclNode::FunctionDeclNode() { kind = ASTKind::FunctionDecl; } +void FunctionDeclNode::log(int indent) { + std::cout << jsonIndent(indent) << "FunctionDecl (" << name << " : " << returnType << ")\n"; + for (auto* child : children) child->log(indent + 1); +} +std::string FunctionDeclNode::toJson(int depth) { + JsonObject obj(depth); + obj.add("kind", "FunctionDecl"); + obj.add("name", name); + obj.add("returnType", returnType); + obj.addArray("children", [&]() { + for (auto* child : children) obj.addItem(child->toJson(depth + 2)); + }); + obj.addRaw("location", loc.toJson()); + return obj.str(); +} + +// VariableDeclNode +VariableDeclNode::VariableDeclNode() { kind = ASTKind::VariableDecl; } +void VariableDeclNode::log(int indent) { + std::cout << jsonIndent(indent) << "VariableDecl (" << name << " : " << varType << ")\n"; + if (initExpr) initExpr->log(indent + 1); +} +std::string VariableDeclNode::toJson(int depth) { + JsonObject obj(depth); + obj.add("kind", "VariableDecl"); + obj.add("name", name); + obj.add("varType", varType); + if (initExpr) obj.addRaw("init", initExpr->toJson(depth + 1)); + obj.addRaw("location", loc.toJson()); + return obj.str(); +} + +// StructDeclNode +StructDeclNode::StructDeclNode() { kind = ASTKind::StructDecl; } +void StructDeclNode::log(int indent) { + std::cout << jsonIndent(indent) << "StructDecl (" << name << ")\n"; + for (auto* child : children) child->log(indent + 1); +} +std::string StructDeclNode::toJson(int depth) { + JsonObject obj(depth); + obj.add("kind", "StructDecl"); + obj.add("name", name); + obj.addArray("children", [&]() { + for (auto* child : children) obj.addItem(child->toJson(depth + 2)); + }); + obj.addRaw("location", loc.toJson()); + return obj.str(); +} diff --git a/src/parser/nodes/declarations.hpp b/src/parser/nodes/declarations.hpp new file mode 100644 index 0000000..2638eda --- /dev/null +++ b/src/parser/nodes/declarations.hpp @@ -0,0 +1,33 @@ +#ifndef SAQUT_AST_DECL +#define SAQUT_AST_DECL + +#include "parser/ast_node.hpp" + +class FunctionDeclNode : public ASTNode { +public: + std::string name; + std::string returnType; + FunctionDeclNode(); + void log(int indent = 0) override; + std::string toJson(int depth = 0) override; +}; + +class VariableDeclNode : public ASTNode { +public: + std::string varType; + std::string name; + ASTNode* initExpr = nullptr; + VariableDeclNode(); + void log(int indent = 0) override; + std::string toJson(int depth = 0) override; +}; + +class StructDeclNode : public ASTNode { +public: + std::string name; + StructDeclNode(); + void log(int indent = 0) override; + std::string toJson(int depth = 0) override; +}; + +#endif diff --git a/src/parser/nodes/expressions.cpp b/src/parser/nodes/expressions.cpp new file mode 100644 index 0000000..5cab82a --- /dev/null +++ b/src/parser/nodes/expressions.cpp @@ -0,0 +1,67 @@ +#include "parser/nodes/expressions.hpp" +#include "parser/ast_json.hpp" + +// PostfixNode +PostfixNode::PostfixNode() { kind = ASTKind::Postfix; } +void PostfixNode::log(int indent) { + std::cout << jsonIndent(indent) << "Postfix (" << (OPERATOR_MAP_REV.count(Operator) ? OPERATOR_MAP_REV.at(Operator) : "?") << ")\n"; + if (operand) operand->log(indent + 1); +} +std::string PostfixNode::toJson(int depth) { + JsonObject obj(depth); + obj.add("kind", "Postfix"); + obj.add("operator", std::string(OPERATOR_MAP_REV.count(Operator) ? OPERATOR_MAP_REV.at(Operator) : "?")); + if (operand) obj.addRaw("operand", operand->toJson(depth + 1)); + obj.addRaw("location", loc.toJson()); + return obj.str(); +} + +// CallExpressionNode +CallExpressionNode::CallExpressionNode() { kind = ASTKind::Call; } +void CallExpressionNode::log(int indent) { + std::cout << jsonIndent(indent) << "Call\n"; + if (callee) callee->log(indent + 1); + for (auto* arg : arguments) arg->log(indent + 1); +} +std::string CallExpressionNode::toJson(int depth) { + JsonObject obj(depth); + obj.add("kind", "Call"); + if (callee) obj.addRaw("callee", callee->toJson(depth + 1)); + obj.addArray("arguments", [&]() { + for (auto* arg : arguments) obj.addItem(arg->toJson(depth + 2)); + }); + obj.addRaw("location", loc.toJson()); + return obj.str(); +} + +// MemberAccessNode +MemberAccessNode::MemberAccessNode() { kind = ASTKind::MemberAccess; } +void MemberAccessNode::log(int indent) { + std::cout << jsonIndent(indent) << "MemberAccess (" << (arrow ? "->" : ".") << member << ")\n"; + if (object) object->log(indent + 1); +} +std::string MemberAccessNode::toJson(int depth) { + JsonObject obj(depth); + obj.add("kind", "MemberAccess"); + obj.add("member", member); + obj.add("arrow", arrow); + if (object) obj.addRaw("object", object->toJson(depth + 1)); + obj.addRaw("location", loc.toJson()); + return obj.str(); +} + +// IndexExpressionNode +IndexExpressionNode::IndexExpressionNode() { kind = ASTKind::IndexExpression; } +void IndexExpressionNode::log(int indent) { + std::cout << jsonIndent(indent) << "IndexExpression\n"; + if (object) object->log(indent + 1); + if (index) index->log(indent + 1); +} +std::string IndexExpressionNode::toJson(int depth) { + JsonObject obj(depth); + obj.add("kind", "IndexExpression"); + if (object) obj.addRaw("object", object->toJson(depth + 1)); + if (index) obj.addRaw("index", index->toJson(depth + 1)); + obj.addRaw("location", loc.toJson()); + return obj.str(); +} diff --git a/src/parser/nodes/expressions.hpp b/src/parser/nodes/expressions.hpp new file mode 100644 index 0000000..0efae4f --- /dev/null +++ b/src/parser/nodes/expressions.hpp @@ -0,0 +1,43 @@ +#ifndef SAQUT_AST_EXPR_EXT +#define SAQUT_AST_EXPR_EXT + +#include "parser/ast_node.hpp" + +class PostfixNode : public ASTNode { +public: + ASTNode* operand = nullptr; + TokenType Operator; + PostfixNode(); + void log(int indent = 0) override; + std::string toJson(int depth = 0) override; +}; + +class CallExpressionNode : public ASTNode { +public: + ASTNode* callee = nullptr; + std::vector arguments; + CallExpressionNode(); + void log(int indent = 0) override; + std::string toJson(int depth = 0) override; +}; + +class MemberAccessNode : public ASTNode { +public: + ASTNode* object = nullptr; + std::string member; + bool arrow = false; + MemberAccessNode(); + void log(int indent = 0) override; + std::string toJson(int depth = 0) override; +}; + +class IndexExpressionNode : public ASTNode { +public: + ASTNode* object = nullptr; + ASTNode* index = nullptr; + IndexExpressionNode(); + void log(int indent = 0) override; + std::string toJson(int depth = 0) override; +}; + +#endif diff --git a/src/parser/nodes/identifier.cpp b/src/parser/nodes/identifier.cpp new file mode 100644 index 0000000..57e9a8f --- /dev/null +++ b/src/parser/nodes/identifier.cpp @@ -0,0 +1,23 @@ +#include "parser/nodes/identifier.hpp" +#include +#include +#include "parser/ast_json.hpp" + +IdentifierNode::IdentifierNode() { kind = ASTKind::Identifier; } + +void IdentifierNode::log(int indent) { + std::cout << padRight("", indent) + << "Identifier {" << (parserToken.token ? parserToken.token->token : "?") << "}\n"; +} + +std::string IdentifierNode::toJson(int depth) { + std::string in = jsonIndent(depth); + std::string name = parserToken.token ? parserToken.token->token : "?"; + std::ostringstream ss; + ss << in << "{\n" + << in << " \"kind\": \"Identifier\",\n" + << in << " \"name\": \"" << jsonEscape(name) << "\",\n" + << in << " \"location\": " << loc.toJson() << "\n" + << in << "}"; + return ss.str(); +} diff --git a/src/parser/nodes/identifier.hpp b/src/parser/nodes/identifier.hpp new file mode 100644 index 0000000..f993096 --- /dev/null +++ b/src/parser/nodes/identifier.hpp @@ -0,0 +1,16 @@ +#ifndef SAQUT_AST_IDENTIFIER +#define SAQUT_AST_IDENTIFIER + +#include "parser/ast_node.hpp" + +class IdentifierNode : public ASTNode { +public: + Token* lexerToken = nullptr; + ParserToken parserToken; + + IdentifierNode(); + void log(int indent = 0) override; + std::string toJson(int depth = 0) override; +}; + +#endif diff --git a/src/parser/nodes/literal.cpp b/src/parser/nodes/literal.cpp new file mode 100644 index 0000000..a04b2f4 --- /dev/null +++ b/src/parser/nodes/literal.cpp @@ -0,0 +1,34 @@ +#include "parser/nodes/literal.hpp" +#include +#include +#include "parser/ast_json.hpp" + +LiteralNode::LiteralNode() { kind = ASTKind::Literal; } + +void LiteralNode::log(int indent) { + std::cout << padRight("", indent) + << "Literal {" << (parserToken.token ? parserToken.token->token : "?") << "} " + << literalTypeToString(literalType); + if (literalType == LiteralType::INTEGER && literalBase != 10) + std::cout << " (base " << literalBase << ")"; + std::cout << "\n"; +} + +std::string LiteralNode::toJson(int depth) { + std::string in = jsonIndent(depth); + std::string val = parserToken.token ? parserToken.token->token : "?"; + std::ostringstream ss; + ss << in << "{\n" + << in << " \"kind\": \"Literal\",\n" + << in << " \"literalType\": \"" << literalTypeToString(literalType) << "\",\n" + << in << " \"value\": \"" << jsonEscape(val) << "\""; + if (literalType == LiteralType::INTEGER && literalBase != 10) { + ss << ",\n" << in << " \"base\": " << literalBase; + } + if (literalType == LiteralType::FLOAT) { + ss << ",\n" << in << " \"isFloat\": true"; + } + ss << ",\n" << in << " \"location\": " << loc.toJson() << "\n" + << in << "}"; + return ss.str(); +} diff --git a/src/parser/nodes/literal.hpp b/src/parser/nodes/literal.hpp new file mode 100644 index 0000000..850dc5a --- /dev/null +++ b/src/parser/nodes/literal.hpp @@ -0,0 +1,20 @@ +#ifndef SAQUT_AST_LITERAL +#define SAQUT_AST_LITERAL + +#include "parser/ast_node.hpp" + +class LiteralNode : public ASTNode { +public: + Token* lexerToken = nullptr; + ParserToken parserToken; + + LiteralType literalType = LiteralType::INTEGER; + int literalBase = 10; + bool isFloatValue = false; + + LiteralNode(); + void log(int indent = 0) override; + std::string toJson(int depth = 0) override; +}; + +#endif diff --git a/src/parser/nodes/program.cpp b/src/parser/nodes/program.cpp new file mode 100644 index 0000000..efcce75 --- /dev/null +++ b/src/parser/nodes/program.cpp @@ -0,0 +1,26 @@ +#include "parser/nodes/program.hpp" +#include "parser/ast_json.hpp" + +ProgramNode::ProgramNode() { + kind = ASTKind::Program; +} + +void ProgramNode::log(int indent) { + std::string in = jsonIndent(indent); + std::cout << in << "Program\n"; + for (auto* child : children) { + child->log(indent + 1); + } +} + +std::string ProgramNode::toJson(int depth) { + JsonObject obj(depth); + obj.add("kind", "Program"); + obj.addArray("children", [&]() { + for (auto* child : children) { + obj.addItem(child->toJson(depth + 2)); + } + }); + obj.addRaw("location", loc.toJson()); + return obj.str(); +} diff --git a/src/parser/nodes/program.hpp b/src/parser/nodes/program.hpp new file mode 100644 index 0000000..a6face3 --- /dev/null +++ b/src/parser/nodes/program.hpp @@ -0,0 +1,13 @@ +#ifndef SAQUT_AST_PROGRAM +#define SAQUT_AST_PROGRAM + +#include "parser/ast_node.hpp" + +class ProgramNode : public ASTNode { +public: + ProgramNode(); + void log(int indent = 0) override; + std::string toJson(int depth = 0) override; +}; + +#endif diff --git a/src/parser/nodes/statements.cpp b/src/parser/nodes/statements.cpp new file mode 100644 index 0000000..99e2038 --- /dev/null +++ b/src/parser/nodes/statements.cpp @@ -0,0 +1,140 @@ +#include "parser/nodes/statements.hpp" +#include "parser/ast_json.hpp" + +// BlockNode +BlockNode::BlockNode() { kind = ASTKind::Block; } +void BlockNode::log(int indent) { + std::cout << jsonIndent(indent) << "Block\n"; + for (auto* child : children) child->log(indent + 1); +} +std::string BlockNode::toJson(int depth) { + JsonObject obj(depth); + obj.add("kind", "Block"); + obj.addArray("children", [&]() { + for (auto* child : children) obj.addItem(child->toJson(depth + 2)); + }); + obj.addRaw("location", loc.toJson()); + return obj.str(); +} + +// IfStatementNode +IfStatementNode::IfStatementNode() { kind = ASTKind::IfStatement; } +void IfStatementNode::log(int indent) { + std::cout << jsonIndent(indent) << "IfStatement\n"; + if (condition) condition->log(indent + 1); + if (thenBranch) thenBranch->log(indent + 1); + if (elseBranch) elseBranch->log(indent + 1); +} +std::string IfStatementNode::toJson(int depth) { + JsonObject obj(depth); + obj.add("kind", "IfStatement"); + if (condition) obj.addRaw("condition", condition->toJson(depth + 1)); + if (thenBranch) obj.addRaw("then", thenBranch->toJson(depth + 1)); + if (elseBranch) obj.addRaw("else", elseBranch->toJson(depth + 1)); + obj.addRaw("location", loc.toJson()); + return obj.str(); +} + +// WhileStatementNode +WhileStatementNode::WhileStatementNode() { kind = ASTKind::WhileStatement; } +void WhileStatementNode::log(int indent) { + std::cout << jsonIndent(indent) << "WhileStatement\n"; + if (condition) condition->log(indent + 1); + if (body) body->log(indent + 1); +} +std::string WhileStatementNode::toJson(int depth) { + JsonObject obj(depth); + obj.add("kind", "WhileStatement"); + if (condition) obj.addRaw("condition", condition->toJson(depth + 1)); + if (body) obj.addRaw("body", body->toJson(depth + 1)); + obj.addRaw("location", loc.toJson()); + return obj.str(); +} + +// ForStatementNode +ForStatementNode::ForStatementNode() { kind = ASTKind::ForStatement; } +void ForStatementNode::log(int indent) { + std::cout << jsonIndent(indent) << "ForStatement\n"; + if (init) init->log(indent + 1); + if (condition) condition->log(indent + 1); + if (update) update->log(indent + 1); + if (body) body->log(indent + 1); +} +std::string ForStatementNode::toJson(int depth) { + JsonObject obj(depth); + obj.add("kind", "ForStatement"); + if (init) obj.addRaw("init", init->toJson(depth + 1)); + if (condition) obj.addRaw("condition", condition->toJson(depth + 1)); + if (update) obj.addRaw("update", update->toJson(depth + 1)); + if (body) obj.addRaw("body", body->toJson(depth + 1)); + obj.addRaw("location", loc.toJson()); + return obj.str(); +} + +// DoWhileStatementNode +DoWhileStatementNode::DoWhileStatementNode() { kind = ASTKind::DoWhileStatement; } +void DoWhileStatementNode::log(int indent) { + std::cout << jsonIndent(indent) << "DoWhileStatement\n"; + if (body) body->log(indent + 1); + if (condition) condition->log(indent + 1); +} +std::string DoWhileStatementNode::toJson(int depth) { + JsonObject obj(depth); + obj.add("kind", "DoWhileStatement"); + if (condition) obj.addRaw("condition", condition->toJson(depth + 1)); + if (body) obj.addRaw("body", body->toJson(depth + 1)); + obj.addRaw("location", loc.toJson()); + return obj.str(); +} + +// ReturnStatementNode +ReturnStatementNode::ReturnStatementNode() { kind = ASTKind::ReturnStatement; } +void ReturnStatementNode::log(int indent) { + std::cout << jsonIndent(indent) << "ReturnStatement\n"; + if (value) value->log(indent + 1); +} +std::string ReturnStatementNode::toJson(int depth) { + JsonObject obj(depth); + obj.add("kind", "ReturnStatement"); + if (value) obj.addRaw("value", value->toJson(depth + 1)); + obj.addRaw("location", loc.toJson()); + return obj.str(); +} + +// BreakStatementNode +BreakStatementNode::BreakStatementNode() { kind = ASTKind::BreakStatement; } +void BreakStatementNode::log(int indent) { + std::cout << jsonIndent(indent) << "BreakStatement\n"; +} +std::string BreakStatementNode::toJson(int depth) { + JsonObject obj(depth); + obj.add("kind", "BreakStatement"); + obj.addRaw("location", loc.toJson()); + return obj.str(); +} + +// ContinueStatementNode +ContinueStatementNode::ContinueStatementNode() { kind = ASTKind::ContinueStatement; } +void ContinueStatementNode::log(int indent) { + std::cout << jsonIndent(indent) << "ContinueStatement\n"; +} +std::string ContinueStatementNode::toJson(int depth) { + JsonObject obj(depth); + obj.add("kind", "ContinueStatement"); + obj.addRaw("location", loc.toJson()); + return obj.str(); +} + +// ExpressionStatementNode +ExpressionStatementNode::ExpressionStatementNode() { kind = ASTKind::ExpressionStatement; } +void ExpressionStatementNode::log(int indent) { + std::cout << jsonIndent(indent) << "ExpressionStatement\n"; + if (expression) expression->log(indent + 1); +} +std::string ExpressionStatementNode::toJson(int depth) { + JsonObject obj(depth); + obj.add("kind", "ExpressionStatement"); + if (expression) obj.addRaw("expression", expression->toJson(depth + 1)); + obj.addRaw("location", loc.toJson()); + return obj.str(); +} diff --git a/src/parser/nodes/statements.hpp b/src/parser/nodes/statements.hpp new file mode 100644 index 0000000..9ec9662 --- /dev/null +++ b/src/parser/nodes/statements.hpp @@ -0,0 +1,82 @@ +#ifndef SAQUT_AST_STMT +#define SAQUT_AST_STMT + +#include "parser/ast_node.hpp" + +class BlockNode : public ASTNode { +public: + BlockNode(); + void log(int indent = 0) override; + std::string toJson(int depth = 0) override; +}; + +class IfStatementNode : public ASTNode { +public: + ASTNode* condition = nullptr; + ASTNode* thenBranch = nullptr; + ASTNode* elseBranch = nullptr; + IfStatementNode(); + void log(int indent = 0) override; + std::string toJson(int depth = 0) override; +}; + +class WhileStatementNode : public ASTNode { +public: + ASTNode* condition = nullptr; + ASTNode* body = nullptr; + WhileStatementNode(); + void log(int indent = 0) override; + std::string toJson(int depth = 0) override; +}; + +class ForStatementNode : public ASTNode { +public: + ASTNode* init = nullptr; + ASTNode* condition = nullptr; + ASTNode* update = nullptr; + ASTNode* body = nullptr; + ForStatementNode(); + void log(int indent = 0) override; + std::string toJson(int depth = 0) override; +}; + +class DoWhileStatementNode : public ASTNode { +public: + ASTNode* condition = nullptr; + ASTNode* body = nullptr; + DoWhileStatementNode(); + void log(int indent = 0) override; + std::string toJson(int depth = 0) override; +}; + +class ReturnStatementNode : public ASTNode { +public: + ASTNode* value = nullptr; + ReturnStatementNode(); + void log(int indent = 0) override; + std::string toJson(int depth = 0) override; +}; + +class BreakStatementNode : public ASTNode { +public: + BreakStatementNode(); + void log(int indent = 0) override; + std::string toJson(int depth = 0) override; +}; + +class ContinueStatementNode : public ASTNode { +public: + ContinueStatementNode(); + void log(int indent = 0) override; + std::string toJson(int depth = 0) override; +}; + +class ExpressionStatementNode : public ASTNode { +public: + ASTNode* expression = nullptr; + ExpressionStatementNode(); + void log(int indent = 0) override; + std::string toJson(int depth = 0) override; +}; + +#endif diff --git a/src/parser/parser.cpp b/src/parser/parser.cpp new file mode 100644 index 0000000..7f0e7e7 --- /dev/null +++ b/src/parser/parser.cpp @@ -0,0 +1,599 @@ +#include "parser/parser.hpp" +#include "parser/nodes/program.hpp" +#include "parser/nodes/binary_expr.hpp" +#include "parser/nodes/literal.hpp" +#include "parser/nodes/identifier.hpp" +#include "parser/nodes/expressions.hpp" +#include "parser/nodes/statements.hpp" +#include "parser/nodes/declarations.hpp" + +// -------------------------------------------------------------------------- +// parseToken: Ham Token'ı ParserToken'a dönüştür. +// -------------------------------------------------------------------------- +ParserToken Parser::parseToken(Token* token) { + ParserToken pt; + pt.token = token; + + std::string t = token->gettype(); + if (t == "string") + pt.type = TokenType::STRING; + else if (t == "number") + pt.type = TokenType::NUMBER; + else if (t == "operator") + pt.type = OPERATOR_MAP.find(pt.token->token)->second; + else if (t == "delimiter") + pt.type = OPERATOR_MAP.find(pt.token->token)->second; + else if (t == "keyword") + pt.type = KEYWORD_MAP.find(pt.token->token)->second; + else if (t == "identifier") + pt.type = TokenType::IDENTIFIER; + + return pt; +} + +ParserToken Parser::getToken(int offset) { + if ((int)tokens.size() - 1 < current + offset) { + ParserToken pt; + pt.type = TokenType::SVR_VOID; + return pt; + } + return parseToken(tokens[current + offset]); +} + +void Parser::nextToken() { + if ((int)tokens.size() >= current + 1) + current++; +} + +ParserToken Parser::lookahead(uint32_t forward) { + return getToken(forward); +} + +ParserToken Parser::currentToken() { + return getToken(0); +} + +ASTNode* Parser::parse(TokenList toks) { + tokens = toks; + current = 0; + return parseProgram(); +} + +ASTNode* Parser::parseProgram() { + ProgramNode* program = new ProgramNode(); + + while (currentToken().type != TokenType::SVR_VOID) { + ASTNode* decl = parseDeclaration(); + if (decl) + program->addChild(decl); + else + break; + } + + return program; +} + +ASTNode* Parser::parseDeclaration() { + auto ct = currentToken(); + + if (ct.is({ + TokenType::KW_VOID, TokenType::KW_INT, TokenType::KW_FLOAT_TYPE, + TokenType::KW_DOUBLE, TokenType::KW_BOOL, TokenType::KW_CHAR, + TokenType::KW_STRING_TYPE, TokenType::KW_AUTO + })) { + auto la1 = lookahead(1); + auto la2 = lookahead(2); + if (la1.type == TokenType::IDENTIFIER && la2.type == TokenType::LPAREN) + return parseFunctionDecl(); + return parseVariableDecl(); + } + + if (ct.type == TokenType::KW_STRUCT) + return parseStructDecl(); + + return parseStatement(); +} + +ASTNode* Parser::parseExpression() { + return parseExpression(0); +} + +ASTNode* Parser::parseExpression(uint16_t precedence) { + if (currentToken().type == TokenType::SVR_VOID) + return nullptr; + + ASTNode* left = parseNullDenotation(); + if (!left) return nullptr; + + while (true) { + auto next = currentToken(); + if (next.type == TokenType::RPAREN || + next.type == TokenType::SEMICOLON || + next.type == TokenType::RBRACE || + next.type == TokenType::COMMA) + break; + + if (precedence < next.getPowerOperator()) { + left = parseLeftDenotation(left); + } else { + break; + } + } + return left; +} + +ASTNode* Parser::parseNullDenotation() { + auto ct = currentToken(); + + if (ct.type == TokenType::SVR_VOID) { + std::cerr << "Parser hatası: beklenmeyen dosya sonu\n"; + return nullptr; + } + + if (ct.type == TokenType::LPAREN) { + nextToken(); + ASTNode* expr = parseExpression(0); + if (currentToken().type == TokenType::RPAREN) + nextToken(); + return expr; + } + + if (ct.is({ + TokenType::PLUS_PLUS, TokenType::MINUS_MINUS, + TokenType::PLUS, TokenType::MINUS, + TokenType::BANG, TokenType::TILDE + })) { + nextToken(); + ASTNode* right = parseExpression(ct.getPowerOperator()); + BinaryExpressionNode* bin = new BinaryExpressionNode(); + bin->loc = ct.token ? ct.token->loc : SourceLocation{}; + bin->Right = right; + bin->Left = nullptr; + bin->Operator = ct.type; + if (right) right->parent = bin; + return bin; + } + + if (ct.type == TokenType::NUMBER) { + nextToken(); + LiteralNode* lit = new LiteralNode(); + lit->loc = ct.token ? ct.token->loc : SourceLocation{}; + lit->lexerToken = ct.token; + lit->parserToken = ct; + if (auto* nt = dynamic_cast(ct.token)) { + lit->literalBase = nt->base; + lit->isFloatValue = nt->isFloat; + lit->literalType = nt->isFloat ? LiteralType::FLOAT : LiteralType::INTEGER; + } + return lit; + } + + if (ct.type == TokenType::STRING) { + nextToken(); + LiteralNode* lit = new LiteralNode(); + lit->literalType = LiteralType::STRING; + lit->loc = ct.token ? ct.token->loc : SourceLocation{}; + lit->lexerToken = ct.token; + lit->parserToken = ct; + return lit; + } + + if (ct.is({TokenType::KW_TRUE, TokenType::KW_FALSE, TokenType::KW_NULL})) { + nextToken(); + LiteralNode* lit = new LiteralNode(); + if (ct.is({TokenType::KW_TRUE, TokenType::KW_FALSE})) + lit->literalType = LiteralType::BOOLEAN; + else + lit->literalType = LiteralType::BOŞ; + lit->loc = ct.token ? ct.token->loc : SourceLocation{}; + lit->lexerToken = ct.token; + lit->parserToken = ct; + return lit; + } + + if (ct.type == TokenType::IDENTIFIER) { + nextToken(); + IdentifierNode* id = new IdentifierNode(); + id->loc = ct.token ? ct.token->loc : SourceLocation{}; + id->lexerToken = ct.token; + id->parserToken = ct; + return id; + } + + return nullptr; +} + +ASTNode* Parser::parseLeftDenotation(ASTNode* left) { + auto ct = currentToken(); + + if (ct.is({TokenType::PLUS_PLUS, TokenType::MINUS_MINUS})) { + nextToken(); + PostfixNode* pf = new PostfixNode(); + pf->loc = ct.token ? ct.token->loc : SourceLocation{}; + pf->operand = left; + pf->Operator = ct.type; + left->parent = pf; + return pf; + } + + if (ct.type == TokenType::LPAREN) { + nextToken(); + CallExpressionNode* call = new CallExpressionNode(); + call->loc = ct.token ? ct.token->loc : SourceLocation{}; + call->callee = left; + left->parent = call; + + if (currentToken().type != TokenType::RPAREN) { + call->arguments.push_back(parseExpression(0)); + while (currentToken().type == TokenType::COMMA) { + nextToken(); + call->arguments.push_back(parseExpression(0)); + } + } + if (currentToken().type == TokenType::RPAREN) + nextToken(); + return call; + } + + if (ct.type == TokenType::LBRACKET) { + nextToken(); + IndexExpressionNode* idx = new IndexExpressionNode(); + idx->loc = ct.token ? ct.token->loc : SourceLocation{}; + idx->object = left; + left->parent = idx; + idx->index = parseExpression(0); + if (currentToken().type == TokenType::RBRACKET) + nextToken(); + return idx; + } + + if (ct.type == TokenType::DOT || ct.type == TokenType::ARROW) { + bool arrow = (ct.type == TokenType::ARROW); + nextToken(); + + if (currentToken().type != TokenType::IDENTIFIER) { + std::cerr << "Parser hatasi: uye ismi bekleniyor\n"; + return left; + } + + MemberAccessNode* ma = new MemberAccessNode(); + ma->loc = ct.token ? ct.token->loc : SourceLocation{}; + ma->object = left; + ma->member = currentToken().token->token; + ma->arrow = arrow; + left->parent = ma; + nextToken(); + return ma; + } + + uint16_t prec = ct.getPowerOperator(); + nextToken(); + + ASTNode* right = parseExpression(prec); + + BinaryExpressionNode* bin = new BinaryExpressionNode(); + bin->loc = ct.token ? ct.token->loc : SourceLocation{}; + bin->Left = left; + bin->Right = right; + bin->Operator = ct.type; + if (left) left->parent = bin; + if (right) right->parent = bin; + return bin; +} + +ASTNode* Parser::parseFunctionDecl() { + FunctionDeclNode* fn = new FunctionDeclNode(); + fn->loc = currentToken().token->loc; + fn->returnType = currentToken().token->token; + nextToken(); + + fn->name = currentToken().token->token; + nextToken(); + + if (currentToken().type == TokenType::LPAREN) { + nextToken(); + while (currentToken().type != TokenType::RPAREN && + currentToken().type != TokenType::SVR_VOID) + nextToken(); + if (currentToken().type == TokenType::RPAREN) + nextToken(); + } + + if (currentToken().type == TokenType::LBRACE) { + ASTNode* body = parseBlock(); + fn->addChild(body); + } + + return fn; +} + +ASTNode* Parser::parseStructDecl() { + StructDeclNode* st = new StructDeclNode(); + st->loc = currentToken().token->loc; + nextToken(); + if (currentToken().type == TokenType::IDENTIFIER) { + st->name = currentToken().token->token; + nextToken(); + } + if (currentToken().type == TokenType::LBRACE) { + nextToken(); + while (currentToken().type != TokenType::RBRACE && currentToken().type != TokenType::SVR_VOID) { + ASTNode* field = parseDeclaration(); + if (field) st->addChild(field); + else break; + } + if (currentToken().type == TokenType::RBRACE) nextToken(); + } + if (currentToken().type == TokenType::SEMICOLON) nextToken(); + return st; +} + +ASTNode* Parser::parseVariableDecl() { + VariableDeclNode* vd = new VariableDeclNode(); + vd->loc = currentToken().token->loc; + vd->varType = currentToken().token->token; + nextToken(); + + if (currentToken().type != TokenType::IDENTIFIER) { + std::cerr << "Parser hatası: değişken ismi bekleniyor\n"; + return vd; + } + + vd->name = currentToken().token->token; + nextToken(); + + if (currentToken().type == TokenType::LBRACKET) { + nextToken(); + while (currentToken().type != TokenType::RBRACKET && + currentToken().type != TokenType::SEMICOLON && + currentToken().type != TokenType::SVR_VOID) + nextToken(); + if (currentToken().type == TokenType::RBRACKET) + nextToken(); + } + + if (currentToken().type == TokenType::EQUAL) { + nextToken(); + vd->initExpr = parseExpression(); + } + + while (currentToken().type == TokenType::COMMA) { + nextToken(); + + if (currentToken().type != TokenType::IDENTIFIER) { + std::cerr << "Parser hatası: virgülden sonra değişken ismi bekleniyor\n"; + break; + } + + VariableDeclNode* sibling = new VariableDeclNode(); + sibling->loc = currentToken().token->loc; + sibling->varType = vd->varType; + sibling->name = currentToken().token->token; + nextToken(); + + if (currentToken().type == TokenType::LBRACKET) { + nextToken(); + while (currentToken().type != TokenType::RBRACKET && + currentToken().type != TokenType::SEMICOLON && + currentToken().type != TokenType::SVR_VOID) + nextToken(); + if (currentToken().type == TokenType::RBRACKET) + nextToken(); + } + + if (currentToken().type == TokenType::EQUAL) { + nextToken(); + sibling->initExpr = parseExpression(); + } + + vd->addChild(sibling); + } + + if (currentToken().type == TokenType::SEMICOLON) + nextToken(); + + return vd; +} + +ASTNode* Parser::parseStatement() { + auto ct = currentToken(); + + if (ct.type == TokenType::LBRACE) + return parseBlock(); + + if (ct.type == TokenType::KW_IF) + return parseIfStatement(); + + if (ct.type == TokenType::KW_WHILE) + return parseWhileStatement(); + + if (ct.type == TokenType::KW_FOR) + return parseForStatement(); + + if (ct.type == TokenType::KW_DO) + return parseDoWhileStatement(); + + if (ct.type == TokenType::KW_RETURN) + return parseReturnStatement(); + + if (ct.type == TokenType::KW_BREAK) + return parseBreakStatement(); + + if (ct.type == TokenType::KW_CONTINUE) + return parseContinueStatement(); + + if (ct.is({ + TokenType::KW_VOID, TokenType::KW_INT, TokenType::KW_FLOAT_TYPE, + TokenType::KW_DOUBLE, TokenType::KW_BOOL, TokenType::KW_CHAR, + TokenType::KW_STRING_TYPE + })) { + return parseVariableDecl(); + } + + if (ct.type == TokenType::KW_STRUCT) + return parseStructDecl(); + + return parseExpressionStatement(); +} + +ASTNode* Parser::parseBlock() { + BlockNode* block = new BlockNode(); + block->loc = currentToken().token ? currentToken().token->loc : SourceLocation{}; + + if (currentToken().type == TokenType::LBRACE) + nextToken(); + + while (currentToken().type != TokenType::RBRACE && + currentToken().type != TokenType::SVR_VOID) { + ASTNode* stmt = parseStatement(); + if (stmt) + block->addChild(stmt); + else + break; + } + + if (currentToken().type == TokenType::RBRACE) + nextToken(); + + return block; +} + +ASTNode* Parser::parseIfStatement() { + IfStatementNode* ifNode = new IfStatementNode(); + ifNode->loc = currentToken().token->loc; + nextToken(); + + if (currentToken().type == TokenType::LPAREN) { + nextToken(); + ifNode->condition = parseExpression(); + if (currentToken().type == TokenType::RPAREN) + nextToken(); + } + + ifNode->thenBranch = parseStatement(); + + if (currentToken().type == TokenType::KW_ELSE) { + nextToken(); + ifNode->elseBranch = parseStatement(); + } + + return ifNode; +} + +ASTNode* Parser::parseWhileStatement() { + WhileStatementNode* ws = new WhileStatementNode(); + ws->loc = currentToken().token->loc; + nextToken(); + + if (currentToken().type == TokenType::LPAREN) { + nextToken(); + ws->condition = parseExpression(); + if (currentToken().type == TokenType::RPAREN) + nextToken(); + } + + ws->body = parseStatement(); + return ws; +} + +ASTNode* Parser::parseForStatement() { + ForStatementNode* fs = new ForStatementNode(); + fs->loc = currentToken().token->loc; + nextToken(); + + if (currentToken().type == TokenType::LPAREN) + nextToken(); + + if (currentToken().type != TokenType::SEMICOLON) + fs->init = parseStatement(); + if (currentToken().type == TokenType::SEMICOLON) + nextToken(); + + if (currentToken().type != TokenType::SEMICOLON) + fs->condition = parseExpression(); + if (currentToken().type == TokenType::SEMICOLON) + nextToken(); + + if (currentToken().type != TokenType::RPAREN) + fs->update = parseExpression(); + if (currentToken().type == TokenType::RPAREN) + nextToken(); + + fs->body = parseStatement(); + + return fs; +} + +ASTNode* Parser::parseDoWhileStatement() { + DoWhileStatementNode* dw = new DoWhileStatementNode(); + dw->loc = currentToken().token->loc; + nextToken(); + + dw->body = parseStatement(); + + if (currentToken().type == TokenType::KW_WHILE) { + nextToken(); + if (currentToken().type == TokenType::LPAREN) { + nextToken(); + dw->condition = parseExpression(); + if (currentToken().type == TokenType::RPAREN) + nextToken(); + } + if (currentToken().type == TokenType::SEMICOLON) + nextToken(); + } + + return dw; +} + +ASTNode* Parser::parseReturnStatement() { + ReturnStatementNode* rs = new ReturnStatementNode(); + rs->loc = currentToken().token->loc; + nextToken(); + + if (currentToken().type != TokenType::SEMICOLON && + currentToken().type != TokenType::RBRACE) { + rs->value = parseExpression(); + } + + if (currentToken().type == TokenType::SEMICOLON) + nextToken(); + + return rs; +} + +ASTNode* Parser::parseBreakStatement() { + BreakStatementNode* bs = new BreakStatementNode(); + bs->loc = currentToken().token->loc; + nextToken(); + if (currentToken().type == TokenType::SEMICOLON) + nextToken(); + return bs; +} + +ASTNode* Parser::parseContinueStatement() { + ContinueStatementNode* cs = new ContinueStatementNode(); + cs->loc = currentToken().token->loc; + nextToken(); + if (currentToken().type == TokenType::SEMICOLON) + nextToken(); + return cs; +} + +ASTNode* Parser::parseExpressionStatement() { + ExpressionStatementNode* es = new ExpressionStatementNode(); + es->loc = currentToken().token ? currentToken().token->loc : SourceLocation{}; + es->expression = parseExpression(); + if (!es->expression) { + while (currentToken().type != TokenType::SEMICOLON && + currentToken().type != TokenType::RBRACE && + currentToken().type != TokenType::SVR_VOID) + nextToken(); + if (currentToken().type == TokenType::SEMICOLON) + nextToken(); + } + if (currentToken().type == TokenType::SEMICOLON) + nextToken(); + + return es; +} diff --git a/src/parser/parser.hpp b/src/parser/parser.hpp index 4dddae4..f0cbb9a 100644 --- a/src/parser/parser.hpp +++ b/src/parser/parser.hpp @@ -1,32 +1,6 @@ -// ============================================================================ -// saQut Compiler — Parser (Aggregator) -// ============================================================================ -// -// DİZİN: src/parser/parser.hpp -// KATMAN: Katman 3 — Tokenizer'ı tüketir, AST üretir -// -// Bu dosya bir AGGREGATOR'dür. Parser'ın tüm bileşenlerini tek bir include -// ile kullanılabilir yapar. -// -// MİMARİ: -// parser_base.hpp — Parser sınıf tanımı -// parser_core.hpp — parse, parseProgram, parseDeclaration, parseExpression -// parser_decl.hpp — parseFunctionDecl, parseStructDecl, parseVariableDecl -// parser_stmt.hpp — parseStatement, parseBlock, parseIf/While/For/... -// -// İKİ AYRI PARSER STRATEJİSİ: -// 1. Pratt Parser (ifadeler için): Operatör önceliğini merkezi tabloda yönetir -// 2. Recursive Descent (statement/deklarasyon): Her yapı kendi parse fonksiyonuna sahip -// -// ============================================================================ - #ifndef SAQUT_PARSER #define SAQUT_PARSER -// Sıralama önemli: önce sınıf tanımı, sonra metot gövdeleri #include "parser/parser_base.hpp" -#include "parser/parser_core.hpp" -#include "parser/parser_decl.hpp" -#include "parser/parser_stmt.hpp" #endif // SAQUT_PARSER diff --git a/src/parser/parser_core.hpp b/src/parser/parser_core.hpp deleted file mode 100644 index f6e73ec..0000000 --- a/src/parser/parser_core.hpp +++ /dev/null @@ -1,409 +0,0 @@ -// ============================================================================ -// saQut Compiler — Parser Çekirdek (Program + İfadeler) -// ============================================================================ -// -// DİZİN: src/parser/parser_core.hpp -// İÇERİK: Token navigasyonu, parse(), parseProgram(), -// parseDeclaration(), parseExpression() [Pratt] -// -// ============================================================================ - -#ifndef SAQUT_PARSER_CORE -#define SAQUT_PARSER_CORE - -#include -#include "parser/parser_base.hpp" -// -------------------------------------------------------------------------- -// parseToken: Ham Token'ı ParserToken'a dönüştür. -// -// Tokenizer'ın string tabanlı tip sistemini ("number", "operator", ...) -// Parser'ın anlamsal tip sistemine (NUMBER, PLUS, KW_IF, ...) çevirir. -// -// BUG FIX (commit 40579ca): pt.token = token (pointer ataması). -// Eskiden pt.token = *token (değer kopyası) object slicing yapıyordu. -// -------------------------------------------------------------------------- -inline ParserToken Parser::parseToken(Token* token) { - ParserToken pt; - pt.token = token; // Pointer — değer kopyası DEĞİL - - std::string t = token->gettype(); - if (t == "string") - pt.type = TokenType::STRING; - else if (t == "number") - pt.type = TokenType::NUMBER; - else if (t == "operator") - pt.type = OPERATOR_MAP.find(pt.token->token)->second; - else if (t == "delimiter") - pt.type = OPERATOR_MAP.find(pt.token->token)->second; - else if (t == "keyword") - pt.type = KEYWORD_MAP.find(pt.token->token)->second; - else if (t == "identifier") - pt.type = TokenType::IDENTIFIER; - - return pt; -} - -// -------------------------------------------------------------------------- -// getToken: Güvenli token erişimi. Sınır dışı = SVR_VOID. -// -------------------------------------------------------------------------- -inline ParserToken Parser::getToken(int offset) { - if ((int)tokens.size() - 1 < current + offset) { - ParserToken pt; - pt.type = TokenType::SVR_VOID; - return pt; - } - return parseToken(tokens[current + offset]); -} - -inline void Parser::nextToken() { - if ((int)tokens.size() >= current + 1) - current++; -} - -inline ParserToken Parser::lookahead(uint32_t forward) { - return getToken(forward); -} - -inline ParserToken Parser::currentToken() { - return getToken(0); -} - -// ============================================================================ -// Üst Seviye -// ============================================================================ - -// -------------------------------------------------------------------------- -// parse: Parser'ın ana giriş noktası. Token listesini alır, AST döndürür. -// -------------------------------------------------------------------------- -inline ASTNode* Parser::parse(TokenList toks) { - tokens = toks; - current = 0; - return parseProgram(); -} - -// -------------------------------------------------------------------------- -// parseProgram: Tüm üst seviye deklarasyonları/statement'ları ayrıştırır. -// -// Program ::= Declaration* -// EOF'a (SVR_VOID) kadar parseDeclaration() çağrılır. -// -// BUG FIX (commit 438bc0e): Eskiden parseExpression() doğrudan çağrılıyordu, -// bu sadece tek bir ifadeyi ayrıştırabiliyordu. Şimdi tam program desteği var. -// -------------------------------------------------------------------------- -inline ASTNode* Parser::parseProgram() { - ProgramNode* program = new ProgramNode(); - - while (currentToken().type != TokenType::SVR_VOID) { - ASTNode* decl = parseDeclaration(); - if (decl) - program->addChild(decl); - else - break; // Hata durumunda döngüden çık - } - - return program; -} - -// ============================================================================ -// Deklarasyonlar -// ============================================================================ - -// -------------------------------------------------------------------------- -// parseDeclaration: Üst seviye deklarasyon ayrıştırıcı. -// -// Strateji: -// 1. Mevcut token bir tip keyword'ü mü (int, void, float, ...)? -// - Evet → lookahead(2) '(' ise → fonksiyon tanımı -// - Evet → değilse → değişken tanımı -// 2. Değilse → statement (REPL modunda ifade de olabilir) -// -// LOOKAHEAD KULLANIMI: -// "int main()" ve "int x = 10" ayrımı için 2 ileriye bakarız: -// - int main() → lookahead(1)=identifier, lookahead(2)='(' -// - int x = 10 → lookahead(1)=identifier, lookahead(2)='=' -// -------------------------------------------------------------------------- -inline ASTNode* Parser::parseDeclaration() { - auto ct = currentToken(); - - // Tip keyword'ü ile başlayan → fonksiyon veya değişken - if (ct.is({ - TokenType::KW_VOID, TokenType::KW_INT, TokenType::KW_FLOAT_TYPE, - TokenType::KW_DOUBLE, TokenType::KW_BOOL, TokenType::KW_CHAR, - TokenType::KW_STRING_TYPE, TokenType::KW_AUTO - })) { - auto la1 = lookahead(1); - auto la2 = lookahead(2); - // int main( ... ) → fonksiyon - if (la1.type == TokenType::IDENTIFIER && la2.type == TokenType::LPAREN) - return parseFunctionDecl(); - // int x ... → değişken - return parseVariableDecl(); - } - - // struct - if (ct.type == TokenType::KW_STRUCT) - return parseStructDecl(); - - // Tip keyword'ü değil → statement - return parseStatement(); -} - -// -------------------------------------------------------------------------- -// parseFunctionDecl: Fonksiyon tanımı. - -inline ASTNode* Parser::parseExpression() { - return parseExpression(0); -} - -// -------------------------------------------------------------------------- -// parseExpression(precedence): Pratt'ın ana döngüsü. -// -// Algoritma: -// 1. NUD ile ilk operand'ı ayrıştır (prefix) -// 2. Mevcut token bir operatör mü? -// - Evet ve önceliği > precedence ise → LED ile infix ayrıştır -// - Hayır veya öncelik <= precedence ise → dur, sol operand'ı döndür -// 3. LED'in döndürdüğü düğüm yeni sol operand olur, 2. adıma dön -// -// DURMA KOŞULLARI: -// - RPAREN, SEMICOLON, RBRACE, COMMA: İfade sonu sinyali -// - Operatörün önceliği <= mevcut öncelik: Daha sıkı bağlanamaz -// -------------------------------------------------------------------------- -inline ASTNode* Parser::parseExpression(uint16_t precedence) { - if (currentToken().type == TokenType::SVR_VOID) - return nullptr; - - // 1. Prefix (NUD) - ASTNode* left = parseNullDenotation(); - if (!left) return nullptr; - - // 2. Infix/Postfix döngüsü (LED) - while (true) { - auto next = currentToken(); - - // İfade sonu sinyalleri → dur - if (next.type == TokenType::RPAREN || - next.type == TokenType::SEMICOLON || - next.type == TokenType::RBRACE || - next.type == TokenType::COMMA) - break; - - // Operatörün bağlanma gücü yetersiz → dur - // (daha yüksek öncelikli bir bağlamdayız, bu operatör oraya ait değil) - if (precedence < next.getPowerOperator()) { - left = parseLeftDenotation(left); - } else { - break; - } - } - return left; -} - -// -------------------------------------------------------------------------- -// parseNullDenotation (NUD): Prefix ifadeleri. -// -// İşlenen prefix tipleri: -// - Parantez: ( expression ) -// - Unary: +expr, -expr, !expr, ~expr, ++expr, --expr -// - Literal: 42, "hello", true, false, null -// - Identifier: x, myVar -// -// DÖNÜŞ: Ayrıştırılmış AST düğümü. Token TÜKETİLMİŞ olur (current ilerlemiş). -// -------------------------------------------------------------------------- -inline ASTNode* Parser::parseNullDenotation() { - auto ct = currentToken(); - - if (ct.type == TokenType::SVR_VOID) { - std::cerr << "Parser hatası: beklenmeyen dosya sonu\n"; - return nullptr; - } - - // --- Parantezli ifade: ( expr ) --- - // Önceliği sıfırlar — parantez içinde yeni bir ifade başlar. - if (ct.type == TokenType::LPAREN) { - nextToken(); // '(' tüket - ASTNode* expr = parseExpression(0); // Öncelik sıfırla - if (currentToken().type == TokenType::RPAREN) - nextToken(); // ')' tüket - return expr; - } - - // --- Unary prefix operatörler: +, -, !, ~, ++, -- --- - // PLUS ve MINUS burada UNARY olarak işlenir. - // Binary olarak işlenmesi LED tarafından yapılır. - // - // ÖNEMLİ: PLUS ve MINUS için getPowerOperator() 13 döndürür (binary öncelik). - // Ama burada unary olarak kullanılıyor. parseExpression(16) çağırmak daha - // doğru olurdu ancak mevcut çalışma şekli de doğru sonuç veriyor. - // TODO: Unary için ayrı öncelik seviyesi (örn: 16) - if (ct.is({ - TokenType::PLUS_PLUS, TokenType::MINUS_MINUS, - TokenType::PLUS, TokenType::MINUS, - TokenType::BANG, TokenType::TILDE - })) { - nextToken(); // Operatörü tüket - // Sağ operand'ı ayrıştır. Unary prefix sağdan sola bağlanır. - ASTNode* right = parseExpression(ct.getPowerOperator()); - BinaryExpressionNode* bin = new BinaryExpressionNode(); - bin->loc = ct.token ? ct.token->loc : SourceLocation{}; - bin->Right = right; - bin->Left = nullptr; // Unary işaretçisi - bin->Operator = ct.type; - if (right) right->parent = bin; - return bin; - } - - // --- Sayısal literal: 42, 0xFF, 3.14 --- - if (ct.type == TokenType::NUMBER) { - nextToken(); // Token'ı tüket - LiteralNode* lit = new LiteralNode(); - lit->loc = ct.token ? ct.token->loc : SourceLocation{}; - lit->lexerToken = ct.token; - lit->parserToken = ct; - // NumberToken'a cast edip base/isFloat bilgisini al - if (auto* nt = dynamic_cast(ct.token)) { - lit->literalBase = nt->base; - lit->isFloatValue = nt->isFloat; - lit->literalType = nt->isFloat ? LiteralType::FLOAT : LiteralType::INTEGER; - } - return lit; - } - - // --- String literal: "hello" --- - if (ct.type == TokenType::STRING) { - nextToken(); - LiteralNode* lit = new LiteralNode(); - lit->literalType = LiteralType::STRING; - lit->loc = ct.token ? ct.token->loc : SourceLocation{}; - lit->lexerToken = ct.token; - lit->parserToken = ct; - return lit; - } - - // --- Boolean/null literal: true, false, null --- - if (ct.is({TokenType::KW_TRUE, TokenType::KW_FALSE, TokenType::KW_NULL})) { - nextToken(); - LiteralNode* lit = new LiteralNode(); - // Token içeriğine göre boolean/null ayrımı - if (ct.is({TokenType::KW_TRUE, TokenType::KW_FALSE})) - lit->literalType = LiteralType::BOOLEAN; - else - lit->literalType = LiteralType::BOŞ; - lit->loc = ct.token ? ct.token->loc : SourceLocation{}; - lit->lexerToken = ct.token; - lit->parserToken = ct; - return lit; - } - - // --- Identifier: x, myVar --- - if (ct.type == TokenType::IDENTIFIER) { - nextToken(); - IdentifierNode* id = new IdentifierNode(); - id->loc = ct.token ? ct.token->loc : SourceLocation{}; - id->lexerToken = ct.token; - id->parserToken = ct; - return id; - } - - return nullptr; -} - -// -------------------------------------------------------------------------- -// parseLeftDenotation (LED): Infix ve Postfix ifadeler. -// -// Sol operand zaten ayrıştırılmış olarak gelir (left). -// Mevcut token operatördür. -// -// İşlenen tipler: -// - Postfix: expr++, expr-- -// - Binary infix: expr + expr, expr * expr, expr == expr, ... -// -// TASARIM NOTU: Postfix ve Binary aynı fonksiyonda işlenir çünkü ikisi de -// "sol operand + operatör" pattern'ini takip eder. Postfix'te sağ operand -// yoktur. -// -------------------------------------------------------------------------- -inline ASTNode* Parser::parseLeftDenotation(ASTNode* left) { - auto ct = currentToken(); - - // --- Postfix: expr++, expr-- --- - if (ct.is({TokenType::PLUS_PLUS, TokenType::MINUS_MINUS})) { - nextToken(); - PostfixNode* pf = new PostfixNode(); - pf->loc = ct.token ? ct.token->loc : SourceLocation{}; - pf->operand = left; - pf->Operator = ct.type; - left->parent = pf; - return pf; - } - - // --- Fonksiyon cagrisi: expr(args) --- - if (ct.type == TokenType::LPAREN) { - nextToken(); - CallExpressionNode* call = new CallExpressionNode(); - call->loc = ct.token ? ct.token->loc : SourceLocation{}; - call->callee = left; - left->parent = call; - - if (currentToken().type != TokenType::RPAREN) { - call->arguments.push_back(parseExpression(0)); - while (currentToken().type == TokenType::COMMA) { - nextToken(); - call->arguments.push_back(parseExpression(0)); - } - } - if (currentToken().type == TokenType::RPAREN) - nextToken(); - return call; - } - - // --- Dizi erisimi: expr[index] --- - if (ct.type == TokenType::LBRACKET) { - nextToken(); - IndexExpressionNode* idx = new IndexExpressionNode(); - idx->loc = ct.token ? ct.token->loc : SourceLocation{}; - idx->object = left; - left->parent = idx; - idx->index = parseExpression(0); - if (currentToken().type == TokenType::RBRACKET) - nextToken(); - return idx; - } - - // --- Uye erisimi: expr.member / expr->member --- - if (ct.type == TokenType::DOT || ct.type == TokenType::ARROW) { - bool arrow = (ct.type == TokenType::ARROW); - nextToken(); - - if (currentToken().type != TokenType::IDENTIFIER) { - std::cerr << "Parser hatasi: uye ismi bekleniyor\n"; - return left; - } - - MemberAccessNode* ma = new MemberAccessNode(); - ma->loc = ct.token ? ct.token->loc : SourceLocation{}; - ma->object = left; - ma->member = currentToken().token->token; - ma->arrow = arrow; - left->parent = ma; - nextToken(); - return ma; - } - - // --- Binary infix: expr OP expr --- - uint16_t prec = ct.getPowerOperator(); - nextToken(); - - ASTNode* right = parseExpression(prec); - - BinaryExpressionNode* bin = new BinaryExpressionNode(); - bin->loc = ct.token ? ct.token->loc : SourceLocation{}; - bin->Left = left; - bin->Right = right; - bin->Operator = ct.type; - if (left) left->parent = bin; - if (right) right->parent = bin; - return bin; -} - - -#endif // SAQUT_PARSER_CORE diff --git a/src/parser/parser_decl.hpp b/src/parser/parser_decl.hpp deleted file mode 100644 index 071da47..0000000 --- a/src/parser/parser_decl.hpp +++ /dev/null @@ -1,159 +0,0 @@ -// ============================================================================ -// saQut Compiler — Parser Deklarasyonlar -// ============================================================================ -// -// DİZİN: src/parser/parser_decl.hpp -// İÇERİK: parseFunctionDecl(), parseStructDecl(), parseVariableDecl() -// -// ============================================================================ - -#ifndef SAQUT_PARSER_DECL -#define SAQUT_PARSER_DECL - -#include -#include "parser/parser_base.hpp" -inline ASTNode* Parser::parseFunctionDecl() { - FunctionDeclNode* fn = new FunctionDeclNode(); - fn->loc = currentToken().token->loc; - fn->returnType = currentToken().token->token; // "int", "void", ... - nextToken(); // Dönüş tipini tüket - - fn->name = currentToken().token->token; // "main", "calculate", ... - nextToken(); // İsmi tüket - - // Parametre listesi: ( ... ) - if (currentToken().type == TokenType::LPAREN) { - nextToken(); // '(' tüket - // TODO: Parametreleri ayrıştır - // Şimdilik ')' gelene kadar atla - while (currentToken().type != TokenType::RPAREN && - currentToken().type != TokenType::SVR_VOID) - nextToken(); - if (currentToken().type == TokenType::RPAREN) - nextToken(); // ')' tüket - } - - // Gövde: { ... } - if (currentToken().type == TokenType::LBRACE) { - ASTNode* body = parseBlock(); - fn->addChild(body); - } - - return fn; -} -// -------------------------------------------------------------------------- -// parseStructDecl: struct tanimi. -// -------------------------------------------------------------------------- -inline ASTNode* Parser::parseStructDecl() { - StructDeclNode* st = new StructDeclNode(); - st->loc = currentToken().token->loc; - nextToken(); - if (currentToken().type == TokenType::IDENTIFIER) { - st->name = currentToken().token->token; - nextToken(); - } - if (currentToken().type == TokenType::LBRACE) { - nextToken(); - while (currentToken().type != TokenType::RBRACE && currentToken().type != TokenType::SVR_VOID) { - ASTNode* field = parseDeclaration(); - if (field) st->addChild(field); - else break; - } - if (currentToken().type == TokenType::RBRACE) nextToken(); - } - if (currentToken().type == TokenType::SEMICOLON) nextToken(); - return st; -} - - -// -------------------------------------------------------------------------- -// parseVariableDecl: Değişken tanımı. -// -// Sözdizimi: Type Identifier [= Expression] {, Identifier [= Expression]} ; -// Örnek: int x = 10; -// float y; (initExpr = nullptr) -// int first = 0, second = 1, next; -// -// Çoklu değişken: -// İlk değişken ana düğüm olur. Virgülle ayrılmış ek değişkenler -// ana düğümün children vektörüne eklenir. JSON çıktısında "declarators" -// dizisi olarak görünür. -// -------------------------------------------------------------------------- -inline ASTNode* Parser::parseVariableDecl() { - // --- Tip ve ilk değişken adı --- - VariableDeclNode* vd = new VariableDeclNode(); - vd->loc = currentToken().token->loc; - vd->varType = currentToken().token->token; // "int", "float", ... - nextToken(); // Tipi tüket - - if (currentToken().type != TokenType::IDENTIFIER) { - std::cerr << "Parser hatası: değişken ismi bekleniyor\n"; - return vd; - } - - vd->name = currentToken().token->token; - nextToken(); // İsmi tüket - - // Opsiyonel array boyutu: [expr] - if (currentToken().type == TokenType::LBRACKET) { - nextToken(); // '[' - while (currentToken().type != TokenType::RBRACKET && - currentToken().type != TokenType::SEMICOLON && - currentToken().type != TokenType::SVR_VOID) - nextToken(); - if (currentToken().type == TokenType::RBRACKET) - nextToken(); // ']' - } - - // İlk değişkenin başlangıç değeri - if (currentToken().type == TokenType::EQUAL) { - nextToken(); // '=' tüket - vd->initExpr = parseExpression(); - } - - // --- Çoklu değişken: , identifier [= expr] --- - while (currentToken().type == TokenType::COMMA) { - nextToken(); // ',' tüket - - if (currentToken().type != TokenType::IDENTIFIER) { - std::cerr << "Parser hatası: virgülden sonra değişken ismi bekleniyor\n"; - break; - } - - VariableDeclNode* sibling = new VariableDeclNode(); - sibling->loc = currentToken().token->loc; - sibling->varType = vd->varType; // Aynı tip - sibling->name = currentToken().token->token; - nextToken(); // İsmi tüket - - // Opsiyonel array boyutu: [expr] - if (currentToken().type == TokenType::LBRACKET) { - nextToken(); // '[' - while (currentToken().type != TokenType::RBRACKET && - currentToken().type != TokenType::SEMICOLON && - currentToken().type != TokenType::SVR_VOID) - nextToken(); - if (currentToken().type == TokenType::RBRACKET) - nextToken(); // ']' - } - - // Başlangıç değeri - if (currentToken().type == TokenType::EQUAL) { - nextToken(); // '=' tüket - sibling->initExpr = parseExpression(); - } - - // Kardeş düğümü ana düğüme ekle - vd->addChild(sibling); - } - - // Noktalı virgül (opsiyonel — parser hoşgörülü) - if (currentToken().type == TokenType::SEMICOLON) - nextToken(); - - return vd; -} - -// ============================================================================ - -#endif // SAQUT_PARSER_DECL diff --git a/src/parser/parser_stmt.hpp b/src/parser/parser_stmt.hpp deleted file mode 100644 index b37e142..0000000 --- a/src/parser/parser_stmt.hpp +++ /dev/null @@ -1,322 +0,0 @@ -// ============================================================================ -// saQut Compiler — Parser Deyimler -// ============================================================================ -// -// DİZİN: src/parser/parser_stmt.hpp -// İÇERİK: parseStatement(), parseBlock(), parseIf/While/For/DoWhile, -// parseReturn/Break/Continue/ExpressionStatement -// -// ============================================================================ - -#ifndef SAQUT_PARSER_STMT -#define SAQUT_PARSER_STMT - -#include -#include "parser/parser_base.hpp" -inline ASTNode* Parser::parseStatement() { - auto ct = currentToken(); - - if (ct.type == TokenType::LBRACE) - return parseBlock(); - - if (ct.type == TokenType::KW_IF) - return parseIfStatement(); - - if (ct.type == TokenType::KW_WHILE) - return parseWhileStatement(); - - if (ct.type == TokenType::KW_FOR) - return parseForStatement(); - - if (ct.type == TokenType::KW_DO) - return parseDoWhileStatement(); - - if (ct.type == TokenType::KW_RETURN) - return parseReturnStatement(); - - if (ct.type == TokenType::KW_BREAK) - return parseBreakStatement(); - - if (ct.type == TokenType::KW_CONTINUE) - return parseContinueStatement(); - - // Değişken tanımı? (tip keyword'ü ile başlayan) - if (ct.is({ - TokenType::KW_VOID, TokenType::KW_INT, TokenType::KW_FLOAT_TYPE, - TokenType::KW_DOUBLE, TokenType::KW_BOOL, TokenType::KW_CHAR, - TokenType::KW_STRING_TYPE - })) { - return parseVariableDecl(); - } - - // struct tanımı: struct Name { ... } - if (ct.type == TokenType::KW_STRUCT) - return parseStructDecl(); - - // Hiçbiri değilse → ifade statement'ı (atama, fonksiyon çağrısı, ...) - return parseExpressionStatement(); -} - -// -------------------------------------------------------------------------- -// parseBlock: { statement* } -// -------------------------------------------------------------------------- -inline ASTNode* Parser::parseBlock() { - BlockNode* block = new BlockNode(); - block->loc = currentToken().token ? currentToken().token->loc : SourceLocation{}; - - if (currentToken().type == TokenType::LBRACE) - nextToken(); // '{' tüket - - while (currentToken().type != TokenType::RBRACE && - currentToken().type != TokenType::SVR_VOID) { - ASTNode* stmt = parseStatement(); - if (stmt) - block->addChild(stmt); - else - break; // Hata durumunda döngüden çık - } - - if (currentToken().type == TokenType::RBRACE) - nextToken(); // '}' tüket - - return block; -} - -// -------------------------------------------------------------------------- -// parseIfStatement: if (expression) statement [else statement] -// -// Süslü parantez zorunlu DEĞİL — tek statement de olabilir. -// if (x > 5) return x; ← geçerli -// if (x > 5) { ... } ← geçerli -// -// TODO: Sallantılı else (dangling else) sorunu: -// if (a) if (b) x; else y; ← else hangi if'e ait? -// Mevcut implementasyon doğru: else en yakın if'e bağlanır. -// -------------------------------------------------------------------------- -inline ASTNode* Parser::parseIfStatement() { - IfStatementNode* ifNode = new IfStatementNode(); - ifNode->loc = currentToken().token->loc; - nextToken(); // 'if' tüket - - // Koşul: ( expression ) - if (currentToken().type == TokenType::LPAREN) { - nextToken(); // '(' tüket - ifNode->condition = parseExpression(); - if (currentToken().type == TokenType::RPAREN) - nextToken(); // ')' tüket - } - - // Then gövdesi - ifNode->thenBranch = parseStatement(); - - // Opsiyonel else - if (currentToken().type == TokenType::KW_ELSE) { - nextToken(); // 'else' tüket - ifNode->elseBranch = parseStatement(); - } - - return ifNode; -} - -// -------------------------------------------------------------------------- -// parseWhileStatement: while (expression) statement -// -------------------------------------------------------------------------- -inline ASTNode* Parser::parseWhileStatement() { - WhileStatementNode* ws = new WhileStatementNode(); - ws->loc = currentToken().token->loc; - nextToken(); // 'while' tüket - - if (currentToken().type == TokenType::LPAREN) { - nextToken(); // '(' tüket - ws->condition = parseExpression(); - if (currentToken().type == TokenType::RPAREN) - nextToken(); // ')' tüket - } - - ws->body = parseStatement(); - return ws; -} - -// -------------------------------------------------------------------------- -// parseForStatement: for (init; condition; update) statement -// -// for'un 3 parçası da isteğe bağlıdır: -// for (;;) { ... } ← sonsuz döngü (geçerli) -// -// init: VariableDeclNode veya ExpressionStatementNode -// for (int i = 0; ...) → VariableDecl -// for (i = 0; ...) → ExpressionStatement -// condition: ifade (nullptr = yok) -// update: ifade (nullptr = yok) -// -------------------------------------------------------------------------- -inline ASTNode* Parser::parseForStatement() { - ForStatementNode* fs = new ForStatementNode(); - fs->loc = currentToken().token->loc; - nextToken(); // 'for' tüket - - if (currentToken().type == TokenType::LPAREN) - nextToken(); // '(' tüket - - // Init (opsiyonel) - if (currentToken().type != TokenType::SEMICOLON) - fs->init = parseStatement(); - if (currentToken().type == TokenType::SEMICOLON) - nextToken(); // ';' tüket - - // Condition (opsiyonel) - if (currentToken().type != TokenType::SEMICOLON) - fs->condition = parseExpression(); - if (currentToken().type == TokenType::SEMICOLON) - nextToken(); // ';' tüket - - // Update (opsiyonel) - if (currentToken().type != TokenType::RPAREN) - fs->update = parseExpression(); - if (currentToken().type == TokenType::RPAREN) - nextToken(); // ')' tüket - - // Body - fs->body = parseStatement(); - - return fs; -} - -// -------------------------------------------------------------------------- -// parseDoWhileStatement: do statement while (expression) ; -// -------------------------------------------------------------------------- -inline ASTNode* Parser::parseDoWhileStatement() { - DoWhileStatementNode* dw = new DoWhileStatementNode(); - dw->loc = currentToken().token->loc; - nextToken(); // 'do' tüket - - // Gövde - dw->body = parseStatement(); - - // while (expression) ; - if (currentToken().type == TokenType::KW_WHILE) { - nextToken(); // 'while' tüket - if (currentToken().type == TokenType::LPAREN) { - nextToken(); // '(' tüket - dw->condition = parseExpression(); - if (currentToken().type == TokenType::RPAREN) - nextToken(); // ')' tüket - } - if (currentToken().type == TokenType::SEMICOLON) - nextToken(); // ';' tüket - } - - return dw; -} - -// -------------------------------------------------------------------------- -// parseReturnStatement: return [expression] ; -// -// return; ← value = nullptr (void fonksiyon) -// return x + 1; ← value = BinaryExpression -// -------------------------------------------------------------------------- -inline ASTNode* Parser::parseReturnStatement() { - ReturnStatementNode* rs = new ReturnStatementNode(); - rs->loc = currentToken().token->loc; - nextToken(); // 'return' tüket - - // Opsiyonel dönüş değeri - // Eğer sıradaki token ; veya } ise → return; - if (currentToken().type != TokenType::SEMICOLON && - currentToken().type != TokenType::RBRACE) { - rs->value = parseExpression(); - } - - if (currentToken().type == TokenType::SEMICOLON) - nextToken(); // ';' tüket - - return rs; -} - -// -------------------------------------------------------------------------- -// parseBreakStatement / parseContinueStatement -// -------------------------------------------------------------------------- -inline ASTNode* Parser::parseBreakStatement() { - BreakStatementNode* bs = new BreakStatementNode(); - bs->loc = currentToken().token->loc; - nextToken(); // 'break' tüket - if (currentToken().type == TokenType::SEMICOLON) - nextToken(); - return bs; -} - -inline ASTNode* Parser::parseContinueStatement() { - ContinueStatementNode* cs = new ContinueStatementNode(); - cs->loc = currentToken().token->loc; - nextToken(); // 'continue' tüket - if (currentToken().type == TokenType::SEMICOLON) - nextToken(); - return cs; -} - -// -------------------------------------------------------------------------- -// parseExpressionStatement: expression ; -// -// Bir ifadeyi statement olarak kullanır. Örn: x = 5; foo(); -// -// HATA KURTARMA: -// Eğer parseExpression() başarısız olursa (nullptr), sonraki ; veya } -// veya EOF'a kadar token'ları atlayarak senkronize olur. Bu, tek bir -// hatalı ifadenin tüm parser'ı kilitlemesini önler. -// -// BUG FIX (commit 438bc0e): Eskiden hatalı ifade durumunda sonsuz -// döngüye giriyordu (parseProgram her seferinde aynı ifadeyi okuyordu). -// -------------------------------------------------------------------------- -inline ASTNode* Parser::parseExpressionStatement() { - ExpressionStatementNode* es = new ExpressionStatementNode(); - es->loc = currentToken().token ? currentToken().token->loc : SourceLocation{}; - es->expression = parseExpression(); - if (!es->expression) { - // Hata kurtarma: sonraki güvenli noktaya atla - while (currentToken().type != TokenType::SEMICOLON && - currentToken().type != TokenType::RBRACE && - currentToken().type != TokenType::SVR_VOID) - nextToken(); - if (currentToken().type == TokenType::SEMICOLON) - nextToken(); - } - if (currentToken().type == TokenType::SEMICOLON) - nextToken(); - - return es; -} - -// ============================================================================ -// İfadeler — Pratt Parser (Top-Down Operator Precedence) -// ============================================================================ -// -// Pratt parser'ın temel fikri: Her operatörün bir "bağlanma gücü" (precedence) -// vardır. Parser, bu güce göre operatörleri doğru sırada gruplar. -// -// NUD (Null Denotation): Prefix ifadeleri (sayılar, -, !, parantez) -// LED (Left Denotation): Infix/Postfix ifadeler (+, *, ++) -// -// ÖRNEK: 1 + 2 * 3 -// 1. NUD: 1 → Literal(1) -// 2. LED(+): prec=13, right'i parseExpression(13) ile ayrıştır -// 2a. NUD: 2 → Literal(2) -// 2b. LED(*): prec=14 > 13 → parseExpression(14) -// 3a. NUD: 3 → Literal(3) -// 3b. LED yok → dön -// 2c. BinaryExpr(*, 2, 3) dön -// 3. BinaryExpr(+, 1, BinaryExpr(*, 2, 3)) -// Sonuç: 1 + (2 * 3) ✓ -// -// BUG FIX (commit 40579ca): Ana döngü lookahead(1) yerine currentToken() -// kullanıyor. NUD artık token'ı tüketip ilerliyor, bu sayede currentToken() -// her zaman bir sonraki operatörü gösterir. -// -// BUG FIX (commit 438bc0e): Atom'lar (sayı, string, identifier) NUD'da -// nextToken() ile tüketiliyor. Eskiden tüketilmediği için sonsuz döngü -// oluyordu. -// -// ============================================================================ - -// -------------------------------------------------------------------------- -// parseExpression(): Öncelik 0'dan başla (en düşük bağlanma) - -#endif // SAQUT_PARSER_STMT diff --git a/src/tokenizer/tokenizer.cpp b/src/tokenizer/tokenizer.cpp new file mode 100644 index 0000000..02631f8 --- /dev/null +++ b/src/tokenizer/tokenizer.cpp @@ -0,0 +1,176 @@ +#include "tokenizer/tokenizer.hpp" + +std::vector Tokenizer::scan(std::string input) { + std::vector tokens; + hmx.setSourceText("", input); + while (true) { + Token* token = scope(); + if (token->token == "EOL") break; + tokens.push_back(token); + if (hmx.isEnd()) break; + } + return tokens; +} + +Token* Tokenizer::scope() { + hmx.skipWhiteSpace(); + + if (hmx.include("//", true)) { skipOneLineComment(); return scope(); } + if (hmx.include("/*", true)) { skipMultiLineComment(); return scope(); } + + if (hmx.isEnd()) { + Token* t = new Token(); + t->token = "EOL"; + return t; + } + + if (hmx.getchar() == '"') + return readString(); + + if (hmx.isNumeric()) { + INumber lem = hmx.readNumeric(); + NumberToken* nt = new NumberToken(); + nt->loc = lem.startLoc; + nt->base = lem.base; + nt->start = lem.start; + nt->end = lem.end; + nt->hasEpsilon = lem.hasEpsilon; + nt->isFloat = lem.isFloat; + nt->token = lem.token; + return nt; + } + + for (const auto& kw : keywords) { + if (hmx.include(std::string(kw), false)) { + char next = hmx.getchar(static_cast(kw.size())); + if ((next >= 'a' && next <= 'z') || (next >= 'A' && next <= 'Z') || + (next >= '0' && next <= '9') || next == '_' || next == '$') { + continue; + } + KeywordToken* kt = new KeywordToken(); + kt->start = hmx.getOffset(); + kt->loc = hmx.getLocation(); + hmx.toChar(static_cast(kw.size())); + kt->end = hmx.getOffset(); + kt->token = kw; + return kt; + } + } + + for (const auto& del : delimiters) { + if (hmx.include(std::string(del), false)) { + DelimiterToken* dt = new DelimiterToken(); + dt->start = hmx.getOffset(); + dt->loc = hmx.getLocation(); + hmx.toChar(static_cast(del.size())); + dt->end = hmx.getOffset(); + dt->token = del; + return dt; + } + } + + for (const auto& op : operators) { + if (hmx.include(std::string(op), false)) { + OperatorToken* ot = new OperatorToken(); + ot->start = hmx.getOffset(); + ot->loc = hmx.getLocation(); + hmx.toChar(static_cast(op.size())); + ot->end = hmx.getOffset(); + ot->token = op; + return ot; + } + } + + return readIdentifier(); +} + +IdentifierToken* Tokenizer::readIdentifier() { + hmx.beginPosition(); + IdentifierToken* it = new IdentifierToken(); + it->start = hmx.getOffset(); + + while (!hmx.isEnd()) { + char c = hmx.getchar(); + bool read = false; + + if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || (c >= '0' && c <= '9')) { + read = true; + it->token.push_back(c); + } else if (c == '_' || c == '$') { + read = true; + it->token.push_back(c); + } + + if (read) { + hmx.nextChar(); + } else { + if (it->token.empty()) { hmx.nextChar(); } break; + } + } + + it->end = hmx.getOffset(); + it->size = static_cast(it->context.size()); + it->loc = hmx.sourceFile.offsetToLocation(it->start); + hmx.acceptPosition(); + return it; +} + +StringToken* Tokenizer::readString() { + hmx.beginPosition(); + StringToken* st = new StringToken(); + bool started = false; + bool ended = false; + st->start = hmx.getOffset(); + + while (!hmx.isEnd()) { + char c = hmx.getchar(); + st->token.push_back(c); + switch (c) { + case '"': + if (!started) { + started = true; + } else { + ended = true; + } + break; + case '\\': + hmx.nextChar(); + c = hmx.getchar(); + st->token.push_back(c); + st->context.push_back(c); + break; + default: + st->context.push_back(c); + break; + } + hmx.nextChar(); + if (ended) break; + } + + st->end = hmx.getOffset(); + st->size = static_cast(st->context.size()); + st->loc = hmx.sourceFile.offsetToLocation(st->start); + hmx.acceptPosition(); + return st; +} + +void Tokenizer::skipOneLineComment() { + while (!hmx.isEnd()) { + if (hmx.getchar() == '\n') { + hmx.nextChar(); + hmx.skipWhiteSpace(); + return; + } + hmx.nextChar(); + } +} + +void Tokenizer::skipMultiLineComment() { + while (!hmx.isEnd()) { + if (hmx.include("*/", true)) { + hmx.skipWhiteSpace(); + return; + } + hmx.nextChar(); + } +} diff --git a/src/tokenizer/tokenizer.hpp b/src/tokenizer/tokenizer.hpp index 07ddec8..ca5c80b 100644 --- a/src/tokenizer/tokenizer.hpp +++ b/src/tokenizer/tokenizer.hpp @@ -1,466 +1,60 @@ -// ============================================================================ -// saQut Compiler — Tokenizer (Token Seviyesinde Tarayıcı) -// ============================================================================ -// -// DİZİN: src/tokenizer/tokenizer.hpp -// KATMAN: Katman 2 — Lexer üzerine kurulu -// BAĞIMLI: Lexer (src/lexer/lexer.hpp) -// KULLANAN: Parser (src/parser/parser.hpp), ParserToken (src/parser/token.hpp) -// -// AMAÇ: -// Lexer tarafından sağlanan karakter akışını alıp anlamlı token'lara dönüştürür. -// Token'lar derleyicinin "kelime"leridir — parser'ın anlayacağı en küçük birim. -// -// Üretilen token tipleri (6 adet polimorfik sınıf): -// ┌─────────────────┬──────────────────────────────────┐ -// │ Sınıf │ Örnek token'lar │ -// ├─────────────────┼──────────────────────────────────┤ -// │ NumberToken │ 42, 0xFF, 3.14, 1e10 │ -// │ StringToken │ "merhaba", "satır\niki" │ -// │ OperatorToken │ +, -, *, /, ==, !=, ++, -- │ -// │ DelimiterToken │ (, ), {, }, [, ], ;, ,, ., -> │ -// │ KeywordToken │ if, for, while, int, void │ -// │ IdentifierToken │ x, myVar, _private │ -// └─────────────────┴──────────────────────────────────┘ -// -// ADR-004: Neden Polimorfik Token Sınıfları? -// Seçenek 1 — Tagged union (std::variant): Tüm veriyi tek struct'ta -// +: Bellek tek parça, cache-friendly -// -: Tip eklemek için union'ı değiştirmek gerek -// Seçenek 2 — Class hierarchy (seçilen): Base Token, alt sınıflar -// +: Yeni token tipi eklemek kolay (yeni sınıf türet) -// +: Her token kendi verisini taşır (NumberToken.isFloat, StringToken.context) -// -: Heap tahsisi (new) gerektirir -// -: virtual destructor çağrısı (maliyet: 1 vtable lookup) -// -// Karar: Class hierarchy. Derleyici gibi bir araçta kod netliği ve -// genişletilebilirlik, mikro-performanstan daha önemlidir. -// -// TASARIM KARARLARI: -// 1. Tablolar (operators, delimiters, keywords): constexpr std::string_view dizileri. -// Derleme zamanında sabit, heap tahsisi yok. Sıralama önceliği: -// - Önce keyword'ler: if/for/while gibi kelimeler identifier'lardan önce yakalanmalı -// - Sonra delimiter'lar: -> ve :: gibi 2 karakterliler önce, tek karakterliler sonra -// - Sonra operator'ler: != ve == gibi 2 karakterliler önce, tek karakterliler sonra -// - En son identifier: yukarıdakilerden hiçbirine uymayan her şey -// -// 2. Keyword boundary check: "do" keyword'ü "double" ile karışmasın diye, -// keyword eşleşmesinden sonraki karakter kontrol edilir. Sonraki karakter -// harf/rakam/_/$ ise bu bir keyword değil, identifier'dır. -// -// 3. scope() metodu: Her çağrıldığında bir sonraki token'ı döndürür. -// EOF'da "EOL" isimli özel bir token döndürür (Token tipi, özel değil). -// Bu, boş token listesi sorununu çözer (parser her zaman bir token görür). -// -// 4. Yorum satırları: // (tek satır) ve /* */ (çok satırlı) desteklenir. -// Yorumlar token üretmez, sessizce atlanır. -// NOT: İç içe /* */ yorumları desteklenmez (C standardı gibi). -// -// BİLİNEN SINIRLAMALAR (TODO): -// TODO: String escape sequence'leri tam değil (\x, \u, \U eksik) -// TODO: Char literal: 'a' formatı okunamıyor -// TODO: Raw string: R"(...)" formatı yok -// TODO: Token konum bilgisi (satır/sütun) token'lara eklenmeli -// TODO: Bellek sızıntısı: Token'lar heap'te new ile oluşturuluyor, silme sorumluluğu çağıranda -// -// ============================================================================ - #ifndef SAQUT_TOKENIZER #define SAQUT_TOKENIZER -#include #include #include +#include #include "lexer/lexer.hpp" - #include "tokenizer/token.hpp" -// ============================================================================ -// Token Tanıma Tabloları (Derleme Zamanı Sabitleri) -// ============================================================================ -// -// Bu tablolar, Tokenizer::scope() tarafından ham karakterlerden token üretmek -// için kullanılır. constexpr std::string_view ile tanımlanmıştır, böylece -// heap tahsisi yapılmaz ve derleme zamanında optimize edilir. -// -// SIRALAMA ÖNEMLİDİR! -// scope() fonksiyonu bu tabloları sırasıyla tarar ve İLK eşleşmede durur. -// Bu nedenle: -// - Çok karakterli operatörler (==) tek karakterlilerden (=) ÖNCE gelmeli -// - Çok karakterli delimiter'lar (->) tek karakterlilerden (.) ÖNCE gelmeli -// - Keyword'ler, identifier'lardan ÖNCE kontrol edilmeli -// -// Mevcut sıralama: keywords → delimiters → operators → identifier (fallback) -// -// ============================================================================ - -#include - // Operatör tablosu. Çok karakterliler (==, !=, ++, +=, vb.) önce gelir. -// NOT: Bu tablo ParserToken'daki OPERATOR_MAP ile eşleşmelidir. inline constexpr std::string_view operators[] = { - // --- 2 karakterli: karşılaştırma --- "==", "!=", "<=", ">=", "&&", "||", - // --- 2 karakterli: aritmetik --- "++", "--", "<<", ">>", - // --- 2 karakterli: birleşik atama --- "+=", "-=", "*=", "/=", "%=", "&=", "|=", "^=", - // --- 1 karakterli: aritmetik --- "+", "-", "*", "/", "%", "<", ">", - // --- 1 karakterli: bitsel/mantıksal --- "^", "!", "~", "&", "|", - // --- 1 karakterli: temel atama --- "=" }; // Delimiter tablosu. Çok karakterliler (->, ::) önce gelir. inline constexpr std::string_view delimiters[] = { - "->", "::", // 2 karakterli bağlayıcılar - "[", "]", "(", ")", "{", "}", // gruplama - ";", ",", ":", // ayırıcılar - "." // üye erişimi + "->", "::", + "[", "]", "(", ")", "{", "}", + ";", ",", ":", + "." }; -// Keyword tablosu. Dilin tüm rezerve edilmiş kelimeleri. -// Gruplandırılmıştır: -// - Kontrol akışı: if, else, for, while, do, switch, case, vb. -// - Tipler: void, int, float, double, char, string, bool -// - Literal'lar: true, false, null -// - OOP: class, interface, enum, extends, public, private, vb. -// - Modüller: import, package -// - C/C++ ekleri: const, extern, typedef, sizeof, auto, vb. -// -// BUG FIX (commit 438bc0e): -// Eskiden tip keyword'leri bu listede yoktu. int, float gibi kelimeler -// identifier olarak tokenize ediliyordu. Parser'da KW_INT gibi tipler -// tanımlı olmasına rağmen tokenizer'dan gelmediği için değişken tanımlama -// çalışmıyordu. Tüm eksik keyword'ler eklendi. -// +// Keyword tablosu. inline constexpr std::string_view keywords[] = { - // Control flow "if", "else", "for", "while", "do", "switch", "case", "default", "break", "continue", "return", "try", "catch", "finally", "throw", "throws", "assert", - // Types "void", "int", "float", "double", "char", "string", "bool", - // Literals "true", "false", "null", - // OOP "class", "struct", "interface","enum", "extends", "implements", "new", "public", "private", "protected", "static", "final", "abstract", - // Modules "import", "package", - // C/C++ "const", "extern", "typedef", "sizeof", "auto", "constexpr","noexcept", "native", "synchronized", "volatile", "transient" }; -// ============================================================================ -// Tokenizer — Lexer Üzerinde Token Üretici -// ============================================================================ -// -// Tek sorumluluğu: karakter akışından token listesi üretmek. -// Durum bilgisi: Lexer'ı içerir (hmx), kendi durumu yok. -// -// KULLANIM: -// Tokenizer tokenizer; -// auto tokens = tokenizer.scan(sourceCode); -// // tokens artık kullanılabilir. İş bitince: -// for (auto* t : tokens) delete t; -// class Tokenizer { public: - Lexer hmx; // İç Lexer. "hmx" adı tarihsel. + Lexer hmx; std::vector scan(std::string input); private: - Token* scope(); // Bir sonraki token'ı döndür - IdentifierToken* readIdentifier(); // Tanımlayıcı oku - StringToken* readString(); // String literal oku - void skipOneLineComment(); // // yorum satırını atla - void skipMultiLineComment(); // /* */ yorum bloğunu atla + Token* scope(); + IdentifierToken* readIdentifier(); + StringToken* readString(); + void skipOneLineComment(); + void skipMultiLineComment(); }; -// ============================================================================ -// GERÇEKLEME (Implementation) -// ============================================================================ - -// -------------------------------------------------------------------------- -// scan: Kaynak kodu tara, token listesi üret. -// -// Akış: -// 1. Lexer'a kaynak kodu yükle -// 2. scope() ile tek tek token oku -// 3. "EOL" (End Of Line) token'ı gelene kadar devam et -// 4. Token listesini döndür -// -// "EOL" token'ı: scope() EOF'da üretilen özel bir Token. Parser'a "bitti" sinyali. -// Neden nullptr değil? Çünkü scope() her zaman geçerli bir pointer döndürmeli, -// aksi takdirde null kontrolü gerekir. "EOL" ile bu kontrol token tipine indirgenir. -// -// TODO: std::unique_ptr veya std::vector> ile bellek yönetimi -// -------------------------------------------------------------------------- -inline std::vector Tokenizer::scan(std::string input) { - std::vector tokens; - hmx.setSourceText("", input); // Kaynak kodu hem Lexer'a yükle hem SourceFile'ı hazırla - while (true) { - Token* token = scope(); - if (token->token == "EOL") break; // Dosya sonu sinyali - tokens.push_back(token); - if (hmx.isEnd()) break; // Güvenlik kontrolü - } - return tokens; -} - -// -------------------------------------------------------------------------- -// scope: Bir sonraki token'ı tanı ve döndür. -// -// Token tanıma sıralaması (önemli!): -// 1. Boşlukları atla -// 2. Yorum satırlarını atla (//, /* */) -// 3. EOF kontrolü → "EOL" token'ı -// 4. String literal ("...") -// 5. Sayısal literal (0-9 ile başlayan) -// 6. Keyword'ler (sınır kontrolü ile) -// 7. Delimiter'lar -// 8. Operatörler -// 9. Identifier (fallback — yukarıdakilerden hiçbiri değilse) -// -// Keyword boundary check: -// include(kw, false) ile önce eşleşme kontrolü yapılır (konum değişmez). -// Sonra keyword'ün hemen sonrasındaki karaktere bakılır. -// Eğer bu karakter harf/rakam/_/$ ise, bu bir keyword değil, daha uzun bir -// identifier'ın parçasıdır. Örnek: "do" → "double"ın başlangıcı olabilir. -// -// BUG FIX (commit 438bc0e): Eskiden boundary check yoktu. "double" kelimesi -// "do" + "uble" olarak iki token'a ayrılıyordu. -// -------------------------------------------------------------------------- -inline Token* Tokenizer::scope() { - hmx.skipWhiteSpace(); - - // Yorum satırları: sessizce atla, token üretme - if (hmx.include("//", true)) { skipOneLineComment(); return scope(); } - if (hmx.include("/*", true)) { skipMultiLineComment(); return scope(); } - - // EOF kontrolü - if (hmx.isEnd()) { - Token* t = new Token(); - t->token = "EOL"; // Özel sinyal token'ı - return t; - } - - // String literal: " ile başlar - if (hmx.getchar() == '"') - return readString(); - - // Sayısal literal: rakam ile başlar (isNumeric: 0-9) - if (hmx.isNumeric()) { - INumber lem = hmx.readNumeric(); - NumberToken* nt = new NumberToken(); - nt->loc = lem.startLoc; - nt->base = lem.base; - nt->start = lem.start; - nt->end = lem.end; - nt->hasEpsilon = lem.hasEpsilon; - nt->isFloat = lem.isFloat; - nt->token = lem.token; - return nt; - } - - // Keyword'ler: sınır kontrolü ile tarama - // include(kw, false) → eşleşme kontrolü yap ama konumu değiştirme - // getchar(kw.size()) → keyword sonrası karaktere bak - // Sonraki karakter harf/rakam/_/$ ise → bu bir keyword değil, devam et - for (const auto& kw : keywords) { - if (hmx.include(std::string(kw), false)) { - char next = hmx.getchar(static_cast(kw.size())); - if ((next >= 'a' && next <= 'z') || (next >= 'A' && next <= 'Z') || - (next >= '0' && next <= '9') || next == '_' || next == '$') { - continue; // Daha uzun bir identifier'ın parçası - } - KeywordToken* kt = new KeywordToken(); - kt->start = hmx.getOffset(); - kt->loc = hmx.getLocation(); - hmx.toChar(static_cast(kw.size())); - kt->end = hmx.getOffset(); - kt->token = kw; - return kt; - } - } - - // Delimiter'lar - for (const auto& del : delimiters) { - if (hmx.include(std::string(del), false)) { - DelimiterToken* dt = new DelimiterToken(); - dt->start = hmx.getOffset(); - dt->loc = hmx.getLocation(); - hmx.toChar(static_cast(del.size())); - dt->end = hmx.getOffset(); - dt->token = del; - return dt; - } - } - - // Operatörler - for (const auto& op : operators) { - if (hmx.include(std::string(op), false)) { - OperatorToken* ot = new OperatorToken(); - ot->start = hmx.getOffset(); - ot->loc = hmx.getLocation(); - hmx.toChar(static_cast(op.size())); - ot->end = hmx.getOffset(); - ot->token = op; - return ot; - } - } - - // Identifier (fallback): hiçbir özel token tipine uymayan her şey - return readIdentifier(); -} - -// -------------------------------------------------------------------------- -// readIdentifier: Bir tanımlayıcı (identifier) oku. -// -// Tanımlayıcı = harf ile başlayan, harf/rakam/_/$ ile devam eden karakter dizisi. -// NOT: Rakam ile başlayamaz (o zaman sayı olurdu). -// -// Karakter seti: -// a-z, A-Z: Latin harfleri -// 0-9: Rakamlar (ilk karakter hariç) -// _ (alt çizgi): Yaygın ayraç -// $ (dolar): Java/C# uyumluluğu için -// -// TODO: Unicode harf desteği (Türkçe karakterler, Çince, Arapça, vb.) -// -------------------------------------------------------------------------- -inline IdentifierToken* Tokenizer::readIdentifier() { - hmx.beginPosition(); - IdentifierToken* it = new IdentifierToken(); - it->start = hmx.getOffset(); - - while (!hmx.isEnd()) { - char c = hmx.getchar(); - bool read = false; - - // Harf veya rakam kontrolü (ASCII) - if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || (c >= '0' && c <= '9')) { - read = true; - it->token.push_back(c); - } else if (c == '_' || c == '$') { - read = true; - it->token.push_back(c); - } - - if (read) { - hmx.nextChar(); - } else { - if (it->token.empty()) { hmx.nextChar(); } break; - } - } - - it->end = hmx.getOffset(); - it->size = static_cast(it->context.size()); - it->loc = hmx.sourceFile.offsetToLocation(it->start); - hmx.acceptPosition(); // Başarılı okuma → konumu kalıcı yap - return it; -} - -// -------------------------------------------------------------------------- -// readString: Bir string literal oku ("...") -// -// Desteklenen escape sequence'ler: -// \" → çift tırnak -// \\ → ters bölü -// \n → satırsonu -// \t → sekme -// \r → satırbaşı -// -// Algoritma: -// 1. Açılış tırnağını (" ) gör → started = true -// 2. Karakterleri oku: -// - \ ise → sonraki karakteri escape olarak işle, context'e ekle -// - " ise → started zaten true, bu kapanış tırnağı → ended = true -// - Diğer → context'e ekle -// 3. Kapanış tırnağında dur -// -// token: Tüm karakterler (tırnaklar ve escape'ler dahil) -// context: Sadece gerçek string içeriği (escape'ler çözülmüş) -// -// Örnek: "a\"b\\n" → token = "\"a\\\"b\\\\n\"", context = "a\"b\n" -// -// TODO: \xNN (hex escape), \uNNNN (Unicode), \UNNNNNNNN (geniş Unicode) -// TODO: Çok satırlı string desteği ("""...""" veya backtick `...`) -// -------------------------------------------------------------------------- -inline StringToken* Tokenizer::readString() { - hmx.beginPosition(); - StringToken* st = new StringToken(); - bool started = false; // Açılış tırnağı görüldü mü? - bool ended = false; // Kapanış tırnağı görüldü mü? - st->start = hmx.getOffset(); - - while (!hmx.isEnd()) { - char c = hmx.getchar(); - st->token.push_back(c); - switch (c) { - case '"': - if (!started) { - started = true; // Açılış tırnağı - } else { - ended = true; // Kapanış tırnağı - } - break; - case '\\': - // Escape sequence: sonraki karakteri olduğu gibi al - hmx.nextChar(); - c = hmx.getchar(); - st->token.push_back(c); - st->context.push_back(c); - break; - default: - st->context.push_back(c); - break; - } - hmx.nextChar(); - if (ended) break; - } - - st->end = hmx.getOffset(); - st->size = static_cast(st->context.size()); - st->loc = hmx.sourceFile.offsetToLocation(st->start); - hmx.acceptPosition(); - return st; -} - -// -------------------------------------------------------------------------- -// skipOneLineComment: // ile başlayan yorum satırını satırsonuna kadar atla -// -------------------------------------------------------------------------- -inline void Tokenizer::skipOneLineComment() { - while (!hmx.isEnd()) { - if (hmx.getchar() == '\n') { - hmx.nextChar(); - hmx.skipWhiteSpace(); // Satırsonu sonrası boşlukları da temizle - return; - } - hmx.nextChar(); - } -} - -// -------------------------------------------------------------------------- -// skipMultiLineComment: /* */ bloğunu atla -// NOT: İç içe yorum blokları desteklenmez (C standardı gibi). -// -------------------------------------------------------------------------- -inline void Tokenizer::skipMultiLineComment() { - while (!hmx.isEnd()) { - if (hmx.include("*/", true)) { - hmx.skipWhiteSpace(); - return; - } - hmx.nextChar(); - } -} - -#endif // SAQUT_TOKENIZER \ No newline at end of file +#endif // SAQUT_TOKENIZER From 3f6c2ee4c9a386554616af69d1867b51eb95cb24 Mon Sep 17 00:00:00 2001 From: abdussamedulutas Date: Wed, 27 May 2026 10:53:18 +0300 Subject: [PATCH 2/3] chore: JsonObject builder, LiteralType enum, token.hpp doc cleanup --- src/parser/ast_json.hpp | 130 ++++++- src/parser/ast_node.hpp | 228 ++++++++++--- src/parser/token.hpp | 739 ++++++++++++++++++++++++++-------------- 3 files changed, 786 insertions(+), 311 deletions(-) diff --git a/src/parser/ast_json.hpp b/src/parser/ast_json.hpp index 45067c5..978af24 100644 --- a/src/parser/ast_json.hpp +++ b/src/parser/ast_json.hpp @@ -3,7 +3,8 @@ // ============================================================================ // // DİZİN: src/parser/ast_json.hpp -// KATMAN: AST — Sadece AST düğümlerinin toJson() metotları için +// KATMAN: Katman 3 — Parser (AST JSON serileştirme) +// AMAÇ: AST düğümlerinin toJson() metotlarında kullanılan builder pattern // BAĞIMLI: Yok (sadece , ) // // AMAÇ: @@ -17,6 +18,15 @@ // obj.add("location", loc.toJson()); // ham JSON gömme // return obj.str(); // +// TASARIM KARARLARI: +// 1. Builder pattern: add() çağrıları zincirlenemez ama okunabilirlik kazanır. +// Zincirleme için: return obj.add("a",1).add("b",2).str() — tercih edilmedi. +// 2. addRaw(): Önceden formatlanmış JSON (alt düğüm çıktısı) gömmek için. +// 3. addArray(): Callback ile dizi oluşturma — C++ lambda'ları sayesinde temiz. +// 4. addIfNotEmpty/addIfNot: Koşullu alanlar — null alanları JSON'da göstermemek için. +// JSON çıktısını temiz tutar. +// 5. JSON_INDENT = 2: Standart JSON girinti (4 değil, 2 okunabilir). +// // ============================================================================ #ifndef SAQUT_AST_JSON @@ -25,7 +35,11 @@ #include #include -// Girinti sabiti (tools.hpp'deki jsonIndent ile uyumlu) +// ============================================================================ +// JSON_INDENT — JSON girinti miktarı (boşluk sayısı) +// ============================================================================ +// tools.hpp'deki jsonIndent() ile uyumlu olmalıdır. +// Her seviyede 2 boşluk içe kaydırılır. #define JSON_INDENT 2 // jsonEscape ve jsonIndent tools.hpp'de tanımlıdır. @@ -34,6 +48,10 @@ // JsonObject — JSON Nesne Builder // ============================================================================ // +// AST düğümlerini JSON formatına dönüştürmek için kullanılır. +// Her çağrıda yeni bir JsonObject oluşturulur, alanlar eklenir ve str() ile +// JSON stringi alınır. +// // KULLANIM: // JsonObject obj(depth); // obj.add("kind", "FunctionDecl"); @@ -46,10 +64,21 @@ // }); // return obj.str(); // +// ÖRNEK ÇIKTI (depth=0): +// { +// "kind": "FunctionDecl", +// "name": "main", +// "returnType": "int", +// "children": [ ... ] +// } +// // ============================================================================ class JsonObject { public: + // JsonObject — Yapıcı + // PARAMETRE: depth — JSON girinti seviyesi (0 = en dış) + // YAN ETKİ: m_ss'e açılış süslü parantezi yazar JsonObject(int depth) : m_indent(jsonIndent(depth)), m_indentInner(jsonIndent(depth + 1)) @@ -57,44 +86,89 @@ public: m_ss << m_indent << "{\n"; } - // String alan ekle (değer tırnak içinde yazılır) + // add() — String alan ekle + // PARAMETRELER: + // key — JSON anahtarı (tırnak içinde yazılır) + // value — string değer (otomatik tırnaklanır ve escape edilir) + // YAN ETKİ: m_hasFields true olur + // ÖRN: obj.add("name", "main") → "name": "main" void add(const std::string& key, const std::string& value) { addRaw(key, "\"" + jsonEscape(value) + "\""); } - // Sayısal alan ekle (değer olduğu gibi yazılır) + // add() — Sayısal alan ekle + // PARAMETRELER: + // key — JSON anahtarı + // value — tamsayı değer (tırnaklanmaz, olduğu gibi yazılır) + // ÖRN: obj.add("line", 42) → "line": 42 void add(const std::string& key, int value) { addRaw(key, std::to_string(value)); } - // Boolean alan ekle + // add() — Boolean alan ekle + // PARAMETRELER: + // key — JSON anahtarı + // value — true/false + // ÖRN: obj.add("isPublic", true) → "isPublic": true void add(const std::string& key, bool value) { addRaw(key, value ? "true" : "false"); } - // Ham JSON değeri ekle (önceden formatlanmış, tırnaklanmamış) + // addRaw() — Ham JSON değeri ekle (önceden formatlanmış) + // PARAMETRELER: + // key — JSON anahtarı + // jsonValue — önceden JSON'a çevrilmiş değer (tırnaklanmaz!) + // KULLANIM: Alt düğüm toJson() çıktısını gömmek için. + // addRaw("location", loc.toJson()); void addRaw(const std::string& key, const std::string& jsonValue) { if (m_hasFields) m_ss << ",\n"; m_ss << m_indentInner << "\"" << jsonEscape(key) << "\": " << jsonValue; m_hasFields = true; } - // Alt nesne ekle (bir alt seviyede JSON nesnesi) + // addNested() — Alt nesne ekle (addRaw alias) + // PARAMETRELER: addRaw ile aynı + // KULLANIM: addRaw ile aynı. Sadece okunabilirlik için. void addNested(const std::string& key, const std::string& nestedJson) { addRaw(key, nestedJson); } - // Koşullu string alan (value boş değilse ekle) + // addIfNotEmpty() — Koşullu string alan + // PARAMETRELER: + // key — JSON anahtarı + // value — string değer (sadece boş DEĞİLSE eklenir) + // KULLANIM: Opsiyonel alanlar için. JSON çıktısını temiz tutar. + // obj.addIfNotEmpty("defaultValue", defaultVal); void addIfNotEmpty(const std::string& key, const std::string& value) { if (!value.empty()) add(key, value); } - // Koşullu sayı alan (value varsayılandan farklıysa ekle) + // addIfNot() — Koşullu sayı alan + // PARAMETRELER: + // key — JSON anahtarı + // value — mevcut değer + // defaultValue — varsayılan değer + // EKLEME KOŞULU: value != defaultValue + // KULLANIM: Varsayılan değerler JSON'da tekrarlanmaz. + // obj.addIfNot("precedence", 0, 14); void addIfNot(const std::string& key, int value, int defaultValue) { if (value != defaultValue) add(key, value); } - // Dizi alanı (callback içinde addItem çağrılır) + // addArray() — Dizi alanı (callback ile) + // PARAMETRELER: + // key — JSON anahtarı + // callback — dizi elemanlarını addItem ile ekleyen lambda/fonksiyon + // KULLANIM: + // obj.addArray("children", [&] { + // for (auto* child : children) + // obj.addItem(child->toJson(depth + 2)); + // }); + // ÖRNEK ÇIKTI: + // "children": [ + // { "kind": "Literal", ... }, + // { "kind": "Identifier", ... } + // ] template void addArray(const std::string& key, Fn callback) { if (m_hasFields) m_ss << ",\n"; @@ -106,7 +180,10 @@ public: m_hasFields = true; } - // Diziye eleman ekle (addArray callback'i içinde kullanılır) + // addItem() — Diziye eleman ekle + // PARAMETRE: itemJson — JSON formatında dizi elemanı + // KULLANIM: Sadece addArray callback'i içinde kullanılır. + // YAN ETKİ: m_hasArrayItem true olur (virgül kontrolü için) void addItem(const std::string& itemJson) { if (m_hasArrayItem) m_ss << ","; // Öğeler m_indentInner'in bir seviye altında (depth + 2) @@ -116,19 +193,36 @@ public: m_hasArrayItem = true; } - // Nesneyi kapat ve string olarak döndür + // str() — JSON nesnesini kapat ve string olarak döndür + // DÖNÜŞ: Tam JSON stringi ({"key": "value", ...}) + // YAN ETKİ: Kapanış süslü parantezini ekler. + // KULLANIM: + // JsonObject obj(depth); + // obj.add("kind", "FunctionDecl"); + // return obj.str(); std::string str() { m_ss << "\n" << m_indent << "}"; return m_ss.str(); } private: - std::ostringstream m_ss; - std::string m_indent; // Bu nesnenin girintisi - std::string m_indentInner; // Bir alt seviye girinti - bool m_hasFields = false; - int m_arrayDepth = 0; // İç içe dizi seviyesi - bool m_hasArrayItem = false; + /* ====== Builder State ====== */ + std::ostringstream m_ss; // JSON çıktısının biriktirildiği string stream + + std::string m_indent; // Bu nesnenin girinti seviyesi (depth * 2 boşluk) + // Örn: depth=0 → "", depth=1 → " " + + std::string m_indentInner; // Bir alt seviye girinti ((depth+1) * 2 boşluk) + // Örn: depth=0 → " ", depth=1 → " " + + bool m_hasFields = false; // Alan eklendi mi? (virgül kontrolü için) + // true ise bir sonraki alandan önce virgül + newline + + int m_arrayDepth = 0; // İç içe dizi seviyesi (şu anda kullanılmıyor, + // ileride çok boyutlu diziler için) + + bool m_hasArrayItem = false; // Diziye eleman eklendi mi? (virgül kontrolü) + // true ise bir sonraki elemandan önce virgül }; #endif // SAQUT_AST_JSON diff --git a/src/parser/ast_node.hpp b/src/parser/ast_node.hpp index e5cc206..3739c70 100644 --- a/src/parser/ast_node.hpp +++ b/src/parser/ast_node.hpp @@ -3,12 +3,23 @@ // ============================================================================ // // DİZİN: src/parser/ast_node.hpp -// KATMAN: Katman 3 — Parser -// BAĞIMLI: core/location.hpp, parser/token.hpp, tools.hpp +// KATMAN: Katman 3 — Parser (Ayrıştırıcı) +// AMAÇ: Tüm AST düğümlerinin taban sınıfını ve temel enum'ları tanımlamak // -// Bu dosya: ASTNode taban sınıfını, ASTKind enum'unu, LiteralType enum'unu -// ve çocuk düğümleri JSON olarak yazdırmak için childrenToJson yardımcısını -// içerir. Diğer tüm düğüm sınıfları bu dosyayı include eder. +// BAĞIMLILIKLAR: +// - core/location.hpp: Kaynak kod konum bilgisi (SourceLocation) +// - parser/token.hpp: Token tipleri (TokenType, ParserToken) +// - tools.hpp: Yardımcı fonksiyonlar (jsonIndent vb.) +// +// MİMARİ KARARLAR: +// 1. ASTNode, tüm düğümlerin ortak davranışını (log, toJson, children) +// tek bir yerde tanımlar. NVI (Non-Virtual Interface) pattern'i. +// 2. virtual log() ve toJson() — her düğüm kendi çıktısını kendisi üretir. +// 3. parent pointer — AST'de yukarı doğru gezinme (ör: sembol çözümleme). +// 4. children vector — aşağı doğru gezinme (ör: tüm düğümleri ziyaret). +// 5. ASTKind enum — switch/case ile tip kontrolü (dynamic_cast yerine). +// Performans: dynamic_cast < switch/case < virtual method çağrısı +// Ama switch/case ile yeni tip eklemek derleyici uyarısı verir (eksik case). // // ============================================================================ @@ -26,43 +37,112 @@ // ============================================================================ // ASTKind — Düğüm Tipi Enum // ============================================================================ +// +// Tüm AST düğüm tiplerini tanımlar. Her düğüm sınıfı bu enum'dan bir değer +// alır. enum class olması sayesinde isim çakışması olmaz (ASTKind::Program). +// +// NEDEN enum class, neden inheritance'daki typeid kullanılmıyor? +// - typeid().name() derleyiciye bağlıdır (g++: "4Program", MSVC: "class Program"). +// - enum class her derleyicide aynıdır, string dönüşümü kolaydır. +// - static_cast ile serileştirilebilir. +// +// ============================================================================ enum class ASTKind { - Program, // Kök düğüm - FunctionDecl, // Fonksiyon tanımı - Block, // { } bloğu - VariableDecl, // Değişken tanımı - BinaryExpression, // İkili işlem (a + b) - UnaryExpression, // Tekli işlem (-a, !a) - Literal, // Sabit değer - Identifier, // İsim referansı - Postfix, // Son ek (a++) - IfStatement, // if/else - ForStatement, // for - WhileStatement, // while - DoWhileStatement, // do-while - ReturnStatement, // return - BreakStatement, // break - ContinueStatement, // continue - ExpressionStatement, // ifade + ; - Call, // Fonksiyon çağrısı f(args) - MemberAccess, // Üye erişimi a.b, a->b - IndexExpression, // Dizi erişimi a[i] - StructDecl, // struct tanımı + /* ====== En üst seviye ====== */ + Program, // Kök düğüm — tüm programı kapsar. + // İçindeki children: FunctionDecl, StructDecl, VariableDecl. + // Tüm .cpp/.sqt dosyası tek bir Program düğümüdür. + + /* ====== Tanımlar (Declarations) ====== */ + FunctionDecl, // Fonksiyon tanımı. + // children: [returnType?], [name], [params...], [body: Block] + // Örn: int main() { ... } + StructDecl, // struct tanımı. + // children: [name], [members: VariableDecl...] + // Örn: struct Point { int x; int y; }; + VariableDecl, // Değişken tanımı. + // children: [type?], [name], [initializer?] + // Örn: int x = 5; veya string name; + + /* ====== Kontrol Akışı (Statements) ====== */ + Block, // { } bloğu — birleşik ifade. + // children: [statements...] + // Kapsam (scope) oluşturur. Yerel değişkenler burada tanımlanır. + IfStatement, // if (koşul) gövde [else gövde]. + // children: [condition], [thenBranch], [elseBranch?] + ForStatement, // for (init; koşul; artım) gövde. + // children: [init?], [condition?], [increment?], [body] + WhileStatement, // while (koşul) gövde. + // children: [condition], [body] + DoWhileStatement, // do gövde while (koşul); + // children: [body], [condition] + ReturnStatement, // return [ifade?]; + // children: [value?] + BreakStatement, // break; + // children: yok. Sadece döngü/switch içinde geçerli. + ContinueStatement, // continue; + // children: yok. Sadece döngü içinde geçerli. + ExpressionStatement, // ifade + noktalı virgül (;) + // children: [expression] + // Örn: x = 5; veya foo(); + + /* ====== İfadeler (Expressions) ====== */ + BinaryExpression, // İkili işlem: sol OP sağ. + // children: [left], [right] + // OP bilgisi: exprType alanında saklanır. + UnaryExpression, // Tekli işlem: OP operand. + // children: [operand] + // prefix (++x) veya postfix (x++) olabilir. + Literal, // Sabit değer: 42, 3.14, "hello", true, null. + // children: yok. Değer düğümün kendi alanında. + Identifier, // İsim referansı: x, PI, main. + // children: yok. İsim string olarak saklanır. + Postfix, // Postfix işlem: operand++. + // children: [operand] + Call, // Fonksiyon/metot çağrısı: f(args). + // children: [callee], [args...] + MemberAccess, // Üye erişimi: a.b veya a->b. + // children: [object], [member] + IndexExpression, // Dizi/indeks erişimi: a[i]. + // children: [object], [index] }; // ============================================================================ // LiteralType — Sabit Değer Alt Tipleri // ============================================================================ +// +// Literal düğümünün hangi türde bir sabit değer taşıdığını belirler. +// uint8_t tabanlı — 256 farklı literal tipi yeterli. +// +// KULLANIM: +// Literal düğümü oluşturulurken tip belirtilir: +// Literal lit(LiteralType::INTEGER, "42"); +// +// ============================================================================ enum class LiteralType : uint8_t { - INTEGER, // Tamsayı (decimal, hex, octal, binary) - FLOAT, // Ondalıklı sayı (3.14, 1e-5) - STRING, // Metin ("hello") - BOOLEAN, // true / false - BOŞ // null + INTEGER, // Tamsayı sabiti: 42, 0xFF, 0b1010, 0777 + // Decimal, hexadecimal (0x), octal (0), binary (0b) desteklenir. + // Tokenizer NumberToken ile iletilir. + FLOAT, // Ondalıklı sayı: 3.14, 1e-5, 2.0f + // Nokta veya üs (e/E) içeren sayılar. + STRING, // Metin sabiti: "merhaba dünya" + // Çift tırnak içinde. Kaçış dizileri (\n, \t, \") desteklenir. + BOOLEAN, // Mantıksal değer: true / false + // KW_TRUE veya KW_FALSE token'ından gelir. + BOŞ // null sabiti (Türkçe "boş"). + // KW_NULL token'ından gelir. Nesne/referans türleri için kullanılır. }; +// ============================================================================ +// literalTypeToString — LiteralType'ı string'e çevir (log için) +// ============================================================================ +// +// PARAMETRE: t — LiteralType enum değeri +// DÖNÜŞ: const char* — insan tarafından okunabilir string +// KARMAŞIKLIK: O(1) — switch/case (derleyici jump table üretir) +// inline const char* literalTypeToString(LiteralType t) { switch (t) { case LiteralType::INTEGER: return "integer"; @@ -79,53 +159,119 @@ inline const char* literalTypeToString(LiteralType t) { // ============================================================================ // // Tüm AST düğümleri bu sınıftan türetilir. Her düğüm: -// - kind: Tipini bilir (ASTKind enum) -// - parent: Ebeveynine işaret eder -// - loc: Kaynak koddaki konumunu bilir -// - log(): Konsola yazdırılabilir -// - toJson: JSON olarak serileştirilebilir +// - kind: ASTKind enum — tipini bilir (switch/case için) +// - parent: Ebeveyn düğüme işaretçi (ağaçta yukarı gezinme) +// - loc: Kaynak koddaki satır/sütun konumu (hata mesajları için) +// - children: Alt düğümler (ağaçta aşağı gezinme) +// - log(): Konsola hiyerarşik yazdırma +// - toJson(): JSON formatında serileştirme +// +// KALITIM: +// Program : ASTNode — Kök düğüm +// FunctionDecl : ASTNode — Fonksiyon tanımı +// BinaryExpression : ASTNode — İkili işlem +// ... (her düğüm tipi ayrı sınıf) +// +// BELLEK YÖNETİMİ: +// Düğümler new ile oluşturulur, delete ile yok edilir. +// Sahiplik: Parser oluşturur, çağıran (main/CLI) yok eder. +// TODO(Büyük yeniden düzenleme): std::unique_ptr ile RAII. // // ============================================================================ class ASTNode { public: - ASTKind kind; - ASTNode* parent = nullptr; - SourceLocation loc; + /* ====== Her düğümün tipi ====== */ + ASTKind kind; // Düğüm tipi (Program, FunctionDecl, ...) + // switch(kind) ile tip kontrolü. + // Set edilir ve bir daha değişmez. + /* ====== Ağaç bağlantıları ====== */ + ASTNode* parent = nullptr; // Ebeveyn düğüm pointerı. + // addChild() tarafından otomatik set edilir. + // Kullanım: semantic analizde kapsam bulma. + // Örn: değişkenin tanımlandığı fonksiyonu bulmak + // için parent->parent->... şeklinde yukarı çıkılır. + + /* ====== Kaynak konumu ====== */ + SourceLocation loc; // Tokenizer'dan gelen satır/sütun bilgisi. + // Hata mesajlarında: "satır 5, sütun 12" + // TODO: Şu anda tüm düğümlerde dolu değil. + + /* ====== Sanal Metotlar ====== */ + + // log() — Düğümü ve alt düğümlerini konsola yazdırır. + // PARAMETRE: indent — girinti seviyesi (her seviyede 2 boşluk artar) + // KULLANIM: ast->log(0); // tüm ağacı yazdır + // KARMAŞIKLIK: O(n) — tüm alt ağacı dolaşır virtual void log(int indent = 0) { (void)indent; std::cout << "\n"; } + // toJson() — Düğümü ve alt düğümlerini JSON formatında döndürür. + // PARAMETRE: indent — JSON girinti seviyesi + // DÖNÜŞ: JSON stringi + // KULLANIM: std::string json = ast->toJson(0); + // KARMAŞIKLIK: O(n) — tüm alt ağacı dolaşır, string birleştirme maliyeti virtual std::string toJson(int indent = 0) { (void)indent; return "{\"kind\":\"Unknown\"}"; } + /* ====== Yardımcı Metotlar ====== */ + + // addChild() — Alt düğüm ekler ve parent pointer'ını set eder. + // PARAMETRE: child — eklenecek alt düğüm (nullptr olmamalı) + // YAN ETKİ: child->parent = this (otomatik) + // KARMAŞIKLIK: O(1) amortize — vector push_back void addChild(ASTNode* child) { children.push_back(child); child->parent = this; } + // getChildren() — Alt düğüm vektörüne erişim. + // DÖNÜŞ: std::vector& — çocuk düğümler listesi + // KARMAŞIKLIK: O(1) — referans döndürür std::vector& getChildren() { return children; } + + // ~ASTNode() — Sanal yıkıcı (polimorfik silme için) + // delete ASTNode* yapıldığında doğru alt sınıf yıkıcısı çağrılır. + // Bu olmazsa türetilmiş sınıfların kaynakları sızdırılır. virtual ~ASTNode() = default; protected: + // children — Alt düğümlerin vektörü. + // protected: doğrudan erişim yerine addChild/getChildren kullanılır. + // Türetilmiş sınıflar erişebilir (ör: log() içinde çocukları gezme). std::vector children; }; // ============================================================================ // childrenToJson — Düğümün çocuklarını JSON array olarak yaz // ============================================================================ - +// +// Bir düğümün tüm alt düğümlerini dolaşır ve her birinin toJson() çıktısını +// virgülle ayrılmış şekilde birleştirir. +// +// PARAMETRELER: +// node — çocukları yazdırılacak düğüm +// depth — JSON girinti seviyesi +// +// DÖNÜŞ: JSON array içeriği (köşeli parantezler HARİÇ) +// +// KULLANIM: +// std::string json = childrenToJson(this, depth + 1); +// +// KARMAŞIKLIK: O(n) — n = çocuk sayısı +// inline std::string childrenToJson(ASTNode* node, int depth) { std::ostringstream ss; std::string in = jsonIndent(depth); auto& ch = node->getChildren(); for (size_t i = 0; i < ch.size(); i++) { ss << ch[i]->toJson(depth); - if (i + 1 < ch.size()) ss << ","; + if (i + 1 < ch.size()) ss << ","; // son elemandan sonra virgül yok ss << "\n"; } return ss.str(); diff --git a/src/parser/token.hpp b/src/parser/token.hpp index d05eee9..bb6d131 100644 --- a/src/parser/token.hpp +++ b/src/parser/token.hpp @@ -1,65 +1,43 @@ // ============================================================================ -// saQut Compiler — Parser Token Tipleri ve Operatör Öncelik Tablosu +// saQut Compiler — Parser Token Tipleri, Operatör Öncelik Tablosu ve ParserToken // ============================================================================ // // DİZİN: src/parser/token.hpp -// KATMAN: Katman 3 — Tokenizer ile Parser arasında köprü -// BAĞIMLI: Tokenizer (src/tokenizer/tokenizer.hpp) -// KULLANAN: AST (src/parser/ast.hpp), Parser (src/parser/parser.hpp) +// KATMAN: Katman 3 — Tokenizer ile Parser Arasında Köprü +// AMAÇ: Tokenizer'ın ham token'larını anlamsal tiplere dönüştürmek, +// operatör öncelik ve birleşme kurallarını merkezi olarak tanımlamak // -// AMAÇ: -// Tokenizer'ın ürettiği ham Token'ları (string tipli) Parser'ın anlayacağı -// anlamsal tiplere (TokenType enum) dönüştürür. Ayrıca operatör önceliğini -// (precedence) ve birleşme yönünü (associativity) merkezi olarak tanımlar. +// BAĞIMLILIKLAR: +// - tokenizer/tokenizer.hpp: Token sınıf hiyerarşisi (Token, NumberToken, vs.) +// - KULLANAN: parser/ast.hpp, parser/parser.hpp // -// Bu dosya, Pratt parser'ın "kalbi"dir — tüm operatör önceliği ve birleşme -// kuralları burada tek bir yerde tanımlanır. +// BU DOSYANIN İÇERDİKLERİ: +// 1. TokenType enum (uint16_t): 100+ token tipi (keyword'ler, operatörler, delimiter'lar) +// 2. KEYWORD_MAP: string → TokenType (keyword çözümleme) +// 3. OPERATOR_MAP: string → TokenType (operatör çözümleme) +// 4. OPERATOR_MAP_REV: TokenType → string (log çıktısı için ters harita) +// 5. OPERATOR_MAP_STRREV: TokenType → string (enum ismi, debug için) +// 6. TokenPrecedence(): Öncelik tablosu (18 seviye, Pratt parser'ın kalbi) +// 7. RightAssociative(): Sağ birleşme kontrolü (atama, üs, ternary) +// 8. ParserToken: Parser'ın kullandığı token yapısı (Token* + TokenType) // -// ADR-002: Neden Merkezi Operatör Öncelik Tablosu? -// Recursive descent parser'larda operatör önceliği, her seviye için ayrı -// bir fonksiyon yazılarak (parseAddExpr, parseMulExpr, ...) kod tekrarına -// neden olur. Yeni bir operatör eklemek için yeni fonksiyon + mevcut -// fonksiyonları değiştirmek gerekir. +// TASARIM KARARLARI (ADR-002): +// Neden TokenType enum'ı burada tanımlı, Tokenizer'da değil? +// -> Tokenizer sadece ham token'lar üretir. Anlamsal tipler Parser'ın işidir. +// -> Tokenizer'ın Tokenizer'ın ham yapısını değiştirmeden yeni diller eklenebilir. // -// Pratt parser'da tüm öncelik bilgisi TEK BİR TABLODA (TokenPrecedence) -// toplanır. Yeni operatör eklemek = tabloya bir satır eklemek. +// Neden uint16_t tabanlı enum? +// -> 65K token tipi fazlasıyla yeterli. 2 byte = bellek tasarrufu. +// -> Her AST düğümünde TokenType saklanabilir (opsiyonel). // -// TASARIM KARARLARI: -// 1. TokenType enum: uint16_t tabanlı. Neden? 65K'dan fazla token tipi -// olmayacak, 2 byte yeterli. Bellek tasarrufu AST'de fark eder. +// Neden dört ayrı map? +// -> unordered_map tek yönlüdür. Her yön için ayrı map gerekir. +// -> OPERATOR_MAP_REV: log çıktısında "+" göstermek için. +// -> OPERATOR_MAP_STRREV: enum ismini string olarak (debug, AST dump). // -// 2. Üç harita (KEYWORD_MAP, OPERATOR_MAP, OPERATOR_MAP_REV, OPERATOR_MAP_STRREV): -// - KEYWORD_MAP: "if" → KW_IF, string'den TokenType'a -// - OPERATOR_MAP: "+" → PLUS, operatör string'inden TokenType'a -// - OPERATOR_MAP_REV: PLUS → "+", log çıktısı için ters harita -// - OPERATOR_MAP_STRREV: PLUS → "PLUS", enum ismini string olarak verir -// Neden dört harita? Çünkü std::unordered_map tek yönlüdür. -// bidirectional_map kütüphanesi kullanılabilirdi ama bağımlılık istemedik. -// -// 3. TokenPrecedence(): 18 seviyeli öncelik sistemi. -// C/C++/Java standartlarına uygun. Yüksek sayı = yüksek öncelik. -// Seviye 18 (en yüksek): üye erişimi (., ->, [], (), ::) -// Seviye 1 (en düşük): virgül (,) -// Seviye 0: önceliksiz (değerler, EOF, vb.) -// -// 4. RightAssociative(): Hangi operatörler sağdan sola birleşir? -// - Atama (=, +=, vb.) -// - Üs alma (**, ^) — matematiksel sağ birleşme: a^b^c = a^(b^c) -// - Ternary (?:) -// Diğer tüm operatörler soldan sağa birleşir. -// -// 5. ParserToken yapısı: -// Token* token: Tokenizer'ın ürettiği Token'a pointer. Değer kopyası -// DEĞİL. Neden pointer? Çünkü Token polimorfik (NumberToken, StringToken, -// vb.) ve değer kopyası object slicing'e neden olur. -// BUG FIX (commit 40579ca): Eskiden Token token (değer) vardı. -// TokenType type: Token'ın anlamsal tipi. -// is() / getPowerOperator() / isRightAssociative(): kolaylık metotları. -// -// BİLİNEN SINIRLAMALAR (TODO): -// TODO: Özel operatörler: ?., ??, |>, >>=, vb. (ileride eklenebilir) -// TODO: Kullanıcı tanımlı operatör önceliği (DSL'ler için) -// TODO: Token konum bilgisi (satır/sütun) ParserToken'a eklenmeli +// Neden bu kadar çok keyword? +// -> saQut hem C/C++ hem Java hem de kendi sözdizimini destekler. +// -> Tüm keyword'ler tek enum'da toplanmıştır. // // ============================================================================ @@ -107,185 +85,334 @@ typedef std::vector TokenList; // NEDEN uint16_t? Bellek optimizasyonu. Her AST düğümü bir TokenType taşır. // Binlerce düğümde 2 byte vs 4 byte fark eder. // +/* ================================================================ + * TokenType — Anlamsal Token Tipleri + * ================================================================ + * + * Tokenizer'ın ürettiği ham token'ları (string tipli) Parser'ın + * anlayacağı anlamsal tiplere dönüştürür. + * + * uint16_t tabanlı — 65K token tipi yeterli. + * Bellek: AST düğümlerinde taşınabilir (2 byte). + * + * KATEGORİLER (öncelik sırasına göre): + * 1. Değerler: IDENTIFIER, NUMBER, STRING, SVR_VOID + * 2. Keyword'ler: KW_IF ... KW_NOEXCEPT (C/C++/Java ortak) + * 3. Operatörler: DOT(18) ... COMMA(1) (Pratt öncelik seviyesi) + * 4. Delimiter'lar: LBRACE, RBRACE, SEMICOLON, vb. + * 5. Özel: END_OF_FILE, UNKNOWN, COMMENT, PREPROCESSOR + * + * ================================================================ */ enum class TokenType : uint16_t { - // --- Değerler ve Tanımlayıcılar --- - IDENTIFIER, // değişken/fonksiyon ismi - NUMBER, // 42, 0xFF, 0b1010, 3.14 - STRING, // "merhaba" - SVR_VOID, // Geçersiz/EOF sinyali (Parser içinde kullanılır) + /* ====== Değerler ve Tanımlayıcılar ====== */ + IDENTIFIER, // Değişken/fonksiyon/sınıf ismi. + // Tokenizer'da IdentifierToken olarak üretilir. + // Örn: x, main, Point, calculateAverage + NUMBER, // Sayısal sabit: 42, 0xFF, 0b1010, 3.14, 1e-5 + // Tokenizer'da NumberToken olarak üretilir. + // .isFloat alanı ile tamsayı/ondalık ayrımı yapılır. + STRING, // Metin sabiti: "merhaba", "selam" + // Tokenizer'da StringToken olarak üretilir. + // Kaçış dizileri (\n, \t, \") tokenizer'da çözülür. + SVR_VOID, // Geçersiz/EOF sinyali. + // Parser içinde kullanılır. Tokenizer ÜRETMEZ. + // currentToken() geçersiz indeks gösterdiğinde döner. - // --- Kontrol Akışı Keyword'leri --- - KW_IF, // if - KW_ELSE, // else - KW_FOR, // for - KW_WHILE, // while - KW_DO, // do - KW_SWITCH, // switch - KW_CASE, // case - KW_DEFAULT, // default - KW_BREAK, // break - KW_CONTINUE, // continue - KW_RETURN, // return + /* ====== Kontrol Akışı Keyword'leri ====== */ + KW_IF, // if (koşullu dal) + // Sözdizimi: if (koşul) gövde [else gövde] + KW_ELSE, // else (if'in alternatif dalı) + // Sözdizimi: if (...) ... else ... + // Parser'da if'ten sonra else opsiyoneldir. + KW_FOR, // for (tekrarlı döngü) + // Sözdizimi: for (init; koşul; artım) gövde + KW_WHILE, // while (koşullu döngü) + // Sözdizimi: while (koşul) gövde + KW_DO, // do (en az bir kez çalışan döngü) + // Sözdizimi: do gövde while (koşul); + KW_SWITCH, // switch (çoklu dal — henüz implemente edilmedi) + KW_CASE, // case (switch dalı — henüz implemente edilmedi) + KW_DEFAULT, // default (switch varsayılan — henüz implemente edilmedi) + KW_BREAK, // break (döngü/switch'ten çık) + // Sadece döngü veya switch içinde geçerlidir. + KW_CONTINUE, // continue (döngünün bir sonraki iterasyonuna geç) + // Sadece döngü içinde geçerlidir. + KW_RETURN, // return (fonksiyondan dön) + // İsteğe bağlı dönüş değeri: return expr; - // --- OOP Keyword'leri --- - KW_CLASS, // class - KW_STRUCT, // struct - KW_INTERFACE, // interface - KW_ENUM, // enum - KW_EXTENDS, // extends - KW_IMPLEMENTS, // implements - KW_NEW, // new - KW_PUBLIC, // public - KW_PRIVATE, // private - KW_PROTECTED, // protected - KW_STATIC, // static - KW_FINAL, // final - KW_ABSTRACT, // abstract + /* ====== OOP Keyword'leri ====== */ + KW_CLASS, // class (sınıf tanımı — Java/C++ tarzı) + KW_STRUCT, // struct (yapı tanımı — C tarzı) + // saQut'ta class ve struct ikisi de desteklenir. + KW_INTERFACE, // interface (soyut tip — Java tarzı) + KW_ENUM, // enum (sabit listesi — C/C++/Java tarzı) + KW_EXTENDS, // extends (kalıtım — Java tarzı) + KW_IMPLEMENTS, // implements (interface gerçekleme — Java tarzı) + KW_NEW, // new (nesne oluşturma — Java/C++ tarzı) + KW_PUBLIC, // public (erişim belirteci) + KW_PRIVATE, // private (erişim belirteci) + KW_PROTECTED, // protected (erişim belirteci — alt sınıflara açık) + KW_STATIC, // static (sınıf üyesi / dosya içi bağlantı) + KW_FINAL, // final (değiştirilemez — Java tarzı) + KW_ABSTRACT, // abstract (soyut sınıf/metot — Java tarzı) - // --- Tip Keyword'leri --- - KW_VOID, // void - KW_BOOL, // bool - KW_INT, // int - KW_FLOAT_TYPE, // float (FLOAT math.h'de tanımlı olabilir, TYPE eki var) - KW_DOUBLE, // double - KW_CHAR, // char - KW_STRING_TYPE, // string + /* ====== Tip Keyword'leri ====== */ + KW_VOID, // void (değer döndürmeyen fonksiyon / tip yok) + // C/C++/Java uyumluluğu için. + KW_BOOL, // bool (mantıksal tip: true/false) + // C++ bool ile aynı. + KW_INT, // int (tamsayı tipi: 32-bit işaretli) + // Varsayılan tamsayı tipi. + KW_FLOAT_TYPE, // float (32-bit ondalıklı sayı) + // FLOAT_MATH hatasından kaçınmak için _TYPE eki. + // math.h'deki float tanımıyla çakışmaz. + KW_DOUBLE, // double (64-bit ondalıklı sayı) + KW_CHAR, // char (8-bit karakter) + // Tek tırnak içindeki karakterler için: 'A' + KW_STRING_TYPE, // string (metin tipi) + // string.h'daki string işlevleriyle çakışmaz. - // --- Literal Keyword'ler --- - KW_TRUE, // true - KW_FALSE, // false - KW_NULL, // null + /* ====== Literal Keyword'ler ====== */ + KW_TRUE, // true (mantıksal doğru sabiti) + // Boolean literal: if (true) { ... } + KW_FALSE, // false (mantıksal yanlış sabiti) + // Boolean literal: while (false) { ... } + KW_NULL, // null (boş referans sabiti) + // Pointer/referans tipleri için: Object obj = null; - // --- İstisna Yönetimi --- - KW_TRY, // try - KW_CATCH, // catch - KW_FINALLY, // finally - KW_THROW, // throw - KW_THROWS, // throws - KW_ASSERT, // assert + /* ====== İstisna Yönetimi ====== */ + KW_TRY, // try (istisna deneme bloğu — Java/C++ tarzı) + // Sözdizimi: try { ... } catch (Ex e) { ... } + KW_CATCH, // catch (istisna yakalama bloğu) + KW_FINALLY, // finally (her durumda çalışan blok — Java tarzı) + KW_THROW, // throw (istisna fırlatma — C++/Java tarzı) + // Sözdizimi: throw new Exception("hata"); + KW_THROWS, // throws (metot imzasında istisna bildirimi — Java) + KW_ASSERT, // assert (debug assertions — C/Java tarzı) - // --- Modül/Paket --- - KW_IMPORT, // import - KW_PACKAGE, // package + /* ====== Modül/Paket ====== */ + KW_IMPORT, // import (modül içe aktarma — Java/Python tarzı) + // Sözdizimi: import java.util.List; + KW_PACKAGE, // package (modül bildirimi — Java tarzı) + // Sözdizimi: package com.saqut.compiler; - // --- C/C++ Ekleri --- - KW_NATIVE, // native (JNI) - KW_SYNCHRONIZED, // synchronized (Java) - KW_VOLATILE, // volatile - KW_TRANSIENT, // transient - KW_CONST, // const - KW_EXTERN, // extern - KW_TYPEDEF, // typedef - KW_SIZEOF, // sizeof - KW_ALIGNOF, // alignof - KW_DECLTYPE, // decltype - KW_AUTO, // auto - KW_CONSTEXPR, // constexpr - KW_NOEXCEPT, // noexcept + /* ====== C/C++ Ekleri ====== */ + KW_NATIVE, // native (yerel kod bildirimi — JNI) + // Java native metotları için. + KW_SYNCHRONIZED, // synchronized (iş parçacığı senkronizasyonu — Java) + KW_VOLATILE, // volatile (derleyici optimizasyonunu engelle — C/C++/Java) + KW_TRANSIENT, // transient (serileştirmeyi atla — Java) + KW_CONST, // const (değişmez değer — C/C++ tarzı) + // Örn: const int MAX = 100; + KW_EXTERN, // extern (harici bağlantı — C/C++ tarzı) + KW_TYPEDEF, // typedef (tip takma adı — C/C++ tarzı) + KW_SIZEOF, // sizeof (tip/boyut sorgulama — C/C++ tarzı) + // Sözdizimi: sizeof(int) veya sizeof x + KW_ALIGNOF, // alignof (hizalama sorgulama — C++11) + KW_DECLTYPE, // decltype (ifade tipi çıkarımı — C++11) + KW_AUTO, // auto (otomatik tip çıkarımı — C++11) + KW_CONSTEXPR, // constexpr (derleme zamanı sabiti — C++11) + KW_NOEXCEPT, // noexcept (istisna fırlatmayan bildirimi — C++11) - // ================================================================ - // Operatörler — Öncelik sırasına göre gruplanmış - // ================================================================ + /* ================================================================ + * Operatörler — Öncelik sırasına göre gruplanmış + * + * Her operatörün yanında Pratt parser öncelik seviyesi yazılıdır. + * Yüksek sayı = daha sıkı bağlanma (önce işlenir). + * + * Seviye 18 (en yüksek): Üye erişimi ve çağrı + * Seviye 17: Postfix ++ -- + * Seviye 16: Unary prefix + - ! ~ + * Seviye 15: Üs alma ** ^ + * Seviye 14: Çarpma/Bölme * / % + * Seviye 13: Toplama/Çıkarma + - + * Seviye 12: Bitsel kaydırma << >> + * Seviye 11: İlişkisel < <= > >= + * Seviye 10: Eşitlik == != + * Seviye 9: Bitsel VE & + * Seviye 8: Bitsel XOR ^ (CARET üs olarak 15'te) + * Seviye 7: Bitsel VEYA | + * Seviye 6: Mantıksal VE && + * Seviye 5: Mantıksal VEYA || + * Seviye 4: Ternary ? + * Seviye 3: Ternary else : + * Seviye 2: Atama = += -= vb. + * Seviye 1 (en düşük): Virgül , + * ================================================================ */ - // Seviye 1 (18): Üye erişimi ve çağrı — En yüksek öncelik - DOT, // . - ARROW, // -> - LBRACKET, // [ - RBRACKET, // ] - LPAREN, // ( - RPAREN, // ) + // Seviye 18: Üye erişimi ve çağrı — En yüksek öncelik + DOT, // . (üye erişimi) — obj.field + // Öncelik 18. En sıkı bağlanan operatör. + ARROW, // -> (pointer üye erişimi) — ptr->field + // C++ tarzı. Öncelik 18. + LBRACKET, // [ (dizi/indeks erişimi başlangıcı) — a[i] + // Açılış köşeli parantez. Öncelik 18. + RBRACKET, // ] (dizi/indeks erişimi bitişi) — a[i] + // Kapanış köşeli parantez. Tek başına kullanılmaz. + LPAREN, // ( (fonksiyon çağrısı/grouping başlangıcı) + // İki anlamı: f(args) çağrı, (expr) gruplama. + // Öncelik 18. + RPAREN, // ) (fonksiyon çağrısı/grouping bitişi) + // Kapanış parantez. Tek başına kullanılmaz. - // Seviye 2 (17): Postfix - PLUS_PLUS, // ++ (postfix) - MINUS_MINUS, // -- (postfix) + // Seviye 17: Postfix — Soldaki ifadeye sonradan uygulanan operatörler + PLUS_PLUS, // ++ (postfix artım) — x++ + // Önce x'in değerini döndür, sonra artır. + // Öncelik 17. Sağ birleşmeli DEĞİL. + MINUS_MINUS, // -- (postfix azaltım) — x-- + // Önce x'in değerini döndür, sonra azalt. + // Öncelik 17. - // Seviye 3 (16): Unary Prefix - PLUS, // + (unary) - MINUS, // - (unary) - BANG, // ! (mantıksal değil) - TILDE, // ~ (bitsel değil) + // Seviye 16: Unary Prefix — Sağındaki ifadeye uygulanan tekli operatörler + PLUS, // + (unary plus / binary toplama) + // Unary: +x (pozitif işareti, genelde etkisiz). + // Binary: a + b (toplama, öncelik 13). + // Hangi anlamda kullanıldığı parse bağlamında belirlenir. + MINUS, // - (unary minus / binary çıkarma) + // Unary: -x (negatif yap). + // Binary: a - b (çıkarma, öncelik 13). + BANG, // ! (mantıksal değil) — !x + // Örn: if (!flag) { ... } + // Sadece prefix. Öncelik 16. + TILDE, // ~ (bitsel değil) — ~x + // Bitwise NOT. Sadece prefix. Öncelik 16. - // Seviye 4 (15): Üs alma - STAR_STAR, // ** (Python tarzı üs) - CARET, // ^ (bazı dillerde üs) + // Seviye 15: Üs alma — Sağ birleşmeli + STAR_STAR, // ** (üs alma) — a ** b = a^b + // Python tarzı. Öncelik 15. Sağ birleşmeli. + // 2 ** 3 ** 2 = 2 ** (3 ** 2) = 512 + CARET, // ^ (üs alma veya bitsel XOR) + // saQut'ta varsayılan: üs alma (öncelik 15). + // C/C++'da XOR (öncelik 8) — bağlama göre değişebilir. - // Seviye 5 (14): Çarpma/Bölme - STAR, // * - SLASH, // / - PERCENT, // % + // Seviye 14: Çarpma/Bölme — Sol birleşmeli + STAR, // * (çarpma) — a * b + // Öncelik 14. + SLASH, // / (bölme) — a / b + // Tamsayı bölmesi: int / int = int. + // Ondalık bölme: float / float = float. + PERCENT, // % (mod alma) — a % b + // Sadece tamsayılar için. - // Seviye 6 (13): Toplama/Çıkarma — PLUS ve MINUS yukarıda (unary + binary) - // Seviye 7 (12): Bitsel kaydırma - LSHIFT, // << - RSHIFT, // >> + // Seviye 13: Toplama/Çıkarma + // PLUS ve MINUS yukarıda tanımlandı (hem unary 16 hem binary 13). + // Pratt parser bağlama göre doğru önceliği kullanır. - // Seviye 8 (11): İlişkisel karşılaştırma - LESS, // < - LESS_EQUAL, // <= - GREATER, // > - GREATER_EQUAL, // >= + // Seviye 12: Bitsel kaydırma + LSHIFT, // << (sola kaydırma) — a << b + // a * 2^b. Öncelik 12. + RSHIFT, // >> (sağa kaydırma) — a >> b + // a / 2^b (işaretli: arithmetic, işaretsiz: logical). - // Seviye 9 (10): Eşitlik - EQUAL_EQUAL, // == - BANG_EQUAL, // != + // Seviye 11: İlişkisel karşılaştırma + LESS, // < (küçüktür) — a < b + // true/false döndürür. + LESS_EQUAL, // <= (küçük eşittir) — a <= b + GREATER, // > (büyüktür) — a > b + GREATER_EQUAL, // >= (büyük eşittir) — a >= b - // Seviye 10 (9): Bitsel VE - AMPERSAND, // & + // Seviye 10: Eşitlik + EQUAL_EQUAL, // == (eşittir) — a == b + // Değer eşitliği. Öncelik 10. + BANG_EQUAL, // != (eşit değildir) — a != b - // Seviye 11 (8): Bitsel XOR — CARET yukarıda (üs veya XOR) + // Seviye 9: Bitsel VE + AMPERSAND, // & (bitsel VE) — a & b + // Bitwise AND. Öncelik 9. - // Seviye 12 (7): Bitsel VEYA - PIPE, // | + // Seviye 8: Bitsel XOR + // ^ (CARET) yukarıda (üs olarak seviye 15'te). + // Gelecekte XOR için ayrı token eklenebilir. - // Seviye 13 (6): Mantıksal VE - AMPERSAND_AMPERSAND, // && + // Seviye 7: Bitsel VEYA + PIPE, // | (bitsel VEYA) — a | b + // Bitwise OR. Öncelik 7. - // Seviye 14 (5): Mantıksal VEYA - PIPE_PIPE, // || + // Seviye 6: Mantıksal VE + AMPERSAND_AMPERSAND, // && (mantıksal VE) — a && b + // Kısa devre (short-circuit): a false ise b değerlendirilmez. + // Öncelik 6. - // Seviye 15 (4): Üçlü koşul (ternary) - TERNARY, // ? - COLON, // : (ternary ve etiket için) + // Seviye 5: Mantıksal VEYA + PIPE_PIPE, // || (mantıksal VEYA) — a || b + // Kısa devre: a true ise b değerlendirilmez. + // Öncelik 5. - // Seviye 16 (3): Atama - EQUAL, // = - PLUS_EQUAL, // += - MINUS_EQUAL, // -= - STAR_EQUAL, // *= - SLASH_EQUAL, // /= - PERCENT_EQUAL, // %= - AMPERSAND_EQUAL, // &= - PIPE_EQUAL, // |= - CARET_EQUAL, // ^= - LSHIFT_EQUAL, // <<= - RSHIFT_EQUAL, // >>= + // Seviye 4: Üçlü koşul (ternary) — Sağ birleşmeli + TERNARY, // ? (ternary if) — a ? b : c + // Öncelik 4. Sağ birleşmeli. + // a ? b : c ? d : e = a ? b : (c ? d : e) + COLON, // : (ternary else / etiket) — ternary'in ikinci kısmı + // Ternary'de öncelik 3 (0 değil!). + // Ayrıca switch/case etiketleri için de kullanılır. - // --- Diğer Semboller --- - LBRACE, // { - RBRACE, // } - SEMICOLON, // ; - COMMA, // , - COLON_COLON, // :: + // Seviye 2: Atama — Sağ birleşmeli + EQUAL, // = (basit atama) — a = b + // Öncelik 2. Sağ birleşmeli. + // a = b = 5 = a = (b = 5) + PLUS_EQUAL, // += (topla ve ata) — a += b → a = a + b + MINUS_EQUAL, // -= (çıkar ve ata) — a -= b → a = a - b + STAR_EQUAL, // *= (çarp ve ata) — a *= b → a = a * b + SLASH_EQUAL, // /= (böl ve ata) — a /= b → a = a / b + PERCENT_EQUAL, // %= (mod al ve ata) — a %= b → a = a % b + AMPERSAND_EQUAL, // &= (bitsel VE ve ata) — a &= b → a = a & b + PIPE_EQUAL, // |= (bitsel VEYA ve ata) — a |= b → a = a | b + CARET_EQUAL, // ^= (XOR ve ata) — a ^= b → a = a ^ b + LSHIFT_EQUAL, // <<= (sola kaydır ve ata) — a <<= b → a = a << b + RSHIFT_EQUAL, // >>= (sağa kaydır ve ata) — a >>= b → a = a >> b - // --- Özel --- - END_OF_FILE, // Dosya sonu - UNKNOWN, // Bilinmeyen karakter - COMMENT, // Yorum (// veya /* */) — şu anda token üretilmez - PREPROCESSOR, // Önişlemci (#) — şu anda kullanılmıyor + /* ====== Diğer Semboller ====== */ + LBRACE, // { (açılış süslü parantez) — blok başlangıcı + // Sözdizimi: { statement1; statement2; } + RBRACE, // } (kapanış süslü parantez) — blok bitişi + SEMICOLON, // ; (noktalı virgül) — ifade sonu belirteci + // C/C++/Java tarzında her ifade ; ile biter. + COMMA, // , (virgül) — ifade ayırıcı + // Örn: int a, b, c; veya f(1, 2, 3) + // Öncelik 1 (en düşük). + COLON_COLON, // :: (kapsam çözümleme) — Class::method + // C++ tarzı. Şu anda sadece token tanımlı, parse yok. + + /* ====== Özel Token'lar ====== */ + END_OF_FILE, // Dosya sonu belirteci. + // Tokenizer dosya sonuna gelindiğinde üretir. + // Parser'ın durma koşuludur. + UNKNOWN, // Bilinmeyen/tanınamayan karakter. + // Tokenizer'ın çözemediği her şey. + // Hata raporlamada kullanılır. + COMMENT, // Yorum token'ı (// veya /* */). + // ŞU ANDA TOKEN ÜRETİLMEZ — tokenizer yorumları atlar. + // Gelecekte belge yorumları (///, /** */) için kullanılabilir. + PREPROCESSOR, // Önişlemci direktifi (#). + // ŞU ANDA KULLANILMIYOR — C önişlemcisi yok. + // Gelecekte #include, #define için. }; // ============================================================================ -// KEYWORD_MAP — Keyword String → TokenType +// KEYWORD_MAP — Keyword String → TokenType Dönüşüm Haritası // ============================================================================ // -// Tokenizer'ın ürettiği KeywordToken'ların token değerini (örn: "if") -// Parser'ın anlayacağı TokenType'a (KW_IF) dönüştürür. +// AMAÇ: Tokenizer'ın ürettiği KeywordToken'ların token değerini (örn: "if") +// Parser'ın anlayacağı TokenType'a (KW_IF) dönüştürür. // -// std::unordered_map: O(1) ortalama arama. const: derleme zamanı sabiti. -// std::string_view: string kopyalamadan kaçınır. +// ANAHTAR: std::string_view — keyword string'i (kopyalanmaz, salt okunur) +// DEĞER: TokenType — Parser'ın anlayacağı anlamsal tip // -// NOT: Bu harita, Tokenizer'daki keywords[] dizisi ile eşleşmelidir. -// Birinde ekleme yapılırsa diğerine de eklenmelidir. +// VERİ YAPISI: std::unordered_map +// - O(1) ortalama arama süresi +// - constexpr: derleme zamanı sabiti (derleyici tabloya gömer) +// - std::string_view: string kopyalamadan kaçınır (performans) +// +// BOYUT: ~60 girdi (tüm keyword'ler) +// NEDEN unordered_map, neden map değil? +// - Arama sıklığı: her token için bir kez +// - unordered_map O(1) vs map O(log n) — fark küçük ama var +// - Sıralı erişim gerekmez +// +// SENKRONİZASYON UYARISI: +// Bu harita, Tokenizer'daki keywords[] dizisi İLE EŞLEŞMELİDİR. +// Birinde ekleme yapılırsa diğerine de eklenmelidir. +// TODO: İki listeyi ortak bir kaynaktan üretecek bir makro/kod üreteci. // inline const std::unordered_map KEYWORD_MAP = { // --- Control flow --- @@ -359,16 +486,30 @@ inline const std::unordered_map KEYWORD_MAP = { }; // ============================================================================ -// OPERATOR_MAP — Operatör/Delimiter String → TokenType +// OPERATOR_MAP — Operatör/Delimiter String → TokenType Dönüşüm Haritası // ============================================================================ // -// Tokenizer'ın ürettiği OperatorToken ve DelimiterToken'ları TokenType'a -// dönüştürür. Her iki token tipi de aynı haritayı kullanır çünkü parser -// seviyesinde delimiter'lar da operatör gibi işlenir. +// AMAÇ: Tokenizer'ın ürettiği OperatorToken ve DelimiterToken'ları TokenType'a +// dönüştürür. Her iki token tipi de aynı haritayı kullanır çünkü +// Parser seviyesinde delimiter'lar da operatör gibi işlenir. // -// SIRALAMA ÖNEMLİ DEĞİL (unordered_map). -// Ama Tokenizer'daki operators[] ve delimiters[] dizilerindeki sıralama -// önemlidir — çok karakterliler önce gelmelidir. +// ANAHTAR: std::string_view — operatör/delimiter string'i (örn: "+", "->", "{") +// DEĞER: TokenType — Parser'ın anlayacağı anlamsal tip +// +// VERİ YAPISI: std::unordered_map +// - O(1) ortalama arama +// - const: derleme zamanı sabiti +// - Boyut: ~40 girdi +// +// NEDEN İKİ AYRI HARİTA DEĞİL (operator + delimiter)? +// - Parser seviyesinde fark yok: {, }, ; hepsi operatör gibi işlenir. +// - Tek harita = tek arama = daha basit kod. +// +// SIRALAMA UYARISI: +// Bu haritada sıralama önemli DEĞİL (unordered_map). +// ANCAK Tokenizer'daki operators[] ve delimiters[] dizilerindeki +// sıralama ÖNEMLİDİR — çok karakterliler önce gelmelidir! +// Örn: "->" önce, "-" sonra kontrol edilmelidir. // inline const std::unordered_map OPERATOR_MAP = { // --- 2 karakterli --- @@ -428,12 +569,21 @@ inline const std::unordered_map OPERATOR_MAP = { }; // ============================================================================ -// OPERATOR_MAP_REV — TokenType → Operatör String (Log için) +// OPERATOR_MAP_REV — TokenType → Operatör String (Log/Görüntüleme İçin) // ============================================================================ // -// AST ağacını konsola yazdırırken (log) TokenType enum değerini insan -// tarafından okunabilir operatör sembolüne dönüştürür. -// Örn: TokenType::PLUS → "+" +// AMAÇ: TokenType enum değerini insan tarafından okunabilir operatör +// sembolüne dönüştürür. Log çıktısı ve hata mesajları için kullanılır. +// +// ANAHTAR: TokenType — enum değeri (örn: TokenType::PLUS) +// DEĞER: std::string_view — operatör sembolü (örn: "+") +// +// KULLANIM: +// auto it = OPERATOR_MAP_REV.find(type); +// if (it != OPERATOR_MAP_REV.end()) std::cout << it->second; +// +// NOT: TokenType::IDENTIFIER, NUMBER, STRING, KW_* ve özel token'lar +// bu haritada YOKTUR (operatör değiller). Onlar için ayrı dönüşüm gerekir. // inline const std::unordered_map OPERATOR_MAP_REV = { {TokenType::ARROW, "->"}, @@ -486,11 +636,24 @@ inline const std::unordered_map OPERATOR_MAP_REV = }; // ============================================================================ -// OPERATOR_MAP_STRREV — TokenType → Enum İsmi (Log için) +// OPERATOR_MAP_STRREV — TokenType → Enum İsmi (Debug/Log İçin) // ============================================================================ // -// AST log çıktısında operatörün enum ismini gösterir. -// Örn: TokenType::PLUS → "PLUS" +// AMAÇ: AST log çıktısında operatörün enum ismini (string olarak) gösterir. +// OPERATOR_MAP_REV'den farkı: sembol yerine enum adı döndürür. +// +// KULLANIM: +// AST dump/debug çıktısı: TokenPrecedence(PLUS) yerine "PLUS(13)" gösterimi. +// +// ANAHTAR: TokenType — enum değeri (örn: TokenType::PLUS) +// DEĞER: std::string_view — enum ismi (örn: "PLUS") +// +// ÖRN: TokenType::PLUS → "PLUS" +// TokenType::PLUS_EQUAL → "PLUS_EQUAL" +// +// NOT: İki harita da (REV ve STRREV) aynı anahtarları içerir ama farklı değerler. +// REV: "+" (operatör sembolü) +// STRREV: "PLUS" (enum ismi) // inline const std::unordered_map OPERATOR_MAP_STRREV = { {TokenType::ARROW, "ARROW"}, @@ -543,40 +706,50 @@ inline const std::unordered_map OPERATOR_MAP_STRREV }; // ============================================================================ -// TokenPrecedence — Operatör Öncelik Tablosu +// TokenPrecedence — Operatör Öncelik Tablosu (Pratt Parser'ın Kalbi) // ============================================================================ // -// Pratt parser'ın kalbi. Her TokenType için bir öncelik seviyesi döndürür. -// Yüksek sayı = daha sıkı bağlanma (daha yüksek öncelik). +// AMAÇ: Her TokenType için bir öncelik seviyesi döndürür. +// Yüksek sayı = daha sıkı bağlanma (önce işlenir). +// +// PARAMETRE: type — sorgulanan token tipi +// DÖNÜŞ: uint16_t — öncelik seviyesi (0-18) +// KARMAŞIKLIK: O(1) — switch/case (derleyici jump table üretir) +// +// KULLANIM: +// uint16_t prec = TokenPrecedence(current.type); +// if (prec >= minPrec) { parseLeftDenotation(left); } // // ÖNCELİK SEVİYELERİ (yüksekten düşüğe): -// 18: Üye erişimi . -> [ ] ( ) +// 18: Üye erişimi . -> [ ] ( ) — En yüksek // 17: Postfix ++ -- -// 16: Unary prefix ! ~ -// 15: Üs alma ** ^ +// 16: Unary prefix ! ~ + - +// 15: Üs alma ** ^ — Sağ birleşmeli // 14: Çarpma/Bölme * / % // 13: Toplama/Çıkarma + - // 12: Bitsel kaydırma << >> // 11: İlişkisel < <= > >= // 10: Eşitlik == != // 9: Bitsel VE & -// 8: Bitsel XOR ^ (üs olarak 15'te de var — bağlama göre) +// 8: Bitsel XOR ^ (şu anda üs olarak 15'te) // 7: Bitsel VEYA | // 6: Mantıksal VE && // 5: Mantıksal VEYA || // 4: Ternary ? // 3: Ternary else : -// 2: Atama = += -= vb. +// 2: Atama = += -= vb. — Sağ birleşmeli // 1: Virgül , // 0: Önceliksiz (değerler, EOF, bilinmeyen) // -// NOT: C/C++'da ^ operatörü bitsel XOR'tur (seviye 8), ama Python'da üs (seviye 15). -// saQut'ta ^ hem üs hem XOR olarak kullanılabilir (AST'de bağlam belirler). -// Şimdilik ^ seviye 15 (üs) olarak ayarlı. +// KARAR: Neden ^ (CARET) seviye 15 (üs) olarak ayarlı? +// - C/C++'da ^ bitsel XOR'tur (seviye 8). +// - Python'da ** üs, ^ XOR'tur. +// - saQut'ta ^ varsayılan olarak üs alma olarak kullanılır. +// - Gelecekte XOR için ayrı token (CARET_CARET ^^) eklenebilir. // -// BUG FIX (commit 438bc0e): Seviye 8'deki ölü kod (CARET için case olmadan -// return 8) temizlendi. CARET zaten seviye 15'te STAR_STAR ile birlikte -// işleniyor. +// BUG FIX (commit 438bc0e): +// Seviye 8'de CARET için ölü kod (case olmadan return 8) vardı. +// Temizlendi. CARET zaten seviye 15'te STAR_STAR ile birlikte işleniyor. // inline uint16_t TokenPrecedence(TokenType type) { switch (type) { @@ -677,18 +850,29 @@ inline uint16_t TokenPrecedence(TokenType type) { } // ============================================================================ -// RightAssociative — Sağdan Sola Birleşme Kontrolü +// RightAssociative — Sağdan Sola Birleşme (Associativity) Kontrolü // ============================================================================ // -// Hangi operatörler sağdan sola birleşir? +// AMAÇ: Bir operatörün sağdan sola mı, yoksa soldan sağa mı birleştiğini +// belirler. Pratt parser'da doğru ağaç yapısını oluşturmak için kritik. +// +// PARAMETRE: type — sorgulanan operatör tipi +// DÖNÜŞ: bool — true: sağ birleşmeli, false: sol birleşmeli +// KARMAŞIKLIK: O(1) — switch/case // // Sağ birleşmeli operatörler (a OP b OP c = a OP (b OP c)): -// - Üs alma: **, ^ (matematiksel: 2^3^2 = 2^(3^2) = 2^9 = 512) -// - Atama: =, +=, -=, vb. (a = b = 5 → a = (b = 5)) -// - Ternary: ?: (a ? b : c ? d : e → a ? b : (c ? d : e)) +// - STAR_STAR (üs alma): 2 ** 3 ** 2 = 2 ** (3 ** 2) = 2^9 = 512 +// (matematiksel kural: üs sağdan sola birleşir) +// - CARET (üs alma): 2 ^ 3 ^ 2 = 2 ^ (3 ^ 2) = 512 +// - EQUAL (atama): a = b = 5 → a = (b = 5) +// (önce b = 5 çalışır, sonra a = b) +// - +=, -=, *=, vb. (birleşik atama): a += b += 5 → a += (b += 5) +// - TERNARY (üçlü koşul): a ? b : c ? d : e → a ? b : (c ? d : e) +// (iç içe ternary'lerde sağdan sola) // // Sol birleşmeli operatörler (a OP b OP c = (a OP b) OP c): -// - Tüm diğerleri: +, -, *, /, ==, &&, vb. +// - Tüm diğerleri: +, -, *, /, ==, &&, ||, vb. +// (a + b + c = (a + b) + c, yani önce a+b, sonuç + c) // inline bool RightAssociative(TokenType type) { switch (type) { @@ -713,52 +897,103 @@ inline bool RightAssociative(TokenType type) { } // ============================================================================ -// ParserToken — Parser'ın Kullandığı Token Yapısı +// ParserToken — Parser'ın Kullandığı Token Yapısı (Köprü) // ============================================================================ // -// Tokenizer'ın ürettiği ham Token ile Parser'ın ihtiyaç duyduğu anlamsal -// tipi (TokenType) bir arada tutar. +// AMAÇ: Tokenizer'ın ürettiği ham Token ile Parser'ın ihtiyaç duyduğu +// anlamsal tipi (TokenType) bir arada tutar. İki katman arasında +// köprü görevi görür. // // ALANLAR: -// token (Token*): Tokenizer'dan gelen orijinal token. Neden pointer? -// Çünkü Token polimorfik bir sınıf hiyerarşisidir. Değer kopyası (Token) -// object slicing'e neden olur — alt sınıf verileri (NumberToken.isFloat, -// StringToken.context) kaybolur. -// BUG FIX (commit 40579ca): Eskiden Token token (değer) tutuyordu. // -// type (TokenType): Token'ın anlamsal tipi. Örn: NUMBER, PLUS, KW_IF. +// token (Token*): +// Tokenizer'dan gelen orijinal token'a pointer. +// Neden pointer, neden değer (Token token) değil? +// +// Çünkü Token polimorfik bir sınıf hiyerarşisidir: +// Token (base) +// +-- NumberToken (isFloat, numberValue alanları) +// +-- StringToken (context alanı) +// +-- IdentifierToken +// +-- OperatorToken +// +-- DelimiterToken +// +-- KeywordToken +// +// Değer kopyası (Token token) OBJECT SLICING'e neden olur: +// NumberToken → Token'a kopyalanırken isFloat, numberValue KAYBOLUR. +// +// BUG FIX (commit 40579ca): +// Eskiden "Token token" (değer) olarak tanımlanmıştı. +// NumberToken.isFloat her zaman false dönüyordu çünkü slicing oluyordu. +// "Token* token" (pointer) olarak değiştirildi. +// +// type (TokenType): +// Token'ın anlamsal tipi. Örn: NUMBER, PLUS, KW_IF. +// Tokeni parselerken parseToken() tarafından atanır. // // METOTLAR: -// is(TokenType): Bu token belirtilen tipte mi? -// is({...}): Bu token listedeki tiplerden biri mi? -// getPowerOperator(): Bu token bir operatör ise önceliğini döndür. -// isRightAssociative(): Bu operatör sağ birleşmeli mi? +// is(TokenType): Tek tip kontrolü (O(1)) +// is(initializer_list): Çoklu tip kontrolü (O(k), k = liste boyutu) +// getPowerOperator(): Öncelik sorgulama (O(1), TokenPrecedence'a yönlendirir) +// isRightAssociative(): Birleşme yönü sorgulama (O(1)) // struct ParserToken { - Token* token = nullptr; // Tokenizer'dan gelen orijinal token - TokenType type = TokenType::SVR_VOID; // Anlamsal tip + /* ====== Alanlar ====== */ - // Tek tip kontrolü + // Tokenizer'dan gelen orijinal token pointer'ı. + // nullptr olabilir mi? Hayır — geçerli bir token her zaman vardır. + // SVR_VOID durumunda token nullptr olabilir (EOF sinyali). + Token* token = nullptr; + + // Token'ın anlamsal tipi. + // Varsayılan: SVR_VOID (geçersiz/başlangıç değeri). + // parseToken() tarafından atanır. + TokenType type = TokenType::SVR_VOID; + + /* ====== Kolaylık Metotları ====== */ + + // is() — Tek tip kontrolü + // PARAMETRE: t — sorgulanan token tipi + // DÖNÜŞ: true — bu token t tipinde + // KARMAŞIKLIK: O(1) + // KULLANIM: if (current.is(TokenType::SEMICOLON)) { ... } bool is(TokenType t) const { return type == t; } - // Çoklu tip kontrolü — örn: is({KW_INT, KW_FLOAT, KW_VOID}) + // is() — Çoklu tip kontrolü + // PARAMETRE: types — kontrol edilecek tipler listesi + // DÖNÜŞ: true — bu token listedeki tiplerden birine aitse + // KARMAŞIKLIK: O(k) — k = liste boyutu + // KULLANIM: + // if (current.is({KW_INT, KW_FLOAT, KW_VOID})) { ... } + // if (current.is({TokenType::SEMICOLON, TokenType::RPAREN})) { ... } bool is(std::initializer_list types) const { for (TokenType t : types) if (type == t) return true; return false; } - // Operatör önceliği (Pratt parser için) + // getPowerOperator() — Operatör önceliği sorgulama (Pratt parser için) + // DÖNÜŞ: uint16_t — öncelik seviyesi (0-18) + // KARMAŞIKLIK: O(1) — TokenPrecedence'a yönlendirir + // KULLANIM: + // uint16_t prec = current.getPowerOperator(); + // while (prec >= minPrec) { ... parseLeftDenotation(left); } uint16_t getPowerOperator() const { return TokenPrecedence(type); } - // Sağ birleşmeli mi? + // isRightAssociative() — Birleşme yönü sorgulama + // DÖNÜŞ: true — sağ birleşmeli (atama, üs, ternary) + // false — sol birleşmeli (toplama, çarpma, vb.) + // KARMAŞIKLIK: O(1) — RightAssociative'a yönlendirir + // KULLANIM: + // bool rightAssoc = current.isRightAssociative(); + // uint16_t nextPrec = rightAssoc ? prec : prec + 1; bool isRightAssociative() const { return RightAssociative(type); } }; -#endif // SAQUT_PARSER_TOKEN +#endif // SAQUT_PARSER_TOKEN \ No newline at end of file From 7c5a86c39b131980442483e3a6327e27f183ff41 Mon Sep 17 00:00:00 2001 From: abdussamedulutas Date: Sun, 14 Jun 2026 15:57:54 +0300 Subject: [PATCH 3/3] =?UTF-8?q?fix:=20kaynak=20dosya=20yolu=20propagasyonu?= =?UTF-8?q?=20ve=20AST=20JSON=20girinti=20hatalar=C4=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Tokenizer::scan artik filePath parametresi alip Lexer'a iletiyor; SourceLocation.file artik bos degil (Asama 0 tamamlandi). - JsonObject::add icin const char* overload eklendi (kind: true bug'i). - JsonObject acilis suslu parantezi girintisiz yaziliyor, addArray ilk eleman oncesi bos satir birakmiyor; LiteralNode/IdentifierNode toJson ayni sekilde duzeltildi. - analysisToJson girinti seviyeleri "analysis" objesine gore duzeltildi. --- build/.ninja_deps | Bin 29656 -> 68992 bytes build/.ninja_log | 74 +++++++++++++---- build/CMakeFiles/CMakeConfigureLog.yaml | 106 ++++++++++++------------ saqut | Bin 781728 -> 0 bytes src/cli/args.hpp | 8 ++ src/cli/commands/ast.hpp | 4 +- src/cli/commands/run.hpp | 2 +- src/cli/commands/symbols.hpp | 2 +- src/cli/commands/tokens.hpp | 2 +- src/json.hpp | 18 ++-- src/parser/ast_json.hpp | 17 +++- src/parser/nodes/identifier.cpp | 2 +- src/parser/nodes/literal.cpp | 2 +- src/tokenizer/tokenizer.cpp | 4 +- src/tokenizer/tokenizer.hpp | 2 +- 15 files changed, 154 insertions(+), 89 deletions(-) delete mode 100755 saqut diff --git a/build/.ninja_deps b/build/.ninja_deps index 2ce38af872bdaf90b1cfbb5d8c86fabbc9536808..53faad2728db3656bb5622a00565d52e68e025f1 100644 GIT binary patch literal 68992 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 X|5|~tFDxqpu9XzNX0Q2U>d{{T22Cvp diff --git a/build/.ninja_log b/build/.ninja_log index fb0be1e..15fd4f7 100644 --- a/build/.ninja_log +++ b/build/.ninja_log @@ -1,16 +1,60 @@ # ninja log v7 -1 1875 1779866878396024286 CMakeFiles/saqut.dir/src/parser/nodes/identifier.cpp.o eb96bb4b1eb4ad80 -1 1743 1779866878396133191 CMakeFiles/saqut.dir/src/parser/nodes/literal.cpp.o 78f2c4da7c9b2281 -1 1835 1779866851291850429 CMakeFiles/saqut.dir/src/parser/nodes/binary_expr.cpp.o d2e2bb2f8a63c6d2 -3 1976 1779866851293202930 CMakeFiles/saqut.dir/src/parser/nodes/program.cpp.o ac5bbcd74d87561a -1 1828 1779866851291959426 CMakeFiles/saqut.dir/src/parser/nodes/declarations.cpp.o b6c56f04a257f685 -1 1991 1779866851292085983 CMakeFiles/saqut.dir/src/parser/nodes/expressions.cpp.o 4057e3d63c63a1ab -6 2108 1779866851296202934 CMakeFiles/saqut.dir/src/parser/nodes/statements.cpp.o b5c20724bbf3648c -1 2478 1779866878395241768 CMakeFiles/saqut.dir/src/main.cpp.o 110c26cb1d0c3a23 -2967 3100 1779866359829193015 saqut 78d8bacf305cfc59 -1 1450 1779866851291202927 CMakeFiles/saqut.dir/src/lexer/lexer.cpp.o 90eeec811f2137e6 -0 1481 1779866851290202926 CMakeFiles/saqut.dir/src/core/sourcefile.cpp.o da6f5fc90e87e6b1 -1 1410 1779866878396365249 CMakeFiles/saqut.dir/src/tokenizer/tokenizer.cpp.o a01677f8bb4f4dbc -1 1579 1779866878396233551 CMakeFiles/saqut.dir/src/parser/parser.cpp.o 2c65b7be26cead32 -1 1163 1779866916763301383 CMakeFiles/saqut.dir/src/parser/parser.cpp.o 2c65b7be26cead32 -1163 1283 1779866917925303269 saqut 89052e51305cb697 +0 1451 1779867877701788943 CMakeFiles/saqut.dir/src/core/sourcefile.cpp.o da6f5fc90e87e6b1 +0 1246 1779867877703024703 CMakeFiles/saqut.dir/src/lexer/lexer.cpp.o 90eeec811f2137e6 +1451 2772 1779867879152793461 CMakeFiles/saqut.dir/src/tokenizer/tokenizer.cpp.o a01677f8bb4f4dbc +1246 2891 1779867878947792823 CMakeFiles/saqut.dir/src/parser/parser.cpp.o 2c65b7be26cead32 +5 2061 1779867877706788958 CMakeFiles/saqut.dir/src/parser/nodes/program.cpp.o ac5bbcd74d87561a +1 2213 1779867877703621428 CMakeFiles/saqut.dir/src/parser/nodes/identifier.cpp.o eb96bb4b1eb4ad80 +1 2296 1779867877703518257 CMakeFiles/saqut.dir/src/parser/nodes/expressions.cpp.o 4057e3d63c63a1ab +1 2529 1779867877703709398 CMakeFiles/saqut.dir/src/parser/nodes/literal.cpp.o 78f2c4da7c9b2281 +7 2335 1779867877708788964 CMakeFiles/saqut.dir/src/parser/nodes/statements.cpp.o b5c20724bbf3648c +0 2098 1779867877703316205 CMakeFiles/saqut.dir/src/parser/nodes/binary_expr.cpp.o d2e2bb2f8a63c6d2 +0 2499 1779867877703412857 CMakeFiles/saqut.dir/src/parser/nodes/declarations.cpp.o b6c56f04a257f685 +0 2892 1779867877703230815 CMakeFiles/saqut.dir/src/main.cpp.o 110c26cb1d0c3a23 +2892 2983 1779867880593797950 saqut 89052e51305cb697 +0 22 1779868368456818650 build.ninja 1876a59d627a585 +0 22 1779868368456217236 /home/saqut/Masaüstü/saqutcompiler/build/cmake_install.cmake 1876a59d627a585 +1 1528 1779868368464217284 CMakeFiles/saqut.dir/src/lexer/lexer.cpp.o 90eeec811f2137e6 +1 1768 1779868368465401047 CMakeFiles/saqut.dir/src/parser/nodes/program.cpp.o ac5bbcd74d87561a +1 2006 1779868368464927313 CMakeFiles/saqut.dir/src/parser/nodes/binary_expr.cpp.o d2e2bb2f8a63c6d2 +1 2109 1779868368465099051 CMakeFiles/saqut.dir/src/parser/nodes/expressions.cpp.o 4057e3d63c63a1ab +1 2216 1779868368465200112 CMakeFiles/saqut.dir/src/parser/nodes/identifier.cpp.o eb96bb4b1eb4ad80 +4 2421 1779868368467294710 CMakeFiles/saqut.dir/src/parser/nodes/statements.cpp.o b5c20724bbf3648c +1 2425 1779868368465010538 CMakeFiles/saqut.dir/src/parser/nodes/declarations.cpp.o b6c56f04a257f685 +1 2450 1779868368465293953 CMakeFiles/saqut.dir/src/parser/nodes/literal.cpp.o 78f2c4da7c9b2281 +4 2468 1779868368468417782 CMakeFiles/saqut.dir/src/parser/parser.cpp.o 2c65b7be26cead32 +1528 2575 1779868369991226412 CMakeFiles/saqut.dir/src/tokenizer/tokenizer.cpp.o a01677f8bb4f4dbc +1 2887 1779868368464815959 CMakeFiles/saqut.dir/src/main.cpp.o 110c26cb1d0c3a23 +2887 2980 1779868371350234528 saqut 89052e51305cb697 +2 1845 1781360349526488567 CMakeFiles/saqut.dir/src/tokenizer/tokenizer.cpp.o a01677f8bb4f4dbc +2 1991 1781360349525864955 CMakeFiles/saqut.dir/src/parser/parser.cpp.o 2c65b7be26cead32 +1 2031 1781360349525052844 CMakeFiles/saqut.dir/src/parser/nodes/binary_expr.cpp.o d2e2bb2f8a63c6d2 +1 2080 1781360349525452259 CMakeFiles/saqut.dir/src/parser/nodes/literal.cpp.o 78f2c4da7c9b2281 +1 2083 1781360349525558767 CMakeFiles/saqut.dir/src/parser/nodes/program.cpp.o ac5bbcd74d87561a +1 2090 1781360349525147077 CMakeFiles/saqut.dir/src/parser/nodes/declarations.cpp.o b6c56f04a257f685 +2 2155 1781360349525690109 CMakeFiles/saqut.dir/src/parser/nodes/statements.cpp.o b5c20724bbf3648c +1 2240 1781360349525339814 CMakeFiles/saqut.dir/src/parser/nodes/identifier.cpp.o eb96bb4b1eb4ad80 +1 2355 1781360349525238105 CMakeFiles/saqut.dir/src/parser/nodes/expressions.cpp.o 4057e3d63c63a1ab +1 2750 1781360349524108829 CMakeFiles/saqut.dir/src/main.cpp.o 110c26cb1d0c3a23 +2750 2867 1781360352273116183 saqut 89052e51305cb697 +1 1640 1781361120993563298 CMakeFiles/saqut.dir/src/parser/nodes/literal.cpp.o 78f2c4da7c9b2281 +1 1661 1781361120993456534 CMakeFiles/saqut.dir/src/parser/nodes/identifier.cpp.o eb96bb4b1eb4ad80 +2 1669 1781361120993689645 CMakeFiles/saqut.dir/src/parser/nodes/program.cpp.o ac5bbcd74d87561a +1 1681 1781361120993213226 CMakeFiles/saqut.dir/src/parser/nodes/declarations.cpp.o b6c56f04a257f685 +1 1686 1781361120993117012 CMakeFiles/saqut.dir/src/parser/nodes/binary_expr.cpp.o d2e2bb2f8a63c6d2 +3 1712 1781361120994511341 CMakeFiles/saqut.dir/src/parser/nodes/statements.cpp.o b5c20724bbf3648c +1 1723 1781361120993344591 CMakeFiles/saqut.dir/src/parser/nodes/expressions.cpp.o 4057e3d63c63a1ab +1 2281 1781361120992511333 CMakeFiles/saqut.dir/src/main.cpp.o 110c26cb1d0c3a23 +2281 2374 1781361123272520466 saqut 89052e51305cb697 +2 1202 1781361145332901008 CMakeFiles/saqut.dir/src/parser/nodes/statements.cpp.o b5c20724bbf3648c +2 1435 1781361145332608544 CMakeFiles/saqut.dir/src/parser/nodes/literal.cpp.o 78f2c4da7c9b2281 +1 1472 1781361145332432199 CMakeFiles/saqut.dir/src/parser/nodes/expressions.cpp.o 4057e3d63c63a1ab +2 1506 1781361145332792284 CMakeFiles/saqut.dir/src/parser/nodes/program.cpp.o ac5bbcd74d87561a +1 1544 1781361145332547154 CMakeFiles/saqut.dir/src/parser/nodes/identifier.cpp.o eb96bb4b1eb4ad80 +1 1549 1781361145331608540 CMakeFiles/saqut.dir/src/parser/nodes/binary_expr.cpp.o d2e2bb2f8a63c6d2 +1 1569 1781361145332294897 CMakeFiles/saqut.dir/src/parser/nodes/declarations.cpp.o b6c56f04a257f685 +1569 1661 1781361146899614781 saqut 89052e51305cb697 +1 1470 1781361261444064707 CMakeFiles/saqut.dir/src/main.cpp.o 110c26cb1d0c3a23 +1471 1563 1781361262914070415 saqut 89052e51305cb697 +0 1462 1781361334065345164 CMakeFiles/saqut.dir/src/main.cpp.o 110c26cb1d0c3a23 +1462 1555 1781361335527350781 saqut 89052e51305cb697 diff --git a/build/CMakeFiles/CMakeConfigureLog.yaml b/build/CMakeFiles/CMakeConfigureLog.yaml index 44ef88f..4ab8233 100644 --- a/build/CMakeFiles/CMakeConfigureLog.yaml +++ b/build/CMakeFiles/CMakeConfigureLog.yaml @@ -5,7 +5,7 @@ events: kind: "find-v1" backtrace: - "/usr/share/cmake/Modules/CMakeDetermineSystem.cmake:12 (find_program)" - - "CMakeLists.txt:2 (project)" + - "CMakeLists.txt:51 (project)" mode: "program" variable: "CMAKE_UNAME" description: "Path to a program." @@ -55,14 +55,14 @@ events: kind: "message-v1" backtrace: - "/usr/share/cmake/Modules/CMakeDetermineSystem.cmake:212 (message)" - - "CMakeLists.txt:2 (project)" + - "CMakeLists.txt:51 (project)" message: | The system is: Linux - 7.0.9-1-MANJARO - x86_64 - kind: "find-v1" backtrace: - "/usr/share/cmake/Modules/CMakeNinjaFindMake.cmake:5 (find_program)" - - "CMakeLists.txt:2 (project)" + - "CMakeLists.txt:51 (project)" mode: "program" variable: "CMAKE_MAKE_PROGRAM" description: "Program used to build from build.ninja files." @@ -122,7 +122,7 @@ events: backtrace: - "/usr/share/cmake/Modules/CMakeDetermineCompiler.cmake:73 (find_program)" - "/usr/share/cmake/Modules/CMakeDetermineCXXCompiler.cmake:69 (_cmake_find_compiler)" - - "CMakeLists.txt:2 (project)" + - "CMakeLists.txt:51 (project)" mode: "program" variable: "CMAKE_CXX_COMPILER" description: "CXX compiler" @@ -185,7 +185,7 @@ events: - "/usr/share/cmake/Modules/CMakeDetermineCompilerId.cmake:8 (CMAKE_DETERMINE_COMPILER_ID_BUILD)" - "/usr/share/cmake/Modules/CMakeDetermineCompilerId.cmake:64 (__determine_compiler_id_test)" - "/usr/share/cmake/Modules/CMakeDetermineCXXCompiler.cmake:125 (CMAKE_DETERMINE_COMPILER_ID)" - - "CMakeLists.txt:2 (project)" + - "CMakeLists.txt:51 (project)" mode: "file" variable: "src_in" description: "Path to a file." @@ -222,7 +222,7 @@ events: - "/usr/share/cmake/Modules/CMakeDetermineCompilerId.cmake:17 (message)" - "/usr/share/cmake/Modules/CMakeDetermineCompilerId.cmake:64 (__determine_compiler_id_test)" - "/usr/share/cmake/Modules/CMakeDetermineCXXCompiler.cmake:125 (CMAKE_DETERMINE_COMPILER_ID)" - - "CMakeLists.txt:2 (project)" + - "CMakeLists.txt:51 (project)" message: | Compiling the CXX compiler identification source file "CMakeCXXCompilerId.cpp" succeeded. Compiler: /usr/bin/c++ @@ -243,7 +243,7 @@ events: backtrace: - "/usr/share/cmake/Modules/CMakeFindBinUtils.cmake:243 (find_program)" - "/usr/share/cmake/Modules/CMakeDetermineCXXCompiler.cmake:206 (include)" - - "CMakeLists.txt:2 (project)" + - "CMakeLists.txt:51 (project)" mode: "program" variable: "CMAKE_AR" description: "Path to a program." @@ -290,7 +290,7 @@ events: backtrace: - "/usr/share/cmake/Modules/CMakeFindBinUtils.cmake:243 (find_program)" - "/usr/share/cmake/Modules/CMakeDetermineCXXCompiler.cmake:206 (include)" - - "CMakeLists.txt:2 (project)" + - "CMakeLists.txt:51 (project)" mode: "program" variable: "CMAKE_RANLIB" description: "Path to a program." @@ -337,7 +337,7 @@ events: backtrace: - "/usr/share/cmake/Modules/CMakeFindBinUtils.cmake:243 (find_program)" - "/usr/share/cmake/Modules/CMakeDetermineCXXCompiler.cmake:206 (include)" - - "CMakeLists.txt:2 (project)" + - "CMakeLists.txt:51 (project)" mode: "program" variable: "CMAKE_STRIP" description: "Path to a program." @@ -384,7 +384,7 @@ events: backtrace: - "/usr/share/cmake/Modules/CMakeFindBinUtils.cmake:243 (find_program)" - "/usr/share/cmake/Modules/CMakeDetermineCXXCompiler.cmake:206 (include)" - - "CMakeLists.txt:2 (project)" + - "CMakeLists.txt:51 (project)" mode: "program" variable: "CMAKE_LINKER" description: "Path to a program." @@ -431,7 +431,7 @@ events: backtrace: - "/usr/share/cmake/Modules/CMakeFindBinUtils.cmake:243 (find_program)" - "/usr/share/cmake/Modules/CMakeDetermineCXXCompiler.cmake:206 (include)" - - "CMakeLists.txt:2 (project)" + - "CMakeLists.txt:51 (project)" mode: "program" variable: "CMAKE_NM" description: "Path to a program." @@ -478,7 +478,7 @@ events: backtrace: - "/usr/share/cmake/Modules/CMakeFindBinUtils.cmake:243 (find_program)" - "/usr/share/cmake/Modules/CMakeDetermineCXXCompiler.cmake:206 (include)" - - "CMakeLists.txt:2 (project)" + - "CMakeLists.txt:51 (project)" mode: "program" variable: "CMAKE_OBJDUMP" description: "Path to a program." @@ -525,7 +525,7 @@ events: backtrace: - "/usr/share/cmake/Modules/CMakeFindBinUtils.cmake:243 (find_program)" - "/usr/share/cmake/Modules/CMakeDetermineCXXCompiler.cmake:206 (include)" - - "CMakeLists.txt:2 (project)" + - "CMakeLists.txt:51 (project)" mode: "program" variable: "CMAKE_OBJCOPY" description: "Path to a program." @@ -572,7 +572,7 @@ events: backtrace: - "/usr/share/cmake/Modules/CMakeFindBinUtils.cmake:243 (find_program)" - "/usr/share/cmake/Modules/CMakeDetermineCXXCompiler.cmake:206 (include)" - - "CMakeLists.txt:2 (project)" + - "CMakeLists.txt:51 (project)" mode: "program" variable: "CMAKE_READELF" description: "Path to a program." @@ -619,7 +619,7 @@ events: backtrace: - "/usr/share/cmake/Modules/CMakeFindBinUtils.cmake:243 (find_program)" - "/usr/share/cmake/Modules/CMakeDetermineCXXCompiler.cmake:206 (include)" - - "CMakeLists.txt:2 (project)" + - "CMakeLists.txt:51 (project)" mode: "program" variable: "CMAKE_DLLTOOL" description: "Path to a program." @@ -679,7 +679,7 @@ events: backtrace: - "/usr/share/cmake/Modules/CMakeFindBinUtils.cmake:243 (find_program)" - "/usr/share/cmake/Modules/CMakeDetermineCXXCompiler.cmake:206 (include)" - - "CMakeLists.txt:2 (project)" + - "CMakeLists.txt:51 (project)" mode: "program" variable: "CMAKE_ADDR2LINE" description: "Path to a program." @@ -726,7 +726,7 @@ events: backtrace: - "/usr/share/cmake/Modules/CMakeFindBinUtils.cmake:243 (find_program)" - "/usr/share/cmake/Modules/CMakeDetermineCXXCompiler.cmake:206 (include)" - - "CMakeLists.txt:2 (project)" + - "CMakeLists.txt:51 (project)" mode: "program" variable: "CMAKE_TAPI" description: "Path to a program." @@ -786,7 +786,7 @@ events: backtrace: - "/usr/share/cmake/Modules/Compiler/GNU-FindBinUtils.cmake:18 (find_program)" - "/usr/share/cmake/Modules/CMakeDetermineCXXCompiler.cmake:207 (include)" - - "CMakeLists.txt:2 (project)" + - "CMakeLists.txt:51 (project)" mode: "program" variable: "CMAKE_CXX_COMPILER_AR" description: "A wrapper around 'ar' adding the appropriate '--plugin' option for the GCC compiler" @@ -873,7 +873,7 @@ events: backtrace: - "/usr/share/cmake/Modules/Compiler/GNU-FindBinUtils.cmake:30 (find_program)" - "/usr/share/cmake/Modules/CMakeDetermineCXXCompiler.cmake:207 (include)" - - "CMakeLists.txt:2 (project)" + - "CMakeLists.txt:51 (project)" mode: "program" variable: "CMAKE_CXX_COMPILER_RANLIB" description: "A wrapper around 'ranlib' adding the appropriate '--plugin' option for the GCC compiler" @@ -960,12 +960,12 @@ events: backtrace: - "/usr/share/cmake/Modules/CMakeDetermineCompilerABI.cmake:83 (try_compile)" - "/usr/share/cmake/Modules/CMakeTestCXXCompiler.cmake:26 (CMAKE_DETERMINE_COMPILER_ABI)" - - "CMakeLists.txt:2 (project)" + - "CMakeLists.txt:51 (project)" checks: - "Detecting CXX compiler ABI info" directories: - source: "/home/saqut/Masa\u00fcst\u00fc/saqutcompiler/build/CMakeFiles/CMakeScratch/TryCompile-lntpv4" - binary: "/home/saqut/Masa\u00fcst\u00fc/saqutcompiler/build/CMakeFiles/CMakeScratch/TryCompile-lntpv4" + source: "/home/saqut/Masa\u00fcst\u00fc/saqutcompiler/build/CMakeFiles/CMakeScratch/TryCompile-tE3Uvz" + binary: "/home/saqut/Masa\u00fcst\u00fc/saqutcompiler/build/CMakeFiles/CMakeScratch/TryCompile-tE3Uvz" cmakeVariables: CMAKE_CXX_FLAGS: "" CMAKE_CXX_FLAGS_DEBUG: "-g" @@ -976,10 +976,10 @@ events: variable: "CMAKE_CXX_ABI_COMPILED" cached: true stdout: | - Change Dir: '/home/saqut/Masaüstü/saqutcompiler/build/CMakeFiles/CMakeScratch/TryCompile-lntpv4' + Change Dir: '/home/saqut/Masaüstü/saqutcompiler/build/CMakeFiles/CMakeScratch/TryCompile-tE3Uvz' - Run Build Command(s): /usr/bin/ninja -v cmTC_ff321 - [1/2] /usr/bin/c++ -v -o CMakeFiles/cmTC_ff321.dir/CMakeCXXCompilerABI.cpp.o -c /usr/share/cmake/Modules/CMakeCXXCompilerABI.cpp + Run Build Command(s): /usr/bin/ninja -v cmTC_3d12d + [1/2] /usr/bin/c++ -v -o CMakeFiles/cmTC_3d12d.dir/CMakeCXXCompilerABI.cpp.o -c /usr/share/cmake/Modules/CMakeCXXCompilerABI.cpp Using built-in specs. COLLECT_GCC=/usr/bin/c++ Target: x86_64-pc-linux-gnu @@ -987,8 +987,8 @@ events: Thread model: posix Supported LTO compression algorithms: zlib zstd gcc version 16.1.1 20260430 (GCC) - COLLECT_GCC_OPTIONS='-v' '-o' 'CMakeFiles/cmTC_ff321.dir/CMakeCXXCompilerABI.cpp.o' '-c' '-shared-libgcc' '-mtune=generic' '-march=x86-64' '-dumpdir' 'CMakeFiles/cmTC_ff321.dir/' - /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/cc1plus -quiet -v -D_GNU_SOURCE /usr/share/cmake/Modules/CMakeCXXCompilerABI.cpp -quiet -dumpdir CMakeFiles/cmTC_ff321.dir/ -dumpbase CMakeCXXCompilerABI.cpp.cpp -dumpbase-ext .cpp -mtune=generic -march=x86-64 -version -o /tmp/ccSiM3Hl.s + COLLECT_GCC_OPTIONS='-v' '-o' 'CMakeFiles/cmTC_3d12d.dir/CMakeCXXCompilerABI.cpp.o' '-c' '-shared-libgcc' '-mtune=generic' '-march=x86-64' '-dumpdir' 'CMakeFiles/cmTC_3d12d.dir/' + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/cc1plus -quiet -v -D_GNU_SOURCE /usr/share/cmake/Modules/CMakeCXXCompilerABI.cpp -quiet -dumpdir CMakeFiles/cmTC_3d12d.dir/ -dumpbase CMakeCXXCompilerABI.cpp.cpp -dumpbase-ext .cpp -mtune=generic -march=x86-64 -version -o /tmp/ccHXl8ac.s GNU C++20 (GCC) version 16.1.1 20260430 (x86_64-pc-linux-gnu) compiled by GNU C version 16.1.1 20260430, GMP version 6.3.0, MPFR version 4.2.2, MPC version 1.4.1, isl version isl-0.27-GMP @@ -1005,13 +1005,13 @@ events: /usr/include End of search list. Compiler executable checksum: d47d0c990a24bc0dbaf3bd00656bd5f3 - COLLECT_GCC_OPTIONS='-v' '-o' 'CMakeFiles/cmTC_ff321.dir/CMakeCXXCompilerABI.cpp.o' '-c' '-shared-libgcc' '-mtune=generic' '-march=x86-64' '-dumpdir' 'CMakeFiles/cmTC_ff321.dir/' - as -v --64 -o CMakeFiles/cmTC_ff321.dir/CMakeCXXCompilerABI.cpp.o /tmp/ccSiM3Hl.s + COLLECT_GCC_OPTIONS='-v' '-o' 'CMakeFiles/cmTC_3d12d.dir/CMakeCXXCompilerABI.cpp.o' '-c' '-shared-libgcc' '-mtune=generic' '-march=x86-64' '-dumpdir' 'CMakeFiles/cmTC_3d12d.dir/' + as -v --64 -o CMakeFiles/cmTC_3d12d.dir/CMakeCXXCompilerABI.cpp.o /tmp/ccHXl8ac.s GNU assembler version 2.46.0 (x86_64-pc-linux-gnu) using BFD version (GNU Binutils) 2.46.0 COMPILER_PATH=/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/:/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/:/usr/lib/gcc/x86_64-pc-linux-gnu/:/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/:/usr/lib/gcc/x86_64-pc-linux-gnu/ LIBRARY_PATH=/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/:/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/:/lib/../lib/:/usr/lib/../lib/:/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../:/lib/:/usr/lib/ - COLLECT_GCC_OPTIONS='-v' '-o' 'CMakeFiles/cmTC_ff321.dir/CMakeCXXCompilerABI.cpp.o' '-c' '-shared-libgcc' '-mtune=generic' '-march=x86-64' '-dumpdir' 'CMakeFiles/cmTC_ff321.dir/CMakeCXXCompilerABI.cpp.' - [2/2] : && /usr/bin/c++ -v -Wl,-v CMakeFiles/cmTC_ff321.dir/CMakeCXXCompilerABI.cpp.o -o cmTC_ff321 && : + COLLECT_GCC_OPTIONS='-v' '-o' 'CMakeFiles/cmTC_3d12d.dir/CMakeCXXCompilerABI.cpp.o' '-c' '-shared-libgcc' '-mtune=generic' '-march=x86-64' '-dumpdir' 'CMakeFiles/cmTC_3d12d.dir/CMakeCXXCompilerABI.cpp.' + [2/2] : && /usr/bin/c++ -v -Wl,-v CMakeFiles/cmTC_3d12d.dir/CMakeCXXCompilerABI.cpp.o -o cmTC_3d12d && : Using built-in specs. COLLECT_GCC=/usr/bin/c++ COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/lto-wrapper @@ -1022,12 +1022,12 @@ events: gcc version 16.1.1 20260430 (GCC) COMPILER_PATH=/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/:/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/:/usr/lib/gcc/x86_64-pc-linux-gnu/:/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/:/usr/lib/gcc/x86_64-pc-linux-gnu/ LIBRARY_PATH=/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/:/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/:/lib/../lib/:/usr/lib/../lib/:/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../:/lib/:/usr/lib/ - COLLECT_GCC_OPTIONS='-v' '-o' 'cmTC_ff321' '-shared-libgcc' '-mtune=generic' '-march=x86-64' '-dumpdir' 'cmTC_ff321.' - /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/collect2 -plugin /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/liblto_plugin.so -plugin-opt=/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/lto-wrapper -plugin-opt=-fresolution=/tmp/ccgqnPZN.res -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-latomic_asneeded -plugin-opt=-pass-through=-lc -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lgcc --build-id --eh-frame-hdr --hash-style=gnu -m elf_x86_64 -dynamic-linker /lib64/ld-linux-x86-64.so.2 -pie -o cmTC_ff321 /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/Scrt1.o /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/crti.o /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtbeginS.o -L/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1 -L/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib -L/lib/../lib -L/usr/lib/../lib -L/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../.. -L/lib -L/usr/lib -v CMakeFiles/cmTC_ff321.dir/CMakeCXXCompilerABI.cpp.o -lstdc++ -lm -lgcc_s -lgcc -latomic_asneeded -lc -lgcc_s -lgcc /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtendS.o /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/crtn.o + COLLECT_GCC_OPTIONS='-v' '-o' 'cmTC_3d12d' '-shared-libgcc' '-mtune=generic' '-march=x86-64' '-dumpdir' 'cmTC_3d12d.' + /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/collect2 -plugin /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/liblto_plugin.so -plugin-opt=/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/lto-wrapper -plugin-opt=-fresolution=/tmp/ccq9todA.res -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-latomic_asneeded -plugin-opt=-pass-through=-lc -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lgcc --build-id --eh-frame-hdr --hash-style=gnu -m elf_x86_64 -dynamic-linker /lib64/ld-linux-x86-64.so.2 -pie -o cmTC_3d12d /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/Scrt1.o /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/crti.o /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtbeginS.o -L/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1 -L/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib -L/lib/../lib -L/usr/lib/../lib -L/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../.. -L/lib -L/usr/lib -v CMakeFiles/cmTC_3d12d.dir/CMakeCXXCompilerABI.cpp.o -lstdc++ -lm -lgcc_s -lgcc -latomic_asneeded -lc -lgcc_s -lgcc /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtendS.o /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/crtn.o collect2 version 16.1.1 20260430 - /usr/bin/ld -plugin /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/liblto_plugin.so -plugin-opt=/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/lto-wrapper -plugin-opt=-fresolution=/tmp/ccgqnPZN.res -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-latomic_asneeded -plugin-opt=-pass-through=-lc -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lgcc --build-id --eh-frame-hdr --hash-style=gnu -m elf_x86_64 -dynamic-linker /lib64/ld-linux-x86-64.so.2 -pie -o cmTC_ff321 /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/Scrt1.o /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/crti.o /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtbeginS.o -L/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1 -L/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib -L/lib/../lib -L/usr/lib/../lib -L/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../.. -L/lib -L/usr/lib -v CMakeFiles/cmTC_ff321.dir/CMakeCXXCompilerABI.cpp.o -lstdc++ -lm -lgcc_s -lgcc -latomic_asneeded -lc -lgcc_s -lgcc /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtendS.o /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/crtn.o + /usr/bin/ld -plugin /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/liblto_plugin.so -plugin-opt=/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/lto-wrapper -plugin-opt=-fresolution=/tmp/ccq9todA.res -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-latomic_asneeded -plugin-opt=-pass-through=-lc -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lgcc --build-id --eh-frame-hdr --hash-style=gnu -m elf_x86_64 -dynamic-linker /lib64/ld-linux-x86-64.so.2 -pie -o cmTC_3d12d /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/Scrt1.o /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/crti.o /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtbeginS.o -L/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1 -L/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib -L/lib/../lib -L/usr/lib/../lib -L/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../.. -L/lib -L/usr/lib -v CMakeFiles/cmTC_3d12d.dir/CMakeCXXCompilerABI.cpp.o -lstdc++ -lm -lgcc_s -lgcc -latomic_asneeded -lc -lgcc_s -lgcc /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtendS.o /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/crtn.o GNU ld (GNU Binutils) 2.46.0 - COLLECT_GCC_OPTIONS='-v' '-o' 'cmTC_ff321' '-shared-libgcc' '-mtune=generic' '-march=x86-64' '-dumpdir' 'cmTC_ff321.' + COLLECT_GCC_OPTIONS='-v' '-o' 'cmTC_3d12d' '-shared-libgcc' '-mtune=generic' '-march=x86-64' '-dumpdir' 'cmTC_3d12d.' exitCode: 0 - @@ -1035,7 +1035,7 @@ events: backtrace: - "/usr/share/cmake/Modules/CMakeDetermineCompilerABI.cmake:217 (message)" - "/usr/share/cmake/Modules/CMakeTestCXXCompiler.cmake:26 (CMAKE_DETERMINE_COMPILER_ABI)" - - "CMakeLists.txt:2 (project)" + - "CMakeLists.txt:51 (project)" message: | Parsed CXX implicit include dir info: rv=done found start of include info @@ -1061,15 +1061,15 @@ events: backtrace: - "/usr/share/cmake/Modules/CMakeDetermineCompilerABI.cmake:253 (message)" - "/usr/share/cmake/Modules/CMakeTestCXXCompiler.cmake:26 (CMAKE_DETERMINE_COMPILER_ABI)" - - "CMakeLists.txt:2 (project)" + - "CMakeLists.txt:51 (project)" message: | Parsed CXX implicit link information: link line regex: [^( *|.*[/\\])(ld[0-9]*(|\\.[a-rt-z][a-z]*|\\.s[a-np-z][a-z]*|\\.so[a-z]+)|CMAKE_LINK_STARTFILE-NOTFOUND|([^/\\]+-)?ld|collect2)[^/\\]*( |$)] linker tool regex: [^[ ]*(->|"|[0-9]+>[ -]*Build:[ 0-9]+ ms[ ]*)?[ ]*(([^"]*[/\\])?(ld[0-9]*(|\\.[a-rt-z][a-z]*|\\.s[a-np-z][a-z]*|\\.so[a-z]+)))("|,| |$)] - ignore line: [Change Dir: '/home/saqut/Masaüstü/saqutcompiler/build/CMakeFiles/CMakeScratch/TryCompile-lntpv4'] + ignore line: [Change Dir: '/home/saqut/Masaüstü/saqutcompiler/build/CMakeFiles/CMakeScratch/TryCompile-tE3Uvz'] ignore line: [] - ignore line: [Run Build Command(s): /usr/bin/ninja -v cmTC_ff321] - ignore line: [[1/2] /usr/bin/c++ -v -o CMakeFiles/cmTC_ff321.dir/CMakeCXXCompilerABI.cpp.o -c /usr/share/cmake/Modules/CMakeCXXCompilerABI.cpp] + ignore line: [Run Build Command(s): /usr/bin/ninja -v cmTC_3d12d] + ignore line: [[1/2] /usr/bin/c++ -v -o CMakeFiles/cmTC_3d12d.dir/CMakeCXXCompilerABI.cpp.o -c /usr/share/cmake/Modules/CMakeCXXCompilerABI.cpp] ignore line: [Using built-in specs.] ignore line: [COLLECT_GCC=/usr/bin/c++] ignore line: [Target: x86_64-pc-linux-gnu] @@ -1077,8 +1077,8 @@ events: ignore line: [Thread model: posix] ignore line: [Supported LTO compression algorithms: zlib zstd] ignore line: [gcc version 16.1.1 20260430 (GCC) ] - ignore line: [COLLECT_GCC_OPTIONS='-v' '-o' 'CMakeFiles/cmTC_ff321.dir/CMakeCXXCompilerABI.cpp.o' '-c' '-shared-libgcc' '-mtune=generic' '-march=x86-64' '-dumpdir' 'CMakeFiles/cmTC_ff321.dir/'] - ignore line: [ /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/cc1plus -quiet -v -D_GNU_SOURCE /usr/share/cmake/Modules/CMakeCXXCompilerABI.cpp -quiet -dumpdir CMakeFiles/cmTC_ff321.dir/ -dumpbase CMakeCXXCompilerABI.cpp.cpp -dumpbase-ext .cpp -mtune=generic -march=x86-64 -version -o /tmp/ccSiM3Hl.s] + ignore line: [COLLECT_GCC_OPTIONS='-v' '-o' 'CMakeFiles/cmTC_3d12d.dir/CMakeCXXCompilerABI.cpp.o' '-c' '-shared-libgcc' '-mtune=generic' '-march=x86-64' '-dumpdir' 'CMakeFiles/cmTC_3d12d.dir/'] + ignore line: [ /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/cc1plus -quiet -v -D_GNU_SOURCE /usr/share/cmake/Modules/CMakeCXXCompilerABI.cpp -quiet -dumpdir CMakeFiles/cmTC_3d12d.dir/ -dumpbase CMakeCXXCompilerABI.cpp.cpp -dumpbase-ext .cpp -mtune=generic -march=x86-64 -version -o /tmp/ccHXl8ac.s] ignore line: [GNU C++20 (GCC) version 16.1.1 20260430 (x86_64-pc-linux-gnu)] ignore line: [ compiled by GNU C version 16.1.1 20260430 GMP version 6.3.0 MPFR version 4.2.2 MPC version 1.4.1 isl version isl-0.27-GMP] ignore line: [] @@ -1095,13 +1095,13 @@ events: ignore line: [ /usr/include] ignore line: [End of search list.] ignore line: [Compiler executable checksum: d47d0c990a24bc0dbaf3bd00656bd5f3] - ignore line: [COLLECT_GCC_OPTIONS='-v' '-o' 'CMakeFiles/cmTC_ff321.dir/CMakeCXXCompilerABI.cpp.o' '-c' '-shared-libgcc' '-mtune=generic' '-march=x86-64' '-dumpdir' 'CMakeFiles/cmTC_ff321.dir/'] - ignore line: [ as -v --64 -o CMakeFiles/cmTC_ff321.dir/CMakeCXXCompilerABI.cpp.o /tmp/ccSiM3Hl.s] + ignore line: [COLLECT_GCC_OPTIONS='-v' '-o' 'CMakeFiles/cmTC_3d12d.dir/CMakeCXXCompilerABI.cpp.o' '-c' '-shared-libgcc' '-mtune=generic' '-march=x86-64' '-dumpdir' 'CMakeFiles/cmTC_3d12d.dir/'] + ignore line: [ as -v --64 -o CMakeFiles/cmTC_3d12d.dir/CMakeCXXCompilerABI.cpp.o /tmp/ccHXl8ac.s] ignore line: [GNU assembler version 2.46.0 (x86_64-pc-linux-gnu) using BFD version (GNU Binutils) 2.46.0] ignore line: [COMPILER_PATH=/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/:/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/:/usr/lib/gcc/x86_64-pc-linux-gnu/:/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/:/usr/lib/gcc/x86_64-pc-linux-gnu/] ignore line: [LIBRARY_PATH=/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/:/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/:/lib/../lib/:/usr/lib/../lib/:/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../:/lib/:/usr/lib/] - ignore line: [COLLECT_GCC_OPTIONS='-v' '-o' 'CMakeFiles/cmTC_ff321.dir/CMakeCXXCompilerABI.cpp.o' '-c' '-shared-libgcc' '-mtune=generic' '-march=x86-64' '-dumpdir' 'CMakeFiles/cmTC_ff321.dir/CMakeCXXCompilerABI.cpp.'] - ignore line: [[2/2] : && /usr/bin/c++ -v -Wl -v CMakeFiles/cmTC_ff321.dir/CMakeCXXCompilerABI.cpp.o -o cmTC_ff321 && :] + ignore line: [COLLECT_GCC_OPTIONS='-v' '-o' 'CMakeFiles/cmTC_3d12d.dir/CMakeCXXCompilerABI.cpp.o' '-c' '-shared-libgcc' '-mtune=generic' '-march=x86-64' '-dumpdir' 'CMakeFiles/cmTC_3d12d.dir/CMakeCXXCompilerABI.cpp.'] + ignore line: [[2/2] : && /usr/bin/c++ -v -Wl -v CMakeFiles/cmTC_3d12d.dir/CMakeCXXCompilerABI.cpp.o -o cmTC_3d12d && :] ignore line: [Using built-in specs.] ignore line: [COLLECT_GCC=/usr/bin/c++] ignore line: [COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/lto-wrapper] @@ -1112,13 +1112,13 @@ events: ignore line: [gcc version 16.1.1 20260430 (GCC) ] ignore line: [COMPILER_PATH=/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/:/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/:/usr/lib/gcc/x86_64-pc-linux-gnu/:/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/:/usr/lib/gcc/x86_64-pc-linux-gnu/] ignore line: [LIBRARY_PATH=/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/:/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/:/lib/../lib/:/usr/lib/../lib/:/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../:/lib/:/usr/lib/] - ignore line: [COLLECT_GCC_OPTIONS='-v' '-o' 'cmTC_ff321' '-shared-libgcc' '-mtune=generic' '-march=x86-64' '-dumpdir' 'cmTC_ff321.'] - link line: [ /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/collect2 -plugin /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/liblto_plugin.so -plugin-opt=/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/lto-wrapper -plugin-opt=-fresolution=/tmp/ccgqnPZN.res -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-latomic_asneeded -plugin-opt=-pass-through=-lc -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lgcc --build-id --eh-frame-hdr --hash-style=gnu -m elf_x86_64 -dynamic-linker /lib64/ld-linux-x86-64.so.2 -pie -o cmTC_ff321 /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/Scrt1.o /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/crti.o /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtbeginS.o -L/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1 -L/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib -L/lib/../lib -L/usr/lib/../lib -L/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../.. -L/lib -L/usr/lib -v CMakeFiles/cmTC_ff321.dir/CMakeCXXCompilerABI.cpp.o -lstdc++ -lm -lgcc_s -lgcc -latomic_asneeded -lc -lgcc_s -lgcc /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtendS.o /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/crtn.o] + ignore line: [COLLECT_GCC_OPTIONS='-v' '-o' 'cmTC_3d12d' '-shared-libgcc' '-mtune=generic' '-march=x86-64' '-dumpdir' 'cmTC_3d12d.'] + link line: [ /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/collect2 -plugin /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/liblto_plugin.so -plugin-opt=/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/lto-wrapper -plugin-opt=-fresolution=/tmp/ccq9todA.res -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-latomic_asneeded -plugin-opt=-pass-through=-lc -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lgcc --build-id --eh-frame-hdr --hash-style=gnu -m elf_x86_64 -dynamic-linker /lib64/ld-linux-x86-64.so.2 -pie -o cmTC_3d12d /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/Scrt1.o /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/crti.o /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtbeginS.o -L/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1 -L/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib -L/lib/../lib -L/usr/lib/../lib -L/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../.. -L/lib -L/usr/lib -v CMakeFiles/cmTC_3d12d.dir/CMakeCXXCompilerABI.cpp.o -lstdc++ -lm -lgcc_s -lgcc -latomic_asneeded -lc -lgcc_s -lgcc /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtendS.o /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/crtn.o] arg [/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/collect2] ==> ignore arg [-plugin] ==> ignore arg [/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/liblto_plugin.so] ==> ignore arg [-plugin-opt=/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/lto-wrapper] ==> ignore - arg [-plugin-opt=-fresolution=/tmp/ccgqnPZN.res] ==> ignore + arg [-plugin-opt=-fresolution=/tmp/ccq9todA.res] ==> ignore arg [-plugin-opt=-pass-through=-lgcc_s] ==> ignore arg [-plugin-opt=-pass-through=-lgcc] ==> ignore arg [-plugin-opt=-pass-through=-latomic_asneeded] ==> ignore @@ -1134,7 +1134,7 @@ events: arg [/lib64/ld-linux-x86-64.so.2] ==> ignore arg [-pie] ==> ignore arg [-o] ==> ignore - arg [cmTC_ff321] ==> ignore + arg [cmTC_3d12d] ==> ignore arg [/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/Scrt1.o] ==> obj [/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/Scrt1.o] arg [/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/crti.o] ==> obj [/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/crti.o] arg [/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtbeginS.o] ==> obj [/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtbeginS.o] @@ -1146,7 +1146,7 @@ events: arg [-L/lib] ==> dir [/lib] arg [-L/usr/lib] ==> dir [/usr/lib] arg [-v] ==> ignore - arg [CMakeFiles/cmTC_ff321.dir/CMakeCXXCompilerABI.cpp.o] ==> ignore + arg [CMakeFiles/cmTC_3d12d.dir/CMakeCXXCompilerABI.cpp.o] ==> ignore arg [-lstdc++] ==> lib [stdc++] arg [-lm] ==> lib [m] arg [-lgcc_s] ==> lib [gcc_s] @@ -1158,7 +1158,7 @@ events: arg [/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtendS.o] ==> obj [/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtendS.o] arg [/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/crtn.o] ==> obj [/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/crtn.o] ignore line: [collect2 version 16.1.1 20260430] - ignore line: [/usr/bin/ld -plugin /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/liblto_plugin.so -plugin-opt=/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/lto-wrapper -plugin-opt=-fresolution=/tmp/ccgqnPZN.res -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-latomic_asneeded -plugin-opt=-pass-through=-lc -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lgcc --build-id --eh-frame-hdr --hash-style=gnu -m elf_x86_64 -dynamic-linker /lib64/ld-linux-x86-64.so.2 -pie -o cmTC_ff321 /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/Scrt1.o /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/crti.o /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtbeginS.o -L/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1 -L/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib -L/lib/../lib -L/usr/lib/../lib -L/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../.. -L/lib -L/usr/lib -v CMakeFiles/cmTC_ff321.dir/CMakeCXXCompilerABI.cpp.o -lstdc++ -lm -lgcc_s -lgcc -latomic_asneeded -lc -lgcc_s -lgcc /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtendS.o /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/crtn.o] + ignore line: [/usr/bin/ld -plugin /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/liblto_plugin.so -plugin-opt=/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/lto-wrapper -plugin-opt=-fresolution=/tmp/ccq9todA.res -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-latomic_asneeded -plugin-opt=-pass-through=-lc -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lgcc --build-id --eh-frame-hdr --hash-style=gnu -m elf_x86_64 -dynamic-linker /lib64/ld-linux-x86-64.so.2 -pie -o cmTC_3d12d /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/Scrt1.o /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/crti.o /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtbeginS.o -L/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1 -L/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib -L/lib/../lib -L/usr/lib/../lib -L/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../.. -L/lib -L/usr/lib -v CMakeFiles/cmTC_3d12d.dir/CMakeCXXCompilerABI.cpp.o -lstdc++ -lm -lgcc_s -lgcc -latomic_asneeded -lc -lgcc_s -lgcc /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/crtendS.o /usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/crtn.o] linker tool for 'CXX': /usr/bin/ld collapse obj [/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/Scrt1.o] ==> [/usr/lib/Scrt1.o] collapse obj [/usr/lib/gcc/x86_64-pc-linux-gnu/16.1.1/../../../../lib/crti.o] ==> [/usr/lib/crti.o] @@ -1182,7 +1182,7 @@ events: - "/usr/share/cmake/Modules/Internal/CMakeDetermineLinkerId.cmake:38 (message)" - "/usr/share/cmake/Modules/CMakeDetermineCompilerABI.cmake:299 (cmake_determine_linker_id)" - "/usr/share/cmake/Modules/CMakeTestCXXCompiler.cmake:26 (CMAKE_DETERMINE_COMPILER_ABI)" - - "CMakeLists.txt:2 (project)" + - "CMakeLists.txt:51 (project)" message: | Running the CXX compiler's linker: "/usr/bin/ld" "-v" GNU ld (GNU Binutils) 2.46.0 diff --git a/saqut b/saqut deleted file mode 100755 index 9ed7f68a2f52b3423d6c43c47d829108237083a4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 781728 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�LrKtTgi<+WVWp*B* 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 z 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 bool + // dönüşümü std::string'e öncelikli olur ve "kind": true gibi hatalı + // çıktı üretir. + void add(const std::string& key, const char* value) { + add(key, std::string(value)); + } + // add() — Sayısal alan ekle // PARAMETRELER: // key — JSON anahtarı @@ -172,7 +185,7 @@ public: template void addArray(const std::string& key, Fn callback) { if (m_hasFields) m_ss << ",\n"; - m_ss << m_indentInner << "\"" << jsonEscape(key) << "\": [\n"; + m_ss << m_indentInner << "\"" << jsonEscape(key) << "\": ["; m_arrayDepth++; callback(); m_arrayDepth--; diff --git a/src/parser/nodes/identifier.cpp b/src/parser/nodes/identifier.cpp index 57e9a8f..55e3df4 100644 --- a/src/parser/nodes/identifier.cpp +++ b/src/parser/nodes/identifier.cpp @@ -14,7 +14,7 @@ std::string IdentifierNode::toJson(int depth) { std::string in = jsonIndent(depth); std::string name = parserToken.token ? parserToken.token->token : "?"; std::ostringstream ss; - ss << in << "{\n" + ss << "{\n" << in << " \"kind\": \"Identifier\",\n" << in << " \"name\": \"" << jsonEscape(name) << "\",\n" << in << " \"location\": " << loc.toJson() << "\n" diff --git a/src/parser/nodes/literal.cpp b/src/parser/nodes/literal.cpp index a04b2f4..94e32b8 100644 --- a/src/parser/nodes/literal.cpp +++ b/src/parser/nodes/literal.cpp @@ -18,7 +18,7 @@ std::string LiteralNode::toJson(int depth) { std::string in = jsonIndent(depth); std::string val = parserToken.token ? parserToken.token->token : "?"; std::ostringstream ss; - ss << in << "{\n" + ss << "{\n" << in << " \"kind\": \"Literal\",\n" << in << " \"literalType\": \"" << literalTypeToString(literalType) << "\",\n" << in << " \"value\": \"" << jsonEscape(val) << "\""; diff --git a/src/tokenizer/tokenizer.cpp b/src/tokenizer/tokenizer.cpp index 02631f8..1c97ec2 100644 --- a/src/tokenizer/tokenizer.cpp +++ b/src/tokenizer/tokenizer.cpp @@ -1,8 +1,8 @@ #include "tokenizer/tokenizer.hpp" -std::vector Tokenizer::scan(std::string input) { +std::vector Tokenizer::scan(std::string input, std::string filePath) { std::vector tokens; - hmx.setSourceText("", input); + hmx.setSourceText(filePath, input); while (true) { Token* token = scope(); if (token->token == "EOL") break; diff --git a/src/tokenizer/tokenizer.hpp b/src/tokenizer/tokenizer.hpp index ca5c80b..8869f1a 100644 --- a/src/tokenizer/tokenizer.hpp +++ b/src/tokenizer/tokenizer.hpp @@ -47,7 +47,7 @@ class Tokenizer { public: Lexer hmx; - std::vector scan(std::string input); + std::vector scan(std::string input, std::string filePath = ""); private: Token* scope();