PExp TExp::LoadTxtExp(TILx& Lx, const TFSet& Expect){ PExp Exp=LoadTxtRelExp(Lx, TFSet(Expect)|syQuestion); if (Lx.Sym==syQuestion){ TExpOp ExpOp=GetExpOpFromLxSym(Lx.Sym); Lx.GetSym(ExpExpect); PExp ThenExp=LoadTxtExp(Lx, TFSet()|syColon); Lx.GetSym(ExpExpect); PExp ElseExp=LoadTxtExp(Lx, Expect); Exp=PExp(new TExp(ExpOp, Exp, ThenExp, ElseExp)); } return Exp; }
PExp TExp::LoadTxtAddExp(TILx& Lx, const TFSet& Expect){ TExpOp PrefExpOp=eoUndef; if (Lx.Sym==syPlus){PrefExpOp=eoUPlus; Lx.GetSym(MulExpExpect);} else if (Lx.Sym==syMinus){PrefExpOp=eoUMinus; Lx.GetSym(MulExpExpect);} PExp Exp=LoadTxtMulExp(Lx, TFSet(Expect)|AddOpSymSet); if (PrefExpOp!=eoUndef){ Exp=PExp(new TExp(PrefExpOp, Exp));} while (AddOpSymSet.In(Lx.Sym)){ TExpOp ExpOp=GetExpOpFromLxSym(Lx.Sym); Lx.GetSym(MulExpExpect); PExp RExp=LoadTxtMulExp(Lx, TFSet(Expect)|AddOpSymSet); Exp=PExp(new TExp(ExpOp, Exp, RExp)); } return Exp; }
PExp TExp::LoadTxtRelExp(TILx& Lx, const TFSet& Expect){ PExp Exp=LoadTxtAddExp(Lx, TFSet(Expect)|RelOpSymSet); if (RelOpSymSet.In(Lx.Sym)){ TExpOp ExpOp=GetExpOpFromLxSym(Lx.Sym); Lx.GetSym(AddExpExpect); PExp RExp=LoadTxtAddExp(Lx, Expect); Exp=PExp(new TExp(ExpOp, Exp, RExp)); } return Exp; }
PExp TExp::LoadTxtMulExp(TILx& Lx, const TFSet& Expect){ PExp Exp=LoadTxtFact(Lx, TFSet(Expect)|MulOpSymSet); while (MulOpSymSet.In(Lx.Sym)){ TExpOp ExpOp=GetExpOpFromLxSym(Lx.Sym); Lx.GetSym(FactExpExpect); PExp RExp=LoadTxtFact(Lx, TFSet(Expect)|MulOpSymSet); Exp=PExp(new TExp(ExpOp, Exp, RExp)); } return Exp; }
TPlVal TPlBs::ParseTup(TILx& Lx, const TFSet& Expect, const PPlBs& PlBs){ IAssert(TupExpect.In(Lx.Sym)); int FuncId=PlBs->AtomH.AddKey(Lx.Str); TPlValV ValV; Lx.GetSym(syLParen); Lx.GetSym(ExpExpect); TPlVal Val=ParseExp(Lx, TFSet()|syComma|syRParen, PlBs); ValV.Add(Val); while (Lx.Sym==syComma){ Lx.GetSym(ExpExpect); Val=ParseExp(Lx, TFSet()|syComma|syRParen, PlBs); ValV.Add(Val); } Lx.GetSym(Expect); // create and store tuple PPlTup Tup=TPlTup::New(FuncId, ValV); int TupId=PlBs->AddTup(Tup); TPlVal TupVal; TupVal.PutTupId(TupId); return TupVal; }
TPlVal TPlBs::ParseExp(TILx& Lx, const TFSet& Expect, const PPlBs& PlBs){ IAssert(ExpExpect.In(Lx.Sym)); TPlVal PlVal; if (Lx.Sym==syInt){ PlVal.PutInt(Lx.Int); Lx.GetSym(Expect); } else if (Lx.Sym==syFlt){ PlVal.PutFlt(Lx.Flt); Lx.GetSym(Expect); } else if (Lx.Sym==syStr){ if (Lx.PeekSym()==syLParen){ Fail; } else { int AtomId=PlBs->AtomH.AddKey(Lx.Str); PlVal.PutAtomId(AtomId); Lx.GetSym(Expect); } } else { Fail; } return PlVal; }
PExp TExp::LoadTxtFact(TILx& Lx, const TFSet& Expect){ PExp Exp; switch (Lx.Sym){ case syFlt:{ PExpVal ExpVal=TExpVal::New(Lx.Flt); Exp=PExp(new TExp(ExpVal)); Lx.GetSym(Expect); break;} case syIdStr:{ TStr ExpNm=Lx.Str; Lx.GetSym(TFSet(Expect)|syLParen); if (Lx.Sym==syLParen){ TExpV ArgExpV; Lx.GetSym(TFSet(ExpExpect)|syRParen); while (Lx.Sym!=syRParen){ if (Lx.Sym==syComma){Lx.GetSym(ExpExpect);} PExp ArgExp=LoadTxtExp(Lx, TFSet()|syComma|syRParen); ArgExpV.Add(ArgExp); } Lx.GetSym(Expect); Exp=PExp(new TExp(ExpNm, ArgExpV)); } else { Exp=PExp(new TExp(ExpNm)); } break;} case syQStr:{ PExpVal ExpVal=TExpVal::New(Lx.Str); Exp=PExp(new TExp(ExpVal)); Lx.GetSym(Expect); break;} case syLParen:{ Lx.GetSym(ExpExpect); Exp=LoadTxtExp(Lx, TFSet()|syRParen); Exp->IsParen=true; Lx.GetSym(Expect); break;} default: Fail; } return Exp; }
PJsonVal TJsonVal::GetValFromLx(TILx& Lx){ static TFSet ValExpect=TFSet()|syIdStr|syFlt|syQStr|syLBracket|syLBrace|syRBracket; PJsonVal Val=TJsonVal::New(); if ((Lx.Sym==syIdStr)&&(Lx.Str=="null")){ Val->PutNull(); Lx.GetSym(); } else if ((Lx.Sym==syIdStr)&&(Lx.Str=="true")){ Val->PutBool(true); Lx.GetSym(); } else if ((Lx.Sym==syIdStr)&&(Lx.Str=="false")){ Val->PutBool(false); Lx.GetSym(); } else if (Lx.Sym==syFlt){ Val->PutNum(Lx.Flt); Lx.GetSym(); } else if (Lx.Sym==syQStr){ Val->PutStr(Lx.Str); Lx.GetSym(); } else if (Lx.Sym==syLBracket){ Val->PutArr(); Lx.GetSym(ValExpect); // added ValExpect to correctly parse arrays of floats if (Lx.Sym!=syRBracket){ forever{ PJsonVal SubVal=TJsonVal::GetValFromLx(Lx); Val->AddToArr(SubVal); if (Lx.Sym==syComma){Lx.GetSym(ValExpect);} else if (Lx.Sym==syRBracket){break;} else {TExcept::Throw("JSON Array not properly formed.");} } }
void TWebTxtBsTrmSrv::ParseAndExeCmLn( const int& CltSockId, TILx& Lx, bool& SendMsgToClt, TChA& MsgChA){ SendMsgToClt=true; if (Lx.UcStr=="TRALALA"){ MsgChA+=TStr("Hopsasa")+Lx.GetStrToEoln()+"!\r\n"; } else if (Lx.UcStr=="SYSECHO"){ TStr SysMsgStr=Lx.GetStrToEoln(true).GetUc(); if (SysMsgStr=="ACCEPT"){ MsgChA+="\r\n"; MsgChA+=TStr(" Welcome at WebBird/WebFly Index Engine (V1.0)!\r\n"); //MsgChA+=TStr(" From:")+GetPeerIpNum()(CltSockId)+"\r\n"; MsgChA+=TStr(" Time:")+TSecTm::GetCurTm().GetStr()+"\r\n"; MsgChA+="\r\n"; } else if (SysMsgStr=="CLOSE"){ SendMsgToClt=false; } else { MsgChA+=SysMsgStr; MsgChA+="\r\n"; } } else if (Lx.UcStr=="ECHO"){ MsgChA+=Lx.GetStrToEoln(true); } else if (Lx.UcStr=="HELP"){ Lx.GetSym(syEof); MsgChA+=GetHelpStr(); } else if (Lx.UcStr=="MEM"){ Lx.GetSym(syEof); PSysMemStat MemStat=PSysMemStat(new TSysMemStat()); MsgChA+=MemStat->GetInfoStr(); } else if (Lx.UcStr=="QUIT"){ Lx.GetSym(syEof); CloseClt(CltSockId); SendMsgToClt=false; } else if (Lx.UcStr=="SET"){ PPp WebTxtBsPp=WebTxtBs->GetPp(); Lx.GetSym(syIdStr, syEof); if (Lx.Sym==syIdStr){ TStr PpNm=Lx.UcStr; PPp Pp; if (WebTxtBsPp->IsPp(PpNm, Pp)){ Lx.GetSym(syIdStr, syQStr, syInt, syEof); if (Lx.Sym==syEof){ MsgChA+=Pp->GetStr(); } else if (((Lx.Sym==syIdStr)||(Lx.Sym==syQStr))&&(Pp->GetTag()==ptStr)){ Pp->PutValStr(Lx.Str); } else if ((Lx.Sym==syInt)&&(Pp->GetTag()==ptInt)){ Pp->PutValInt(Lx.Int); } else { MsgChA+="Error: Bad value type.\r\n"; } } else { MsgChA+=TStr("Error: Property '")+PpNm+"' not defined.\r\n"; } } else if (Lx.Sym==syEof){ MsgChA+=WebTxtBsPp->GetStr(); } else { Fail; } } else if (Lx.UcStr=="NEW"){ Lx.GetSym(syEof); TStr FPath; TStr Nm; GetWebTxtBsPp_FPath_Nm(FPath, Nm); WebTxtBs->TxtBsNew(Nm, FPath); } else if (Lx.UcStr=="OPEN"){ Lx.GetSym(syEof); TStr FPath; TStr Nm; GetWebTxtBsPp_FPath_Nm(FPath, Nm); WebTxtBs->TxtBsOpenForUpdate(Nm, FPath); } else if (Lx.UcStr=="CLOSE"){ Lx.GetSym(syEof); WebTxtBs->TxtBsClose(); } else if (Lx.UcStr=="DEL"){ Lx.GetSym(syEof); TStr FPath; TStr Nm; GetWebTxtBsPp_FPath_Nm(FPath, Nm); WebTxtBs->TxtBsDel(Nm, FPath); } else if (Lx.UcStr=="START"){ Lx.GetSym(syEof); TStr FPath; TStr Nm; GetWebTxtBsPp_FPath_Nm(FPath, Nm); TStr WebFilterFNm; GetWebTxtBsPp_WebFilterFNm(WebFilterFNm); WebTxtBs->FetchStart(Nm, FPath, WebFilterFNm); } else if (Lx.UcStr=="STOP"){ Lx.GetSym(syEof); WebTxtBs->FetchStop(); } else if (Lx.UcStr=="CONT"){ Lx.GetSym(syEof); TStr FPath; TStr Nm; GetWebTxtBsPp_FPath_Nm(FPath, Nm); WebTxtBs->FetchContinue(Nm, FPath); } else if (Lx.UcStr=="GO"){ TStr WebFilterFNm=Lx.GetStrToEoln(true); WebFilterFNm=TStr::PutFExtIfEmpty(WebFilterFNm, TWebFilter::FExt); TStr WebTxtBsFPath=TStr::GetNrFPath(WebFilterFNm.GetFPath()); TStr WebTxtBsNm=TStr::GetNrFMid(WebFilterFNm.GetFMid()); WebTxtBs->TxtBsNew(WebTxtBsNm, WebTxtBsFPath); WebTxtBs->FetchStart(WebTxtBsNm, WebTxtBsFPath, WebFilterFNm); } else if (Lx.UcStr=="FETCH"){ Lx.GetSym(syQStr); TStr ShortcutUrlStr=Lx.Str; Lx.GetSym(syInt, syEof); int MxDmSegs=-1; if (Lx.Sym==syInt){MxDmSegs=Lx.Int;} else {Lx.GetSym(syEof);} PUrl StartUrl=TUrl::GetUrlFromShortcut(ShortcutUrlStr, "www", "si"); if (StartUrl->IsOk(usHttp)){ // create filter PWebFilter WebFilter=PWebFilter(new TWebFilter()); WebFilter->AddStartUrl(StartUrl->GetUrlStr()); TStr DmConstrStr=StartUrl->GetDmNm(MxDmSegs); WebFilter->AddDmConstr(DmConstrStr); // create new web-text-base name TStr WebTxtBsFPath; GetWebTxtBsPp_FPath(WebTxtBsFPath); TStr WebTxtBsNm(DmConstrStr); WebTxtBsNm.ChangeStrAll(".", "-"); PutWebTxtBsPp(TWebTxtBs::PpNm_WebTxtBsNm, WebTxtBsNm); // save filter to file TStr WebFilterFPath; GetWebTxtBsPp_FPath(WebFilterFPath); TStr WebFilterFNm=WebFilterFPath+WebTxtBsNm+TWebFilter::FExt; WebFilter->SaveTxt(WebFilterFNm); PutWebTxtBsPp(TWebTxtBs::PpNm_WebFilterFNm, WebFilterFNm); // create new web-text-base name WebTxtBs->TxtBsNew(WebTxtBsNm, WebTxtBsFPath); WebTxtBs->FetchStart(WebTxtBsNm, WebTxtBsFPath, WebFilterFNm); } else { MsgChA+=TStr("Error: Invalid url shortcut '")+ShortcutUrlStr+"'.\r\n"; } } else if (Lx.UcStr=="STAT"){ Lx.GetSym(syEof); WebTxtBs->ReportStatus(); } else if (Lx.UcStr=="SOCKS"){ Lx.GetSym(syEof); WebTxtBs->ReportSocks(); } else if (Lx.UcStr=="HOSTS"){ Lx.GetSym(syEof); WebTxtBs->ReportHosts(); } else if (Lx.UcStr=="QUEUE"){ Lx.GetSym(syInt, syEof); int ShowLen=10; if (Lx.Sym==syInt){ShowLen=Lx.Int;} else {Lx.GetSym(syEof);} WebTxtBs->ReportQueue(ShowLen); } else if (Lx.UcStr=="SEARCH"){ TStr QueryStr=Lx.GetStrToEoln(true); WebTxtBs->ReportSearch(QueryStr); } else { MsgChA+="Error: Bad command keyword ("+Lx.UcStr+").\r\n"; } }