13 Star 69 Fork 22

johnsonyl/cpps

加入 Gitee
与超过 1400万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
克隆/下载
cpps_symbol.cpp 35.26 KB
一键复制 编辑 原始数据 按行查看 历史
johnsonyl 提交于 2021-01-28 22:30 +08:00 . 2021-01-28 更新2
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476
#include "cpps/cpps.h"
namespace cpps
{
cpps_value cpps_calculate_expression(C* c, cpps_domain* domain, cpps_domain* root, node* o, cpps_domain*& leftdomain);
CPPS_SYMBOL_MAP symbolmap; //操作符表
CPPS_SYMBOL_MAP leftsymbolmap; //左操作符表
bool symbolleftasso[MAXSYMBOLPRIO]; //操作符是否左结合
void cpps_add(cpps_value &a, cpps_value b, cpps_value &_result)
{
if (a.tt == CPPS_TBOOLEAN || b.tt == CPPS_TBOOLEAN)
{
_result.tt = CPPS_TBOOLEAN;
_result.value.b = a.value.b + b.value.b;
return;
}
_result.tt = CPPS_TNIL;
switch (a.tt)
{
case CPPS_TINTEGER:
if (b.tt == CPPS_TINTEGER)
{
_result.tt = CPPS_TINTEGER;
_result.value.integer = cpps_to_integer(a) + cpps_to_integer(b);
}
else if (b.tt == CPPS_TNUMBER)
{
_result.tt = CPPS_TNUMBER;
_result.value.number = cpps_to_number(a) + cpps_to_number(b);
}
else if (b.tt == CPPS_TSTRING)
{
_result.tt = CPPS_TNUMBER;
_result.value.number = cpps_to_number(a) + cpps_to_number(b);
}
break;
case CPPS_TNUMBER:
case CPPS_TSTRING:
_result.tt = CPPS_TNUMBER;
_result.value.number = cpps_to_number(a) + cpps_to_number(b);
break;
default:
_result.tt = CPPS_TNIL;
break;
}
}
void cpps_add2(cpps_value &a, cpps_value &b, cpps_value &_result)
{
if (a.tt == CPPS_TBOOLEAN || b.tt == CPPS_TBOOLEAN)
{
_result.tt = CPPS_TBOOLEAN;
_result.value.b = a.value.b & b.value.b;
return;
}
_result.tt = CPPS_TNIL;
switch (a.tt)
{
case CPPS_TINTEGER:
if (b.tt == CPPS_TINTEGER)
{
_result.tt = CPPS_TINTEGER;
_result.value.integer = cpps_to_integer(a) & cpps_to_integer(b);
}
else if (b.tt == CPPS_TNUMBER)
{
_result.tt = CPPS_TINTEGER;
_result.value.integer = cpps_to_integer(a) & cpps_to_integer(b);
}
else if (b.tt == CPPS_TSTRING)
{
_result.tt = CPPS_TINTEGER;
_result.value.integer = cpps_to_integer(a) & cpps_to_integer(b);
}
break;
case CPPS_TNUMBER:
case CPPS_TSTRING:
_result.tt = CPPS_TINTEGER;
_result.value.integer = cpps_to_integer(a) & cpps_to_integer(b);
break;
default:
_result.tt = CPPS_TNIL;
break;
}
}
void cpps_add3(cpps_value &a, cpps_value b, cpps_value &_result)
{
if (a.tt == CPPS_TBOOLEAN || b.tt == CPPS_TBOOLEAN)
{
_result.tt = CPPS_TBOOLEAN;
_result.value.b = a.value.b | b.value.b;
return;
}
_result.tt = CPPS_TNIL;
switch (a.tt)
{
case CPPS_TINTEGER:
if (b.tt == CPPS_TINTEGER)
{
_result.tt = CPPS_TINTEGER;
_result.value.integer = cpps_to_integer(a) | cpps_to_integer(b);
}
else if (b.tt == CPPS_TNUMBER)
{
_result.tt = CPPS_TINTEGER;
_result.value.integer = cpps_to_integer(a) | cpps_to_integer(b);
}
else if (b.tt == CPPS_TSTRING)
{
_result.tt = CPPS_TINTEGER;
_result.value.integer = cpps_to_integer(a) | cpps_to_integer(b);
}
break;
case CPPS_TNUMBER:
case CPPS_TSTRING:
_result.tt = CPPS_TINTEGER;
_result.value.integer = cpps_to_integer(a) | cpps_to_integer(b);
break;
default:
_result.tt = CPPS_TNIL;
break;
}
}
void cpps_subtract(cpps_value& a, cpps_value &b, cpps_value &_result)
{
if (a.tt == CPPS_TBOOLEAN || b.tt == CPPS_TBOOLEAN)
{
_result.tt = CPPS_TBOOLEAN;
_result.value.b = a.value.b - b.value.b;
return;
}
_result.tt = CPPS_TNIL;
switch (a.tt)
{
case CPPS_TINTEGER:
if (b.tt == CPPS_TINTEGER)
{
_result.tt = CPPS_TINTEGER;
_result.value.integer = cpps_to_integer(a) - cpps_to_integer(b);
}
else if (b.tt == CPPS_TNUMBER)
{
_result.tt = CPPS_TNUMBER;
_result.value.number = cpps_to_number(a) - cpps_to_number(b);
}
else if (b.tt == CPPS_TSTRING)
{
_result.tt = CPPS_TNUMBER;
_result.value.number = cpps_to_number(a) - cpps_to_number(b);
}
break;
case CPPS_TNUMBER:
case CPPS_TSTRING:
_result.tt = CPPS_TNUMBER;
_result.value.number = cpps_to_number(a) - cpps_to_number(b);
break;
default:
_result.tt = CPPS_TNIL;
break;
}
}
void cpps_mul(cpps_value& a, cpps_value b, cpps_value &_result)
{
if (a.tt == CPPS_TBOOLEAN || b.tt == CPPS_TBOOLEAN)
{
_result.tt = CPPS_TBOOLEAN;
_result.value.b = a.value.b * b.value.b;
return;
}
_result.tt = CPPS_TNIL;
switch (a.tt)
{
case CPPS_TINTEGER:
if (b.tt == CPPS_TINTEGER)
{
_result.tt = CPPS_TINTEGER;
_result.value.integer = cpps_to_integer(a) * cpps_to_integer(b);
}
else if (b.tt == CPPS_TNUMBER)
{
_result.tt = CPPS_TNUMBER;
_result.value.number = cpps_to_number(a) * cpps_to_number(b);
}
else if (b.tt == CPPS_TSTRING)
{
_result.tt = CPPS_TNUMBER;
_result.value.number = cpps_to_number(a) * cpps_to_number(b);
}
break;
case CPPS_TNUMBER:
case CPPS_TSTRING:
_result.tt = CPPS_TNUMBER;
_result.value.number = cpps_to_number(a) * cpps_to_number(b);
break;
default:
_result.tt = CPPS_TNIL;
break;
}
}
void cpps_quyu(cpps_value &a, cpps_value &b, cpps_value &_result)
{
if (a.tt == CPPS_TBOOLEAN || b.tt == CPPS_TBOOLEAN)
{
_result.tt = CPPS_TBOOLEAN;
_result.value.b = a.value.b % b.value.b;
return;
}
_result.tt = CPPS_TNIL;
switch (a.tt)
{
case CPPS_TINTEGER:
case CPPS_TNUMBER:
case CPPS_TSTRING:
if (cpps_to_number(b) != 0)
{
_result.tt = CPPS_TINTEGER;
_result.value.integer = cpps_to_integer(a) % cpps_to_integer(b);
}
break;
default:
_result.tt = CPPS_TNIL;
break;
}
}
void cpps_divide(cpps_value &a, cpps_value b, cpps_value &_result)
{
if (a.tt == CPPS_TBOOLEAN || b.tt == CPPS_TBOOLEAN)
{
_result.tt = CPPS_TBOOLEAN;
_result.value.b = a.value.b / b.value.b;
return;
}
_result.tt = CPPS_TNIL;
switch (a.tt)
{
case CPPS_TNUMBER:
case CPPS_TINTEGER:
case CPPS_TSTRING:
if (cpps_to_number(b) != 0)
{
_result.tt = CPPS_TNUMBER;
_result.value.number = cpps_to_number(a) / cpps_to_number(b);
}
break;
default:
_result.tt = CPPS_TNIL;
break;
}
}
void cpps_strcat(C*c,cpps_value &a, cpps_value &b, cpps_value &ret)
{
if (a.isref()) {
std::string* str;
newclass<std::string>(c, &str,&ret);
str->append(a.real().tt == CPPS_TSTRING ? *cpps_get_string(a.real()) : cpps_to_string(a.real()));
str->append(b.tt == CPPS_TSTRING ? *cpps_get_string(b) : cpps_to_string(b));
}
else {
ret = a;
std::string* str = cpps_get_string(a);
str->append(b.tt == CPPS_TSTRING ? *cpps_get_string(b) : cpps_to_string(b));
}
}
void cpps_strcatassignment(C*c,cpps_value &a, cpps_value &b,cpps_value &ret)
{
if (a.tt == CPPS_TNIL)
{
return;
}
if (a.tt == CPPS_TREF) {
if (a.value.value->tt == CPPS_TSTRING) {
cpps_cppsclassvar* cppsclassvar = (cpps_cppsclassvar*)a.value.value->value.domain;
std::string* tmpStr = (std::string*)cppsclassvar->getclsptr();
if (b.tt == CPPS_TREF)
{
tmpStr->append(*cpps_get_string(*(b.value.value)));
}
else
{
tmpStr->append(*cpps_get_string(b));
}
}
else {
std::string* tmpStr = NULL;
newclass<std::string>(c, &tmpStr, a.value.value);
if (b.tt == CPPS_TREF)
{
tmpStr->append(*cpps_get_string(*(b.value.value)));
}
else
{
tmpStr->append(*cpps_get_string(b));
}
}
ret = *(a.value.value);
}
}
void cpps_rightautoincrease(cpps_value& a, cpps_value &ret)
{
if (a.tt == CPPS_TREF) {
cpps_value& v = *(a.value.value);
ret = v;
switch (v.tt)
{
case CPPS_TNUMBER:
v.value.number++;
break;
case CPPS_TINTEGER:
v.value.integer++;
break;
default:
break;
}
}
else if (a.tt == CPPS_TSTRINGV)
{
char& strv = *(a.value.strv);
ret = (cpps_integer)strv;
strv++;
}
}
void cpps_leftautoincrease(cpps_value& a,cpps_value &ret)
{
if (a.tt == CPPS_TREF) {
cpps_value& v = *(a.value.value);
switch (v.tt)
{
case CPPS_TNUMBER:
v.value.number++;
break;
case CPPS_TINTEGER:
v.value.integer++;
break;
default:
break;
}
ret = v;
}
else if (a.tt == CPPS_TSTRINGV)
{
char& strv = *(a.value.strv);
strv++;
ret = (cpps_integer)strv;
}
}
void cpps_rightautodecrease(cpps_value& a, cpps_value& ret)
{
if (a.tt == CPPS_TREF) {
cpps_value& v = *(a.value.value);
ret = v;
switch (v.tt)
{
case CPPS_TNUMBER:
v.value.number--;
break;
case CPPS_TINTEGER:
v.value.integer--;
break;
default:
break;
}
}
else if (a.tt == CPPS_TSTRINGV)
{
char& strv = *(a.value.strv);
ret = (cpps_integer)strv;
strv--;
}
}
void cpps_leftautodecrease(cpps_value& a, cpps_value& ret)
{
if (a.tt == CPPS_TREF) {
cpps_value& v = *(a.value.value);
switch (v.tt)
{
case CPPS_TNUMBER:
v.value.number--;
break;
case CPPS_TINTEGER:
v.value.integer--;
break;
default:
break;
}
ret = v;
}
else if (a.tt == CPPS_TSTRINGV)
{
char& strv = *(a.value.strv);
strv--;
ret = (cpps_integer)strv;
}
}
//正号
void cpps_plus(cpps_value& a, cpps_value &_result)
{
_result.tt = CPPS_TNIL;
switch (a.tt)
{
case CPPS_TINTEGER:
_result.tt = CPPS_TINTEGER;
_result.value.integer = a.value.integer;
break;
case CPPS_TNUMBER:
case CPPS_TSTRING:
_result.tt = CPPS_TINTEGER;
_result.value.number = cpps_to_number(a);
default:
break;
}
}
void cpps_minus(cpps_value& a, cpps_value &_result)
{
_result.tt = CPPS_TNIL;
switch (a.tt)
{
case CPPS_TINTEGER:
_result.tt = CPPS_TINTEGER;
_result.value.integer = -a.value.integer;
break;
case CPPS_TNUMBER:
case CPPS_TSTRING:
_result.tt = CPPS_TINTEGER;
_result.value.number = -cpps_to_number(a);
default:
break;
}
}
void cpps_assignment(C*c,cpps_value& a,cpps_value b,cpps::cpps_value &ret)
{
if (a.tt == CPPS_TNIL)
{
return ;
}
if (a.tt == CPPS_TREF) {
if (b.tt == CPPS_TREF)
{
if (b.value.value->tt == CPPS_TSTRING)
{
if (a.value.value->tt == CPPS_TSTRING)
{
std::string* src = cpps_get_string(*(b.value.value));
std::string* tar = cpps_get_string(*(a.value.value));
*tar = *src;
}
else
{
std::string* str;
cpps_value ret2;
newclass<std::string>(c, &str,&ret2);
cpps_cppsclassvar* cppsclassvar = (cpps_cppsclassvar*)b.value.value->value.domain;
std::string* tmpStr = (std::string*)cppsclassvar->getclsptr();
str->append(tmpStr->c_str());
*(a.value.value) = ret2;
}
}
else
*(a.value.value) = *(b.value.value);
}
else {
if (b.tt == CPPS_TSTRING)
{
if (a.value.value->tt == CPPS_TSTRING)
{
std::string* src = cpps_get_string(b);
std::string* tar = cpps_get_string(*a.value.value);
*tar = *src;
//tar->assign(*src);
}
else
{
std::string* str;
cpps_value ret2;
newclass<std::string>(c, &str,&ret2);
cpps_cppsclassvar* cppsclassvar = (cpps_cppsclassvar*)b.value.domain;
std::string* tmpStr = (std::string*)cppsclassvar->getclsptr();
str->append(tmpStr->begin(), tmpStr->end());
*(a.value.value) = ret2;
}
}
else
*(a.value.value) = b;
}
ret = a;
}
else if (a.tt == CPPS_TSTRINGV)
{
char& strv = *(a.value.strv);
strv = (char)cpps_to_integer(b);
ret = (cpps_integer)strv;
}
}
void cpps_addandassignment(cpps_value& a, cpps_value b, cpps::cpps_value& _result)
{
if (a.tt == CPPS_TNIL)
{
return;
}
if (a.tt == CPPS_TREF) {
cpps_value& v = *(a.value.value);
if (v.tt == CPPS_TBOOLEAN || b.tt == CPPS_TBOOLEAN)
{
return;
}
;
_result.tt = CPPS_TNIL;
switch (v.tt)
{
case CPPS_TINTEGER:
v.decruse();
if (b.tt == CPPS_TINTEGER)
{
v.value.integer += cpps_to_integer(b);
}
else if (b.tt == CPPS_TNUMBER)
{
v.tt = CPPS_TNUMBER;
v.value.number = cpps_to_number(v) + cpps_to_number(b);
}
else if (b.tt == CPPS_TSTRING)
{
v.tt = CPPS_TNUMBER;
v.value.number = cpps_to_number(v) + cpps_to_number(b);
}
break;
case CPPS_TNUMBER:
case CPPS_TSTRING:
v.decruse();
v.tt = CPPS_TNUMBER;
v.value.number = cpps_to_number(v) + cpps_to_number(b);
break;
default:
break;
}
_result = a;
}
else if (a.tt == CPPS_TSTRINGV)
{
char& strv = *(a.value.strv);
strv += (char)cpps_to_integer(b);
_result = (cpps_integer)strv;
}
}
void cpps_subtractandassignment(cpps_value& a, cpps_value b, cpps::cpps_value& _result)
{
if (a.tt == CPPS_TNIL)
{
return;
}
if (a.tt == CPPS_TREF) {
cpps_value& v = *(a.value.value);
v.decruse();
if (v.tt == CPPS_TBOOLEAN || b.tt == CPPS_TBOOLEAN)
{
return;
}
;
_result.tt = CPPS_TNIL;
switch (v.tt)
{
case CPPS_TINTEGER:
if (b.tt == CPPS_TINTEGER)
{
v.value.integer -= cpps_to_integer(b);
}
else if (b.tt == CPPS_TNUMBER)
{
v.tt = CPPS_TNUMBER;
v.value.number = cpps_to_number(v) - cpps_to_number(b);
}
else if (b.tt == CPPS_TSTRING)
{
v.tt = CPPS_TNUMBER;
v.value.number = cpps_to_number(v) - cpps_to_number(b);
}
break;
case CPPS_TNUMBER:
case CPPS_TSTRING:
v.tt = CPPS_TNUMBER;
v.value.number = cpps_to_number(v) - cpps_to_number(b);
break;
default:
break;
}
_result = a;
}
else if (a.tt == CPPS_TSTRINGV)
{
char& strv = *(a.value.strv);
strv -= (char)cpps_to_integer(b);
_result = (cpps_integer)strv;
}
}
void cpps_mulandassignment(cpps_value& a, cpps_value b, cpps::cpps_value& _result)
{
if (a.tt == CPPS_TNIL)
{
return;
}
if (a.tt == CPPS_TREF) {
cpps_value& v = *(a.value.value);
v.decruse();
if (v.tt == CPPS_TBOOLEAN || b.tt == CPPS_TBOOLEAN)
{
return;
}
_result.tt = CPPS_TNIL;
switch (v.tt)
{
case CPPS_TINTEGER:
if (b.tt == CPPS_TINTEGER)
{
v.value.integer *= cpps_to_integer(b);
}
else if (b.tt == CPPS_TNUMBER)
{
v.tt = CPPS_TNUMBER;
v.value.number = cpps_to_number(v) * cpps_to_number(b);
}
else if (b.tt == CPPS_TSTRING)
{
v.tt = CPPS_TNUMBER;
v.value.number = cpps_to_number(v) * cpps_to_number(b);
}
break;
case CPPS_TNUMBER:
case CPPS_TSTRING:
v.tt = CPPS_TNUMBER;
v.value.number = cpps_to_number(v) * cpps_to_number(b);
break;
default:
break;
}
_result = a;
}
else if (a.tt == CPPS_TSTRINGV)
{
char& strv = *(a.value.strv);
strv *= (char)cpps_to_integer(b);
_result = (cpps_integer)strv;
}
}
void cpps_divideandassignment(cpps_value& a, cpps_value b, cpps::cpps_value& _result)
{
if (a.tt == CPPS_TNIL)
{
return;
}
if (a.tt == CPPS_TREF) {
cpps_value& v = *(a.value.value);
v.decruse();
if (v.tt == CPPS_TBOOLEAN || b.tt == CPPS_TBOOLEAN)
{
return;
}
;
_result.tt = CPPS_TNIL;
switch (v.tt)
{
case CPPS_TINTEGER:
if (b.tt == CPPS_TINTEGER)
{
v.value.integer /= cpps_to_integer(b);
}
else if (b.tt == CPPS_TNUMBER)
{
v.tt = CPPS_TNUMBER;
v.value.number = cpps_to_number(v) / cpps_to_number(b);
}
else if (b.tt == CPPS_TSTRING)
{
v.tt = CPPS_TNUMBER;
v.value.number = cpps_to_number(v) / cpps_to_number(b);
}
break;
case CPPS_TNUMBER:
case CPPS_TSTRING:
v.tt = CPPS_TNUMBER;
v.value.number = cpps_to_number(v) / cpps_to_number(b);
break;
default:
break;
}
_result = a;
}
else if (a.tt == CPPS_TSTRINGV)
{
char& strv = *(a.value.strv);
strv /= (char)cpps_to_integer(b);
_result = (cpps_integer)strv;
}
}
void cpps_bigger(cpps_value& a, cpps_value b, cpps_value &ret)
{
ret.tt = CPPS_TBOOLEAN;
switch (a.tt)
{
case CPPS_TNUMBER:
if (b.tt == CPPS_TNUMBER)
{
ret.value.b = a.value.number > b.value.number;
}
else if (b.tt == CPPS_TINTEGER)
{
ret.value.b = a.value.number > b.value.integer;
}
else if (b.tt == CPPS_TSTRING)
{
ret.value.b = a.value.number > cpps_to_number(b);
}
else
{
throw(cpps_error("", 0, 0, "Can't compare non number with number."));
}
break;
case CPPS_TINTEGER:
if (b.tt == CPPS_TNUMBER)
{
ret.value.b = a.value.integer > b.value.number;
}
else if (b.tt == CPPS_TINTEGER)
{
ret.value.b = a.value.integer > b.value.integer;
}
else if (b.tt == CPPS_TSTRING)
{
ret.value.b = a.value.number > cpps_to_integer(b);
}
else
{
throw(cpps_error("", 0, 0, "Can't compare non number with number."));
}
break;
case CPPS_TSTRING:
if (b.tt == CPPS_TSTRING)
{
std::string* tmpStr = cpps_get_string(a);
std::string* tmpStr2 = cpps_get_string(b);
ret.value.b = *(tmpStr) > *(tmpStr2);
}
else if (b.tt == CPPS_TNUMBER)
{
ret.value.b = cpps_to_number(a) > b.value.number;
}
else if (b.tt == CPPS_TINTEGER)
{
ret.value.b = cpps_to_integer(a) > b.value.integer;
}
else
{
throw(cpps_error("", 0, 0, "Cannot compare non string with string."));
}
break;
default:
throw(cpps_error("", 0, 0, "These two can't be compared."));
break;
}
}
void cpps_less(cpps_value& a, cpps_value b, cpps_value &ret)
{
ret.tt = CPPS_TBOOLEAN;
switch (a.tt)
{
case CPPS_TNUMBER:
if (b.tt == CPPS_TNUMBER)
{
ret.value.b = a.value.number < b.value.number;
}
else if (b.tt == CPPS_TINTEGER)
{
ret.value.b = a.value.number < b.value.integer;
}
else if (b.tt == CPPS_TSTRING)
{
ret.value.b = a.value.number < cpps_to_number(b);
}
else
{
throw(cpps_error("", 0, 0, "Can't compare non number with number."));
}
break;
case CPPS_TINTEGER:
if (b.tt == CPPS_TNUMBER)
{
ret.value.b = a.value.integer < b.value.number;
}
else if (b.tt == CPPS_TINTEGER)
{
ret.value.b = a.value.integer < b.value.integer;
}
else if (b.tt == CPPS_TSTRING)
{
ret.value.b = a.value.number < cpps_to_integer(b);
}
else
{
throw(cpps_error("", 0, 0, "Can't compare non number with number."));
}
break;
case CPPS_TSTRING:
if (b.tt == CPPS_TSTRING)
{
std::string* tmpStr = cpps_get_string(a);
std::string* tmpStr2 = cpps_get_string(b);
ret.value.b = *(tmpStr) < *(tmpStr2);
}
else if (b.tt == CPPS_TNUMBER)
{
ret.value.b = cpps_to_number(a) < b.value.number;
}
else if (b.tt == CPPS_TINTEGER)
{
ret.value.b = cpps_to_integer(a) < b.value.integer;
}
else
{
throw(cpps_error("", 0, 0, "Cannot compare non string with string."));
}
break;
default:
throw(cpps_error("", 0, 0, "These two can't be compared."));
break;
}
}
void cpps_biggerorequel(cpps_value& a, cpps_value b, cpps_value &ret)
{
ret.tt = CPPS_TBOOLEAN;
switch (a.tt)
{
case CPPS_TNUMBER:
if (b.tt == CPPS_TNUMBER)
{
ret.value.b = a.value.number >= b.value.number;
}
else if (b.tt == CPPS_TINTEGER)
{
ret.value.b = a.value.number >= b.value.integer;
}
else if (b.tt == CPPS_TSTRING)
{
ret.value.b = a.value.number >= cpps_to_number(b);
}
else
{
throw(cpps_error("", 0, 0, "Can't compare non number with number."));
}
break;
case CPPS_TINTEGER:
if (b.tt == CPPS_TNUMBER)
{
ret.value.b = a.value.integer >= b.value.number;
}
else if (b.tt == CPPS_TINTEGER)
{
ret.value.b = a.value.integer >= b.value.integer;
}
else if (b.tt == CPPS_TSTRING)
{
ret.value.b = a.value.number >= cpps_to_integer(b);
}
else
{
throw(cpps_error("", 0, 0, "Can't compare non number with number."));
}
break;
case CPPS_TSTRING:
if (b.tt == CPPS_TSTRING)
{
std::string* tmpStr = cpps_get_string(a);
std::string* tmpStr2 = cpps_get_string(b);
ret.value.b = *(tmpStr) >= *(tmpStr2);
}
else if (b.tt == CPPS_TNUMBER)
{
ret.value.b = cpps_to_number(a) >= b.value.number;
}
else if (b.tt == CPPS_TINTEGER)
{
ret.value.b = cpps_to_integer(a) >= b.value.integer;
}
else
{
throw(cpps_error("", 0, 0, "Cannot compare non string with string."));
}
break;
default:
throw(cpps_error("", 0, 0, "These two can't be compared."));
break;
}
}
void cpps_lessorequel(cpps_value& a, cpps_value b, cpps_value &ret)
{
ret.tt = CPPS_TBOOLEAN;
switch (a.tt)
{
case CPPS_TNUMBER:
if (b.tt == CPPS_TNUMBER)
{
ret.value.b = a.value.number <= b.value.number;
}
else if (b.tt == CPPS_TINTEGER)
{
ret.value.b = a.value.number <= b.value.integer;
}
else if (b.tt == CPPS_TSTRING)
{
ret.value.b = a.value.number <= cpps_to_number(b);
}
else
{
throw(cpps_error("", 0, 0, "Can't compare non number with number."));
}
break;
case CPPS_TINTEGER:
if (b.tt == CPPS_TNUMBER)
{
ret.value.b = a.value.integer <= b.value.number;
}
else if (b.tt == CPPS_TINTEGER)
{
ret.value.b = a.value.integer <= b.value.integer;
}
else if (b.tt == CPPS_TSTRING)
{
ret.value.b = a.value.number <= cpps_to_integer(b);
}
else
{
throw(cpps_error("", 0, 0, "Can't compare non number with number."));
}
break;
case CPPS_TSTRING:
if (b.tt == CPPS_TSTRING)
{
std::string* tmpStr = cpps_get_string(a);
std::string* tmpStr2 = cpps_get_string(b);
ret.value.b = *(tmpStr) <= *(tmpStr2);
}
else if (b.tt == CPPS_TNUMBER)
{
ret.value.b = cpps_to_number(a) <= b.value.number;
}
else if (b.tt == CPPS_TINTEGER)
{
ret.value.b = cpps_to_integer(a) <= b.value.integer;
}
else
{
throw(cpps_error("", 0, 0, "Cannot compare non string with string."));
}
break;
default:
throw(cpps_error("", 0, 0, "These two can't be compared."));
break;
}
}
void cpps_equel(cpps_value& a, cpps_value b, cpps_value &ret)
{
ret.tt = CPPS_TBOOLEAN;
ret.value.b = false;
switch (a.tt)
{
case CPPS_TNIL:
ret.value.b = b.tt == CPPS_TNIL;
break;
case CPPS_TNUMBER:
if (b.tt == CPPS_TNUMBER)
{
ret.value.b = a.value.number == b.value.number;
}
else if (b.tt == CPPS_TINTEGER)
{
ret.value.b = a.value.number == b.value.integer;
}
else if (b.tt == CPPS_TSTRING)
{
cpps_number t = cpps_to_number(b);
ret.value.b = a.value.number == t;
}
break;
case CPPS_TINTEGER:
if (b.tt == CPPS_TNUMBER)
{
ret.value.b = a.value.integer == b.value.number;
}
else if (b.tt == CPPS_TINTEGER)
{
ret.value.b = a.value.integer == b.value.integer;
}
else if (b.tt == CPPS_TSTRING)
{
cpps_integer t = cpps_to_integer(b);
ret.value.b = a.value.integer == t;
}
break;
case CPPS_TSTRING:
if (b.tt == CPPS_TSTRING)
{
std::string* tmpStr = cpps_get_string(a);
std::string* tmpStr2 = cpps_get_string(b);
ret.value.b = *(tmpStr) == *(tmpStr2);
}
else if (b.tt == CPPS_TINTEGER)
{
std::string *t = cpps_get_string(b);
std::string* tmpStr = cpps_get_string(a);
ret.value.b = *(tmpStr) == *t;
}
else if (b.tt == CPPS_TNUMBER)
{
std::string *t = cpps_get_string(b);
std::string* tmpStr = cpps_get_string(a);
ret.value.b = *(tmpStr) == *t;
}
break;
case CPPS_TBOOLEAN:
if (b.tt == CPPS_TBOOLEAN)
{
if (a.value.b == 0 && b.value.b == 0)
{
ret.value.b = 1;
}
else if (a.value.b != 0 && b.value.b != 0)
{
ret.value.b = 1;
}
else
{
ret.value.b = 0;
}
}
break;
default:
break;
}
}
void cpps_notequel(cpps_value& a, cpps_value b, cpps_value &ret)
{
cpps_equel(a, b, ret);
ret.value.b = !ret.value.b;
}
void cpps_not(cpps_value a, cpps_value &ret)
{
ret.tt = CPPS_TBOOLEAN;
typedef cpps_converter<bool> converter;
bool b = converter::apply(a);
ret.value.b = !b;
}
void cpps_regsymbols(C * c)
{
leftsymbolmap["++"] = new cpps_symbol(0, 1, RIGHTMUSTVAR, "++left", CPPS_SYMBOL_TYPE_LEFTAUTOINCREASE);
leftsymbolmap["--"] = new cpps_symbol(0, 1, RIGHTMUSTVAR, "--left", CPPS_SYMBOL_TYPE_LEFTAUTODECREASE);
leftsymbolmap["+"] = new cpps_symbol(0, 1, NOLIMIT, "+left", CPPS_SYMBOL_TYPE_PLUS);
leftsymbolmap["-"] = new cpps_symbol(0, 1, NOLIMIT, "-left", CPPS_SYMBOL_TYPE_MINUS);
leftsymbolmap["!"] = new cpps_symbol(0, 1, NOLIMIT, "!left", CPPS_SYMBOL_TYPE_NOT);
symbolmap["++"] = new cpps_symbol(0, 1, LEFTMUSTVAR, "++", CPPS_SYMBOL_TYPE_RIGHTAUTOINCREASE);
symbolmap["--"] = new cpps_symbol(0, 1, LEFTMUSTVAR, "--", CPPS_SYMBOL_TYPE_RIGHTAUTODECREASE);
symbolmap["*"] = new cpps_symbol(1, 2, NOLIMIT, "*", CPPS_SYMBOL_TYPE_MUL);
symbolmap["/"] = new cpps_symbol(1, 2, NOLIMIT, "/", CPPS_SYMBOL_TYPE_DIVIDE);
symbolmap["%"] = new cpps_symbol(1, 2, NOLIMIT, "%", CPPS_SYMBOL_TYPE_QUYU);
symbolmap["+"] = new cpps_symbol(2, 2, NOLIMIT, "+", CPPS_SYMBOL_TYPE_ADD);
symbolmap["&"] = new cpps_symbol(2, 2, NOLIMIT, "&", CPPS_SYMBOL_TYPE_ADD2);
symbolmap["|"] = new cpps_symbol(2, 2, NOLIMIT, "|", CPPS_SYMBOL_TYPE_ADD3);
symbolmap["-"] = new cpps_symbol(2, 2, NOLIMIT, "-", CPPS_SYMBOL_TYPE_SUBTRACT);
symbolmap[".."] = new cpps_symbol(3, 2, NOLIMIT, "..", CPPS_SYMBOL_TYPE_STRCAT);
symbolmap[">"] = new cpps_symbol(4, 2, NOLIMIT, ">", CPPS_SYMBOL_TYPE_BIGGER);
symbolmap[">="] = new cpps_symbol(4, 2, NOLIMIT, ">=", CPPS_SYMBOL_TYPE_BIGGEROREQUEL);
symbolmap["<"] = new cpps_symbol(4, 2, NOLIMIT, "<", CPPS_SYMBOL_TYPE_LESS);
symbolmap["<="] = new cpps_symbol(4, 2, NOLIMIT, "<=", CPPS_SYMBOL_TYPE_LESSOREQUEL);
symbolmap["=="] = new cpps_symbol(5, 2, NOLIMIT, "==", CPPS_SYMBOL_TYPE_EQUEL);
symbolmap["!="] = new cpps_symbol(5, 2, NOLIMIT, "!=", CPPS_SYMBOL_TYPE_NOTEQUEL);
symbolmap["&&"] = new cpps_symbol(6, 2, NOLIMIT, "&&", CPPS_SYMBOL_TYPE_AND);
symbolmap["||"] = new cpps_symbol(7, 2, NOLIMIT, "||", CPPS_SYMBOL_TYPE_OR);
symbolmap["?"] = new cpps_symbol(8, 3, NOLIMIT, "?", CPPS_SYMBOL_TYPE_TERNARYOPERATOR);
symbolmap["="] = new cpps_symbol(9, 2, LEFTMUSTVAR, "=", CPPS_SYMBOL_TYPE_ASSIGNMENT);
symbolmap["+="] = new cpps_symbol(9, 2, LEFTMUSTVAR, "+=", CPPS_SYMBOL_TYPE_ADDANDASSIGNMENT);
symbolmap["-="] = new cpps_symbol(9, 2, LEFTMUSTVAR, "-=", CPPS_SYMBOL_TYPE_SUBTRACTANDASSIGNMENT);
symbolmap["*="] = new cpps_symbol(9, 2, LEFTMUSTVAR, "*=", CPPS_SYMBOL_TYPE_MULANDASSIGNMENT);
symbolmap["/="] = new cpps_symbol(9, 2, LEFTMUSTVAR, "/=", CPPS_SYMBOL_TYPE_DIVIDEANDASSIGNMENT);
symbolmap["..="] = new cpps_symbol(9, 2, LEFTMUSTVAR, "..", CPPS_SYMBOL_TYPE_STRCATASSIGNMENT);
symbolmap["[]"] = new cpps_symbol(9, 2, LEFTMUSTVAR, "[]", CPPS_SYMBOL_TYPE_GETOBJECT);
symbolmap["->"] = new cpps_symbol(9, 2, LEFTMUSTVAR, "->", CPPS_SYMBOL_TYPE_GETSUBOBJECT);
symbolleftasso[0] = false;
symbolleftasso[1] = true;
symbolleftasso[2] = true;
symbolleftasso[3] = true;
symbolleftasso[4] = true;
symbolleftasso[5] = true;
symbolleftasso[6] = true;
symbolleftasso[7] = true;
symbolleftasso[8] = false;
}
bool cpps_parse_isleftasso(usint8 prio)
{
//assert(getprio() < MAXSYMBOLPRIO);
return symbolleftasso[prio];
}
cpps_symbol* cpps_parse_getsymbol(std::string symbolstr, bool leftsymbol)
{
cpps_symbol* ret = NULL;
CPPS_SYMBOL_MAP::iterator it;
if (leftsymbol)
{
it = leftsymbolmap.find(symbolstr);
if (it != leftsymbolmap.end())
{
ret = it->second;
}
}
else
{
it = symbolmap.find(symbolstr);
if (it != symbolmap.end())
{
ret = it->second;
}
}
return ret;
}
void cpps_symbol_handle(C* c, cpps_domain* domain, cpps_domain* root, node* d, cpps_value& ret)
{
cpps_domain* leftdomain = NULL;
cpps_value a = cpps_calculate_expression(c, domain,root, d->l[0], leftdomain);
leftdomain = NULL;
if ((cpps_isclassvar(a) || (a.tt == CPPS_TREF && cpps_isclassvar(*a.value.value)))) {
object left = object(a);
cpps_cppsclassvar* cppsclassvar = cpps_to_cpps_cppsclassvar(a);
cpps_cppsclass* cppsclass = cppsclassvar->getcppsclass();
cpps_function* func = cppsclass->getoperator(d->symbol->symboltype);
if (func) {
object symbolfunc = cpps_value(func);
if (func->getIsNeedC()) {
ret = doclassfunction(c, left, symbolfunc, cpps::object::create(c,c), cpps_calculate_expression(c, domain, root, d->l[1], leftdomain)).getval();
}
else {
ret = doclassfunction(c, left, symbolfunc, cpps_calculate_expression(c, domain, root, d->l[1], leftdomain)).getval();
}
return;
}
}
switch (d->symbol->symboltype)
{
case CPPS_SYMBOL_TYPE_LEFTAUTOINCREASE:
{
cpps_leftautoincrease(a, ret);
break;
}
case CPPS_SYMBOL_TYPE_LEFTAUTODECREASE:
{
cpps_leftautodecrease(a, ret);
break;
}
case CPPS_SYMBOL_TYPE_PLUS:
{
CPPS_TO_REAL_VALUE(a);
cpps_plus(a, ret);
break;
}
case CPPS_SYMBOL_TYPE_MINUS:
{
CPPS_TO_REAL_VALUE(a);
cpps_minus(a, ret);
break;
}
case CPPS_SYMBOL_TYPE_NOT:
{
CPPS_TO_REAL_VALUE(a);
cpps_not(a, ret);
break;
}
case CPPS_SYMBOL_TYPE_RIGHTAUTOINCREASE:
{
cpps_rightautoincrease(a, ret);
break;
}
case CPPS_SYMBOL_TYPE_RIGHTAUTODECREASE:
{
cpps_rightautodecrease(a, ret);
break;
}
case CPPS_SYMBOL_TYPE_MUL:
{
cpps_value b = cpps_calculate_expression(c, domain, root, d->l[1], leftdomain);
CPPS_TO_REAL_VALUE(a);
CPPS_TO_REAL_VALUE(b);
cpps_mul(a, b, ret);
break;
}
case CPPS_SYMBOL_TYPE_DIVIDE:
{
cpps_value b = cpps_calculate_expression(c, domain, root, d->l[1], leftdomain);
CPPS_TO_REAL_VALUE(a);
CPPS_TO_REAL_VALUE(b);
cpps_divide(a, b, ret);
break;
}
case CPPS_SYMBOL_TYPE_QUYU:
{
cpps_value b = cpps_calculate_expression(c, domain, root, d->l[1], leftdomain);
CPPS_TO_REAL_VALUE(a);
CPPS_TO_REAL_VALUE(b);
cpps_quyu(a, b, ret);
break;
}
case CPPS_SYMBOL_TYPE_ADD:
{
cpps_value b = cpps_calculate_expression(c, domain, root, d->l[1], leftdomain);
CPPS_TO_REAL_VALUE(a);
CPPS_TO_REAL_VALUE(b);
cpps_add(a, b, ret);
break;
}
case CPPS_SYMBOL_TYPE_ADD2:
{
cpps_value b = cpps_calculate_expression(c, domain, root, d->l[1], leftdomain);
CPPS_TO_REAL_VALUE(a);
CPPS_TO_REAL_VALUE(b);
cpps_add2(a, b, ret);
break;
}
case CPPS_SYMBOL_TYPE_ADD3:
{
cpps_value b = cpps_calculate_expression(c, domain, root, d->l[1], leftdomain);
CPPS_TO_REAL_VALUE(a);
CPPS_TO_REAL_VALUE(b);
cpps_add3(a, b, ret);
break;
}
case CPPS_SYMBOL_TYPE_SUBTRACT:
{
cpps_value b = cpps_calculate_expression(c, domain, root, d->l[1], leftdomain);
CPPS_TO_REAL_VALUE(a);
CPPS_TO_REAL_VALUE(b);
cpps_subtract(a, b, ret);
break;
}
case CPPS_SYMBOL_TYPE_STRCAT:
{
cpps_value b = cpps_calculate_expression(c, domain, root, d->l[1], leftdomain);
//CPPS_TO_REAL_VALUE(a);
CPPS_TO_REAL_VALUE(b);
cpps_strcat(c, a, b, ret);
break;
}
case CPPS_SYMBOL_TYPE_BIGGER:
{
cpps_value b = cpps_calculate_expression(c, domain, root, d->l[1], leftdomain);
CPPS_TO_REAL_VALUE(a);
CPPS_TO_REAL_VALUE(b);
cpps_bigger(a, b, ret);
break;
}
case CPPS_SYMBOL_TYPE_BIGGEROREQUEL:
{
cpps_value b = cpps_calculate_expression(c, domain, root, d->l[1], leftdomain);
CPPS_TO_REAL_VALUE(a);
CPPS_TO_REAL_VALUE(b);
cpps_biggerorequel(a, b, ret);
break;
}
case CPPS_SYMBOL_TYPE_LESS:
{
cpps_value b = cpps_calculate_expression(c, domain, root, d->l[1], leftdomain);
CPPS_TO_REAL_VALUE(a);
CPPS_TO_REAL_VALUE(b);
cpps_less(a, b, ret);
break;
}
case CPPS_SYMBOL_TYPE_LESSOREQUEL:
{
cpps_value b = cpps_calculate_expression(c, domain, root, d->l[1], leftdomain);
CPPS_TO_REAL_VALUE(a);
CPPS_TO_REAL_VALUE(b);
cpps_lessorequel(a, b, ret);
break;
}
case CPPS_SYMBOL_TYPE_EQUEL:
{
cpps_value b = cpps_calculate_expression(c, domain, root, d->l[1], leftdomain);
CPPS_TO_REAL_VALUE(a);
CPPS_TO_REAL_VALUE(b);
cpps_equel(a, b, ret);
break;
}
case CPPS_SYMBOL_TYPE_NOTEQUEL:
{
cpps_value b = cpps_calculate_expression(c, domain, root, d->l[1], leftdomain);
CPPS_TO_REAL_VALUE(a);
CPPS_TO_REAL_VALUE(b);
cpps_notequel(a, b, ret);
break;
}
case CPPS_SYMBOL_TYPE_ASSIGNMENT:
{
cpps_value b = cpps_calculate_expression(c, domain, root, d->l[1], leftdomain);
CPPS_TO_REAL_VALUE(b);
cpps_assignment(c, a, b, ret);
break;
}
case CPPS_SYMBOL_TYPE_ADDANDASSIGNMENT:
{
cpps_value b = cpps_calculate_expression(c, domain, root, d->l[1], leftdomain);
CPPS_TO_REAL_VALUE(b);
cpps_addandassignment( a, b, ret);
break;
}
case CPPS_SYMBOL_TYPE_SUBTRACTANDASSIGNMENT:
{
cpps_value b = cpps_calculate_expression(c, domain, root, d->l[1], leftdomain);
CPPS_TO_REAL_VALUE(b);
cpps_subtractandassignment(a, b, ret);
break;
}
case CPPS_SYMBOL_TYPE_MULANDASSIGNMENT:
{
cpps_value b = cpps_calculate_expression(c, domain, root, d->l[1], leftdomain);
CPPS_TO_REAL_VALUE(b);
cpps_mulandassignment(a, b, ret);
break;
}
case CPPS_SYMBOL_TYPE_DIVIDEANDASSIGNMENT:
{
cpps_value b = cpps_calculate_expression(c, domain, root, d->l[1], leftdomain);
CPPS_TO_REAL_VALUE(b);
cpps_divideandassignment(a, b, ret);
break;
}
case CPPS_SYMBOL_TYPE_AND:
{
typedef cpps::cpps_converter<bool> convert;
CPPS_TO_REAL_VALUE(a);
ret.tt = CPPS_TBOOLEAN;
ret.value.b = convert::apply(a);
if (!ret.value.b) break; //如果A等于false 则不需要执行B.
cpps_value b = cpps_calculate_expression(c, domain, root, d->l[1], leftdomain);
CPPS_TO_REAL_VALUE(b);
ret.value.b = convert::apply(b);
break;
}
case CPPS_SYMBOL_TYPE_OR:
{
typedef cpps::cpps_converter<bool> convert;
CPPS_TO_REAL_VALUE(a);
ret.tt = CPPS_TBOOLEAN;
ret.value.b = convert::apply(a);
if (ret.value.b) break; //如果A等于true 则不需要执行B.
cpps_value b = cpps_calculate_expression(c, domain, root, d->l[1], leftdomain);
CPPS_TO_REAL_VALUE(b);
ret.value.b = convert::apply(b);
break;
}
case CPPS_SYMBOL_TYPE_STRCATASSIGNMENT:
{
cpps_value b = cpps_calculate_expression(c, domain, root, d->l[1], leftdomain);
CPPS_TO_REAL_VALUE(b);
cpps_strcatassignment(c, a, b, ret);
break;
}
case CPPS_SYMBOL_TYPE_TERNARYOPERATOR:
{
typedef cpps::cpps_converter<bool> convert;
CPPS_TO_REAL_VALUE(a);
ret = convert::apply(a) ? cpps_calculate_expression(c, domain, root, d->l[1], leftdomain) : cpps_calculate_expression(c, domain, root, d->l[2], leftdomain);
break;
}
default:
break;
}
}
}
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
C++
1
https://gitee.com/cppscript/cpps.git
git@gitee.com:cppscript/cpps.git
cppscript
cpps
cpps
v1.0.0

搜索帮助