1 Star 0 Fork 0

topxeq / xie

Create your Gitee Account
Explore and code with more than 8 million developers,Free private repositories !:)
Sign up
Clone or Download
xie.go 194.29 KB
Copy Edit Web IDE Raw Blame History
unknown authored 2022-06-29 16:13 . 2022062901
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963296429652966296729682969297029712972297329742975297629772978297929802981298229832984298529862987298829892990299129922993299429952996299729982999300030013002300330043005300630073008300930103011301230133014301530163017301830193020302130223023302430253026302730283029303030313032303330343035303630373038303930403041304230433044304530463047304830493050305130523053305430553056305730583059306030613062306330643065306630673068306930703071307230733074307530763077307830793080308130823083308430853086308730883089309030913092309330943095309630973098309931003101310231033104310531063107310831093110311131123113311431153116311731183119312031213122312331243125312631273128312931303131313231333134313531363137313831393140314131423143314431453146314731483149315031513152315331543155315631573158315931603161316231633164316531663167316831693170317131723173317431753176317731783179318031813182318331843185318631873188318931903191319231933194319531963197319831993200320132023203320432053206320732083209321032113212321332143215321632173218321932203221322232233224322532263227322832293230323132323233323432353236323732383239324032413242324332443245324632473248324932503251325232533254325532563257325832593260326132623263326432653266326732683269327032713272327332743275327632773278327932803281328232833284328532863287328832893290329132923293329432953296329732983299330033013302330333043305330633073308330933103311331233133314331533163317331833193320332133223323332433253326332733283329333033313332333333343335333633373338333933403341334233433344334533463347334833493350335133523353335433553356335733583359336033613362336333643365336633673368336933703371337233733374337533763377337833793380338133823383338433853386338733883389339033913392339333943395339633973398339934003401340234033404340534063407340834093410341134123413341434153416341734183419342034213422342334243425342634273428342934303431343234333434343534363437343834393440344134423443344434453446344734483449345034513452345334543455345634573458345934603461346234633464346534663467346834693470347134723473347434753476347734783479348034813482348334843485348634873488348934903491349234933494349534963497349834993500350135023503350435053506350735083509351035113512351335143515351635173518351935203521352235233524352535263527352835293530353135323533353435353536353735383539354035413542354335443545354635473548354935503551355235533554355535563557355835593560356135623563356435653566356735683569357035713572357335743575357635773578357935803581358235833584358535863587358835893590359135923593359435953596359735983599360036013602360336043605360636073608360936103611361236133614361536163617361836193620362136223623362436253626362736283629363036313632363336343635363636373638363936403641364236433644364536463647364836493650365136523653365436553656365736583659366036613662366336643665366636673668366936703671367236733674367536763677367836793680368136823683368436853686368736883689369036913692369336943695369636973698369937003701370237033704370537063707370837093710371137123713371437153716371737183719372037213722372337243725372637273728372937303731373237333734373537363737373837393740374137423743374437453746374737483749375037513752375337543755375637573758375937603761376237633764376537663767376837693770377137723773377437753776377737783779378037813782378337843785378637873788378937903791379237933794379537963797379837993800380138023803380438053806380738083809381038113812381338143815381638173818381938203821382238233824382538263827382838293830383138323833383438353836383738383839384038413842384338443845384638473848384938503851385238533854385538563857385838593860386138623863386438653866386738683869387038713872387338743875387638773878387938803881388238833884388538863887388838893890389138923893389438953896389738983899390039013902390339043905390639073908390939103911391239133914391539163917391839193920392139223923392439253926392739283929393039313932393339343935393639373938393939403941394239433944394539463947394839493950395139523953395439553956395739583959396039613962396339643965396639673968396939703971397239733974397539763977397839793980398139823983398439853986398739883989399039913992399339943995399639973998399940004001400240034004400540064007400840094010401140124013401440154016401740184019402040214022402340244025402640274028402940304031403240334034403540364037403840394040404140424043404440454046404740484049405040514052405340544055405640574058405940604061406240634064406540664067406840694070407140724073407440754076407740784079408040814082408340844085408640874088408940904091409240934094409540964097409840994100410141024103410441054106410741084109411041114112411341144115411641174118411941204121412241234124412541264127412841294130413141324133413441354136413741384139414041414142414341444145414641474148414941504151415241534154415541564157415841594160416141624163416441654166416741684169417041714172417341744175417641774178417941804181418241834184418541864187418841894190419141924193419441954196419741984199420042014202420342044205420642074208420942104211421242134214421542164217421842194220422142224223422442254226422742284229423042314232423342344235423642374238423942404241424242434244424542464247424842494250425142524253425442554256425742584259426042614262426342644265426642674268426942704271427242734274427542764277427842794280428142824283428442854286428742884289429042914292429342944295429642974298429943004301430243034304430543064307430843094310431143124313431443154316431743184319432043214322432343244325432643274328432943304331433243334334433543364337433843394340434143424343434443454346434743484349435043514352435343544355435643574358435943604361436243634364436543664367436843694370437143724373437443754376437743784379438043814382438343844385438643874388438943904391439243934394439543964397439843994400440144024403440444054406440744084409441044114412441344144415441644174418441944204421442244234424442544264427442844294430443144324433443444354436443744384439444044414442444344444445444644474448444944504451445244534454445544564457445844594460446144624463446444654466446744684469447044714472447344744475447644774478447944804481448244834484448544864487448844894490449144924493449444954496449744984499450045014502450345044505450645074508450945104511451245134514451545164517451845194520452145224523452445254526452745284529453045314532453345344535453645374538453945404541454245434544454545464547454845494550455145524553455445554556455745584559456045614562456345644565456645674568456945704571457245734574457545764577457845794580458145824583458445854586458745884589459045914592459345944595459645974598459946004601460246034604460546064607460846094610461146124613461446154616461746184619462046214622462346244625462646274628462946304631463246334634463546364637463846394640464146424643464446454646464746484649465046514652465346544655465646574658465946604661466246634664466546664667466846694670467146724673467446754676467746784679468046814682468346844685468646874688468946904691469246934694469546964697469846994700470147024703470447054706470747084709471047114712471347144715471647174718471947204721472247234724472547264727472847294730473147324733473447354736473747384739474047414742474347444745474647474748474947504751475247534754475547564757475847594760476147624763476447654766476747684769477047714772477347744775477647774778477947804781478247834784478547864787478847894790479147924793479447954796479747984799480048014802480348044805480648074808480948104811481248134814481548164817481848194820482148224823482448254826482748284829483048314832483348344835483648374838483948404841484248434844484548464847484848494850485148524853485448554856485748584859486048614862486348644865486648674868486948704871487248734874487548764877487848794880488148824883488448854886488748884889489048914892489348944895489648974898489949004901490249034904490549064907490849094910491149124913491449154916491749184919492049214922492349244925492649274928492949304931493249334934493549364937493849394940494149424943494449454946494749484949495049514952495349544955495649574958495949604961496249634964496549664967496849694970497149724973497449754976497749784979498049814982498349844985498649874988498949904991499249934994499549964997499849995000500150025003500450055006500750085009501050115012501350145015501650175018501950205021502250235024502550265027502850295030503150325033503450355036503750385039504050415042504350445045504650475048504950505051505250535054505550565057505850595060506150625063506450655066506750685069507050715072507350745075507650775078507950805081508250835084508550865087508850895090509150925093509450955096509750985099510051015102510351045105510651075108510951105111511251135114511551165117511851195120512151225123512451255126512751285129513051315132513351345135513651375138513951405141514251435144514551465147514851495150515151525153515451555156515751585159516051615162516351645165516651675168516951705171517251735174517551765177517851795180518151825183518451855186518751885189519051915192519351945195519651975198519952005201520252035204520552065207520852095210521152125213521452155216521752185219522052215222522352245225522652275228522952305231523252335234523552365237523852395240524152425243524452455246524752485249525052515252525352545255525652575258525952605261526252635264526552665267526852695270527152725273527452755276527752785279528052815282528352845285528652875288528952905291529252935294529552965297529852995300530153025303530453055306530753085309531053115312531353145315531653175318531953205321532253235324532553265327532853295330533153325333533453355336533753385339534053415342534353445345534653475348534953505351535253535354535553565357535853595360536153625363536453655366536753685369537053715372537353745375537653775378537953805381538253835384538553865387538853895390539153925393539453955396539753985399540054015402540354045405540654075408540954105411541254135414541554165417541854195420542154225423542454255426542754285429543054315432543354345435543654375438543954405441544254435444544554465447544854495450545154525453545454555456545754585459546054615462546354645465546654675468546954705471547254735474547554765477547854795480548154825483548454855486548754885489549054915492549354945495549654975498549955005501550255035504550555065507550855095510551155125513551455155516551755185519552055215522552355245525552655275528552955305531553255335534553555365537553855395540554155425543554455455546554755485549555055515552555355545555555655575558555955605561556255635564556555665567556855695570557155725573557455755576557755785579558055815582558355845585558655875588558955905591559255935594559555965597559855995600560156025603560456055606560756085609561056115612561356145615561656175618561956205621562256235624562556265627562856295630563156325633563456355636563756385639564056415642564356445645564656475648564956505651565256535654565556565657565856595660566156625663566456655666566756685669567056715672567356745675567656775678567956805681568256835684568556865687568856895690569156925693569456955696569756985699570057015702570357045705570657075708570957105711571257135714571557165717571857195720572157225723572457255726572757285729573057315732573357345735573657375738573957405741574257435744574557465747574857495750575157525753575457555756575757585759576057615762576357645765576657675768576957705771577257735774577557765777577857795780578157825783578457855786578757885789579057915792579357945795579657975798579958005801580258035804580558065807580858095810581158125813581458155816581758185819582058215822582358245825582658275828582958305831583258335834583558365837583858395840584158425843584458455846584758485849585058515852585358545855585658575858585958605861586258635864586558665867586858695870587158725873587458755876587758785879588058815882588358845885588658875888588958905891589258935894589558965897589858995900590159025903590459055906590759085909591059115912591359145915591659175918591959205921592259235924592559265927592859295930593159325933593459355936593759385939594059415942594359445945594659475948594959505951595259535954595559565957595859595960596159625963596459655966596759685969597059715972597359745975597659775978597959805981598259835984598559865987598859895990599159925993599459955996599759985999600060016002600360046005600660076008600960106011601260136014601560166017601860196020602160226023602460256026602760286029603060316032603360346035603660376038603960406041604260436044604560466047604860496050605160526053605460556056605760586059606060616062606360646065606660676068606960706071607260736074607560766077607860796080608160826083608460856086608760886089609060916092609360946095609660976098609961006101610261036104610561066107610861096110611161126113611461156116611761186119612061216122612361246125612661276128612961306131613261336134613561366137613861396140614161426143614461456146614761486149615061516152615361546155615661576158615961606161616261636164616561666167616861696170617161726173617461756176617761786179618061816182618361846185618661876188618961906191619261936194619561966197619861996200620162026203620462056206620762086209621062116212621362146215621662176218621962206221622262236224622562266227622862296230623162326233623462356236623762386239624062416242624362446245624662476248624962506251625262536254625562566257625862596260626162626263626462656266626762686269627062716272627362746275627662776278627962806281628262836284628562866287628862896290629162926293629462956296629762986299630063016302630363046305630663076308630963106311631263136314631563166317631863196320632163226323632463256326632763286329633063316332633363346335633663376338633963406341634263436344634563466347634863496350635163526353635463556356635763586359636063616362636363646365636663676368636963706371637263736374637563766377637863796380638163826383638463856386638763886389639063916392639363946395639663976398639964006401640264036404640564066407640864096410641164126413641464156416641764186419642064216422642364246425642664276428642964306431643264336434643564366437643864396440644164426443644464456446644764486449645064516452645364546455645664576458645964606461646264636464646564666467646864696470647164726473647464756476647764786479648064816482648364846485648664876488648964906491649264936494649564966497649864996500650165026503650465056506650765086509651065116512651365146515651665176518651965206521652265236524652565266527652865296530653165326533653465356536653765386539654065416542654365446545654665476548654965506551655265536554655565566557655865596560656165626563656465656566656765686569657065716572657365746575657665776578657965806581658265836584658565866587658865896590659165926593659465956596659765986599660066016602660366046605660666076608660966106611661266136614661566166617661866196620662166226623662466256626662766286629663066316632663366346635663666376638663966406641664266436644664566466647664866496650665166526653665466556656665766586659666066616662666366646665666666676668666966706671667266736674667566766677667866796680668166826683668466856686668766886689669066916692669366946695669666976698669967006701670267036704670567066707670867096710671167126713671467156716671767186719672067216722672367246725672667276728672967306731673267336734673567366737673867396740674167426743674467456746674767486749675067516752675367546755675667576758675967606761676267636764676567666767676867696770677167726773677467756776677767786779678067816782678367846785678667876788678967906791679267936794679567966797679867996800680168026803680468056806680768086809681068116812681368146815681668176818681968206821682268236824682568266827682868296830683168326833683468356836683768386839684068416842684368446845684668476848684968506851685268536854685568566857685868596860686168626863686468656866686768686869687068716872687368746875687668776878687968806881688268836884688568866887688868896890689168926893689468956896689768986899690069016902690369046905690669076908690969106911691269136914691569166917691869196920692169226923692469256926692769286929693069316932693369346935693669376938693969406941694269436944694569466947694869496950695169526953695469556956695769586959696069616962696369646965696669676968696969706971697269736974697569766977697869796980698169826983698469856986698769886989699069916992699369946995699669976998699970007001700270037004700570067007700870097010701170127013701470157016701770187019702070217022702370247025702670277028702970307031703270337034703570367037703870397040704170427043704470457046704770487049705070517052705370547055705670577058705970607061706270637064706570667067706870697070707170727073707470757076707770787079708070817082708370847085708670877088708970907091709270937094709570967097709870997100710171027103710471057106710771087109711071117112711371147115711671177118711971207121712271237124712571267127712871297130713171327133713471357136713771387139714071417142714371447145714671477148714971507151715271537154715571567157715871597160716171627163716471657166716771687169717071717172717371747175717671777178717971807181718271837184718571867187718871897190719171927193719471957196719771987199720072017202720372047205720672077208720972107211721272137214721572167217721872197220722172227223722472257226722772287229723072317232723372347235723672377238723972407241724272437244724572467247724872497250725172527253725472557256725772587259726072617262726372647265726672677268726972707271727272737274727572767277727872797280728172827283728472857286728772887289729072917292729372947295729672977298729973007301730273037304730573067307730873097310731173127313731473157316731773187319732073217322732373247325732673277328732973307331733273337334733573367337733873397340734173427343734473457346734773487349735073517352735373547355735673577358735973607361736273637364736573667367736873697370737173727373737473757376737773787379738073817382738373847385738673877388738973907391739273937394739573967397739873997400740174027403740474057406740774087409741074117412741374147415741674177418741974207421742274237424742574267427742874297430743174327433743474357436743774387439744074417442744374447445744674477448744974507451745274537454745574567457745874597460746174627463746474657466746774687469747074717472747374747475747674777478747974807481748274837484748574867487748874897490749174927493749474957496749774987499750075017502750375047505750675077508750975107511751275137514751575167517751875197520752175227523752475257526752775287529753075317532753375347535753675377538753975407541754275437544754575467547754875497550755175527553755475557556755775587559756075617562756375647565756675677568756975707571757275737574757575767577757875797580758175827583758475857586758775887589759075917592759375947595759675977598759976007601760276037604760576067607760876097610761176127613761476157616761776187619762076217622762376247625762676277628762976307631763276337634763576367637763876397640764176427643764476457646764776487649765076517652765376547655765676577658765976607661766276637664766576667667766876697670767176727673767476757676767776787679768076817682768376847685768676877688768976907691769276937694769576967697769876997700770177027703770477057706770777087709771077117712771377147715771677177718771977207721772277237724772577267727772877297730773177327733773477357736773777387739774077417742774377447745774677477748774977507751775277537754775577567757775877597760776177627763776477657766776777687769777077717772777377747775777677777778777977807781778277837784778577867787778877897790779177927793779477957796779777987799780078017802780378047805780678077808780978107811781278137814781578167817781878197820782178227823782478257826782778287829783078317832783378347835783678377838783978407841784278437844784578467847784878497850785178527853785478557856785778587859786078617862786378647865786678677868786978707871787278737874787578767877787878797880788178827883788478857886788778887889789078917892789378947895789678977898789979007901790279037904790579067907790879097910791179127913791479157916791779187919792079217922792379247925792679277928792979307931793279337934793579367937793879397940794179427943794479457946794779487949795079517952795379547955795679577958795979607961796279637964796579667967796879697970797179727973797479757976797779787979798079817982798379847985798679877988798979907991799279937994799579967997799879998000800180028003800480058006800780088009801080118012801380148015801680178018801980208021802280238024802580268027802880298030803180328033803480358036803780388039804080418042804380448045804680478048804980508051805280538054805580568057805880598060806180628063806480658066806780688069807080718072807380748075807680778078807980808081808280838084808580868087808880898090809180928093809480958096809780988099810081018102810381048105810681078108810981108111811281138114811581168117811881198120812181228123812481258126812781288129813081318132813381348135813681378138813981408141814281438144814581468147814881498150815181528153815481558156815781588159816081618162816381648165816681678168816981708171817281738174817581768177817881798180818181828183818481858186818781888189819081918192819381948195819681978198819982008201820282038204820582068207820882098210821182128213821482158216821782188219822082218222822382248225822682278228822982308231823282338234823582368237823882398240824182428243824482458246824782488249825082518252825382548255825682578258825982608261826282638264826582668267826882698270827182728273827482758276827782788279828082818282828382848285828682878288828982908291829282938294829582968297829882998300830183028303830483058306830783088309831083118312831383148315831683178318831983208321832283238324832583268327832883298330833183328333833483358336833783388339834083418342834383448345834683478348834983508351835283538354835583568357835883598360836183628363836483658366836783688369837083718372837383748375837683778378837983808381838283838384838583868387838883898390839183928393839483958396839783988399840084018402840384048405840684078408840984108411841284138414841584168417841884198420842184228423842484258426842784288429843084318432843384348435843684378438843984408441844284438444844584468447844884498450845184528453845484558456845784588459846084618462846384648465846684678468846984708471847284738474847584768477847884798480848184828483848484858486848784888489849084918492849384948495849684978498849985008501850285038504850585068507850885098510851185128513851485158516851785188519852085218522852385248525852685278528852985308531853285338534853585368537853885398540854185428543854485458546854785488549855085518552855385548555855685578558855985608561856285638564856585668567856885698570857185728573857485758576857785788579858085818582858385848585858685878588858985908591859285938594859585968597859885998600860186028603860486058606860786088609861086118612861386148615861686178618861986208621862286238624862586268627862886298630863186328633863486358636863786388639864086418642864386448645864686478648864986508651865286538654865586568657865886598660866186628663866486658666866786688669867086718672867386748675867686778678867986808681868286838684868586868687868886898690869186928693869486958696869786988699870087018702870387048705870687078708870987108711871287138714871587168717871887198720872187228723872487258726872787288729873087318732873387348735873687378738873987408741874287438744874587468747874887498750875187528753875487558756875787588759876087618762876387648765876687678768876987708771877287738774877587768777877887798780878187828783878487858786878787888789879087918792879387948795879687978798879988008801880288038804880588068807880888098810881188128813881488158816881788188819882088218822882388248825882688278828882988308831883288338834883588368837883888398840884188428843884488458846884788488849885088518852885388548855885688578858885988608861886288638864886588668867886888698870887188728873887488758876887788788879888088818882888388848885888688878888888988908891889288938894889588968897889888998900890189028903890489058906890789088909891089118912891389148915891689178918891989208921892289238924892589268927892889298930893189328933893489358936893789388939894089418942894389448945894689478948894989508951895289538954895589568957895889598960896189628963896489658966896789688969897089718972897389748975897689778978897989808981898289838984898589868987898889898990899189928993899489958996899789988999900090019002900390049005900690079008900990109011901290139014901590169017901890199020902190229023902490259026902790289029903090319032903390349035903690379038903990409041904290439044904590469047904890499050905190529053905490559056905790589059906090619062906390649065906690679068906990709071907290739074907590769077907890799080908190829083908490859086908790889089909090919092909390949095909690979098909991009101910291039104910591069107910891099110911191129113911491159116911791189119912091219122912391249125912691279128912991309131913291339134913591369137913891399140914191429143914491459146914791489149915091519152915391549155915691579158915991609161916291639164916591669167916891699170917191729173917491759176917791789179918091819182918391849185918691879188918991909191919291939194919591969197919891999200920192029203920492059206920792089209921092119212921392149215921692179218921992209221922292239224922592269227922892299230923192329233923492359236923792389239924092419242924392449245924692479248924992509251925292539254925592569257925892599260926192629263926492659266926792689269927092719272927392749275927692779278927992809281928292839284928592869287928892899290929192929293929492959296929792989299930093019302930393049305930693079308930993109311931293139314931593169317931893199320932193229323932493259326932793289329933093319332933393349335933693379338933993409341934293439344934593469347934893499350935193529353935493559356935793589359936093619362936393649365936693679368936993709371937293739374937593769377937893799380938193829383938493859386938793889389939093919392939393949395939693979398939994009401940294039404940594069407940894099410941194129413941494159416941794189419942094219422942394249425942694279428942994309431943294339434943594369437943894399440944194429443944494459446944794489449945094519452945394549455945694579458945994609461946294639464946594669467946894699470947194729473947494759476947794789479948094819482948394849485948694879488948994909491949294939494949594969497949894999500950195029503950495059506950795089509951095119512951395149515951695179518
package xie
import (
"database/sql"
"encoding/base64"
"encoding/hex"
"encoding/json"
"fmt"
"net/http"
"net/url"
"os"
"path"
"path/filepath"
"regexp"
"runtime/debug"
"strconv"
"strings"
"sync"
"time"
"github.com/topxeq/sqltk"
"github.com/topxeq/tk"
)
var VersionG string = "0.1.6"
type UndefinedStruct struct {
int
}
func (o UndefinedStruct) String() string {
return "未定义"
}
var Undefined UndefinedStruct = UndefinedStruct{0}
// 指令集
// 关于结果参数:很多命令需要一个用于指定接收指令执行结果的参数,称作结果参数
// 结果参数一般都是一个变量,因此也称作结果变量
// 结果变量可以是$push(表示将结果压入堆栈中)、$drop(表示将结果丢弃)等预置全局变量
// 结果变量一般可以省略,此时表示将结果压入堆栈中(等同于$push)
// 当指令的参数个数可变时,结果参数不可省略,以免产生混淆
// 如果指令应返回结果,则当不提结果参数时,“第一个参数”一般指的是除结果参数外的第一个参数,余者类推
var InstrNameSet map[string]int = map[string]int{
// internal & debug related
"invalidInstr": 12, // 无效指令,用于内部表示有错误的指令
"version": 100, // 获取当前谢语言版本,结果压栈或放入最后一个可选参数中(后面结果放入的情况大多数指令类似,不再重复,特殊的情况是存在可变参数个数的时候,结果变量会放到第一个不可选参数中,也不再重复)
"版本": 100,
"pass": 101, // 不做任何事情的指令
"过": 101,
"debug": 102, // 显示内部调试信息
"调试": 102,
"debugInfo": 103, // 获取调试信息
"varInfo": 104, // 获取变量信息
"help": 105, // 提供帮助信息
"onError": 106, // 设置出错处理代码块,如有第一个参数,是一个标号,表示要跳转到的代码块位置,如无参数,表示清除(不设置任何错误处理代码块)
"isUndef": 111, // 判断变量是否未被声明(定义),第一个结果参数可省略,第二个参数是要判断的变量
"是否未定义": 111,
"isDef": 112, // 判断变量是否已被声明(定义),第一个结果参数可省略,第二个参数是要判断的变量
"是否已定义": 112,
"isNil": 113, // 判断变量是否是nil,第一个结果参数可省略,第二个参数是要判断的变量
"test": 121, // 内部测试用,测试两个数值是否相等
"typeOf": 131, // 获取变量或数值类型(字符串格式),省略所有参数表示获取栈顶值的类型(不弹栈)
"类型": 131,
"layer": 141, // 获取变量所处的层级(主函数层级为0,调用的第一个函数层级为1,再嵌套调用的为2,……)
"loadCode": 151, // 载入字符串格式的谢语言代码到当前虚拟机中(加在最后),出错则返回TXERROR:开头的字符串说明原因
"载入代码": 151,
"len": 161, // 获取字符串、列表、映射等的长度,参数全省略表示取看栈值
"长度": 161,
"fatalf": 170, // 类似pl输出信息后退出程序运行
"goto": 180, // 无条件跳转到指定标号处
"jmp": 180,
"转到": 180,
"exit": 199, // 退出程序运行
"终止": 199,
// var related
"global": 201, // 声明全局变量
"声明全局": 201,
"var": 203, // 声明局部变量
"声明变量": 203,
"ref": 210, // 获取变量的引用(取地址)
"取引用": 210,
"unref": 211, // 对引用进行解引用
"解引用": 211,
"assignRef": 212, // 根据引用进行赋值(将引用指向的变量赋值)
"引用赋值": 212,
// push/peek/pop related
"push": 220, // 将数值压栈
"入栈": 220,
"push$": 221,
"peek": 222, // 查看栈顶数值(不弹栈)
"看栈": 222,
"peek$": 223,
"pop": 224, // 弹出栈顶数值,结果参数如果省略相当于丢弃栈顶值
"出栈": 224,
"pop$": 225,
"peek*": 226, // from reg
"pop*": 227, // from reg
"pushInt": 231,
"pushInt$": 232,
"pushInt#": 233,
"pushInt*": 234,
"clearStack": 240,
// "pushLocal": 290,
// reg related
"regInt": 310,
"regInt#": 312, // from number
// assign related
"assign": 401, // 赋值
"=": 401,
"赋值": 401,
"assign$": 402,
"assignInt": 410,
"assignI": 411,
"assignGlobal": 491, // 声明(如果未声明的话)并赋值一个全局变量
"assignLocal": 492, // 声明(如果未声明的话)并赋值一个局部变量
"局部赋值": 492,
// if/else, switch related
"if": 610, // 判断第一个参数(布尔类型,如果省略则表示取弹栈值)如果是true,则跳转到指定标号处
"是则": 610,
"ifNot": 611, // 判断第一个参数(布尔类型,如果省略则表示取弹栈值)如果是false,则跳转到指定标号处
"否则": 611,
"if$": 618,
"if*": 619,
"ifNot$": 621,
"否则$": 621,
"ifEval": 631, // 判断第一个参数(字符串类型)表示的表达式计算结果如果是true,则跳转到指定标号处
"表达式是则": 631,
// compare related
"==": 701, // 判断两个数值是否相等,无参数时,比较两个弹栈值,结果压栈;参数为1个时是结果参数,两个数值从堆栈获取;参数为2个时,表示两个数值,结果压栈;参数为3个时,第一个参数是结果参数,后两个为待比较数值
"等于": 701,
"!=": 702, // 判断两个数值是否不等,无参数时,比较两个弹栈值,结果压栈;参数为1个时是结果参数,两个数值从堆栈获取;参数为2个时,表示两个数值,结果压栈;参数为3个时,第一个参数是结果参数,后两个为待比较数值
"不等于": 702,
"<": 703, // 判断两个数值是否是第一个数值小于第二个数值,无参数时,比较两个弹栈值(注意弹栈值先弹出的为第二个待比较数值),结果压栈;参数为1个时是结果参数,两个数值从堆栈获取;参数为2个时,表示两个数值,结果压栈;参数为3个时,第一个参数是结果参数,后两个为待比较数值
">": 704, // 判断两个数值是否是第一个数值大于第二个数值,无参数时,比较两个弹栈值(注意弹栈值先弹出的为第二个待比较数值),结果压栈;参数为1个时是结果参数,两个数值从堆栈获取;参数为2个时,表示两个数值,结果压栈;参数为3个时,第一个参数是结果参数,后两个为待比较数值
"<=": 705, // 判断两个数值是否是第一个数值小于等于第二个数值,无参数时,比较两个弹栈值(注意弹栈值先弹出的为第二个待比较数值),结果压栈;参数为1个时是结果参数,两个数值从堆栈获取;参数为2个时,表示两个数值,结果压栈;参数为3个时,第一个参数是结果参数,后两个为待比较数值
">=": 706, // 判断两个数值是否是第一个数值大于等于第二个数值,无参数时,比较两个弹栈值(注意弹栈值先弹出的为第二个待比较数值),结果压栈;参数为1个时是结果参数,两个数值从堆栈获取;参数为2个时,表示两个数值,结果压栈;参数为3个时,第一个参数是结果参数,后两个为待比较数值
">i": 710,
"<i": 720,
"整数小于": 720,
"<i$": 721,
"<i*": 722,
"cmp": 790, // 比较两个数值,根据结果返回-1,0或1,分别表示小于、等于、大于,无参数时,比较两个弹栈值(注意弹栈值先弹出的为第二个待比较数值),结果压栈;参数为1个时是结果参数,两个数值从堆栈获取;参数为2个时,表示两个数值,结果压栈;参数为3个时,第一个参数是结果参数,后两个为待比较数值
"比较": 790,
// operator related
"inc": 801, // 将某个整数变量的值加1,省略参数的话将操作栈顶值
"加一": 801,
"inc$": 802,
"inc*": 803,
"dec": 810, // 将某个整数变量的值减1,省略参数的话将操作栈顶值
"减一": 810,
"dec$": 811,
"dec*": 812,
"intAdd": 820,
"整数加": 820,
"intAdd$": 821,
"整数加$": 821,
"intDiv": 831,
"floatAdd": 840,
"floatDiv": 848,
"add": 901, // 两个数值相加,无参数时,将两个弹栈值相加(注意弹栈值先弹出的为第二个数值),结果压栈;参数为1个时是结果参数,两个数值从堆栈获取;参数为2个时,表示两个数值,结果压栈;参数为3个时,第一个参数是结果参数,后两个为待计算数值
"+": 901,
"加": 901,
"sub": 902, // 两个数值相减,无参数时,将两个弹栈值相加(注意弹栈值先弹出的为第二个数值),结果压栈;参数为1个时是结果参数,两个数值从堆栈获取;参数为2个时,表示两个数值,结果压栈;参数为3个时,第一个参数是结果参数,后两个为待计算数值
"-": 902,
"减": 902,
"mul": 903, // 两个数值相乘,无参数时,将两个弹栈值相加(注意弹栈值先弹出的为第二个数值),结果压栈;参数为1个时是结果参数,两个数值从堆栈获取;参数为2个时,表示两个数值,结果压栈;参数为3个时,第一个参数是结果参数,后两个为待计算数值
"*": 903,
"乘": 903,
"div": 904, // 两个数值相除,无参数时,将两个弹栈值相加(注意弹栈值先弹出的为第二个数值),结果压栈;参数为1个时是结果参数,两个数值从堆栈获取;参数为2个时,表示两个数值,结果压栈;参数为3个时,第一个参数是结果参数,后两个为待计算数值
"/": 904,
"除": 904,
"mod": 905, // 两个数值做取模计算,无参数时,将两个弹栈值相加(注意弹栈值先弹出的为第二个数值),结果压栈;参数为1个时是结果参数,两个数值从堆栈获取;参数为2个时,表示两个数值,结果压栈;参数为3个时,第一个参数是结果参数,后两个为待计算数值
"%": 905,
"取模": 905,
"!": 930, // 取反操作符,对于布尔值取反,即true -> false,false -> true。对于其他数值,如果是未定义的变量(即Undefined),返回true,否则返回false
"not": 931, // 逻辑非操作符,对于布尔值取反,即true -> false,false -> true,对于int、rune、byte等按位取反,即 0 -> 1, 1 -> 0
"&&": 933, // 逻辑与操作符
"||": 934, // 逻辑或操作符
"?": 990, // 三元操作符,用法示例:? $result $a $s1 "abc",表示判断变量$a中的布尔值,如果为true,则结果为$s1,否则结果值为字符串abc,结果值将放入结果变量result中,如果省略结果参数,结果值将会压栈
"eval": 998, // 计算一个表达式
// func related 函数相关
"call": 1010, // 调用指定标号处的函数
"调用": 1010,
"ret": 1020, // 函数内返回
"返回": 1020,
"callFunc": 1050, // 封装调用函数,一个参数是传入参数(压栈值)的个数(可省略),第二个参数是字符串类型的源代码
"封装调用": 1050,
"goFunc": 1060, // 并发调用函数,一个参数是传入参数(压栈值)的个数(可省略),第二个参数是字符串类型的源代码
"fastCall": 1070, // 快速调用函数
"快调": 1070,
"fastRet": 1071, // 被快速调用的函数中返回
"快回": 1071,
"for": 1080, // for循环
"range": 1085, // 遍历一个数字、字符串等
// array/slice related 数组/切片相关
"addItem": 1110, //数组中添加项
"增项": 1110,
"addStrItem": 1111,
"deleteItem": 1112, //数组中删除项
"删项": 1112,
"addItems": 1115, // 数组添加另一个数组的值
"增多项": 1115,
"getAnyItem": 1120,
"任意类型取项": 1120,
"setAnyItem": 1121,
"任意类型置项": 1121,
// "setItem": 1121,
// "置项": 1121,
// "getItemX": 1123,
// "取项X": 1123,
"getItem": 1123, // 从数组中取项
"取项": 1123,
"setItem": 1124, // 修改数组中某一项的值
"置项": 1124,
// "setItemX": 1124,
// "置项X": 1124,
"slice": 1130, // 对列表(数组)切片,如果没有指定结果参数,将改变原来的变量。用法示例:slice $list4 $list3 #i1 #i5,将list3进行切片,截取序号1(包含)至序号5(不包含)之间的项,形成一个新的列表,放入变量list4中
"切片": 1130,
"rangeList": 1140, // 遍历数组
"遍历列表": 1140,
"rangeStrList": 1141, // 遍历字符串数组
"遍历字符串列表": 1141,
// control related 控制相关
"continue": 1210, // 循环中继续
"继续循环": 1210,
"break": 1211, // 跳出循环(注意只能是用于for、range、rangeList、rangeMap等循环指令)
"跳出循环": 1211,
"continueIf": 1212, // 条件满足则继续循环
"breakIf": 1213, // 条件满足则跳出循环
// map related 映射相关
"setMapItem": 1310, // 设置映射项,用法:setMapItem $map1 Name "李白"
"置映射项": 1310,
"deleteMapItem": 1312, // 删除映射项
"删映射项": 1312,
"getMapItem": 1320, // 获取指定序号的映射项,用法:getMapItem $result $map1 #i2,获取map1中的序号为2的项(即第3项),放入结果变量result中
"取映射项": 1320,
"rangeMap": 1340, // 遍历映射
"遍历映射": 1340,
// object related 对象相关
"new": 1401, // 新建一个数据或对象,第一个参数为结果放入的变量,第二个为字符串格式的数据类型或对象名,后面是可选的0-n个参数,目前支持byte、int等
"method": 1403, // 对特定数据类型执行一定的方法,例如:method $result $str1 trimSet "ab",将对一个字符串类型的变量str1去掉首尾的a和b字符,结果放入变量result中(注意,该结果参数不可省略,即使该方法没有返回数据,此时可以考虑用$drop)
"m": 1403,
"newObj": 1410, // 新建一个对象,第一个参数为结果放入的变量,第二个为字符串格式的对象名,后面是可选的0-n个参数,目前支持string、any等
"setObjValue": 1411, // 设置对象本体值
"getObjValue": 1412, // 获取对象本体值
"getMember": 1420, // 获取对象成员值
"setMember": 1430, // 设置对象成员值
"callObj": 1440, // 调用对象方法
// string related 字符串相关
"backQuote": 1501, // 获取反引号字符串
"quote": 1503, // 将字符串进行转义(加上转义符,如“"”变成“\"”)
"unquote": 1504, // 将字符串进行解转义
"isEmpty": 1510, // 判断字符串是否为空
"是否空串": 1510,
"strAdd": 1520,
"strSplit": 1530, // 按指定分割字符串分割字符串,结果参数不可省略,用法示例:strSplit $result $str1 "," 3,其中第3个参数可选(即可省略),表示结果列表最多的项数(例如为3时,将只按逗号分割成3个字符串的列表,后面的逗号将忽略;省略或为-1时将分割出全部)
"分割字符串": 1530,
"strReplace": 1540, // 字符串替换,用法示例:strReplace $result $str1 $find $replacement
"trim": 1550, // 字符串首尾去空白
"去空白": 1550,
"trimSet": 1551, // 字符串首尾去指定字符,除结果参数外第二个参数(字符串类型)指定去掉那些字符
"trimSetLeft": 1553, // 字符串首去指定字符,除结果参数外第二个参数(字符串类型)指定去掉那些字符
"trimSetRight": 1554, // 字符串尾去指定字符,除结果参数外第二个参数(字符串类型)指定去掉那些字符
"trimPrefix": 1557, // 字符串首去指定字符串,除结果参数外第二个参数(字符串类型)指定去掉的子串,如果没有则返回原字符串
"trimSuffix": 1558, // 字符串尾去指定字符串,除结果参数外第二个参数(字符串类型)指定去掉的子串,如果没有则返回原字符串
"toUpper": 1561, // 字符串转为大写
"toLower": 1562, // 字符串转为小写
"strPad": 1571, // 字符串补零等填充操作,例如 strPad $result $strT #i5 -fill=0 -right=true,第一个参数是接收结果的字符串变量(不可省略),第二个是将要进行补零操作的字符串,第三个参数是要补齐到几位,默认填充字符串fill为字符串0,right(表示是否在右侧填充)为false(也可以直接写成-right),因此上例等同于strPad $result $strT #i5,如果fill字符串不止一个字符,最终补齐数量不会多于第二个参数指定的值,但有可能少
// time related 时间相关
"now": 1910, // 获取当前时间
"现在时间": 1910,
"nowStrCompact": 1911, // 获取简化的当前时间字符串,如20220501080930
"nowStr": 1912, // 获取当前时间字符串的正式表达
"nowStrFormal": 1912, // 获取当前时间字符串的正式表达
"timeSub": 1921, // 时间进行相减操作
"时间减": 1921,
// math related 数学相关
"abs": 2100, // 取绝对值
// command-line related 命令行相关
"getParam": 10001, // 获取指定序号的命令行参数,结果参数外第一个参数为list或strList类型,第二个为整数,第三个为默认值(字符串类型),例:getParam $result $argsG 2 ""
"获取参数": 10001,
"getSwitch": 10002, // 获取命令行参数中指定的开关参数,结果参数外第一个参数为list或strList类型,第二个为类似“-code=”的字符串,第三个为默认值(字符串类型),例:getSwitch $result $argsG "-code=" "",将获取命令行中-code=abc的“abc”部分。
"ifSwitchExists": 10003, // 判断命令行参数中是否有指定的开关参数,结果参数外第一个参数为list或strList类型,第二个为类似“-verbose”的字符串,例:ifSwitchExists $result $argsG "-verbose",根据命令行中是否含有-verbose返回布尔值true或false
// print related 输出相关
"pln": 10410, // 相当于其它语言的println函数
"输出行": 10410,
"plo": 10411, // 输出一个变量或数值的类型和值
"输出值类型": 10411,
"pl": 10420, // 相当于其它语言的printf函数再多输出一个换行符\n
"输出": 10420,
"plv": 10430, // 输出一个变量或数值的值的内部表达形式
"输出值": 10430,
"plErr": 10440, // 输出一个error(表示错误的数据类型)信息
"plErrStr": 10450, // 输出一个TXERROR字符串(表示错误的字符串,以TXERROR:开头,后面一般是错误原因描述)信息
"spr": 10460, // 相当于其它语言的sprintf函数
// scan/input related 输入相关
"scanf": 10511, // 相当于其它语言的scanf函数
"sscanf": 10512, // 相当于其它语言的sscanf函数
// convert related 转换相关
"convert": 10810, // 转换数值类型,例如 convert $a int
"转换": 10810,
"convert$": 10811,
"hex": 10821, // 16进制编码,对于数字高位在后
"hexb": 10822, // 16进制编码,对于数字高位在前
"unhex": 10823, // 16进制解码,结果是一个字节列表
// err string(TXERROR:) related TXERROR错误字符串相关
"isErrStr": 10910, // 判断是否是TXERROR字符串,用法:isErrStr $result $str1 $errMsg,第三个参数可选(结果参数不可省略),如有则当str1为TXERROR字符串时,会放入错误原因信息
"getErrStr": 10921, // 获取TXERROR字符串中的错误原因信息(即TXERROR:后的内容)
"getErrStr$": 10922,
"checkErrStr": 10931, // 判断是否是TXERROR字符串,是则退出程序运行
// error related error相关
"isErr": 10941, // 判断是否是error对象,结果参数不可省略,除结果参数外第一个参数是需要确定是否是error的对象,第二个可选变量是如果是error时,包含的错误描述信息
"getErrMsg": 10942, // 获取error对象的错误信息
// http request/response related HTTP请求相关
"writeResp": 20110, // 写一个HTTP请求的响应
"setRespHeader": 20111, // 设置一个HTTP请求的响应头,如setRespHeader $responseG "Content-Type" "text/json; charset=utf-8"
"writeRespHeader": 20112, // 写一个HTTP请求的响应头状态,如writeRespHeader $responseG #i200
"getReqHeader": 20113, // 获取一个HTTP请求的请求头信息
"genJsonResp": 20114, // 生成一个JSON格式的响应字符串,格式类似{"Status":"fail", "Value": "network timeout"},其中Status字段表示响应处理结果状态,一般只有success和fail两种,分别表示成功和失败,如果失败,Value字段中为失败原因,如果成功,Value中为空或需要返回的信息
"newMux": 20121, // 新建一个HTTP请求处理路由对象,等同于 new mux
"setMuxHandler": 20122, // 设置HTTP请求路由处理函数
"setMuxStaticDir": 20123, // 设置静态WEB服务的目录,用法示例:setMuxStaticDir $muxT "/static/" "./scripts" ,设置处理路由“/static/”后的URL为静态资源服务,第1个参数为newMux指令创建的路由处理器对象变量,第2个参数是路由路径,第3个参数是对应的本地文件路径,例如:访问 http://127.0.0.1:8080/static/basic.xie,而当前目录是c:\tmp,那么实际上将获得c:\scripts\basic.xie
"startHttpServer": 20151, // 启动http服务器,用法示例:startHttpServer $resultT ":8080" $muxT
"startHttpsServer": 20153, // 启动https(SSL)服务器
// web related WEB相关
"getWeb": 20210, // 发送一个HTTP网络请求,并获取响应结果(字符串格式),getWeb指令除了第一个参数必须是返回结果的变量,第二个参数是访问的URL,其他所有参数都是可选的,method可以是GET、POST等;encoding用于指定返回信息的编码形式,例如GB2312、GBK、UTF-8等;headers是一个JSON格式的字符串,表示需要加上的自定义的请求头内容键值对;参数中还可以有一个映射类型的变量或值,表示需要POST到服务器的参数,用法示例:getWeb $resultT "http://127.0.0.1:80/xms/xmsApi" -method=POST -encoding=UTF-8 -timeout=15 -headers=`{"Content-Type": "application/json"}` $mapT
// html related HTML相关
"htmlToText": 20310, // 将HTML转换为字符串,用法示例:htmlToText $result $str1 "flat",第3个参数开始是可选参数,表示HTML转文本时的选项
// regex related 正则表达式相关
"regReplaceAllStr$": 20411,
"regFindAll": 20421, // 获取正则表达式的所有匹配,用法示例:regFindAll $result $str1 $regex1 $group
// system related 系统相关
"sleep": 20501, // 睡眠指定的秒数(浮点数)
"睡眠": 20501,
"getClipText": 20511, // 获取剪贴板文本
"获取剪贴板文本": 20511,
"setClipText": 20512, // 设置剪贴板文本
"设置剪贴板文本": 20512,
// file related 文件相关
"loadText": 21101, // 从指定文件载入文本
"载入文本": 21101,
"saveText": 21103, // 保存文本到指定文件
"保存文本": 21103,
"loadBytes": 21105, // 从指定文件载入数据(字节列表)
"载入数据": 21105,
"saveBytes": 21106, // 保存数据(字节列表)到指定文件
"保存数据": 21106,
"loadBytesLimit": 21107, // 从指定文件载入数据(字节列表),不超过指定字节数
"joinPath": 21501, // 合并文件路径,第一个参数是结果参数不可省略,第二个参数开始要合并的路径
"合并路径": 21501, // 合并文件路径
"fileExists": 21701, // 判断文件是否存在
"removeFile": 21801, // 删除文件
// json related JSON相关
"toJson": 22101, // 将对象编码为JSON字符串
"toJSON": 22101,
"JSON编码": 22101,
"fromJson": 22102, // 将JSON字符串转换为对象
"fromJSON": 22102,
"JSON解码": 22102,
// xml related XML相关
"toXml": 22201, // 将对象编码为XML字符串
"toXML": 22201,
"XML编码": 22201,
// random related 随机数相关
"genRandomStr": 23101, // 生成随机字符串,用法示例:genRandomStr $result -min=6 -max=8 -noUpper -noLower -noDigit -special -space -invalid,其中,除结果参数外所有参数均可选,-min用于设置最少生成字符个数,-max设置最多字符个数,-noUpper设置是否包含大写字母,-noLower设置是否包含小写字母,-noDigit设置是否包含数字,-special设置是否包含特殊字符,-space设置是否包含空格,-invalid设置是否包含一般意义上文件名中的非法字符,
// encode/decode related 编码解码相关
"md5": 24101, // 生成MD5编码
"simpleEncode": 24201, // 简单编码,主要为了文件名和网址名不含非法字符
"simpleDecode": 24203, // 简单编码的解码
"urlEncode": 24301, // URL编码(http://www.aaa.com -> http%3A%2F%2Fwww.aaa.com)
"urlDecode": 24303, // URL解码
"base64Encode": 24401, // Base64编码,输入参数是[]byte字节数组或字符串
"base64Decode": 24403, // Base64解码
"htmlEncode": 24501, // HTML编码(&nbsp;等)
"htmlDecode": 24503, // HTML解码
// encrypt/decrypt related 加密/解密相关
"encryptText": 25101, // 用TXDEF方法加密字符串
"decryptText": 25103, // 用TXDEF方法解密字符串
"encryptData": 25201, // 用TXDEF方法加密数据(字节列表)
"decryptData": 25203, // 用TXDEF方法解密数据(字节列表)
// database related 数据库相关
"dbConnect": 32101, // 连接数据库,用法示例:dbConnect $db "sqlite3" `c:\tmpx\test.db`,或dbConnect $db "godror" `user/pass@129.0.9.11:1521/testdb`,结果参数外第一个参数为数据库驱动类型,目前支持sqlite3、mysql、mssql、godror(即oracle)等,第二个参数为连接字串
"连接数据库": 32101,
"dbClose": 32102, // 关闭数据库连接
"关闭数据库": 32102,
"dbQuery": 32103, // 在指定数据库连接上执行一个查询的SQL语句(一般是select等),返回数组,每行是映射(字段名:字段值),用法示例:dbQuery $rs $db $sql $arg1 $arg2 ...
"查询数据库": 32103,
"dbQueryRecs": 32104, // 在指定数据库连接上执行一个查询的SQL语句(一般是select等),返回二维数组(第一行为字段名),用法示例:dbQueryRecs $rs $db $sql $arg1 $arg2 ...
"查询数据库记录": 32104,
"dbExec": 32105, // 在指定数据库连接上执行一个有操作的SQL语句(一般是insert、update、delete等),用法示例:dbExec $rs $db $sql $arg1 $arg2 ...
"执行数据库": 32105,
//
}
type VarRef struct {
Ref int // -9 - eval, -8 - pop, -7 - peek, -5 - push, -4 - pln, -3 - var(string), -2 - drop, -1 - debug, > 0 normal vars, -210 - reg(bool) idx 0, -211 - reg(bool) idx 1..., -220 - reg(int) idx 0, -221 - reg(int) idx 1..., -230 - reg(float) idx 0, -231 - reg(float) idx 1..., -240 - reg(str) idx 0, -241 - reg(str) idx 1..., -250 - reg(any) idx 0, -251 - reg(any) idx 1...
Value interface{}
}
type Instr struct {
Code int
ParamLen int
Params []VarRef
// Param1Ref int
// Param1Value interface{}
// Param2Ref int
// Param2Value interface{}
}
func (v Instr) ParamsToStrs(fromA int) []string {
lenT := len(v.Params)
sl := make([]string, 0, lenT)
for i := fromA; i < lenT; i++ {
sl = append(sl, tk.ToStr(v.Params[i].Value))
}
return sl
}
func (v Instr) ParamsToList(fromA int) []interface{} {
lenT := len(v.Params)
sl := make([]interface{}, 0, lenT)
for i := fromA; i < lenT; i++ {
sl = append(sl, v.Params[i].Value)
}
return sl
}
type Regs struct {
IntsM [5]int
FloatsM [5]float64
CondsM [5]bool
StrsM [5]string
AnysM [5]interface{}
}
type FuncContext struct {
// VarsM map[int]interface{}
VarsLocalMapM map[int]int
VarsM *[]interface{}
ReturnPointerM int
RegsM *Regs
Layer int
// StackM []interface{}
}
type XieVM struct {
SourceM []string
CodeListM []string
InstrListM []Instr
CodeSourceMapM map[int]int
LabelsM map[int]int
VarIndexMapM map[string]int
VarNameMapM map[int]string
CodePointerM int
StackM []interface{}
StackPointerM int
// StackM *linkedliststack.Stack
FuncStackM []FuncContext
FuncStackPointerM int
// VarsM map[int]interface{}
// VarsLocalMapM map[int]int
// VarsM []interface{}
// RegsM Regs
FuncContextM FuncContext
// CurrentRegsM *Regs
// // CurrentVarsM *(map[int]interface{})
// CurrentVarsM *([]interface{})
CurrentFuncContextM *FuncContext
ErrorHandlerM int
VerboseM bool
}
type XieObject interface {
TypeName() string
Init(argsA ...interface{}) interface{}
SetValue(argsA ...interface{}) interface{}
GetValue(argsA ...interface{}) interface{}
Call(argsA ...interface{}) interface{}
SetMember(argsA ...interface{}) interface{}
GetMember(argsA ...interface{}) interface{}
}
// type XieObjectImpl struct {
// Members map[string]XieObject
// Methods map[string]*XieObject
// }
// var _ XieObject = XieObjectImpl{}
type XieString struct {
Value string
Members map[string]interface{}
}
func (v XieString) TypeName() string {
return "string"
}
func (v XieString) String() string {
return v.Value
}
func (p *XieString) Init(argsA ...interface{}) interface{} {
if len(argsA) > 0 {
p.Value = tk.ToStr(argsA[0])
} else {
p.Value = ""
}
return nil
}
func (p *XieString) SetValue(argsA ...interface{}) interface{} {
if len(argsA) > 0 {
p.Value = tk.ToStr(argsA[0])
} else {
p.Value = ""
}
return nil
}
func (v XieString) GetValue(argsA ...interface{}) interface{} {
return v.Value
}
func (p *XieString) SetMember(argsA ...interface{}) interface{} {
// if len(argsA) < 2 {
// return fmt.Errorf("参数个数不够")
// }
// return nil
return fmt.Errorf("不支持此方法")
}
func (p *XieString) GetMember(argsA ...interface{}) interface{} {
// if len(argsA) < 2 {
// return fmt.Errorf("参数个数不够")
// }
// return nil
return fmt.Errorf("不支持此方法")
}
func (p *XieString) Call(argsA ...interface{}) interface{} {
if len(argsA) < 1 {
return fmt.Errorf("参数个数不够")
}
methodNameT := tk.ToStr(argsA[0])
switch methodNameT {
case "toStr":
return p.Value
case "len":
return len(p.Value)
case "toRuneArray":
return []rune(p.Value)
case "runeLen":
return len([]rune(p.Value))
case "toByteArray":
return []byte(p.Value)
case "trim":
p.Value = strings.TrimSpace(p.Value)
return nil
case "trimSet":
if len(argsA) < 2 {
return fmt.Errorf("参数个数不够")
}
p.Value = strings.Trim(p.Value, tk.ToStr(argsA[1]))
return nil
case "add":
if len(argsA) < 2 {
return fmt.Errorf("参数个数不够")
}
p.Value = p.Value + tk.ToStr(argsA[1])
return nil
default:
return fmt.Errorf("未知方法")
}
return nil
}
// type XieHandler struct {
// Value string
// Members map[string]interface{}
// }
// func (v XieString) TypeName() string {
// return "string"
// }
// func (v XieString) String() string {
// return v.Value
// }
// func (p *XieString) Init(argsA ...interface{}) interface{} {
// if len(argsA) > 0 {
// p.Value = tk.ToStr(argsA[0])
// } else {
// p.Value = ""
// }
// return nil
// }
// func (p *XieString) SetValue(argsA ...interface{}) interface{} {
// if len(argsA) > 0 {
// p.Value = tk.ToStr(argsA[0])
// } else {
// p.Value = ""
// }
// return nil
// }
// func (v XieString) GetValue(argsA ...interface{}) interface{} {
// return v.Value
// }
// func (p *XieString) SetMember(argsA ...interface{}) interface{} {
// // if len(argsA) < 2 {
// // return fmt.Errorf("参数个数不够")
// // }
// // return nil
// return fmt.Errorf("不支持此方法")
// }
// func (p *XieString) GetMember(argsA ...interface{}) interface{} {
// // if len(argsA) < 2 {
// // return fmt.Errorf("参数个数不够")
// // }
// // return nil
// return fmt.Errorf("不支持此方法")
// }
// func (p *XieString) Call(argsA ...interface{}) interface{} {
// if len(argsA) < 1 {
// return fmt.Errorf("参数个数不够")
// }
// methodNameT := tk.ToStr(argsA[0])
// switch methodNameT {
// case "toStr":
// return p.Value
// case "len":
// return len(p.Value)
// case "toRuneArray":
// return []rune(p.Value)
// case "runeLen":
// return len([]rune(p.Value))
// case "toByteArray":
// return []byte(p.Value)
// case "trim":
// p.Value = strings.TrimSpace(p.Value)
// return nil
// case "trimSet":
// if len(argsA) < 2 {
// return fmt.Errorf("参数个数不够")
// }
// p.Value = strings.Trim(p.Value, tk.ToStr(argsA[1]))
// return nil
// case "add":
// if len(argsA) < 2 {
// return fmt.Errorf("参数个数不够")
// }
// p.Value = p.Value + tk.ToStr(argsA[1])
// return nil
// default:
// return fmt.Errorf("未知方法")
// }
// return nil
// }
type XieAny struct {
Value interface{}
Members map[string]interface{}
}
func (v XieAny) TypeName() string {
return "any"
}
func (v XieAny) String() string {
return tk.ToJSONX(v)
}
func (p *XieAny) Init(argsA ...interface{}) interface{} {
if len(argsA) > 0 {
p.Value = argsA[0]
} else {
p.Value = nil
}
p.Members = make(map[string]interface{})
return nil
}
func (p *XieAny) SetValue(argsA ...interface{}) interface{} {
if len(argsA) > 0 {
p.Value = argsA[0]
} else {
p.Value = ""
}
return nil
}
func (v XieAny) GetValue(argsA ...interface{}) interface{} {
return v.Value
}
func (p *XieAny) SetMember(argsA ...interface{}) interface{} {
if len(argsA) < 2 {
return fmt.Errorf("参数个数不够")
}
p.Members[tk.ToStr(argsA[0])] = argsA[1]
return nil
}
func (p *XieAny) GetMember(argsA ...interface{}) interface{} {
if len(argsA) < 1 {
return fmt.Errorf("参数个数不够")
}
nv, ok := p.Members[tk.ToStr(argsA[0])]
if !ok {
return Undefined
}
return nv
}
func (p *XieAny) Call(argsA ...interface{}) interface{} {
if len(argsA) < 1 {
return fmt.Errorf("参数个数不够")
}
methodNameT := tk.ToStr(argsA[0])
switch methodNameT {
case "toStr":
return p.String()
default:
return fmt.Errorf("未知方法")
}
return nil
}
func fnASRSE(fn func(string) (string, error)) func(args ...interface{}) interface{} {
return func(args ...interface{}) interface{} {
if len(args) != 1 {
return tk.Errf("not enough parameters")
}
s := tk.ToStr(args[0])
strT, errT := fn(s)
if errT != nil {
return errT
}
return strT
}
}
func NewXie(globalsA ...map[string]interface{}) *XieVM {
vmT := &XieVM{}
vmT.InitVM(globalsA...)
return vmT
}
func (p *XieVM) InitVM(globalsA ...map[string]interface{}) {
p.ErrorHandlerM = -1
p.StackM = make([]interface{}, 0, 10)
p.StackPointerM = 0
p.FuncStackM = make([]FuncContext, 0, 10)
p.VarIndexMapM = make(map[string]int, 100)
p.VarNameMapM = make(map[int]string, 100)
// p.VarsM = make(map[int]interface{}, 100)
// p.VarsM = make([]interface{}, 0, 100)
// p.VarsLocalMapM = make(map[int]string, 100)
// p.CurrentFuncContextM.RegsM = &(p.RegsM)
// p.CurrentVarsM = &(p.VarsM)
// p.FuncContextM = FuncContext{VarsM: make([]interface{}, 0, 10), VarsLocalMapM: make(map[int]int, 10), ReturnPointerM: -1}
p.FuncContextM = FuncContext{VarsM: &([]interface{}{}), VarsLocalMapM: make(map[int]int, 10), ReturnPointerM: -1, RegsM: &Regs{}}
p.CurrentFuncContextM = &(p.FuncContextM)
p.SetVar("backQuoteG", "`")
p.SetVar("undefined", Undefined)
p.SetVar("newLineG", "\n")
if len(globalsA) > 0 {
globalsT := globalsA[0]
for k, v := range globalsT {
p.SetVar(k, v)
}
}
p.SourceM = make([]string, 0, 100)
p.CodeListM = make([]string, 0, 100)
p.InstrListM = make([]Instr, 0, 100)
p.LabelsM = make(map[int]int, 100)
p.CodeSourceMapM = make(map[int]int, 100)
}
func (p *XieVM) ParseVar(strA string) VarRef {
s1T := strings.TrimSpace(strA)
if strings.HasPrefix(s1T, "`") && strings.HasSuffix(s1T, "`") {
s1T = s1T[1 : len(s1T)-1]
return VarRef{-3, s1T} // value(string)
} else if strings.HasPrefix(s1T, `"`) && strings.HasSuffix(s1T, `"`) {
tmps, errT := strconv.Unquote(s1T)
if errT != nil {
return VarRef{-3, s1T}
}
return VarRef{-3, tmps} // value(string)
} else {
if strings.HasPrefix(s1T, "$") {
if s1T == "$drop" || s1T == "$丢弃" {
return VarRef{-2, nil}
} else if s1T == "$debug" || s1T == "$调试" {
return VarRef{-1, nil}
} else if s1T == "$pln" || s1T == "$行输出" {
return VarRef{-4, nil}
} else if s1T == "$pop" || s1T == "$出栈" {
return VarRef{-8, nil}
} else if s1T == "$peek" || s1T == "$看栈" {
return VarRef{-7, nil}
} else if s1T == "$push" || s1T == "$入栈" {
return VarRef{-5, nil}
} else {
vNameT := s1T[1:]
// if strings.HasPrefix(vNameT, "$") {
// vNameT = vNameT[1:]
// varIndexT, ok := p.VarIndexMapM[vNameT]
// if !ok {
// varIndexT = len(p.VarIndexMapM) + 10000 + 1
// p.VarIndexMapM[vNameT] = varIndexT
// p.VarNameMapM[varIndexT] = vNameT
// }
// return VarRef{varIndexT, nil}
// }
varIndexT, ok := p.VarIndexMapM[vNameT]
if !ok {
varIndexT = len(p.VarIndexMapM)
p.VarIndexMapM[vNameT] = varIndexT
p.VarNameMapM[varIndexT] = vNameT
}
return VarRef{varIndexT, nil}
}
} else if strings.HasPrefix(s1T, ":") { // labels
vNameT := s1T[1:]
varIndexT, ok := p.VarIndexMapM[vNameT]
if !ok {
return VarRef{-3, s1T}
}
return VarRef{-3, p.LabelsM[varIndexT]}
} else if strings.HasPrefix(s1T, "#") { // values
if len(s1T) < 2 {
return VarRef{-3, s1T}
}
// remainsT := s1T[2:]
typeT := s1T[1]
if typeT == 'i' {
c1T, errT := tk.StrToIntQuick(s1T[2:])
if errT != nil {
return VarRef{-3, s1T}
}
return VarRef{-3, c1T}
} else if typeT == 'f' {
c1T, errT := tk.StrToFloat64E(s1T[2:])
if errT != nil {
return VarRef{-3, s1T}
}
return VarRef{-3, c1T}
} else if typeT == 'b' {
return VarRef{-3, tk.ToBool(s1T[2:])}
} else if typeT == 'y' {
return VarRef{-3, tk.ToByte(s1T[2:])}
} else if typeT == 'r' {
return VarRef{-3, tk.ToRune(s1T[2:])}
} else if typeT == 's' {
return VarRef{-3, tk.ToStr(s1T[2:])}
} else if typeT == 'L' { // list
var listT []interface{}
s1DT := s1T[2:] // tk.UrlDecode(s1T[2:])
if strings.HasPrefix(s1DT, "`") && strings.HasSuffix(s1DT, "`") {
s1DT = s1DT[1 : len(s1DT)-1]
}
// tk.Plv(s1T[2:])
// tk.Plv(s1DT)
errT := json.Unmarshal([]byte(s1DT), &listT)
// tk.Plv(errT)
if errT != nil {
return VarRef{-3, s1T}
}
// tk.Plv(listT)
return VarRef{-3, listT}
} else if typeT == 'Y' { // byteList
var listT []byte
s1DT := s1T[2:] // tk.UrlDecode(s1T[2:])
if strings.HasPrefix(s1DT, "`") && strings.HasSuffix(s1DT, "`") {
s1DT = s1DT[1 : len(s1DT)-1]
}
// tk.Plv(s1T[2:])
// tk.Plv(s1DT)
errT := json.Unmarshal([]byte(s1DT), &listT)
// tk.Plv(errT)
if errT != nil {
return VarRef{-3, s1T}
}
// tk.Plv(listT)
return VarRef{-3, listT}
} else if typeT == 'R' { // runeList
var listT []rune
s1DT := s1T[2:] // tk.UrlDecode(s1T[2:])
if strings.HasPrefix(s1DT, "`") && strings.HasSuffix(s1DT, "`") {
s1DT = s1DT[1 : len(s1DT)-1]
}
// tk.Plv(s1T[2:])
// tk.Plv(s1DT)
errT := json.Unmarshal([]byte(s1DT), &listT)
// tk.Plv(errT)
if errT != nil {
return VarRef{-3, s1T}
}
// tk.Plv(listT)
return VarRef{-3, listT}
} else if typeT == 'M' { // map
var mapT map[string]interface{}
s1DT := s1T[2:] // tk.UrlDecode(s1T[2:])
if strings.HasPrefix(s1DT, "`") && strings.HasSuffix(s1DT, "`") {
s1DT = s1DT[1 : len(s1DT)-1]
}
// tk.Plv(s1T[2:])
// tk.Plv(s1DT)
errT := json.Unmarshal([]byte(s1DT), &mapT)
// tk.Plv(errT)
if errT != nil {
return VarRef{-3, s1T}
}
// tk.Plv(listT)
return VarRef{-3, mapT}
}
return VarRef{-3, s1T}
} else if strings.HasPrefix(s1T, "@") { // regs
if len(s1T) < 2 {
return VarRef{-3, s1T}
}
typeT := s1T[1]
if typeT == 'i' {
c1T, errT := tk.StrToIntQuick(s1T[2:])
if errT != nil {
return VarRef{-3, s1T}
}
return VarRef{-220 - c1T, nil}
} else if typeT == 'f' {
c1T, errT := tk.StrToIntQuick(s1T[2:])
if errT != nil {
return VarRef{-3, s1T}
}
return VarRef{-230 - c1T, nil}
} else if typeT == 'b' {
c1T, errT := tk.StrToIntQuick(s1T[2:])
if errT != nil {
return VarRef{-3, s1T}
}
return VarRef{-210 - c1T, nil}
} else if typeT == 's' {
c1T, errT := tk.StrToIntQuick(s1T[2:])
if errT != nil {
return VarRef{-3, s1T}
}
return VarRef{-240 - c1T, nil}
} else if typeT == 'a' {
c1T, errT := tk.StrToIntQuick(s1T[2:])
if errT != nil {
return VarRef{-3, s1T}
}
return VarRef{-250 - c1T, nil}
}
return VarRef{-3, s1T}
} else if strings.HasPrefix(s1T, "?") { // eval
if len(s1T) < 2 {
return VarRef{-3, s1T}
}
s1T = strings.TrimSpace(s1T[1:])
if strings.HasPrefix(s1T, "`") && strings.HasSuffix(s1T, "`") {
s1T = s1T[1 : len(s1T)-1]
return VarRef{-9, s1T} // eval value
} else if strings.HasPrefix(s1T, `"`) && strings.HasSuffix(s1T, `"`) {
tmps, errT := strconv.Unquote(s1T)
if errT != nil {
return VarRef{-9, s1T}
}
return VarRef{-9, tmps}
}
return VarRef{-9, s1T}
} else {
return VarRef{-3, s1T} // value(string)
}
}
}
func isOperator(strA string) (bool, string) {
return false, ""
}
func evalSingle(exprA []interface{}) (resultR interface{}) {
// tk.Pl("%v", exprA)
resultR = nil
opT := exprA[1].(string)
if exprA[0] == nil {
if opT == "-" {
switch nv := exprA[2].(type) {
case int:
resultR = -nv
return
case float64:
resultR = -nv
return
case byte:
resultR = -nv
return
case rune:
resultR = -nv
return
default:
resultR = fmt.Errorf("类型不一致")
return
}
} else if opT == "!" {
switch nv := exprA[2].(type) {
case bool:
resultR = !nv
return
default:
resultR = fmt.Errorf("类型不一致")
return
}
}
resultR = fmt.Errorf("未知运算符:%v", opT)
return
} else {
if opT == "+" {
switch nv := exprA[0].(type) {
case int:
resultR = nv + exprA[2].(int)
return
case float64:
resultR = nv + exprA[2].(float64)
return
case byte:
resultR = nv + exprA[2].(byte)
return
case rune:
resultR = nv + exprA[2].(rune)
return
case string:
resultR = nv + exprA[2].(string)
return
default:
resultR = fmt.Errorf("类型不一致")
return
}
} else if opT == "-" {
switch nv := exprA[0].(type) {
case int:
resultR = nv - exprA[2].(int)
return
case float64:
resultR = nv - exprA[2].(float64)
return
case byte:
resultR = nv - exprA[2].(byte)
return
case rune:
resultR = nv - exprA[2].(rune)
return
default:
resultR = fmt.Errorf("类型不一致")
return
}
} else if opT == "*" {
switch nv := exprA[0].(type) {
case int:
resultR = nv * exprA[2].(int)
return
case float64:
resultR = nv * exprA[2].(float64)
return
case byte:
resultR = nv * exprA[2].(byte)
return
case rune:
resultR = nv * exprA[2].(rune)
return
default:
resultR = fmt.Errorf("类型不一致")
return
}
} else if opT == "/" {
switch nv := exprA[0].(type) {
case int:
resultR = nv / exprA[2].(int)
return
case float64:
resultR = nv / exprA[2].(float64)
return
case byte:
resultR = nv / exprA[2].(byte)
return
case rune:
resultR = nv / exprA[2].(rune)
return
default:
resultR = fmt.Errorf("类型不一致")
return
}
} else if opT == "%" {
switch nv := exprA[0].(type) {
case int:
resultR = nv % exprA[2].(int)
return
case byte:
resultR = nv % exprA[2].(byte)
return
case rune:
resultR = nv % exprA[2].(rune)
return
default:
resultR = fmt.Errorf("类型不一致")
return
}
} else if opT == "<" {
switch nv := exprA[0].(type) {
case int:
resultR = nv < exprA[2].(int)
return
case byte:
resultR = nv < exprA[2].(byte)
return
case rune:
resultR = nv < exprA[2].(rune)
return
case float64:
resultR = nv < exprA[2].(float64)
return
case string:
resultR = nv < exprA[2].(string)
return
default:
resultR = fmt.Errorf("类型不一致")
return
}
} else if opT == "<=" {
switch nv := exprA[0].(type) {
case int:
resultR = nv <= exprA[2].(int)
return
case byte:
resultR = nv <= exprA[2].(byte)
return
case rune:
resultR = nv <= exprA[2].(rune)
return
case float64:
resultR = nv <= exprA[2].(float64)
return
case string:
resultR = nv <= exprA[2].(string)
return
default:
resultR = fmt.Errorf("类型不一致")
return
}
} else if opT == ">" {
switch nv := exprA[0].(type) {
case int:
resultR = nv > exprA[2].(int)
return
case byte:
resultR = nv > exprA[2].(byte)
return
case rune:
resultR = nv > exprA[2].(rune)
return
case float64:
resultR = nv > exprA[2].(float64)
return
case string:
resultR = nv > exprA[2].(string)
return
default:
resultR = fmt.Errorf("类型不一致")
return
}
} else if opT == ">=" {
switch nv := exprA[0].(type) {
case int:
resultR = nv >= exprA[2].(int)
return
case byte:
resultR = nv >= exprA[2].(byte)
return
case rune:
resultR = nv >= exprA[2].(rune)
return
case float64:
resultR = nv >= exprA[2].(float64)
return
case string:
resultR = nv >= exprA[2].(string)
return
default:
resultR = fmt.Errorf("类型不一致")
return
}
} else if opT == "==" {
switch nv := exprA[0].(type) {
case bool:
resultR = nv == exprA[2].(bool)
return
case int:
resultR = nv == exprA[2].(int)
return
case byte:
resultR = nv == exprA[2].(byte)
return
case rune:
resultR = nv == exprA[2].(rune)
return
case float64:
resultR = nv == exprA[2].(float64)
return
case string:
resultR = nv == exprA[2].(string)
return
default:
resultR = fmt.Errorf("类型不一致")
return
}
} else if opT == "!=" {
switch nv := exprA[0].(type) {
case bool:
resultR = nv != exprA[2].(bool)
return
case int:
resultR = nv != exprA[2].(int)
return
case byte:
resultR = nv != exprA[2].(byte)
return
case rune:
resultR = nv != exprA[2].(rune)
return
case float64:
resultR = nv != exprA[2].(float64)
return
case string:
resultR = nv != exprA[2].(string)
return
default:
resultR = fmt.Errorf("类型不一致")
return
}
} else if opT == "&&" {
switch nv := exprA[0].(type) {
case bool:
resultR = nv && exprA[2].(bool)
return
default:
resultR = fmt.Errorf("无法处理的类型:%T", exprA[0])
return
}
} else if opT == "||" {
switch nv := exprA[0].(type) {
case bool:
resultR = nv || exprA[2].(bool)
return
default:
resultR = fmt.Errorf("无法处理的类型:%T", exprA[0])
return
}
} else if opT == "&" {
switch nv := exprA[0].(type) {
case int:
resultR = nv & exprA[2].(int)
return
case byte:
// tk.Pl("%v -- %v", nv, exprA[2].(byte))
resultR = nv & exprA[2].(byte)
return
case rune:
resultR = nv & exprA[2].(rune)
return
default:
resultR = fmt.Errorf("类型不一致")
return
}
} else if opT == "|" {
switch nv := exprA[0].(type) {
case int:
resultR = nv | exprA[2].(int)
return
case byte:
resultR = nv | exprA[2].(byte)
return
case rune:
resultR = nv | exprA[2].(rune)
return
default:
resultR = fmt.Errorf("类型不一致")
return
}
} else if opT == "^" {
switch nv := exprA[0].(type) {
case int:
resultR = nv ^ exprA[2].(int)
return
case byte:
resultR = nv ^ exprA[2].(byte)
return
case rune:
resultR = nv ^ exprA[2].(rune)
return
default:
resultR = fmt.Errorf("类型不一致")
return
}
} else if opT == ">>" {
switch nv := exprA[0].(type) {
case int:
resultR = nv >> tk.ToInt(exprA[2])
return
case byte:
resultR = nv >> tk.ToInt(exprA[2])
return
case rune:
resultR = nv >> tk.ToInt(exprA[2])
return
default:
resultR = fmt.Errorf("类型不一致")
return
}
} else if opT == "<<" {
switch nv := exprA[0].(type) {
case int:
resultR = nv << tk.ToInt(exprA[2])
return
case byte:
resultR = nv << tk.ToInt(exprA[2])
return
case rune:
resultR = nv << tk.ToInt(exprA[2])
return
default:
resultR = fmt.Errorf("类型不一致")
return
}
}
resultR = fmt.Errorf("未知运算符:%v", opT)
return
}
return
}
func (p *XieVM) EvalExpressionNoGroup(strA string, valuesA *map[string]interface{}) interface{} {
// strT := strA[1 : len(strA)-1]
// tk.Pl("EvalExpressionNoGroup: %v", strA)
if strings.HasPrefix(strA, "?") {
instrT := p.NewInstr(strA[1:], valuesA)
if instrT.Code == InstrNameSet["invalidInstr"] {
return fmt.Errorf("指令分析失败:%v", instrT.Params[0].Value)
}
rsT := p.RunLine(0, instrT)
nsv, ok := rsT.(string)
if ok {
if tk.IsErrStr(nsv) {
return fmt.Errorf("计算失败:%v", tk.GetErrStr(nsv))
}
}
// keyT := "~" + tk.IntToStr(len(valuesA))
// valuesA[keyT] = p.Pop()
strA = "$pop"
}
listT := strings.Split(strA, " ")
// lenT := len(listT)
// opListT := make([][]interface{}, 0, lenT)
stateT := 0 // 0: initial, 1: first value ready, 2: operator ready, 3: second value ready
opT := []interface{}{nil, nil, nil}
// valuesT := make([]interface{})
for _, v := range listT {
v = strings.TrimSpace(v)
if v == "" {
continue
}
if tk.InStrings(v, "+", "-", "*", "/", "%", "!", "&&", "||", "==", "!=", ">", "<", ">=", "<=", "&", "|", "^", ">>", "<<") {
if stateT == 0 {
opT[0] = nil
opT[1] = v
stateT = 2
} else if stateT == 1 {
opT[1] = v
stateT = 2
} else if stateT == 2 {
opT[1] = v
stateT = 2
} else {
}
} else if strings.HasPrefix(v, "~") {
if stateT == 0 {
opT[0] = (*valuesA)[v]
stateT = 1
} else if stateT == 1 {
opT[0] = (*valuesA)[v]
stateT = 1
} else if stateT == 2 {
opT[2] = (*valuesA)[v]
stateT = 3
}
} else {
vT := p.ParseVar(v)
vvT := p.GetVarValue(vT)
if stateT == 0 {
opT[0] = vvT
stateT = 1
} else if stateT == 1 {
opT[0] = vvT
stateT = 1
} else if stateT == 2 {
opT[2] = vvT
stateT = 3
}
}
if stateT == 3 {
// opListT = append(opListT, opT)
rvT := evalSingle(opT)
if tk.IsError(rvT) {
return rvT
}
opT[0] = rvT
stateT = 1
}
}
return opT[0]
}
func (p *XieVM) EvalExpression(strA string) (resultR interface{}) {
strT := strA
regexpT := regexp.MustCompile(`\([^\(]*?\)`)
valuesT := make(map[string]interface{})
var tmpv interface{}
for {
matchT := regexpT.FindStringIndex(strT)
if matchT == nil {
tmpv = p.EvalExpressionNoGroup(strT, &valuesT)
if tk.IsError(tmpv) {
tk.Pl("表达式计算失败:%v", tmpv)
}
break
} else {
tmpv = p.EvalExpressionNoGroup(strT[matchT[0]:matchT[1]][1:matchT[1]-matchT[0]-1], &valuesT)
if tk.IsError(tmpv) {
tk.Pl("表达式计算失败:%v", tmpv)
}
}
keyT := "~" + tk.IntToStr(len(valuesT))
valuesT[keyT] = tmpv
strT = strT[0:matchT[0]] + " " + keyT + " " + strT[matchT[1]:len(strT)]
}
resultR = tmpv
return
// listT := strings.Split(strA, " ")
// lenT := len(listT)
// opListT := make([][]interface{}, lenT)
// stateT := 0 // 0: initial, 1: first value ready, 2: operator ready, 3: second value ready
// for i, v := range listT {
// v = strings.TrimSpace(v)
// if v == "" {
// continue
// }
// opT := []interface{}{nil, nil, nil}
// if tk.InStrings(v, "+", "-", "*", "/", "%", "!", "&&", "||", "==", "!=", ">", "<", ">=", "<=") {
// if stateT == 0 {
// opT[0] = nil
// opT[1] = v
// stateT = 2
// }
// } else {
// vT := p.ParseVar(v)
// vvT := p.GetVarValue(vT)
// if stateT == 0 {
// opT[0] = vvT
// stateT = 1
// }
// }
// if stateT == 3 {
// opListT = append(opListT, opT)
// }
// }
}
func (p *XieVM) GetVarValue(vA VarRef) interface{} {
idxT := vA.Ref
if idxT == -2 {
return Undefined
}
if idxT == -3 {
return vA.Value
}
if idxT == -8 {
return p.Pop()
}
if idxT == -7 {
return p.Peek()
}
if idxT == -1 { // $debug
return tk.ToJSONX(p, "-indent", "-sort")
}
if idxT < -199 {
if idxT < -249 {
return p.CurrentFuncContextM.RegsM.AnysM[(-idxT)-250]
} else if idxT < -239 {
return p.CurrentFuncContextM.RegsM.StrsM[(-idxT)-240]
} else if idxT < -229 {
return p.CurrentFuncContextM.RegsM.FloatsM[(-idxT)-230]
} else if idxT < -219 {
return p.CurrentFuncContextM.RegsM.IntsM[(-idxT)-220]
} else {
return p.CurrentFuncContextM.RegsM.CondsM[(-idxT)-210]
}
}
if idxT == -5 {
return Undefined
}
if idxT == -9 {
return p.EvalExpression(vA.Value.(string))
}
if idxT < 0 {
return Undefined
}
contextT := p.CurrentFuncContextM
nv, ok := contextT.VarsLocalMapM[idxT]
if !ok {
for {
if contextT.Layer < 1 {
break
}
if contextT.Layer < 2 {
contextT = &p.FuncContextM
} else {
contextT = &p.FuncStackM[contextT.Layer-2]
}
nv, ok = contextT.VarsLocalMapM[idxT]
if !ok {
continue
}
return (*contextT.VarsM)[nv]
}
return Undefined
}
return (*contextT.VarsM)[nv]
// vT, ok := (*(p.CurrentVarsM))[idxT]
// if !ok {
// return Undefined
// }
// return vT
}
func (p *XieVM) GetVarValueWithLayer(vA VarRef) (interface{}, int) {
idxT := vA.Ref
if idxT == -2 {
return Undefined, -2
}
if idxT == -3 {
return vA.Value, -1
}
if idxT == -8 {
return p.Pop(), -2
}
if idxT == -7 {
return p.Peek(), -2
}
if idxT == -5 {
return Undefined, -2
}
if idxT == -1 { // $debug
return tk.ToJSONX(p, "-indent", "-sort"), -2
}
if idxT == -9 {
return p.EvalExpression(vA.Value.(string)), -2
}
if idxT < 0 {
return Undefined, -3
}
// layerT := len(p.FuncStackM)
contextT := p.CurrentFuncContextM
nv, ok := contextT.VarsLocalMapM[idxT]
if !ok {
for {
if contextT.Layer < 1 {
break
}
if contextT.Layer < 2 {
contextT = &p.FuncContextM
} else {
contextT = &p.FuncStackM[contextT.Layer-2]
}
// layerT--
nv, ok = contextT.VarsLocalMapM[idxT]
if !ok {
continue
}
return (*contextT.VarsM)[nv], (*contextT).Layer
}
return Undefined, (*contextT).Layer
}
return (*contextT.VarsM)[nv], (*contextT).Layer
// vT, ok := (*(p.CurrentVarsM))[idxT]
// if !ok {
// return Undefined
// }
// return vT
}
func (p *XieVM) GetVarRef(vA VarRef) *interface{} {
idxT := vA.Ref
if idxT == -2 {
return nil
}
if idxT == -3 {
return nil
}
if idxT == -8 {
return nil
}
if idxT == -7 {
return nil
}
if idxT == -5 {
return nil
}
if idxT == -9 {
return nil
}
if idxT < -199 {
if idxT < -249 {
return &p.CurrentFuncContextM.RegsM.AnysM[(-idxT)-250]
// } else if idxT < -239 {
// return &((interface{})(p.CurrentFuncContextM.RegsM.StrsM[(-idxT)-240]))
// } else if idxT < -229 {
// return &p.CurrentFuncContextM.RegsM.FloatsM[(-idxT)-230]
// } else if idxT < -219 {
// return &p.CurrentFuncContextM.RegsM.IntsM[(-idxT)-220]
// } else {
// return &p.CurrentFuncContextM.RegsM.CondsM[(-idxT)-210]
}
}
if idxT < 0 {
return nil
}
// _, ok := p.VarsM[idxT]
// if !ok {
// return nil
// }
contextT := p.CurrentFuncContextM
nv, ok := contextT.VarsLocalMapM[idxT]
if !ok {
for {
if contextT.Layer < 1 {
break
}
if contextT.Layer < 2 {
contextT = &p.FuncContextM
} else {
contextT = &p.FuncStackM[contextT.Layer-2]
}
nv, ok = contextT.VarsLocalMapM[idxT]
if !ok {
continue
}
return &((*contextT.VarsM)[nv])
}
return nil
}
return &((*contextT.VarsM)[nv])
// return &((*contextT.VarsM)[contextT.VarsLocalMapM[idxT]])
}
func (p *XieVM) GetVarValueGlobal(vA VarRef) interface{} {
idxT := vA.Ref
if idxT == -2 {
return Undefined
}
if idxT == -3 {
return vA.Value
}
if idxT == -8 {
return p.Pop()
}
if idxT == -7 {
return p.Peek()
}
if idxT == -5 {
return Undefined
}
if idxT == -1 { // $debug
return tk.ToJSONX(p, "-indent", "-sort")
}
if idxT == -9 {
return p.EvalExpression(vA.Value.(string))
}
if idxT < 0 {
return Undefined
}
contextT := p.FuncContextM
nv, ok := contextT.VarsLocalMapM[idxT]
if !ok {
return Undefined
}
return (*contextT.VarsM)[nv]
// return p.VarsM[idxT]
// vT, ok := p.VarsM[idxT]
// if !ok {
// return Undefined
// }
// return vT
}
func (p *XieVM) ParseLine(commandA string) ([]string, error) {
var args []string
// state: 1 - start, quotes - 2, arg - 3
state := 1
current := ""
quote := "`"
// escapeNext := false
command := []rune(commandA)
for i := 0; i < len(command); i++ {
c := command[i]
// if escapeNext {
// current += string(c)
// escapeNext = false
// continue
// }
// if c == '\\' {
// current += string(c)
// escapeNext = true
// continue
// }
if state == 2 {
if string(c) != quote {
current += string(c)
} else {
current += string(c) // add it
args = append(args, current)
current = ""
state = 1
}
continue
}
// tk.Pln(string(c), c, c == '`', '`')
if c == '"' || c == '\'' || c == '`' {
state = 2
quote = string(c)
current += string(c) // add it
continue
}
if state == 3 {
if c == ' ' || c == '\t' {
args = append(args, current)
current = ""
state = 1
} else {
current += string(c)
}
// Pl("state: %v, current: %v, args: %v", state, current, args)
continue
}
if c != ' ' && c != '\t' {
state = 3
current += string(c)
}
}
if state == 2 {
return []string{}, fmt.Errorf("Unclosed quote in command line: %v", command)
}
if current != "" {
args = append(args, current)
}
return args, nil
}
func (p *XieVM) NewInstr(codeA string, valuesA *map[string]interface{}) Instr {
v := strings.TrimSpace(codeA)
if tk.StartsWith(v, "//") || tk.StartsWith(v, "#") {
instrT := Instr{Code: 101, ParamLen: 0}
return instrT
}
// var varCountT int
if tk.StartsWith(v, ":") {
instrT := Instr{Code: InstrNameSet["pass"], ParamLen: 0}
return instrT
}
listT, errT := p.ParseLine(v)
if errT != nil {
instrT := Instr{Code: InstrNameSet["invalidInstr"], ParamLen: 1, Params: []VarRef{VarRef{Ref: -3, Value: "参数解析失败"}}}
return instrT
}
lenT := len(listT)
instrNameT := strings.TrimSpace(listT[0])
codeT, ok := InstrNameSet[instrNameT]
if !ok {
instrT := Instr{Code: InstrNameSet["invalidInstr"], ParamLen: 1, Params: []VarRef{VarRef{Ref: -3, Value: "未知指令"}}}
return instrT
}
instrT := Instr{Code: codeT, Params: make([]VarRef, 0, lenT-1)} //&([]VarRef{})}
list3T := []VarRef{}
for j, jv := range listT {
if j == 0 {
continue
}
if strings.HasPrefix(jv, "~") {
list3T = append(list3T, VarRef{-3, (*valuesA)[jv]})
} else {
list3T = append(list3T, p.ParseVar(jv))
}
}
instrT.Params = append(instrT.Params, list3T...)
instrT.ParamLen = lenT - 1
return instrT
}
func (p *XieVM) Load(codeA string) string {
// originSourceLenT := len(p.SourceM)
originCodeLenT := len(p.CodeListM)
sourceT := tk.SplitLines(codeA)
p.SourceM = append(p.SourceM, sourceT...)
// p.CodeListM = make([]string, 0, len(p.SourceM))
// p.InstrListM = make([]Instr, 0, len(p.SourceM))
// p.LabelsM = make(map[int]int, len(p.SourceM))
// p.CodeSourceMapM = make(map[int]int, len(p.SourceM))
pointerT := originCodeLenT
var varCountT int
for i := 0; i < len(sourceT); i++ {
v := strings.TrimSpace(sourceT[i])
if tk.StartsWith(v, "//") || tk.StartsWith(v, "#") {
continue
}
if tk.StartsWith(v, ":") {
labelT := strings.TrimSpace(v[1:])
_, ok := p.VarIndexMapM[labelT]
if !ok {
varCountT = len(p.VarIndexMapM)
p.VarIndexMapM[labelT] = varCountT
p.VarNameMapM[varCountT] = labelT
}
p.LabelsM[varCountT] = pointerT
continue
}
iFirstT := i
if tk.Contains(v, "`") {
if strings.Count(v, "`")%2 != 0 {
foundT := false
var j int
for j = i + 1; j < len(sourceT); j++ {
if tk.Contains(sourceT[j], "`") {
v = tk.JoinLines(sourceT[i : j+1])
foundT = true
break
}
}
if !foundT {
return tk.ErrStrf("代码解析错误: ` 未成对(%v)", i)
}
i = j
}
}
v = strings.TrimSpace(v)
if v == "" {
continue
}
p.CodeListM = append(p.CodeListM, v)
p.CodeSourceMapM[pointerT] = iFirstT
pointerT++
}
for i := originCodeLenT; i < len(p.CodeListM); i++ {
// listT := strings.SplitN(v, " ", 3)
v := p.CodeListM[i]
listT, errT := p.ParseLine(v)
if errT != nil {
return p.ErrStrf("参数解析失败")
}
lenT := len(listT)
instrNameT := strings.TrimSpace(listT[0])
codeT, ok := InstrNameSet[instrNameT]
if !ok {
instrT := Instr{Code: codeT, ParamLen: 1, Params: []VarRef{VarRef{Ref: -3, Value: v}}} //&([]VarRef{})}
p.InstrListM = append(p.InstrListM, instrT)
return tk.ErrStrf("编译错误(行 %v/%v %v): 未知指令", i, p.CodeSourceMapM[i]+1, tk.LimitString(p.SourceM[p.CodeSourceMapM[i]], 50))
}
instrT := Instr{Code: codeT, Params: make([]VarRef, 0, lenT-1)} //&([]VarRef{})}
list3T := []VarRef{}
for j, jv := range listT {
if j == 0 {
continue
}
list3T = append(list3T, p.ParseVar(jv))
}
instrT.Params = append(instrT.Params, list3T...)
instrT.ParamLen = lenT - 1
p.InstrListM = append(p.InstrListM, instrT)
}
// tk.Plv(p.SourceM)
// tk.Plv(p.CodeListM)
// tk.Plv(p.CodeSourceMapM)
return tk.ToStr(originCodeLenT)
}
func (p *XieVM) PushFunc() {
// funcContextT := FuncContext{VarsM: make(map[int]interface{}, 10), ReturnPointerM: p.CodePointerM + 1}
// funcContextT := FuncContext{VarsM: make([]interface{}, 0, 10), VarsLocalMapM: make(map[int]int, 10), ReturnPointerM: p.CodePointerM + 1}
funcContextT := FuncContext{VarsM: &([]interface{}{}), VarsLocalMapM: make(map[int]int, 10), ReturnPointerM: p.CodePointerM + 1, Layer: p.FuncStackPointerM + 1, RegsM: &Regs{}}
lenT := len(p.<