From 218d54ba616dcbbc474775f1ac834145a0181f28 Mon Sep 17 00:00:00 2001 From: saqut Date: Thu, 18 Jun 2026 15:43:26 +0300 Subject: [PATCH] =?UTF-8?q?feat(faz2):=20sembol=20tablosu=20=E2=80=94=20is?= =?UTF-8?q?im=20=C3=A7=C3=B6z=C3=BCmleme=20+=20scope=20+=20referans=20topl?= =?UTF-8?q?ama=20(#71)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - parser: parseFunctionDecl() parametreleri artık AST'ye alıyor (FunctionDeclNode::params alanı eklendi; declarations.hpp/cpp güncellendi) - parser: parseDeclaration() kullanıcı-tanımlı tip (struct alanı) desteği - ast_json: addArray() m_hasArrayItem sıfırlama hatası düzeltildi (birden fazla dizi alanı içeren düğümlerde bozuk JSON üretimi giderildi) - src/symbol/: Symbol, Scope, SymbolTable, SymbolCollector eklendi * İki geçiş: pass1 global hoist, pass2 gövde + declare-before-use * E001 tanımsız isim, E002 çift tanım, E010 döngüsel struct * print builtin tohumlama (TODO: #89 katalog) - cli/symbols: yeni SymbolTable/Collector kullanıyor; tip + refs çıktısı - examples/symbols/: dup.sqt, undef.sqt, cyclic.sqt test fixture'ları Doğrulama: build/saqut symbols file:examples/fibonacci.sqt → 0 hata, 10 sembol examples/symbols/dup.sqt → E002 examples/symbols/undef.sqt → E001 examples/symbols/cyclic.sqt → E010 tests/run.sh → TUM TESTLER GECTI AST JSON → geçerli Co-Authored-By: Claude Opus 4.8 --- build/.ninja_deps | Bin 68992 -> 31712 bytes build/.ninja_log | 75 +---- build/CMakeCache.txt | 4 +- build/CMakeFiles/CMakeConfigureLog.yaml | 305 +++++++++++++++++++ build/build.ninja | 15 +- examples/symbols/cyclic.sqt | 12 + examples/symbols/dup.sqt | 6 + examples/symbols/undef.sqt | 5 + src/cli/commands/symbols.hpp | 34 ++- src/parser/ast_json.hpp | 3 + src/parser/nodes/declarations.cpp | 3 + src/parser/nodes/declarations.hpp | 3 + src/parser/parser.cpp | 30 +- src/symbol/scope.hpp | 37 +++ src/symbol/symbol.hpp | 34 +++ src/symbol/symbol_collector.cpp | 377 ++++++++++++++++++++++++ src/symbol/symbol_collector.hpp | 37 +++ src/symbol/symbol_table.hpp | 65 ++++ 18 files changed, 968 insertions(+), 77 deletions(-) create mode 100644 examples/symbols/cyclic.sqt create mode 100644 examples/symbols/dup.sqt create mode 100644 examples/symbols/undef.sqt create mode 100644 src/symbol/scope.hpp create mode 100644 src/symbol/symbol.hpp create mode 100644 src/symbol/symbol_collector.cpp create mode 100644 src/symbol/symbol_collector.hpp create mode 100644 src/symbol/symbol_table.hpp diff --git a/build/.ninja_deps b/build/.ninja_deps index 53faad2728db3656bb5622a00565d52e68e025f1..5664a6a25c82b6df029f6098e9d20704172860ee 100644 GIT binary patch delta 2923 zcmcImdr(wW7{3QuVAF=q@kJ5(%zPp*+YBy=;5PGB`Y5@V!w0uf@Ws_1T#O*Ip6o4@B7_z zzWu(_wk-PS1+t;Q7Tdh1+~IL=?Q+;ICB_;H5>N1KVc!`YD?PJg3DeZm^#i(Aj0r{4 z((E zioJ=u2xS43IdOcz-zeFeF3{Y@{Nz^2-_k0&Ln^c3xIZBrlGem4qPI`>2X>ZXXYMt* z+rx*!g5!SIobZ8wEbwaYp7XTbn@@*(P2@MIZB}uC>JVf}XjK$Z6106>_f4GgsvPtS z_NH^pX?kSU7wIfER51Qox&k4aeTpc$y`s-AiD5?POoWc+$336-t4#PSggF*oXr9k2 zUI*W*%KE3BhRbnue@a1$6(UV38yClk~Tmjz)Fex@m&V(N05 z$SL}0g^TX0jH6FFW5`Kbg4Lpi1bW12ASWnaTNRBb&1r!oZLW%JxijLJ}*N@o93$*rA04kDYYv%k_w3`5}V zxD2iZBnosA*8V0@M5PKdJu@qYe2EL1Ovl&7WPhO(8V(Y}%hp|Gr!qn(G`Rl>Eow+5 zpKIB&w;?tAfKFy42u$35=LJTlP$y&gAIS{-$Il5t3ffb$%t78S*^w`HnfnYy%1QRq zlJa8uuqVmzDahrcbY{|Zo;dP}R-F%dOi>^A(9XiKG+Rg_`)H9cfqcYNW?xuUL_TO& z1>r-j-0c%ghQ08?+D9h6D459yD5*nfy*I(|ey?vMuP8j45ceLOILNznw|5eGN84W} znhbCE+0Ek>KQF1=TUxN7EXiRNy~EzLM=RbTUI~kCsWs>k6;#~abiX)>ya{hE6CXxB z*M1RiP~PVxyXbOX9@$BE`y6Bk?Z*G@a50)}!*8dUPWB}vg%<`rasY0$U0dO$*bD)FkXQkJ)*BM4Ey5Q_63U(1L+|bamWfU^Z&N8fPnmls= zO%7O|s>w>Y1ClWStJP!av}T)e9A;%e`O-==d2IZxiuZpu6+#a$8*iNgZ`HuvfEgDa z=381-jIUBxAj7&5Jkzmqw1yQ&!0&Mgit0yFZlJ+{)9?zk6-d{AJ+?>&bDeZez-C>4 zqc8Xi+QafXdMuDhUZz(9HnJA;G+G>tGpvDi7R?Q280{q-_Yzj6^jO+RBQ`Y(f}MYn zwg-oi4!SjHv%YW>&jLKJrrp6zvWg~1dE|LoA`K%e!Fv>4A{if9apN9*nS?KU4)Vu2 zuI(P2hu_g|WR>w=%xi$D0Q*}Du$yDWiq#0#Ral#2C7rckR#n*}U>e5L81KV)KTr!y z2WAj%1UD0tSwI~y8>k2701dzcfE#!as6x(_{aaq*fS(27Hlz{@Rldxec@vnJ{IWB?dxAb*^slB5PJpv1uu6F AV*mgE delta 4258 zcmc&$du&r>6z{jSY_nZU%jPyl=|&5T!P-5L$I4!Wxi|;|geCF_>6$^i^|jku6wSyq zYIr7)qmiHzmWUA|$>s!#fHE1c!H}Vd@}3F^%sCzk_=oeHYfEgRxn732zx8@P94@%)w+i{ZXHCdb%(QFt-$mB&mryr1vDo!hzkSZG_E z1s#P-_8T;omcr1Y0qj1s78O8Mk&fL1ZE=Cd&)fKFceRK2n;kyiUEHl;zv9kR_6zO9 zhGI3lBVeu+>jvHay|2$Cmo@atWU@f_-V$=8EJ=~W*x8wIp;Re1du6xK*Hm^B>hi6_ zYy4gh@%AE4j<|RxlYK5fszF?`8lR((XFv;^@lrJ0nVtcgI2BAQPlJ6q3D7%5u2A3+ z4b+zxv7d#@Y%N#odqPwLaqpe^XOf9Z8=_K*Q)R&`6*~5l5YfpBoxVFnr$dV8uRlGM z=mv%8RAO{Fv#sm~-mKJU_xUiC>mjlPBq+Z-cnpyxhRB`}BdagZg52kH>>7nS`Y&}s z?jJ+MPa;`!)P^)7P6`pniV>e*P{gicz|Vwkc_l=aj0CYG=IMwmB}5h{Mn<>1Ql(>; zg$$0f>-0Z_=msN&J8xzt(WQpyV*ZgXPN*#&%UGu!qH^1u9y7*?^7$TG7hBnPkdvPc zSq=^Bf&#}#b_tp%nP7!Oskn&lra+ftEOg-R1$eo@06sQE;q;mv=joJck)P+PZEiDf zx1U3@Y^ZlC*;#0|8sGz`ik-nj7WOSPx<p-eEcR(GW~r(A+`&m#lBO>6sUuI24x*XlZEaXv5HqVB-w&CVU!>HUe!Vtl!raP9F4f)6}DJWei#tnwdd4H#qSrd>n_S!h?QWU4X~GhoRG-lyV4f zlYnoQfSQiJo^HF@_Yha0VCT5iX|gi z5dG%D!XT6+U2^AeONk7ZWya;%M=9?zU)cxYZKVGhZVo z|8c9$3b$HVq77rWuOz?ylxR4%BbD;(jx9kUHcdDSvnnr4phfzO3%Vuo#ZDV-#YL&& zqk`y~O@#y%FGxf!sk7$Jog+ZS|1*eyl7i}Y?-ZaC6-2t-9JPHiU09-SsasZ!YAYkC z#BQM;U7fRWIzh#IG$pLtuo~waPhCXN$E`+Hui8z1`=>@hVkL`!Zt3-K{#@dgo4-@nu zG}gMh_!>bUx5f(D!5;Ga2sB2?b06C9?Ca8#NAe85u+m0QiF1tdKE9{jPEhf@N6ayj zXLm(MH9;lHlbS+Psd5lhVpEVjx16&HP>J%S!Fy}q3MY9LZ;DyrITrr98Q1rD2-?3| rKln($>09G!M7qZ 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_cb4a5.dir/CMakeCXXCompilerABI.cpp.o' '-c' '-shared-libgcc' '-mtune=generic' '-march=x86-64' '-dumpdir' 'CMakeFiles/cmTC_cb4a5.dir/' + as -v --64 -o CMakeFiles/cmTC_cb4a5.dir/CMakeCXXCompilerABI.cpp.o /tmp/ccE5rYpo.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_cb4a5.dir/CMakeCXXCompilerABI.cpp.o' '-c' '-shared-libgcc' '-mtune=generic' '-march=x86-64' '-dumpdir' 'CMakeFiles/cmTC_cb4a5.dir/CMakeCXXCompilerABI.cpp.' + [2/2] : && /usr/bin/c++ -v -Wl,-v CMakeFiles/cmTC_cb4a5.dir/CMakeCXXCompilerABI.cpp.o -o cmTC_cb4a5 && : + 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_cb4a5' '-shared-libgcc' '-mtune=generic' '-march=x86-64' '-dumpdir' 'cmTC_cb4a5.' + /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/cc4Zp6V6.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_cb4a5 /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_cb4a5.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/cc4Zp6V6.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_cb4a5 /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_cb4a5.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_cb4a5' '-shared-libgcc' '-mtune=generic' '-march=x86-64' '-dumpdir' 'cmTC_cb4a5.' + + 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-OqZJyT'] + ignore line: [] + ignore line: [Run Build Command(s): /usr/bin/ninja -v cmTC_cb4a5] + ignore line: [[1/2] /usr/bin/c++ -v -o CMakeFiles/cmTC_cb4a5.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_cb4a5.dir/CMakeCXXCompilerABI.cpp.o' '-c' '-shared-libgcc' '-mtune=generic' '-march=x86-64' '-dumpdir' 'CMakeFiles/cmTC_cb4a5.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_cb4a5.dir/ -dumpbase CMakeCXXCompilerABI.cpp.cpp -dumpbase-ext .cpp -mtune=generic -march=x86-64 -version -o /tmp/ccE5rYpo.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_cb4a5.dir/CMakeCXXCompilerABI.cpp.o' '-c' '-shared-libgcc' '-mtune=generic' '-march=x86-64' '-dumpdir' 'CMakeFiles/cmTC_cb4a5.dir/'] + ignore line: [ as -v --64 -o CMakeFiles/cmTC_cb4a5.dir/CMakeCXXCompilerABI.cpp.o /tmp/ccE5rYpo.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_cb4a5.dir/CMakeCXXCompilerABI.cpp.o' '-c' '-shared-libgcc' '-mtune=generic' '-march=x86-64' '-dumpdir' 'CMakeFiles/cmTC_cb4a5.dir/CMakeCXXCompilerABI.cpp.'] + ignore line: [[2/2] : && /usr/bin/c++ -v -Wl -v CMakeFiles/cmTC_cb4a5.dir/CMakeCXXCompilerABI.cpp.o -o cmTC_cb4a5 && :] + 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_cb4a5' '-shared-libgcc' '-mtune=generic' '-march=x86-64' '-dumpdir' 'cmTC_cb4a5.'] + 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/cc4Zp6V6.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_cb4a5 /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_cb4a5.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/cc4Zp6V6.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_cb4a5] ==> 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_cb4a5.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/cc4Zp6V6.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_cb4a5 /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_cb4a5.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/build.ninja b/build/build.ninja index e1adc35..3bf1809 100644 --- a/build/build.ninja +++ b/build/build.ninja @@ -148,6 +148,15 @@ build CMakeFiles/saqut.dir/src/parser/parser.cpp.o: CXX_COMPILER__saqut_unscanne OBJECT_FILE_DIR = CMakeFiles/saqut.dir/src/parser TARGET_SUPPORT_DIR = CMakeFiles/saqut.dir +build CMakeFiles/saqut.dir/src/symbol/symbol_collector.cpp.o: CXX_COMPILER__saqut_unscanned_Debug /home/saqut/Masaüstü/saqutcompiler/src/symbol/symbol_collector.cpp || cmake_object_order_depends_target_saqut + CONFIG = Debug + DEP_FILE = CMakeFiles/saqut.dir/src/symbol/symbol_collector.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/symbol + 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 @@ -165,7 +174,7 @@ build CMakeFiles/saqut.dir/src/tokenizer/tokenizer.cpp.o: CXX_COMPILER__saqut_un ############################################# # 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 +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/symbol/symbol_collector.cpp.o CMakeFiles/saqut.dir/src/tokenizer/tokenizer.cpp.o CONFIG = Debug DEP_FILE = CMakeFiles/saqut.dir/link.d FLAGS = -g @@ -221,14 +230,14 @@ build all: phony saqut ############################################# # 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 +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.3/CMakeCXXCompiler.cmake CMakeFiles/4.3.3/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 +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.3/CMakeCXXCompiler.cmake CMakeFiles/4.3.3/CMakeSystem.cmake: phony ############################################# diff --git a/examples/symbols/cyclic.sqt b/examples/symbols/cyclic.sqt new file mode 100644 index 0000000..4a1b373 --- /dev/null +++ b/examples/symbols/cyclic.sqt @@ -0,0 +1,12 @@ +// E010 — döngüsel struct (by-value çevrim → sonsuz boyut) +struct A { + B b; +} + +struct B { + A a; +} + +int main() { + return 0; +} diff --git a/examples/symbols/dup.sqt b/examples/symbols/dup.sqt new file mode 100644 index 0000000..ae8f5e6 --- /dev/null +++ b/examples/symbols/dup.sqt @@ -0,0 +1,6 @@ +// E002 — aynı scope'ta çift tanım +int main() { + int x = 1; + int x = 2; + return 0; +} diff --git a/examples/symbols/undef.sqt b/examples/symbols/undef.sqt new file mode 100644 index 0000000..2efc0e0 --- /dev/null +++ b/examples/symbols/undef.sqt @@ -0,0 +1,5 @@ +// E001 — tanımsız isim +int main() { + int x = y + 1; + return 0; +} diff --git a/src/cli/commands/symbols.hpp b/src/cli/commands/symbols.hpp index 0eeb865..90b4b4b 100644 --- a/src/cli/commands/symbols.hpp +++ b/src/cli/commands/symbols.hpp @@ -1,5 +1,5 @@ // ============================================================================ -// saQut CLI — symbols komutu (sembol tablosu) +// saQut CLI — symbols komutu (sembol tablosu — Faz 2) // ============================================================================ #ifndef SAQUT_CLI_SYMBOLS @@ -9,7 +9,9 @@ #include "cli/args.hpp" #include "tokenizer/tokenizer.hpp" #include "parser/parser.hpp" -#include "json.hpp" +#include "symbol/symbol_table.hpp" +#include "symbol/symbol_collector.hpp" +#include "diagnostic/diagnostic_engine.hpp" inline int cmdSymbols(const CliArgs& args) { std::string source = readSource(args); @@ -27,7 +29,11 @@ inline int cmdSymbols(const CliArgs& args) { return 1; } - auto symbols = collectSymbols(ast); + SymbolTable table; + DiagnosticEngine diag; + SymbolCollector(table, diag).collect(ast); + + auto symbols = table.allSymbols(); std::cout << "Sembol Tablosu (" << symbols.size() << " sembol):\n"; std::cout << "────────────────────────────────────────────\n"; @@ -36,23 +42,27 @@ inline int cmdSymbols(const CliArgs& args) { std::cout << " (sembol bulunamadı)\n"; } - for (auto& s : symbols) { - std::cout << " [" << s.kind << "] " << s.type << " " << s.name << "\n"; + for (Symbol* s : symbols) { + if (s->isBuiltin) continue; // builtinleri çıktıda gösterme + std::cout << " [" << symbolKindName(s->kind) << "] " + << s->type.toString() << " " << s->name + << " @" << s->definitionLoc.shortString() + << " refs(" << s->references.size() << "):"; + for (auto& r : s->references) + std::cout << " " << r.shortString(); + std::cout << "\n"; } std::cout << "────────────────────────────────────────────\n"; - int fnCount = 0, varCount = 0; - for (auto& s : symbols) { - if (s.kind == "function") fnCount++; - else if (s.kind == "variable") varCount++; + if (diag.hasErrors()) { + std::cerr << "\n"; + diag.printAll(std::cerr); } - std::cout << "Fonksiyon: " << fnCount - << " | Değişken: " << varCount << "\n"; delete ast; for (auto* t : tokens) delete t; - return 0; + return diag.hasErrors() ? 1 : 0; } #endif // SAQUT_CLI_SYMBOLS diff --git a/src/parser/ast_json.hpp b/src/parser/ast_json.hpp index b7130a7..a4d0a91 100644 --- a/src/parser/ast_json.hpp +++ b/src/parser/ast_json.hpp @@ -187,7 +187,10 @@ public: if (m_hasFields) m_ss << ",\n"; m_ss << m_indentInner << "\"" << jsonEscape(key) << "\": ["; m_arrayDepth++; + bool saved = m_hasArrayItem; + m_hasArrayItem = false; // her dizi kendi virgül sayacıyla başlar callback(); + m_hasArrayItem = saved; m_arrayDepth--; m_ss << "\n" << m_indentInner << "]"; m_hasFields = true; diff --git a/src/parser/nodes/declarations.cpp b/src/parser/nodes/declarations.cpp index e4357fb..994f81e 100644 --- a/src/parser/nodes/declarations.cpp +++ b/src/parser/nodes/declarations.cpp @@ -12,6 +12,9 @@ std::string FunctionDeclNode::toJson(int depth) { obj.add("kind", "FunctionDecl"); obj.add("name", name); obj.add("returnType", returnType); + obj.addArray("params", [&]() { + for (auto* p : params) obj.addItem(p->toJson(depth + 2)); + }); obj.addArray("children", [&]() { for (auto* child : children) obj.addItem(child->toJson(depth + 2)); }); diff --git a/src/parser/nodes/declarations.hpp b/src/parser/nodes/declarations.hpp index 20bf751..8779b82 100644 --- a/src/parser/nodes/declarations.hpp +++ b/src/parser/nodes/declarations.hpp @@ -3,10 +3,13 @@ #include "parser/ast_node.hpp" +class VariableDeclNode; // fwd — FunctionDeclNode::params için + class FunctionDeclNode : public ASTNode { public: std::string name; std::string returnType; + std::vector params; // TODO(faz2): parametreler FunctionDeclNode(); void log(int indent = 0) override; std::string toJson(int depth = 0) override; diff --git a/src/parser/parser.cpp b/src/parser/parser.cpp index 7f0e7e7..398abde 100644 --- a/src/parser/parser.cpp +++ b/src/parser/parser.cpp @@ -91,6 +91,16 @@ ASTNode* Parser::parseDeclaration() { if (ct.type == TokenType::KW_STRUCT) return parseStructDecl(); + // Kullanıcı tanımlı tip adı (struct tipi) ile değişken/fonksiyon bildirimi + if (ct.type == TokenType::IDENTIFIER) { + auto la1 = lookahead(1); + auto la2 = lookahead(2); + if (la1.type == TokenType::IDENTIFIER && la2.type == TokenType::LPAREN) + return parseFunctionDecl(); + if (la1.type == TokenType::IDENTIFIER) + return parseVariableDecl(); + } + return parseStatement(); } @@ -293,8 +303,26 @@ ASTNode* Parser::parseFunctionDecl() { if (currentToken().type == TokenType::LPAREN) { nextToken(); while (currentToken().type != TokenType::RPAREN && - currentToken().type != TokenType::SVR_VOID) + currentToken().type != TokenType::SVR_VOID) { + auto typeTok = currentToken(); + bool isTypeKw = typeTok.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 + }) || typeTok.type == TokenType::IDENTIFIER; + if (!isTypeKw || !typeTok.token) break; + std::string paramType = typeTok.token->token; nextToken(); + if (currentToken().type != TokenType::IDENTIFIER || !currentToken().token) break; + VariableDeclNode* param = new VariableDeclNode(); + param->loc = currentToken().token->loc; + param->varType = paramType; + param->name = currentToken().token->token; + nextToken(); + fn->params.push_back(param); + if (currentToken().type == TokenType::COMMA) + nextToken(); + } if (currentToken().type == TokenType::RPAREN) nextToken(); } diff --git a/src/symbol/scope.hpp b/src/symbol/scope.hpp new file mode 100644 index 0000000..74d0ad4 --- /dev/null +++ b/src/symbol/scope.hpp @@ -0,0 +1,37 @@ +#ifndef SAQUT_SYMBOL_SCOPE +#define SAQUT_SYMBOL_SCOPE + +#include +#include +#include "symbol/symbol.hpp" + +class Scope { +public: + Scope* parent = nullptr; + explicit Scope(Scope* p = nullptr) : parent(p) {} + + // Bu scope'a ekle. Aynı adda varsa nullptr (duplicate → çağıran E002 verir). + Symbol* defineLocal(Symbol* s) { + if (table.count(s->name)) return nullptr; + table[s->name] = s; + order.push_back(s); + s->scope = this; + return s; + } + + Symbol* lookupLocal(const std::string& n) { + auto it = table.find(n); + return it == table.end() ? nullptr : it->second; + } + + Symbol* resolve(const std::string& n) { + for (Scope* s = this; s; s = s->parent) + if (auto* r = s->lookupLocal(n)) return r; + return nullptr; + } + + std::unordered_map table; // non-owning + std::vector order; // ekleme sırası +}; + +#endif // SAQUT_SYMBOL_SCOPE diff --git a/src/symbol/symbol.hpp b/src/symbol/symbol.hpp new file mode 100644 index 0000000..4328d7d --- /dev/null +++ b/src/symbol/symbol.hpp @@ -0,0 +1,34 @@ +#ifndef SAQUT_SYMBOL_SYMBOL +#define SAQUT_SYMBOL_SYMBOL + +#include +#include +#include "core/type.hpp" +#include "core/location.hpp" + +enum class SymbolKind { Variable, Function, Parameter, Struct, Field }; + +inline const char* symbolKindName(SymbolKind k) { + switch (k) { + case SymbolKind::Variable: return "variable"; + case SymbolKind::Function: return "function"; + case SymbolKind::Parameter: return "parameter"; + case SymbolKind::Struct: return "struct"; + case SymbolKind::Field: return "field"; + } + return "?"; +} + +class Scope; + +struct Symbol { + std::string name; + SymbolKind kind = SymbolKind::Variable; + Type type; + SourceLocation definitionLoc; + std::vector references; + Scope* scope = nullptr; + bool isBuiltin = false; +}; + +#endif // SAQUT_SYMBOL_SYMBOL diff --git a/src/symbol/symbol_collector.cpp b/src/symbol/symbol_collector.cpp new file mode 100644 index 0000000..c4295b6 --- /dev/null +++ b/src/symbol/symbol_collector.cpp @@ -0,0 +1,377 @@ +#include "symbol/symbol_collector.hpp" +#include +#include "parser/nodes/program.hpp" +#include "parser/nodes/declarations.hpp" +#include "parser/nodes/statements.hpp" +#include "parser/nodes/expressions.hpp" +#include "parser/nodes/binary_expr.hpp" +#include "parser/nodes/identifier.hpp" + +// ───────────────────────────────────────────────────────────────────────────── +// collect — dört aşamalı toplama +// ───────────────────────────────────────────────────────────────────────────── + +void SymbolCollector::collect(ASTNode* program) { + if (!program) return; + seedBuiltins(); + pass1Globals(program); + checkStructCycles(); + pass2Bodies(program); +} + +// ───────────────────────────────────────────────────────────────────────────── +// seedBuiltins — global scope'a yerleşik fonksiyonları ekle +// ───────────────────────────────────────────────────────────────────────────── + +void SymbolCollector::seedBuiltins() { + // TODO(#89 builtin kataloğu): geçici; ileride gerçek katalog gelecek. + Symbol* s = table_.define("print", SymbolKind::Function, + Type::function(Type::Void(), {}), + SourceLocation{}); + if (s) s->isBuiltin = true; +} + +// ───────────────────────────────────────────────────────────────────────────── +// typeFromName — tip adından Type üret; bilinmiyorsa E007 +// ───────────────────────────────────────────────────────────────────────────── + +Type SymbolCollector::typeFromName(const std::string& n, const SourceLocation& loc) { + Type t = Type::fromName(n); + if (!t.isError()) return t; + if (structFields_.count(n)) return Type::structType(n); + // TODO(faz2/faz3): bilinmeyen tip tam E007 tanısı + diag_.report("E007", loc, "Bilinmeyen tip: '" + n + "'"); + return Type::error(); +} + +// ───────────────────────────────────────────────────────────────────────────── +// pass1Globals — üst-seviye isimleri hoist eder (gövdelere girmez) +// ───────────────────────────────────────────────────────────────────────────── + +void SymbolCollector::pass1Globals(ASTNode* program) { + for (ASTNode* child : program->getChildren()) { + switch (child->kind) { + + case ASTKind::FunctionDecl: { + auto* fn = (FunctionDeclNode*)child; + // parametre tiplerini topla + std::vector paramTypes; + for (auto* p : fn->params) + paramTypes.push_back(typeFromName(p->varType, p->loc)); + Type retType = typeFromName(fn->returnType, fn->loc); + Symbol* s = table_.define(fn->name, SymbolKind::Function, + Type::function(retType, paramTypes), + fn->loc); + if (!s) + diag_.report("E002", fn->loc, + "'" + fn->name + "' zaten bu kapsamda tanımlı"); + break; + } + + case ASTKind::StructDecl: { + auto* st = (StructDeclNode*)child; + Symbol* s = table_.define(st->name, SymbolKind::Struct, + Type::structType(st->name), st->loc); + if (!s) { + diag_.report("E002", st->loc, + "'" + st->name + "' zaten bu kapsamda tanımlı"); + break; + } + // struct alan isimlerini cycle check için kaydet + for (ASTNode* fieldNode : st->getChildren()) { + if (fieldNode->kind == ASTKind::VariableDecl) { + auto* vd = (VariableDeclNode*)fieldNode; + // yalnızca struct tipindeki alanları izle + Type ft = Type::fromName(vd->varType); + if (ft.isError()) // primitif değilse struct tipi olabilir + structFields_[st->name].push_back(vd->varType); + } + } + break; + } + + case ASTKind::VariableDecl: { + auto* vd = (VariableDeclNode*)child; + Symbol* s = table_.define(vd->name, SymbolKind::Variable, + typeFromName(vd->varType, vd->loc), + vd->loc); + if (!s) + diag_.report("E002", vd->loc, + "'" + vd->name + "' zaten bu kapsamda tanımlı"); + // Sibling VariableDecl'ler (int a, b;) + for (ASTNode* sib : vd->getChildren()) { + if (sib->kind == ASTKind::VariableDecl) { + auto* sv = (VariableDeclNode*)sib; + Symbol* ss = table_.define(sv->name, SymbolKind::Variable, + typeFromName(sv->varType, sv->loc), + sv->loc); + if (!ss) + diag_.report("E002", sv->loc, + "'" + sv->name + "' zaten bu kapsamda tanımlı"); + } + } + break; + } + + default: + break; + } + } +} + +// ───────────────────────────────────────────────────────────────────────────── +// checkStructCycles — E010 döngüsel struct (by-value çevrim → sonsuz boyut) +// ───────────────────────────────────────────────────────────────────────────── + +void SymbolCollector::checkStructCycles() { + // white=0 / gray=1 / black=2 + std::unordered_map color; + for (auto& kv : structFields_) color[kv.first] = 0; + + std::function dfs = [&](const std::string& name) -> bool { + auto it = color.find(name); + if (it == color.end()) return false; // primitif / bilinmeyen → çevrim değil + if (it->second == 1) return true; // gray → back-edge → çevrim! + if (it->second == 2) return false; // black → zaten işlendi + + it->second = 1; // gri yap + auto fit = structFields_.find(name); + if (fit != structFields_.end()) { + for (const std::string& dep : fit->second) { + if (dfs(dep)) return true; + } + } + it->second = 2; // siyah yap + return false; + }; + + for (auto& kv : structFields_) { + if (color[kv.first] == 0) { + // DFS başlat + color[kv.first] = 1; + for (const std::string& dep : kv.second) { + if (dfs(dep)) { + // tanımlama konumunu bulmak için global scope'ta ara + Symbol* s = table_.global()->lookupLocal(kv.first); + SourceLocation loc = s ? s->definitionLoc : SourceLocation{}; + diag_.report("E010", loc, + "Döngüsel struct: '" + kv.first + "' by-value sonsuz boyut oluşturur"); + break; + } + } + color[kv.first] = 2; + } + } +} + +// ───────────────────────────────────────────────────────────────────────────── +// pass2Bodies — fonksiyon gövdelerini gez; isim çözümle + referans topla +// ───────────────────────────────────────────────────────────────────────────── + +void SymbolCollector::pass2Bodies(ASTNode* program) { + for (ASTNode* child : program->getChildren()) { + switch (child->kind) { + + case ASTKind::FunctionDecl: { + auto* fn = (FunctionDeclNode*)child; + table_.enterScope(); + // parametreleri tanımla + for (auto* p : fn->params) { + Symbol* s = table_.define(p->name, SymbolKind::Parameter, + typeFromName(p->varType, p->loc), p->loc); + if (!s) + diag_.report("E002", p->loc, + "Parametre '" + p->name + "' zaten tanımlı"); + } + // gövdeyi gez (children[0] = BlockNode) + auto& ch = fn->getChildren(); + if (!ch.empty()) walkStmt(ch[0]); + table_.exitScope(); + break; + } + + case ASTKind::VariableDecl: { + // global değişken başlatıcısı (declare-before-use) + auto* vd = (VariableDeclNode*)child; + if (vd->initExpr) walkExpr(vd->initExpr); + // TODO(faz2): global init sırası kontrolü (fibonacci'de global var yok) + for (ASTNode* sib : vd->getChildren()) { + if (sib->kind == ASTKind::VariableDecl) { + auto* sv = (VariableDeclNode*)sib; + if (sv->initExpr) walkExpr(sv->initExpr); + } + } + break; + } + + case ASTKind::StructDecl: + break; // pass2'de gövde gezme gerekmez + + default: + break; + } + } +} + +// ───────────────────────────────────────────────────────────────────────────── +// walkStmt — ifade bloğunu gez +// ───────────────────────────────────────────────────────────────────────────── + +void SymbolCollector::walkStmt(ASTNode* node) { + if (!node) return; + + switch (node->kind) { + + case ASTKind::Block: { + table_.enterScope(); + for (ASTNode* child : node->getChildren()) walkStmt(child); + table_.exitScope(); + break; + } + + case ASTKind::VariableDecl: { + auto* vd = (VariableDeclNode*)node; + // Önce başlatıcıyı gez (kendini görmesin) + if (vd->initExpr) walkExpr(vd->initExpr); + // Sonra tanımla + Symbol* s = table_.define(vd->name, SymbolKind::Variable, + typeFromName(vd->varType, vd->loc), vd->loc); + if (!s) + diag_.report("E002", vd->loc, + "'" + vd->name + "' zaten bu kapsamda tanımlı"); + // Sibling VariableDecl'ler (int a, b;) — TODO: fibonacci'de yok + for (ASTNode* sib : vd->getChildren()) { + if (sib->kind == ASTKind::VariableDecl) { + auto* sv = (VariableDeclNode*)sib; + if (sv->initExpr) walkExpr(sv->initExpr); + Symbol* ss = table_.define(sv->name, SymbolKind::Variable, + typeFromName(sv->varType, sv->loc), sv->loc); + if (!ss) + diag_.report("E002", sv->loc, + "'" + sv->name + "' zaten bu kapsamda tanımlı"); + } + } + break; + } + + case ASTKind::IfStatement: { + auto* ifn = (IfStatementNode*)node; + if (ifn->condition) walkExpr(ifn->condition); + if (ifn->thenBranch) walkStmt(ifn->thenBranch); + if (ifn->elseBranch) walkStmt(ifn->elseBranch); + break; + } + + case ASTKind::WhileStatement: { + auto* ws = (WhileStatementNode*)node; + if (ws->condition) walkExpr(ws->condition); + if (ws->body) walkStmt(ws->body); + break; + } + + case ASTKind::ForStatement: { + auto* fs = (ForStatementNode*)node; + table_.enterScope(); // init değişkeni döngüye ait + if (fs->init) { + if (fs->init->kind == ASTKind::VariableDecl) walkStmt(fs->init); + else walkExpr(fs->init); + } + if (fs->condition) walkExpr(fs->condition); + if (fs->update) walkExpr(fs->update); + if (fs->body) walkStmt(fs->body); + table_.exitScope(); + break; + } + + case ASTKind::DoWhileStatement: { + auto* dw = (DoWhileStatementNode*)node; + if (dw->body) walkStmt(dw->body); + if (dw->condition) walkExpr(dw->condition); + break; + } + + case ASTKind::ReturnStatement: { + auto* rs = (ReturnStatementNode*)node; + if (rs->value) walkExpr(rs->value); + break; + } + + case ASTKind::ExpressionStatement: { + auto* es = (ExpressionStatementNode*)node; + if (es->expression) walkExpr(es->expression); + break; + } + + case ASTKind::BreakStatement: + case ASTKind::ContinueStatement: + break; // yaprak + + default: + break; + } +} + +// ───────────────────────────────────────────────────────────────────────────── +// walkExpr — ifade ağacında isimleri çöz +// ───────────────────────────────────────────────────────────────────────────── + +void SymbolCollector::walkExpr(ASTNode* node) { + if (!node) return; + + switch (node->kind) { + + case ASTKind::Identifier: { + auto* id = (IdentifierNode*)node; + if (!id->parserToken.token) break; + std::string name = id->parserToken.token->token; + Symbol* s = table_.resolve(name); + if (s) { + id->resolvedSymbol = s; + table_.addReference(s, id->loc); + } else { + diag_.report("E001", id->loc, + "'" + name + "' tanımlı değil"); + } + break; + } + + case ASTKind::BinaryExpression: { + auto* bin = (BinaryExpressionNode*)node; + if (bin->Left) walkExpr(bin->Left); + if (bin->Right) walkExpr(bin->Right); + break; + } + + case ASTKind::Call: { + auto* call = (CallExpressionNode*)node; + if (call->callee) walkExpr(call->callee); + for (ASTNode* arg : call->arguments) walkExpr(arg); + break; + } + + case ASTKind::Postfix: { + auto* pf = (PostfixNode*)node; + if (pf->operand) walkExpr(pf->operand); + break; + } + + case ASTKind::MemberAccess: { + auto* ma = (MemberAccessNode*)node; + if (ma->object) walkExpr(ma->object); // member çözümü Faz 3 → TODO + break; + } + + case ASTKind::IndexExpression: { + auto* ie = (IndexExpressionNode*)node; + if (ie->object) walkExpr(ie->object); + if (ie->index) walkExpr(ie->index); + break; + } + + case ASTKind::Literal: + break; // yaprak + + default: + break; + } +} diff --git a/src/symbol/symbol_collector.hpp b/src/symbol/symbol_collector.hpp new file mode 100644 index 0000000..ec267e3 --- /dev/null +++ b/src/symbol/symbol_collector.hpp @@ -0,0 +1,37 @@ +#ifndef SAQUT_SYMBOL_COLLECTOR +#define SAQUT_SYMBOL_COLLECTOR + +#include +#include +#include +#include "symbol/symbol_table.hpp" +#include "diagnostic/diagnostic_engine.hpp" +#include "core/type.hpp" +#include "core/location.hpp" +#include "parser/ast_node.hpp" + +class SymbolCollector { +public: + SymbolCollector(SymbolTable& t, DiagnosticEngine& d) : table_(t), diag_(d) {} + + // seedBuiltins → pass1 → structCycles(E010) → pass2 + void collect(ASTNode* program); + +private: + void seedBuiltins(); + void pass1Globals(ASTNode* program); + void checkStructCycles(); + void pass2Bodies(ASTNode* program); + void walkStmt(ASTNode* node); + void walkExpr(ASTNode* node); + + Type typeFromName(const std::string& n, const SourceLocation& loc); + + SymbolTable& table_; + DiagnosticEngine& diag_; + + // struct adı → içerdiği struct-tip alan adları (cycle check için) + std::unordered_map> structFields_; +}; + +#endif // SAQUT_SYMBOL_COLLECTOR diff --git a/src/symbol/symbol_table.hpp b/src/symbol/symbol_table.hpp new file mode 100644 index 0000000..8ff6624 --- /dev/null +++ b/src/symbol/symbol_table.hpp @@ -0,0 +1,65 @@ +#ifndef SAQUT_SYMBOL_TABLE +#define SAQUT_SYMBOL_TABLE + +#include +#include +#include "symbol/scope.hpp" + +class SymbolTable { +public: + SymbolTable() { + global_ = newScope(nullptr); + current_ = global_; + } + + Scope* global() { return global_; } + Scope* current() { return current_; } + + Scope* enterScope() { + current_ = newScope(current_); + return current_; + } + + void exitScope() { + if (current_->parent) current_ = current_->parent; + } + + // current scope'ta tanımla; duplicate → nullptr döner + Symbol* define(const std::string& name, SymbolKind k, Type t, SourceLocation loc) { + auto s = std::make_unique(); + s->name = name; + s->kind = k; + s->type = std::move(t); + s->definitionLoc = loc; + Symbol* raw = s.get(); + if (!current_->defineLocal(raw)) return nullptr; // duplicate + pool_.push_back(std::move(s)); + return raw; + } + + Symbol* resolve(const std::string& n) { return current_->resolve(n); } + + void addReference(Symbol* s, SourceLocation loc) { + if (s) s->references.push_back(loc); + } + + std::vector allSymbols() const { + std::vector result; + result.reserve(pool_.size()); + for (const auto& s : pool_) result.push_back(s.get()); + return result; + } + +private: + Scope* newScope(Scope* p) { + scopes_.push_back(std::make_unique(p)); + return scopes_.back().get(); + } + + std::vector> scopes_; + std::vector> pool_; + Scope* global_ = nullptr; + Scope* current_ = nullptr; +}; + +#endif // SAQUT_SYMBOL_TABLE