#pragma once #include "Lexer.hpp" #include #include #include #include #include #include #include #include #include #include #include namespace ztl{ inline void interpreter(const std::vector &tokens){ using ObjectType = std::variant; std::map objects; const auto getValueOrLiteral = [&tokens,&objects](size_t i){ ObjectType a; if(tokens[i].type==TokenType::Literal){ a=atoi(tokens[i].str.data()); }else if(tokens[i].type==TokenType::Identifier){ if(auto it = objects.find(tokens[i].str);it!=objects.end()){ a=(*it).second; }else{ throw std::runtime_error(std::format("error in getting value named '{}'",tokens[i].str)); } }else{ throw std::runtime_error("error in getting expression result"); } return a; }; const auto getExprAns = [&getValueOrLiteral,&objects,&tokens](size_t i)->std::pair{ ObjectType a=getValueOrLiteral(i); ObjectType b; if(i+1(a) && std::holds_alternative(b)){ if(tokens[i+1].str=="+"){ res = std::get(a) + std::get(b); }else if(tokens[i+1].str=="-"){ res = std::get(a) - std::get(b); } else{ throw std::runtime_error(std::format("unknown operator '{}' ",tokens[i+1].str)); } }else{ throw std::runtime_error(std::format("unknown value type '{}' ,'{}'",tokens[i].str,tokens[i+2].str)); } return {res,3}; }; for(size_t i=0;isecond.index()!=res.first.index()){ throw std::runtime_error(std::format("cannot give value to {}, because type is not same",valueName)); } }else{ throw std::runtime_error(std::format("error when getting int value named '{}'",valueName)); } objects[valueName] = res.first; i+=res.second; }else{ throw std::runtime_error(std::format("error when creatting int value '{}'",tokens[i].str)); } } else{ throw std::runtime_error(std::format("interpreter error at '{}'",tokens[i].str)); } eat(";"); } } }