@@ -44,6 +44,9 @@ namespace cpps {
4444 bool cpps_io_isdir (std::string p);
4545 bool cpps_io_isfile (std::string p);
4646 void cpps_cpp_real_walk (std::vector<std::string>& vct, std::string path, bool bfindchildren);
47+ node* cpps_parse_getsymbol2node (C* c, node* o, std::string symbolStr, cppsbuffer& buffer, bool leftsymbol);
48+
49+
4750 void cpps_load_filebuffer (const char * path, std::string& fileSrc)
4851 {
4952#ifdef _WIN32
@@ -575,7 +578,15 @@ namespace cpps {
575578 }
576579 if (str->s == " operator" ) {
577580 cpps_parse_rmspaceandenter (buffer);
578- node* op = cpps_parse_symbol (c, domain, str, buffer);
581+ node* op = NULL ;
582+ if (buffer.cur () == ' (' && buffer.at (buffer.offset () + 1 ) == ' )' ) {
583+ // operator () 特殊处理
584+ op = cpps_parse_getsymbol2node (c, str, " ()" , buffer, false );
585+ }
586+ else {
587+ op = cpps_parse_symbol (c, domain, str, buffer);
588+ }
589+
579590 if (!op) throw (cpps_error (str->filename , buffer.line (), cpps_error_varerror, " invalid operator symbol." ));
580591 str->s = op->symbol ->symbolfuncname ;
581592 str->symbol = op->symbol ;
@@ -1530,6 +1541,18 @@ namespace cpps {
15301541
15311542 return p;
15321543 }
1544+ node* cpps_parse_getsymbol2node (C*c, node* o, std::string symbolStr, cppsbuffer& buffer, bool leftsymbol) {
1545+ cpps_symbol* symbol = cpps_parse_getsymbol (c, symbolStr, leftsymbol);
1546+ if (!symbol) {
1547+ return (NULL );
1548+ }
1549+ buffer.seek (buffer.offset () + (int32)symbolStr.size ());
1550+ node* pNode = CPPSNEW (node)(o->filename , buffer.line ());
1551+ pNode->type = CPPS_FUNCNAME;
1552+ pNode->symbol = symbol;
1553+ pNode->s = symbolStr;
1554+ return pNode;
1555+ }
15331556 node* cpps_parse_symbol (C* c, cpps_node_domain* domain, node* o, cppsbuffer& buffer, bool leftsymbol) {
15341557 std::string symbolStr;
15351558 std::string tempStr;
@@ -1549,16 +1572,7 @@ namespace cpps {
15491572 curoffset += 1 ;
15501573 ch = buffer.at (curoffset);
15511574 }
1552- cpps_symbol* symbol = cpps_parse_getsymbol (c, symbolStr, leftsymbol);
1553- if (!symbol) {
1554- return (NULL );
1555- }
1556- buffer.seek (buffer.offset () + (int32)symbolStr.size ());
1557- node* pNode = CPPSNEW (node)(o->filename , buffer.line ());
1558- pNode->type = CPPS_FUNCNAME;
1559- pNode->symbol = symbol;
1560- pNode->s = symbolStr;
1561- return (pNode);
1575+ return cpps_parse_getsymbol2node (c,o,symbolStr,buffer,leftsymbol);
15621576 }
15631577 void cpps_parse_expression (C* c, cpps_node_domain* domain, node* param, node* root, cppsbuffer& buffer) {
15641578 node* lastOpNode = param;
@@ -5373,12 +5387,24 @@ namespace cpps {
53735387 }
53745388 cpps_value cpps_step_callfunction (C* c, cpps_domain* domain, cpps_domain* root, cpps_value func, node* d, cpps_domain* leftdomain) {
53755389 cpps_value ret;
5390+ cpps_domain* _tmp = leftdomain;
53765391 if (func.tt == CPPS_TLAMBDAFUNCTION) {
53775392 cpps_cppsclassvar* cppsclassvar = (cpps_cppsclassvar*)func.value .domain ;
53785393 cpps_lambda_function* pfunc = (cpps_lambda_function*)cppsclassvar->getclsptr ();
53795394 func = pfunc;
53805395 func.tt = CPPS_TFUNCTION;
53815396 }
5397+ if (func.tt == CPPS_TCLASSVAR) {
5398+ cpps_cppsclassvar* cppsclassvar = cpps_to_cpps_cppsclassvar (func);
5399+ cpps_cppsclass* cppsclass = cppsclassvar->getcppsclass ();
5400+ cpps_function* _func = cppsclass->getoperator (" ()" );
5401+ if (_func) {
5402+ leftdomain = cppsclassvar;
5403+ func = _func;
5404+ func.tt = CPPS_TFUNCTION;
5405+ }
5406+ }
5407+
53825408 if (func.tt == CPPS_TFUNCTION) {
53835409 cpps_function* f = func.value .func ;
53845410 bool take_disabled_non_def_var = c->disabled_non_def_var ;
@@ -5426,11 +5452,14 @@ namespace cpps {
54265452 }
54275453 }
54285454 else {
5455+
54295456 /* 需要一个函数,但是他不是!!!! */
54305457 if (d->getleft ()->l .size () == 2 )
5431- printf (" cpps warring: [%s] is not function line:%d , file:%s \n " , d->getleft ()->getright ()->s .c_str (), d->line , d->filename .c_str ()); else
5458+ printf (" cpps warring: [%s] is not function line:%d , file:%s \n " , d->getleft ()->getright ()->s .c_str (), d->line , d->filename .c_str ());
5459+ else
54325460 printf (" cpps warring: [%s] is not function line:%d , file:%s \n " , d->getleft ()->s .c_str (), d->line , d->filename .c_str ());
54335461 }
5462+ leftdomain = _tmp;
54345463 return (ret);
54355464 }
54365465 cpps::object _G (C* c) {
0 commit comments