diff --git a/.gitignore b/.gitignore index 42afabf..8db1ff4 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,3 @@ -/build \ No newline at end of file +/build +/.cache +/.vscode \ No newline at end of file diff --git a/include/Lexer.hpp b/include/Lexer.hpp new file mode 100644 index 0000000..3f59c93 --- /dev/null +++ b/include/Lexer.hpp @@ -0,0 +1,2 @@ +#pragma once + diff --git a/include/Parser.hpp b/include/Parser.hpp deleted file mode 100644 index dae4db1..0000000 --- a/include/Parser.hpp +++ /dev/null @@ -1,114 +0,0 @@ -#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 9941e2b..5f27d60 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,8 +1,5 @@ -#include -#include +#include "Lexer.hpp" int main(){ - std::string s = "1 2 3 ; ; ; ;"; - ztl::Parser parser(s); - parser.advance(); + } \ No newline at end of file