From edb6ce4a71ddc0704de96bfe660aed3aa96f9e1f Mon Sep 17 00:00:00 2001 From: Zengtudor Date: Sat, 17 May 2025 23:32:26 +0800 Subject: [PATCH] update --- .../index/Parser.hpp.938445F9E3CDA47F.idx | Bin 0 -> 3380 bytes .../index/main.cpp.22F7FFCCC53EEB81.idx | Bin 0 -> 654 bytes CMakeLists.txt | 8 +- include/Parser.hpp | 114 ++++++++++++++++++ src/main.cpp | 7 +- 5 files changed, 125 insertions(+), 4 deletions(-) create mode 100644 .cache/clangd/index/Parser.hpp.938445F9E3CDA47F.idx create mode 100644 .cache/clangd/index/main.cpp.22F7FFCCC53EEB81.idx create mode 100644 include/Parser.hpp diff --git a/.cache/clangd/index/Parser.hpp.938445F9E3CDA47F.idx b/.cache/clangd/index/Parser.hpp.938445F9E3CDA47F.idx new file mode 100644 index 0000000000000000000000000000000000000000..ca350dbedd656abbcddf26810f86f08c71c6468f GIT binary patch literal 3380 zcmb_dZ){Ul6u*1>)AjAOeXPCP+P$r>?F!w1zI7}U3XI0B;0R8EL6kqvu6^4Yy0)~1 z4GaqyV-_GL7?lt(Mh$-=EX0UL2uOk$A|F@+$R88ngJ^=72p=Q_4e{JNPRj>AZdp&y zz2~0aJ@=gRJ6+MWc=0R~Asw-(=({Dh{)@aOjgg3UU(LX#5PBgQJwUqQV9|b_7QeD zi81&7ctQ_qn${82V)|w+noesyn_{WVvPg13izlOrO)*`Y#PScO(=R$d6i*Hex3y}C zc%L>9jcOxv+j`qtXT#QPZkp4g1zP0CUOj3lNOm34A*U}`aQThe-OE)$9KYGtxHGN9*HLT|-mBP5>fO6EF% zCrry_d*CcdriMvYhYH6?ZZMvSk*&D|`vilNlC?4F`EJGy*2#H2-`lt|*^aOp%{wmW zX(yw+|3?d4V4K-3LwyEd^_B6PiM4;eMJs^o$gg(5PolB~G2$a-vswYXZC z|!2o>OM6|H72h;h<3tK=T3D($cDcd#hQn zOefUoaMp8y=HXY1?hjVKKPn3zFnblRiwiX0oH*5e_j_r3nP7yp)K}D7xWKfuADMq= z)z0xTiKt-q8GV&p5My~M%lU;e+rC3zx%SCI9e}Hf>gEE$pPo6Ly!hAdL$aWN*`s(| zT%h^$vt7%UdK<^))O0==Pw!j zQ4&~aextvV3pAIczAIfGwq7v^W-u=l7s_1V!%Qvt6{?xFE(d{_}EvZ0muMt2GbILOndpWpPzb~8c=YB94V^g+(1s?cd^Jhfk+Ys4%yHsQ9HHUF)?4SyV3H+ zZcAm6M8h;}#~y86cwW4*WsOacsOnK0u|Fj0DtDPNYsj@C2j>`83OQCJa&F;Gt6d0*l!McZZ&**H8a##Z46!8|@`YyM#S-mo>hxpGNIysl;~pZN^{@P_ z<@a5oA{!00hUTJg>%{RNetq!M64(yU49`XoWzYPY6?N(LW$&j2nPFbEJnxu@iI`r2+twECvH4r5wr44)a&h`-^G5-qnG<(`G{|apgG`xiQSE#qy+lDX3GlGN9uL4}a z9hiZSx?OQ=?dsvt!^J>ARrBJuLYp1U&cZ6t6wq*mg%m_S`0(WttufWuu>XI#@9Uj7 zxA`iR*MpJvZ7Li6z9N0GTTlNu)aGClV`eNCk z1=%=85bP9~uxt$DHWb*QF1}h_5HyMhN|isyQ8Z1f7?IYDgXcg literal 0 HcmV?d00001 diff --git a/.cache/clangd/index/main.cpp.22F7FFCCC53EEB81.idx b/.cache/clangd/index/main.cpp.22F7FFCCC53EEB81.idx new file mode 100644 index 0000000000000000000000000000000000000000..ba4c23c8fbcf1acfaa42bd121af7a0cacb53f31e GIT binary patch literal 654 zcmaJ;y-EW?5S~j;O*AGJ0YwlCu?l+|&k!UK5Q7H+1yLIzAa}d#xq3fgH>c4Du(S|- zjnp>2g@wI^orRs1?nVzI1c%vScITVfZ)Wz}j&qX%Xwh~*WIfjefU-KWC-}fnjuwQJ zQo%2nKw(T-)2~zjwOb8L*##!uE^h7QSy}r=-nLjAE|z`R?2;ePl|rFq=LDkdOxYnxC1;WG8Zy1#`-nhA-}yxUv8M literal 0 HcmV?d00001 diff --git a/CMakeLists.txt b/CMakeLists.txt index 637c706..9615e46 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,10 +1,12 @@ cmake_minimum_required(VERSION 3.10) -project(td CXX) +project(ztl CXX) +set(CMAKE_EXPORT_COMPILE_COMMANDS ON) set(CMAKE_CXX_STANDARD 26 CMAKE_CXX_STANDARD_REQUIRED ON) -file(GLOB_RECURSE SRC_CPP src/*.cpp) +file(GLOB_RECURSE SRC_CPP ${CMAKE_CURRENT_LIST_DIR}/src/*.cpp) -add_executable(${PROJECT_NAME} ${SRC_CPP}) \ No newline at end of file +add_executable(${PROJECT_NAME} ${SRC_CPP}) +target_include_directories(${PROJECT_NAME} PRIVATE ${CMAKE_CURRENT_LIST_DIR}/include) \ No newline at end of file diff --git a/include/Parser.hpp b/include/Parser.hpp new file mode 100644 index 0000000..dae4db1 --- /dev/null +++ b/include/Parser.hpp @@ -0,0 +1,114 @@ +#pragma once + +#include +#include +#include +#include +#include +#include +#include + +namespace ztl{ + struct Code{ + const std::string _str; + std::optional getStr(size_t n)const{return idx+n>=_str.size()?std::nullopt:std::optional{_str[idx+n]};}; + size_t idx=0; + std::optional now()const{return getStr(0);} + std::optional first()const{return getStr(1);} + std::optional second()const{return getStr(2);} + std::optional third()const{return getStr(3);} + void consume(){ + if(idx==_str.size())[[unlikely]]{ + throw std::logic_error("the Code cannot to be consume!"); + } + idx++; + } + bool isEnd(){ + return idx==_str.size(); + } + }; + + template + concept Numeric = std::integral || std::floating_point; + + template + class INodeData{ + public: + T data; + virtual~INodeData()=default; + }; + + class Node{ + public: + virtual~Node()=default; + }; + + template + class NumberNode:public Node,public INodeData{ + public: + NumberNode(T&t):data(t){ + + } + T data; + virtual~NumberNode()=default; + }; + + template + bool isItsType(const Code&code)=delete; + + bool inline isIntChar(const char c)noexcept{ + return '0'<=c&&c<='9'; + } + template<> + bool inline isItsType>(const Code&code){ + if(isIntChar(code.now().value())){ + if(code.now().value()=='0'){ + if(isIntChar(code.first().value())){ + return false; + }else{ + return true; + } + }else{ + return true; + } + }else{ + return false; + } + } + + + template + inline T parse(Code&code)=delete; + + template<> + inline NumberNode parse(Code&code){ + int v=0; + while(code.now().has_value()&&isIntChar(code.now().value())){ + v=v*10+(code.now().value()-'0'); + code.consume(); + } + return NumberNode(v); + } + + class Parser{ + Code code; + public: + Parser(const std::string &code):code({._str=code}){ + + } + void advance(){ + while(!code.isEnd()){ + if(code.now().value()==';'){ + return; + } + if(code.now().value()==' '){ + code.consume(); + }else if(isItsType>(code)){ + std::cout<>(code).data<<'\n'; + }else[[unlikely]]{ + throw std::logic_error("cannot parse the code"); + } + } + } + }; +} \ No newline at end of file diff --git a/src/main.cpp b/src/main.cpp index 294989d..9941e2b 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,3 +1,8 @@ +#include +#include + int main(){ - + std::string s = "1 2 3 ; ; ; ;"; + ztl::Parser parser(s); + parser.advance(); } \ No newline at end of file