⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 parser.js

📁 在线ExeclCopyright (c) iRows.com. All rights reserved. Do not copy
💻 JS
📖 第 1 页 / 共 3 页
字号:
token=tokens[tokens.length-1]message="Operator does not have operands"}if(!token){token=tokens[1]message="Invalid syntax of expression"}var startwhile(true){if(token.start)start=token.startif(token.left)token=token.leftelsebreak}var pos=start?start:0P.H9(errors,'syntax',message,pos,1)}P.append=function(source,target,sourceFromIndex,sourceToIndex){for(var i=sourceFromIndex;i<=sourceToIndex;i++)target[target.length]=source[i]}P.ruleNumberToExp=function(tokens,pos,errors){var H2=tokens[pos]var H0=new Object()H0.type="exp"H0.valueType="number"if(H2.text.substring(0,2).toLowerCase()=="0x")H0.value=parseInt(H2.text)elseif(H2.text.indexOf('.')>=0||H2.text.indexOf('e')>0)H0.value=parseFloat(H2.text)elseif(H2.text.substring(0,2).toLowerCase()=="0b")H0.value=P.parseBinary(H2,errors)elseH0.value=parseInt(H2.text,10)H0.left=H2tokens[pos]=H0return tokens}P.ruleTextToExp=function(tokens,pos,errors){var H2=tokens[pos]var H0=new Object()H0.type="exp"H0.valueType="text"H0.value=H2.textH0.left=H2tokens[pos]=H0return tokens}P.ruleNameRange=function(tokens,pos,errors){var startToken=tokens[pos]var endToken=tokens[pos+2]var H0=new Object()H0.type='range'var nameStart=startToken.textvar nameEnd=endToken.textvar indExcl=nameStart.indexOf('!')if(indExcl>=0){var refId=nameStart.substring(0,indExcl)var refRangeStart=nameStart.substring(indExcl+1)var refIdEnd=refIdvar refRangeEndindExcl=nameEnd.indexOf('!')if(indExcl>=0){refIdEnd=nameEnd.substring(0,indExcl)refRangeEnd=nameEnd.substring(indExcl+1)}elserefRangeEnd=nameEndif(refId.length==0||refRangeStart.length==0)P.H9(errors,"syntax","Invalid external range start "+nameStart,startToken.start,startToken.text.length)if(refRangeEnd.length==0)P.H9(errors,"syntax","Invalid external range end "+nameEnd,startToken.start,startToken.text.length)if(!refIdEnd==refId)P.H9(errors,"syntax","Range end reference must be on the same data sheet as range start",startToken.start,startToken.text.length)H0.type="range"H0.dynid=refId+'\t'+refRangeStart+':'+refRangeEnd}else{nameStart=nameStart.toLowerCase()nameEnd=nameEnd.toLowerCase()var startCell=H6(nameStart)if(!startCell)P.H9(errors,'syntax',"Invalid range start ["+nameStart+"]",startToken.start,startToken.text.length)var endCell=H6(nameEnd)if(!endCell)P.H9(errors,'syntax',"Invalid range end ["+nameEnd+"]",endToken.start,endToken.text.length)if(startCell&&endCell){H0.startRow=Math.min(startCell.row,endCell.row)H0.endRow=Math.max(startCell.row,endCell.row)H0.startCol=Math.min(startCell.col,endCell.col)H0.endCol=Math.max(startCell.col,endCell.col)startToken.cellReference={startRow:H0.startRow,startCol:H0.startCol,endRow:H0.endRow,endCol:H0.endCol}}else{H0.startRow=0H0.endRow=0H0.startCol=0H0.endCol=0}}H0.left=startTokenH0.right=endTokenvar H0s=new Array()P.append(tokens,H0s,0,pos-1)H0s[H0s.length]=H0P.append(tokens,H0s,pos+3,tokens.length-1)return H0s}P.ruleNameToExp=function(tokens,pos,errors){var H2=tokens[pos]var H0=new Object()H0.type='exp'var name=H2.text.toLowerCase()var value=""var valueType='null'if(name=='pi'){value=Math.PIvalueType='number'}elseif(name=='e'){value=Math.EvalueType='number'}elseif(name=='true'){value=1valueType='boolean'}elseif(name=='false'){value=0valueType='boolean'}if(valueType!="null"){H0.value=valueH0.valueType=valueType}elseif(name.indexOf('!')>=0){H2.op=OP_GetDynH2.dynid=H2.textH0.op=OP_DoLeft}else{var cellId=H6(name)if(cellId){H2.op=OP_GetCellH2.cellReference=cellIdH0.op=OP_DoLeft}elseP.H9(errors,'syntax',"Invalid variable name "+name,H2.start,H2.text.length)}H0.left=H2tokens[pos]=H0return tokens}P.ruleBrExpBr=function(tokens,pos,errors){var H0s=new Array()P.append(tokens,H0s,0,pos-1)H0s[H0s.length]=tokens[pos+1]P.append(tokens,H0s,pos+3,tokens.length-1)return H0s}P.ruleBrExpOpExpBr=function(tokens,pos,errors){var H0s=new Array()P.append(tokens,H0s,0,pos-1)P.append(tokens,H0s,pos+1,pos+3)P.append(tokens,H0s,pos+5,tokens.length-1)return P.ruleOp(H0s,pos,errors)}P.ruleOp=function(tokens,pos,errors){var H0s=new Array()P.append(tokens,H0s,0,pos-1)var t1=tokens[pos]var t2=tokens[pos+2]var tOp=tokens[pos+1]var H0=new Object()H0.type="exp"H0.op=OP_DoLeftH0s[H0s.length]=H0H0.left=tOptOp.op=OP_OptOp.left=t1tOp.right=t2P.append(tokens,H0s,pos+3,tokens.length-1)return H0s}P.evaluateOperator=function(tOp,t1,t2,errors){var v1=t1.valuevar v2=t2.valuevar op=tOp.textif(t1.valueType=='null')v1=0if(t2.valueType=='null')v2=0if(t1.valueType=='text'){P.H9(errors,'value',"Arithmetic operations require numeric parameters (on left)",tOp.start,1)v1=0}if(t2.valueType=='text'){P.H9(errors,'value',"Arithmetic operations require numeric parameters (on right)",tOp.start,1)v2=op=='/'?1:0}var result=v1if(op=='+')result+=v2elseif(op=='-')result-=v2elseif(op=='*')result *=v2elseif(op=='/'){result /=v2if(isNaN(result)||result=="Infinity")P.H9(errors,'value',"Divide by zero is not allowed",tOp.start,1)}elseif(op=='^')result=Math.pow(result,v2)tOp.value=resulttOp.valueType='number'}P.evaluateLogicalOperator=function(tOp,t1,t2,errros){var v1=t1.valuevar v2=t2.valuevar op=tOp.textif(t1.valueType!=t2.valueType){if(t1.valueType=='text'||t2.valueType=='text'){if(t1.valueType=='null')v1=''if(t2.valueType=='null')v2=''if(t1.valueType=='number')v1=''+v1if(t2.valueType=='number')v2=''+v2if(t1.valueType=='booean')v1=v1?'true':'false'if(t2.valueType=='booean')v2=v2?'true':'false'}elseif(t1.valueType=='number'||t2.valueType=='number'||t1.valueType=='boolean'||t2.valueType=='boolean'){if(t1.valueType=='null')v1=0if(t2.valueType=='null')v2=0}}var result=falseif(op=='=')result=(v1==v2)elseif(op=='<')result=(v1<v2)elseif(op=='>')result=(v1>v2)elseif(op=='>=')result=(v1>=v2)elseif(op=='<=')result=(v1<=v2)elseif(op=='<>')result=(v1!=v2)tOp.value=result?1:0tOp.valueType='boolean'}P.rulePct=function(tokens,pos,errors){var H0s=new Array()P.append(tokens,H0s,0,pos-1)var t=tokens[pos]var opToken=tokens[pos+1]var H0=new Object()H0.left=tH0.right=opTokenH0.type='exp'H0.op=OP_PctH0s[H0s.length]=H0opToken.left=tokens[pos]P.append(tokens,H0s,pos+2,tokens.length-1)return H0s}P.ruleUnari=function(tokens,pos,errors){var H0s=new Array()P.append(tokens,H0s,0,pos)var opToken=tokens[pos+1]var H0=new Object()H0.type="exp"H0.op=OP_UnariH0.left=opTokenH0.right=tokens[pos+2]H0s[H0s.length]=H0P.append(tokens,H0s,pos+3,tokens.length-1)return H0s}P.ruleCallNoParm=function(tokens,pos,errors){var H0s=new Array()P.append(tokens,H0s,0,pos-1)var nameToken=tokens[pos]var H1=new Object()H1.type='call'H1.callName=nameToken.text.toLowerCase()H1.start=nameToken.startH1.left=nameTokenH1.parms=new Array()H1.op=OP_Callvar callResult=new Object()callResult.type="exp"callResult.op=OP_DoLeftcallResult.left=H1H0s[H0s.length]=callResultP.append(tokens,H0s,pos+3,tokens.length-1)return H0s}P.ruleCallStart=function(tokens,pos,errors){var H0s=new Array()P.append(tokens,H0s,0,pos-1)var nameToken=tokens[pos]var H0=new Object()H0.type='call'H0.callName=nameToken.text.toLowerCase()H0.start=nameToken.startH0.left=nameTokenH0.parms=new Array()H0.op=OP_CallH0s[H0s.length]=H0P.append(tokens,H0s,pos+2,tokens.length-1)return H0s}P.ruleCallParm=function(tokens,pos,errors){var H0s=new Array()P.append(tokens,H0s,0,pos)var H1=tokens[pos]H1.parms[H1.parms.length]=tokens[pos+1]P.append(tokens,H0s,pos+3,tokens.length-1)return H0s}P.ruleCallLast=function(tokens,pos,errors){var H0s=new Array()P.append(tokens,H0s,0,pos-1)var H1=tokens[pos]H1.parms[H1.parms.length]=tokens[pos+1]var callResult=new Object()callResult.type="exp"callResult.op=OP_DoLeftcallResult.left=H1H0s[H0s.length]=callResultP.append(tokens,H0s,pos+3,tokens.length-1)return H0s}P.H3=function(func,parms,errors,minParms,maxParms,H4){var ok=trueif(parms.length<minParms){ok=falseP.H9(errors,'value',"Function ["+func.callName+"] requires "+(maxParms>minParms||maxParms<0?"at least ":"")+minParms+(minParms==1?" parameter":" parameters"),func.start,func.callName.length)}if(ok&&maxParms>-1&&parms.length>maxParms){ok=falseP.H9(errors,'value',"Too many parameters for function ["+func.callName+"].",func.start,func.callName.length)}if(ok){for(var i=0;ok&&i<parms.length;i++){var et=H4.charAt(Math.min(H4.length-1,i))var parm=parms[i]if(et=='N'){if(parm.valueType=='null'){parm.value=0parm.valueType='number'}if(parm.valueType!='number'&&parm.valueType!='boolean'){ok=falseP.H9(errors,'value',"Parameter ["+parm.value+"] is invalid for function "+func.callName+". Expecting a numeric value",func.start,func.callName.length)parm.value=0parm.valueType='number'}}elseif(et=='T'){if(parm.valueType=='null'){parm.value=''parm.valueType='text'}elseif(parm.valueType=='number'){parm.value=''+parm.valueparm.valueType='text'}elseif(parm.valueType=='boolean'){parm.value=parm.value?'true':'false'parm.valueType='text'}}elseif(et=='B'){if(parm.valueType=='null'){parm.value=0parm.valueType='boolean'}elseif(parm.valueType=='number'){parm.value=parm.value==0?0:1parm.valueType='boolean'}elseif(parm.valueType=='text'){ok=falseP.H9(errors,'value',"Parameter ["+parm.value+"] is invalid for function "+func.callName+". Expecting a boolean value (true or false)",func.start,func.callName.length)parm.valueType='boolean'parm.value=0}}elseif(et=='R'){if(parm.type!="range"){ok=falseP.H9(errors,'value',"Parameter number "+(i+1)+" is invalid for function "+func.callName+". Expecting a range (e.g. a1:b3)",func.start,func.callName.length)}}}}return ok}P.processCall=function(root,token,errors){var func=token.callNameif(func=="if"){P.J5(root,token,errors)return}if(func=="countif"||func=="sumif"){P.J6(root,token,errors)return}var H5=token.parmsvar J7=falsefor(var i=0;i<H5.length;i++){var p=H5[i]if(p.type=="range"&&p.dynid!=null){if(H5.length!=1)P.H9(errors,"syntax","The referennce to external sheets is not supported in this context",token.start,func.length)else{var dynid=p.dynidvar indsep=dynid.indexOf('\t')var dynRef=dynid.substring(0,indsep)var dynRange=dynid.substring(indsep+1)dynid=func+"("+dynRef+"!"+dynRange+")"P.getDynVal(dynid,root,token,errors)return}}}var parms=[]for(var i=0;i<H5.length;i++){var p=H5[i]if(p.type=="range"){var cells=P.M.getCells(p.startRow,p.startCol,p.endRow,p.endCol)for(var ic=0;ic<cells.length;ic++){var cell=cells[ic]var cv=H7(cell)if(cv.valueType=='error'){P.H9(errors,'value',"["+P.M.cellId(cell)+"] does not have a valid value.",token.start,func.length)}else{parms[parms.length]={value:cv.value,valueType:cv.valueType}}}J7=true}elseparms[parms.length]=p}token.valueType="null"for(var i=0;i<parms.length;i++){var p=parms[i]if(p.op!=null&&p.op!=0)P.J4(root,p,errors)if(p.valueType=="pending"){token.valueType="pending"}}if(token.valueType=="pending")returnif(errors.length>0){token.value=""return}if(func=='ln')func='log'if(func=='sqrt'||func=='abs'||func=='ceil'||func=='floor'||func=='log'||func=='round'){if(P.H3(token,parms,errors,1,1,'N')){token.value=eval('Math.'+func+'('+parms[0].value+')')token.valueType='number'}}elseif(func=='sin'||func=='cos'||func=='tan'){if(P.H3(token,parms,errors,1,1,'N')){var v=parms[0].valuev=eval('Math.'+func+'('+v+')')token.value=vtoken.valueType='number'}}elseif(func=='asin'||func=='acos'||func=='atan'){if(P.H3(token,parms,errors,1,1,'N')){var v=parms[0].valuev=eval('Math.'+func+'('+v+')')token.value=vtoken.valueType='number'}}elseif(func=='degrees'||func=='radians'){if(P.H3(token,parms,errors,1,1,'N')){var v=parms[0].valueif(func=='degrees')v=v * 180 / Math.PIelsev=v * Math.PI / 180token.value=vtoken.valueType='number'}}elseif(func=='log10'){if(P.H3(token,parms,errors,1,1,'N')){token.value=eval('Math.log('+parms[0].value+')/Math.log(10)')token.valueType='number'}}elseif(func=='hex'){if(P.H3(token,parms,errors,1,1,'N')){token.value=parms[0].valuetoken.pattern='n:hex'token.valueType='number'}}elseif(func=='bin'){if(P.H3(token,parms,errors,1,1,'N')){token.value=parms[0].valuetoken.pattern='n:bin'token.valueType='number'}}elseif(func=='not'){if(P.H3(token,parms,errors,1,1,'B')){token.value=parms[0].value==0?1:0token.valueType='boolean'}}elseif(func=='max'||func=='min'||func=='average'||func=='count'||func=='sum'){var minvar maxvar count=0var sum=0var minParms=1if(J7)minParms=0if(P.H3(token,parms,errors,minParms,-1,'*')){for(var i=0;i<parms.length;i++){var p=parms[i]if(p.valueType=='number'){var v=parms[i].valueif(!min||min>v)min=vif(!max||max<v)max=vcount++sum+=v}}if(count==0)token.value=0else{if(func=='max')token.value=maxelseif(func=='min')token.value=minelseif(func=='count')token.value=countelseif(func=='sum')token.value=sumelseif(func=='average')token.value=sum/count}token.valueType='number'}}elseif(func=='concatenate'||func=='concat'){var c=""var minParms=1

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -