想用c语言 最深 堆栈写个关于逆波兰表达式的小程序 堆栈的弹出函数有问题 求助 经测试就push()工作正常 pop不对

栈。计算表达式带有括号和负号(1)

2694:逆波兰表达式
总时间限制: 1000ms 内存限制: 65536kB
描述逆波兰表达式是一种把运算符前置的算术表达式,例如普通的表达式2 + 3的逆波兰表示法为+ 2 3。逆波兰表达式的优点是运算符之间不必有优先级关系,也不必用括号改变运算次序,例如(2 + 3) * 4的逆波兰表示法为* + 2 3 4。本题求解逆波兰表达式的值,其中运算符包括+ - * /四个。输入输入为一行,其中运算符和运算数之间都用空格分隔,运算数是浮点数。输出输出为一行,表达式的值。
可直接用printf(&%f\n&, v)输出表达式的值v。样例输入
* + 11.0 12.0 + 24.0 35.0
提示可使用atof(str)把字符串转换为一个double类型的浮点数。atof定义在math.h中。
此题可使用函数递归调用的方法求解。
刚开始AC的时候没考虑使用递归,利用栈的先进后出加上判断,即可达到计算目的,可惜第一次提交忘了考虑浮点数为负数的情况,第二次提交忘了讨论(3+1)*(4-2)/(7/-2)这种情况,因为4-2运算后会继续和站里面的3+1的运算结果运算,而后再次将结果入栈,因此我将if循环改成了while循环,Ac。
第二种解法考虑使用递归,此时需要理解,代码简洁。
#include&stdio.h&
#include&stack&
#include&string.h&
#include&math.h&
#include&algorithm&
#include&iostream&
#define N 100
#define M 10010
typedef struct Node{
double f2(double a,double b,char ch)
&&& if(ch=='+')return a+b;
&&& else if(ch=='-')return b-a;
&&& else if(ch=='*')return b*a;
&&& else return& b/a;
int f(char e)
&&& if(e=='+'||e=='-'||e=='*'||e=='/')
&&&&&&& return 1;
&&& return 0;
int main()
&&&&&& char a[M];
&&&&&&& while(gets(a)){
&&&&&&&&&&& stack&node&
&&&&&&& int lenc=strlen(a),i,j;
&&&&&&& for(i=0;i&i++){
&&&&&&&&&&&
&&&&&&&&&&& if(f(a[i])&&a[i+1]==' '){
&&&&&&&&&&&&&&& tt.tag=0;
&&&&&&&&&&&&&&& tt.b=a[i];
&&&&&&&&&&&&&&& q.push(tt);
&&&&&&&&&&& }
&&&&&&&&&&& else if(a[i]==' ')
&&&&&&&&&&&&&&&
&&&&&&&&&&& else{& char b[N];
&&&&&&&&&&&&&&&&&&& int cnt=0;
&&&&&&&&&&&&&&& for(j=i;j&lenc&&a[j]!=' ';j++){
&&&&&&&&&&&&&&&&&&& b[cnt++]=a[j];
&&&&&&&&&&&&&&& }
&&&&&&&&&&& i=j-1;
&&&&&&&&&&& b[cnt]='\0';
&&&&&&&&&&& double rr=atof(b);
&&&&&&&&&&& tt.tag=1;
&&&&&&&&&&& tt.a=
&&&&&&&&&&& q.push(tt);
&&&&&&&&&&& }
&&&&&&&&&&& while(q.size()&=3)
&&&&&&&&&&& {node t1,t2,t3;
&&&&&&&&&&& t1=q.top();
&&&&&&&&&&& q.pop();
&&&&&&&&&&& t2=q.top();
&&&&&&&&&&& q.pop();
&&&&&&&&&&& t3=q.top();
&&&&&&&&&&& q.pop();
&&&&&&&&&&& if(t1.tag==1&&t2.tag==1&&t3.tag==0){
&&&&&&&&&&&&&&& double ttt=f2(t1.a,t2.a,t3.b);
&&&&&&&&&&&&&&& node t4;
&&&&&&&&&&&&&&& t4.tag=1;
&&&&&&&&&&&&&&& t4.a=
&&&&&&&&&&&&&&& q.push(t4);
&&&&&&&&&&& }
&&&&&&&&&&& else{
&&&&&&&&&&&&&&& q.push(t3);
&&&&&&&&&&&&&&& q.push(t2);
&&&&&&&&&&&&&&& q.push(t1);
&&&&&&&&&&&&&&&
&&&&&&&&&&& }
&&&&&&& node t=q.top();
&&&&&&& printf(&%lf\n&,t.a);
#include&stdio.h&
#include&string.h&
#include&math.h&
#include&algorithm&
int f(char a)
&&& if(a&='0'&&a&='9')
&&&&&&& return 1;
&&& return 0;
double exp(){
& char a[10];
scanf(&%s&,a);
if(strlen(a)==1&&!f(a[0])){
& if(a[0]=='+')return
exp()+exp();
& else if(a[0]=='-')return
exp()-exp();
& else if(a[0]=='*')return
exp()*exp();
& else if(a[0]=='/')return
exp()/exp();
&&& return atof(a);
int& main()
&&&& double ans;
&&&& ans=exp();
&&&& printf(&%f\n&,ans);
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:101次
排名:千里之外
原创:14篇4297人阅读
数据结构与算法(14)
本文演示如何利用自定义堆栈(可实现通用性)和逆波兰表达式(后缀表达式)来进行数学四则运算。
阅读须知:了解堆栈定义过程、了解中缀表达式、了解后缀表达式(逆波兰表达式)。不清楚的同学百度一下,用10分钟了解一下即可。
示例程序优点:
1,自己做了一些注释, 尽量将转换原理和计算原理说清一些,如果还有看不明白的同学,只好移步百度谷歌了。
2,自己定义了一个堆栈,可实现数据类型无关性。简称通用性堆栈。参考文章:/kf/64.html
3,基于以上两点,以后大家如需将中缀表达式转换为后缀表达式或者需使用通用性堆栈,可直接使用示例中的源码。
1,代码没做什么优化,对用户输入也没有严格验证。
注:做一个利用堆栈及逆波兰表达式进行数学四则运算的小程序,一方面方便自己以后查看使用。另一方面,也希望抛砖引玉,大家一起来探寻更好的计算方法。
#include &stdio.h&
#include &stdlib.h&
#include &string.h&
#define TRUE 1
#define FALSE 0
#define ERROR -1
#define STACKELEMENT 100 //定义堆栈中可入栈元素个数
#define BUFFERSIZE 100
//定义临时缓冲区大小
typedef int S //定义返回状态
typedef struct
//定义堆栈:堆栈中只定义栈大小和每次入栈元素大小,栈中一律使用空指针进行操作。这样,我们自己定义的栈就做到了和数据类型无关性。真正实现了栈的通用。
void * //指向栈底
//指向栈顶
int stackS //栈的空间总容量大小
int typeS //入栈时,单个元素占用空间大小
Status InitStack(sqStack *s,unsigned stackSize,unsigned typeSize); //初始化栈
Status Push(sqStack *s,void *e); //入栈
Status Pop(sqStack *s,void *e); //出栈
Status ClearStack(sqStack *s); //清空栈内所有元素
Status DestroyStack(sqStack *s); //销毁栈
int GetLen(sqStack *s); //获取已入栈元素个数
Status Calculate(char *arr,void *result); //计算表达式结果:参数一:arr为使用空格分隔的采用后缀表达式表示的要计算的字符串,例:arr={&3 5 + &}。参数二:result存放计算结果。
Status InfixToPostfix(char *infix,char *postfix); //将中缀表达式转换为后缀表达式。例:infix={&3+5\n&} ,转换后,postfix={&3 5 + &};
void my_err(char *str); //自定义错误处理函数
int main(int argc,char *argv[])
printf(&Please input the nifix expression.\n&); //输入中缀表达式。
char src[BUFFERSIZE]={'\0'}; //存放中缀表达式的临时缓冲区
char *infix=
char postfix[BUFFERSIZE]={'\0'}; //存放后缀表达式的临时缓冲区
fgets(infix,BUFFERSIZE,stdin); //从标准输入流中读取要计算的四则运算表达式
printf(&Infix expression:%s&,infix);
InfixToPostfix(infix,postfix); //将中缀转换为后缀表达式
printf(&Postfix expression:%s\n&,postfix);
Calculate(postfix,&result); //计算后缀表达式的结果
printf(&result:%f\n&,result);
将中缀表达式转换为后缀表达式
参数:infix 指向中缀表达式,以回车键即\n结尾。
postfix 指向后缀表达式临时缓冲区,用来存放转换后的结果。
附转换规则:从左到右遍历中缀表达式的每个数字和符号,若是数字则直接保存在postfix数组中;若是符号,则判断其与栈顶符号的优先级,是右括号或者优先级不大于栈顶符号,则栈顶元素依次出栈并输出,直到遇到左括号或者栈空时,才将刚才的那个符号入栈。
Status InfixToPostfix(char *infix,char *postfix)
if(InitStack(&s,STACKELEMENT*sizeof(char),sizeof(char))==ERROR)
my_err(&InfixToPostfix init stack error!&);
int j=0,i=0;
c=*(infix+i); //取出中缀表达式中的第一个字符
while('\n'!=c) //遇到换行符,表示转换结束
while(c&='0'&&c&='9') //先判断一下取出的字符是否是数字,如果是数字的话,则直接存入postfix数组
postfix[j++]=c;
c=*(infix+i);
if(c&'0'||c&'9') //如果不是数字,则在后面添加空格,以便区分各个符号
postfix[j++]=' ';
if(')'==c) //不是数字,则判断是否为右括号。[括号的优先级最高,所以,如果是右括号的话,就得先进行括号里的各种运算]
Pop(&s,(void*)&e);
while('('!=e) //直到遇到左括号为止
postfix[j++]=e;
postfix[j++]=' ';
Pop(&s,(void*)&e);
else if('+'==c||'-'==c) //如果是加减号,因为他俩的优先级最低了,所以此时先将栈里的所有符号出栈后(除非遇到左括号),再把此符号入栈
if(!GetLen(&s)) //如果是空栈,则直接将加减号入栈
Push(&s,(void*)&c);
Pop(&s,(void*)&e);
if('('==e)
Push(&s,(void*)&e);
postfix[j++]=e;
postfix[j++]=' ';
}while(GetLen(&s)&&'('!=e);
//将栈里的所有符号出栈(除非遇到左括号)
Push(&s,(void*)&c); //最后将新来的加减号再入栈
else if('*'==c||'/'==c||'('==c) //如果是乘除号或左括号,因为他们的优先级高,所以直接入栈。
Push(&s,(void*)&c);
else if('\n'==c) //判断一下,所有符号是否都已转换完成
else //能走到这个else的,都是我不认识的符号了
// printf(&\nError:input error,the character %d cann't recognize!\n&,c);
return -1;
c=*(infix+i); //取出下一个字符进行转换
while(GetLen(&s)) //转换完成后,栈里可能还有没出栈的运算符号
Pop(&s,(void*)&e);
postfix[j++]=e;
postfix[j++]=' ';
DestroyStack(&s);
return TRUE;
计算后缀表达式的结果
参数:arr使用空格分隔的后缀表达式字符串。例:arr=&31 5 + &
result 保存计算完毕后的结果
注:如何利用栈来计算后缀表达式的结果:依次取出后缀表达式中的符号进行比较,如果是数字,则直接入栈;如果是符号,则出栈两次,弹出两个要计算的因数,进行计算,之后再将计算结果入栈。知道后缀表达式中所有符号都已比较完毕。
Status Calculate(char *arr,void *result)
// printf(&%s\n&,arr);
double d,e,f; //d,e 存放两个因数。f存放d,e计算后的结果.
char * //存放后缀表达式中的每个因数或运算符
char *buf= //声明bufhe saveptr两个变量,是strtok_r函数的需要。
char *saveptr=NULL;
if(InitStack(&s,STACKELEMENT*sizeof(double),sizeof(double))==ERROR)
my_err(&Calculate init stack error!&);
while((op=strtok_r(buf,& &,&saveptr))!=NULL) //利用strtok_r函数分隔字符串
switch(op[0])
Pop(&s,&d);
Pop(&s,&e);
Push(&s,&f);
Pop(&s,&d);
Pop(&s,&e);
Push(&s,&f);
Pop(&s,&d);
Pop(&s,&e);
Push(&s,&f);
Pop(&s,&d);
Pop(&s,&e);
Push(&s,&f);
d=atof(op); //不是运算符,就肯定是因数了。所以,用atof函数,将字符串转换为double类型
Push(&s,&d);
Pop(&s,result);
DestroyStack(&s);
return TRUE;
参数:stackSize:栈的总容量大小
typeSize:以后要入栈的单个元素的大小
Status InitStack(sqStack *s,unsigned stackSize,unsigned typeSize)
s-&base=malloc(stackSize);
if(!s-&base)
return ERROR;
s-&top=s-&
s-&stackSize=stackS
s-&typeSize=typeS
return TRUE;
Status Push(sqStack *s,void *e)
if((int)s-&top-(int)s-&base+s-&typeSize&s-&stackSize)
return FALSE;
memcpy(s-&top,e,s-&typeSize);
s-&top=(void*)((int)s-&top+s-&typeSize);
return TRUE;
Status Pop(sqStack *s,void *e)
if(s-&top==s-&base)
return FALSE;
s-&top=(void*)((int)s-&top-(int)s-&typeSize);
memcpy(e,s-&top,s-&typeSize);
return TRUE;
Status ClearStack(sqStack *s)
s-&top=s-&
return TRUE;
Status DestroyStack(sqStack *s)
free(s-&base);
s-&top=s-&base=NULL;
s-&stackSize=s-&typeSize=0;
return TRUE;
获取已入栈元素个数
int GetLen(sqStack *s)
return ((int)s-&top-(int)s-&base)/s-&typeS
自定义错误处理函数
void my_err(char *str)
perror(str);
示例运算:
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:640852次
积分:6503
积分:6503
排名:第2522名
原创:85篇
转载:133篇
评论:126条
(7)(1)(4)(2)(1)(2)(3)(1)(2)(3)(14)(12)(8)(16)(1)(1)(2)(3)(6)(11)(9)(9)(11)(2)(2)(3)(4)(13)(12)(4)(6)(7)(6)(5)(1)(1)(1)(2)(4)(3)(13)(2)C语言:逆波兰表达式代码
今天有师妹求助,要实现带有括号、加减乘除、阶乘的表达式计算
一时冲动便给师妹写了一下,C语言代码如下,用了两个栈来实现逆波兰表达式求值:
#include &stdio.h&&
#include &stdlib.h&&
//运算符栈的长度&
#define OPSTACK_LENGTH 5&
//操作数栈的长度&
#define NUMSTACK_LENGTH 100&
//输入串的最大长度&
#define MAX_STRING_LENGTH 100&
//运算符结构体&
struct operatorStruct&
&&& //运算符名称&
&&& //优先级&
&&& //目数,即操作数个数,例如单目运算符为1,双目运算符2&
typedef struct operatorStruct OPERATOR;&
//运算符栈&
OPERATOR opStack[OPSTACK_LENGTH];&
//运算符栈顶指针&
int opStackTop = -1;&
//操作数栈&
double numStack[NUMSTACK_LENGTH];&
//操作数栈顶指针&
int numStackTop = -1;&
//获取一个字符所代表的运算符的优先级&
int getPriority(char name)&
&&& if (name == '(' || name == ')')&
&&&&&&& return 0;&
&&& if (name == '!')&
&&&&&&& return 3;&
&&& if (name == '*' || name == '/')&
&&&&&&& return 2;&
&&& if (name == '+' || name == '-')&
&&&&&&& return 1;&
&&& exit(1);&
//获取一个字符所代表的运算符的目数&
int getOpNum(char name)&
&&& if (name == '*' || name == '/' || name == '+' || name == '-')&
&&&&&&& return 2;&
&&& if (name == '!')&
&&&&&&& return 1;&
&&& if (name == '(' || name == ')')&
&&&&&&& return 0;&
&&& exit(1);&
//运算符压栈&
void pushOperator(OPERATOR op)&
&&& if (opStackTop & OPSTACK_LENGTH - 1)&
&&&&&&& opStack[++opStackTop] =&
&&&&&&& exit(1);&
//运算符出栈&
OPERATOR popOperator()&
&&& if (opStackTop &= 0)&
&&&&&&& return opStack[opStackTop--];&
&&&&&&& exit(1);&
//操作数压栈&
void pushNumber(double num)&
&&& if (numStackTop & NUMSTACK_LENGTH - 1)&
&&&&&&& numStack[++numStackTop] =&
&&&&&&& exit(1);&
//操作数出栈&
double popNumber()&
&&& if (numStackTop &= 0)&
&&&&&&& return numStack[numStackTop--];&
&&&&&&& exit(1);&
//将输入字符串中的以0-9开头、到下一个运算符结束的一段转化为浮点型&
//i加上浮点型对应的字符串的长度&
double getNumFromString(char *s, int *i)&
&&& int j = 0;&
&&& static char numstr[MAX_STRING_LENGTH];&
&&& while ((*s) &= '0' && *s &= '9')&
&&&&&&& numstr[j++] = (*s);&
&&&&&&& s++;&
&&& if ((*s) == '.')&
&&&&&&& numstr[j++] = (*s);&
&&&&&&& s++;&
&&&&&&& while ((*s) &= '0' && *s &= '9')&
&&&&&&& {&
&&&&&&&&&&& numstr[j++] = (*s);&
&&&&&&&&&&& s++;&
&&&&&&& }&
&&& (*i) = (*i) +&
&&& numstr[j] = '\0';&
&&& return atof(numstr);&
//从操作数栈中弹出两个操作数,完成一次双目运算&
double opertate2Num(OPERATOR op)&
&&& double num2 = popNumber();&
&&& double num1 = popNumber();&
&&& if (op.name == '+')&
&&&&&&& return num1 + num2;&
&&& if (op.name == '-')&
&&&&&&& return num1 - num2;&
&&& if (op.name == '*')&
&&&&&&& return num1 * num2;&
&&& if (op.name == '/')&
&&&&&&& return num1 + num2;&
&&& exit(1);&
//从操作数栈中弹出一个操作数,完成一次单目运算&
double opertate1Num(OPERATOR op)&
&&& double num = popNumber();&
&&& if (op.name == '!')&
&&&&&&& double result = 1;&
&&&&&&& while (num & 1)&
&&&&&&& {&
&&&&&&&&&&& result *=&
&&&&&&&&&&& num--;&
&&&&&&& }&
&&& exit(1);&
//完成一次运算
double operate(OPERATOR op)&
&&& if (op.opnum == 1)&
&&&&&&& return opertate1Num(op);&
&&& else if (op.opnum == 2)&
&&&&&&& return opertate2Num(op);&
&&& exit(1);&
int main()&
&&& char string[MAX_STRING_LENGTH];//表达式的输入串&
&&& OPERATOR op, topOp;//op为从当前输入串中提取的一个运算符,topOp为运算符栈栈顶的运算符&
&&& topOp.name = '#';&
&&& topOp.priority = 0;&
&&& topOp.opnum = 0;&
&&& pushOperator(topOp);//压入#作为初始运算符&
&&& scanf(&%s&, string);&
&&& for (i = 0; string[i] != '\0' && string[i] != '=';)&
&&&&&&& //从输入串中取出一个字符作为开始,进行处理,直到表达式结束&
&&&&&&& if (string[i] &= '0' && string[i] &= '9')&
&&&&&&& {&
&&&&&&&&&&& //如果是操作数,将整个操作数提取出来,压入操作数栈&
&&&&&&&&&&& pushNumber(getNumFromString(&string[i], &i));&
&&&&&&& }&
&&&&&&& else&
&&&&&&& {&
&&&&&&&&&&& op.name = string[i];&
&&&&&&&&&&& op.priority = getPriority(string[i]);&
&&&&&&&&&&& op.opnum = getOpNum(string[i]);&
&&&&&&&&&&& topOp = popOperator();&
&&&&&&&&&&& if (op.name == '(')&
&&&&&&&&&&& {&
&&&&&&&&&&&&&&& //如果是'(',将从栈顶弹出的运算符压回栈内,并将当前运算符则压栈&
&&&&&&&&&&&&&&& pushOperator(topOp);&
&&&&&&&&&&&&&&& pushOperator(op);&
&&&&&&&&&&& }&
&&&&&&&&&&& else if (op.name == ')')&
&&&&&&&&&&& {&
&&&&&&&&&&&&&&& //如果是')',则进行运算,每次运算结果作为一个操作数压入操作数栈,直到将'('弹出运算符栈&
&&&&&&&&&&&&&&& while (topOp.name != '(')&
&&&&&&&&&&&&&&& {&
&&&&&&&&&&&&&&&&&&& pushNumber(operate(topOp));&
&&&&&&&&&&&&&&&&&&& topOp = popOperator();&
&&&&&&&&&&&&&&& }&
&&&&&&&&&&& }&
&&&&&&&&&&& else&
&&&&&&&&&&& {&
&&&&&&&&&&&&&&& //如果是普通运算符&
&&&&&&&&&&&&&&& if (topOp.name != '#' && op.priority &= topOp.priority)&
&&&&&&&&&&&&&&& {&
&&&&&&&&&&&&&&&&&&& //如果运算符栈非空,且当前运算符的优先级大于栈顶运算符,则进行一次运算,将结果压入操作数栈&
&&&&&&&&&&&&&&&&&&& pushNumber(operate(topOp));&
&&&&&&&&&&&&&&& }&
&&&&&&&&&&&&&&& else&
&&&&&&&&&&&&&&& {&
&&&&&&&&&&&&&&&&&&& //否则将从栈顶弹出的运算符压回&
&&&&&&&&&&&&&&&&&&& pushOperator(topOp);&
&&&&&&&&&&&&&&& }&
&&&&&&&&&&&&&&& //将当前运算符压栈&
&&&&&&&&&&&&&&& pushOperator(op);&
&&&&&&&&&&& }&
&&&&&&&&&&& i++;&
&&&&&&& }&
&&& //完成栈内剩余的运算&
&&& while ((topOp = popOperator()).name != '#')&
&&&&&&& pushNumber(operate(topOp));&
&&& //操作数栈中剩下的最后一个数即为结果&
&&& printf(&%f\n&, popNumber());&
&&& return 0;&
作者:卞昊穹&
(window.slotbydup=window.slotbydup || []).push({
id: '2467140',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467141',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467143',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467148',
container: s,
size: '1000,90',
display: 'inlay-fix'&*&名称:逆波兰表达式算法
&*&作者:rayrain
&*&描述:逆波兰表达式主要用于一些项目中表达式、函数的求值。
&*&EMAIL:
using&System.C
using&System.Collections.G
using&System.T
namespace&Analyzer
&&&&#region&运算符
&&&&///&&summary&
&&&&///&运算符类型(从上到下优先级依次递减)
&&&&///&&/summary&
&&&&public&enum&OperatorType
&&&&&&&&///&&summary&
&&&&&&&&///&左括号:(,left&bracket
&&&&&&&&///&&/summary&
&&&&&&&&LB&=&10,
&&&&&&&&///&&summary&
&&&&&&&&///&右括号),right&bracket
&&&&&&&&///&&/summary&
&&&&&&&&RB&=&11,
&&&&&&&&///&&summary&
&&&&&&&&///&逻辑非,!,NOT
&&&&&&&&///&&/summary&
&&&&&&&&NOT&=&20,
&&&&&&&&///&&summary&
&&&&&&&&///&正号,+,positive&sign
&&&&&&&&///&&/summary&
&&&&&&&&PS&=&21,
&&&&&&&&///&&summary&
&&&&&&&&///&负号,-,negative&sign
&&&&&&&&///&&/summary&
&&&&&&&&NS&=&22,
&&&&&&&&///&&summary&
&&&&&&&&///&乘,*,multiplication
&&&&&&&&///&&/summary&
&&&&&&&&MUL&=&30,
&&&&&&&&///&&summary&
&&&&&&&&///&除,/,division
&&&&&&&&///&&/summary&
&&&&&&&&DIV&=&31,
&&&&&&&&///&&summary&
&&&&&&&&///&余,%,modulus
&&&&&&&&///&&/summary&
&&&&&&&&MOD&=&32,
&&&&&&&&///&&summary&
&&&&&&&&///&加,+,Addition
&&&&&&&&///&&/summary&
&&&&&&&&ADD&=&40,
&&&&&&&&///&&summary&
&&&&&&&&///&减,-,subtraction
&&&&&&&&///&&/summary&
&&&&&&&&SUB&=&41,
&&&&&&&&///&&summary&
&&&&&&&&///&小于,less&than
&&&&&&&&///&&/summary&
&&&&&&&&LT&=&50,
&&&&&&&&///&&summary&
&&&&&&&&///&小于或等于,less&than&or&equal&to
&&&&&&&&///&&/summary&
&&&&&&&&LE&=&51,
&&&&&&&&///&&summary&
&&&&&&&&///&大于,&,greater&than
&&&&&&&&///&&/summary&
&&&&&&&&GT&=&52,&
&&&&&&&&///&&summary&
&&&&&&&&///&大于或等于,&=,greater&than&or&equal&to
&&&&&&&&///&&/summary&
&&&&&&&&GE&=&53,
&&&&&&&&///&&summary&
&&&&&&&&///&等于,=,equal&to
&&&&&&&&///&&/summary&
&&&&&&&&ET&=&60,
&&&&&&&&///&&summary&
&&&&&&&&///&不等于,unequal&to
&&&&&&&&///&&/summary&
&&&&&&&&UT&=&61,
&&&&&&&&///&&summary&
&&&&&&&&///&逻辑与,&,AND
&&&&&&&&///&&/summary&
&&&&&&&&AND&=&70,
&&&&&&&&///&&summary&
&&&&&&&&///&逻辑或,|,OR
&&&&&&&&///&&/summary&
&&&&&&&&OR&=&71,
&&&&&&&&///&&summary&
&&&&&&&&///&逗号,comma
&&&&&&&&///&&/summary&
&&&&&&&&CA&=&80,
&&&&&&&&///&&summary&
&&&&&&&&///&结束符号
&&&&&&&&///&&/summary&
&&&&&&&&END&=&255,
&&&&&&&&///&&summary&
&&&&&&&&///&错误符号
&&&&&&&&///&&/summary&
&&&&&&&&ERR&=&256
&&&&///&&summary&
&&&&///&运算符
&&&&///&&/summary&
&&&&public&class&Operator
&&&&&&&&private&OperatorType&type&=&OperatorType.END;
&&&&&&&&private&string&value&=&"";
&&&&&&&&public&Operator(OperatorType&type,&string&value)
&&&&&&&&&&&&this.type&=&
&&&&&&&&&&&&this.value&=&
&&&&&&&&///&&summary&
&&&&&&&&///&运算符类型
&&&&&&&&///&&/summary&
&&&&&&&&public&OperatorType&Type
&&&&&&&&&&&&get
&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&return&this.
&&&&&&&&&&&&}
&&&&&&&&&&&&set
&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&this.type&=&
&&&&&&&&&&&&}
&&&&&&&&///&&summary&
&&&&&&&&///&运算符值
&&&&&&&&///&&/summary&
&&&&&&&&public&string&Value
&&&&&&&&&&&&get
&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&return&this.
&&&&&&&&&&&&}
&&&&&&&&&&&&set
&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&this.value&=&
&&&&&&&&&&&&}
&&&&#endregion
&&&&#region&操作数
&&&&///&&summary&
&&&&///&操作数类型
&&&&///&&/summary&
&&&&public&enum&OperandType
&&&&&&&&///&&summary&
&&&&&&&&///&函数
&&&&&&&&///&&/summary&
&&&&&&&&FUNC&=&1,
&&&&&&&&///&&summary&
&&&&&&&&///&日期
&&&&&&&&///&&/summary&
&&&&&&&&DATE&=&2,
&&&&&&&&///&&summary&
&&&&&&&&///&数字
&&&&&&&&///&&/summary&
&&&&&&&&NUMBER&=&3,
&&&&&&&&///&&summary&
&&&&&&&&///&布尔
&&&&&&&&///&&/summary&
&&&&&&&&BOOLEAN&=&4,
&&&&&&&&///&&summary&
&&&&&&&&///&字符串
&&&&&&&&///&&/summary&
&&&&&&&&STRING&=&5
&&&&///&&summary&
&&&&///&操作数
&&&&///&&/summary&
&&&&public&class&Operand
&&&&&&&&private&OperandType&type&=&OperandType.STRING;
&&&&&&&&private&string&key&=&"";
&&&&&&&&private&object&value&=&null;
&&&&&&&&public&Operand(OperandType&type,&object&value)
&&&&&&&&&&&&this.type&=&
&&&&&&&&&&&&this.value&=&
&&&&&&&&///&&summary&
&&&&&&&&///&操作数类型
&&&&&&&&///&&/summary&
&&&&&&&&public&OperandType&Type
&&&&&&&&&&&&get
&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&return&this.
&&&&&&&&&&&&}
&&&&&&&&&&&&set
&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&this.type&=&
&&&&&&&&&&&&}
&&&&&&&&///&&summary&
&&&&&&&&///&关键字
&&&&&&&&///&&/summary&
&&&&&&&&public&string&Key
&&&&&&&&&&&&get
&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&return&this.
&&&&&&&&&&&&}
&&&&&&&&&&&&set
&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&this.key&=&
&&&&&&&&&&&&}
&&&&&&&&///&&summary&
&&&&&&&&///&操作数值
&&&&&&&&///&&/summary&
&&&&&&&&public&object&Value
&&&&&&&&&&&&get
&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&return&this.
&&&&&&&&&&&&}
&&&&&&&&&&&&set
&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&this.value&=&
&&&&&&&&&&&&}
&&///&&summary&
&&&&///&语法分析器
&&&&///&&/summary&
&&&&public&class&AccidenceAnalyzer
&&&&&&&&#region&成员变量
&&&&&&&&private&string&m_Operator&=&"()!*/%+-&&=&|,";&&&&//运算符
&&&&&&&&private&Stack&object&&m_tokens&=&null;&&&&&&&&&&&&//语法单元堆栈
&&&&&&&&private&string&m_Message&=&"";&&&&&&&&&&&&&&&&&&&&&&&&//消息
&&&&&&&&#endregion
&&&&&&&&#region&构造与析构
&&&&&&&&///&&summary&
&&&&&&&&///&
&&&&&&&&///&&/summary&
&&&&&&&&public&AccidenceAnalyzer()
&&&&&&&&&&&&m_tokens&=&new&Stack&object&();
&&&&&&&&#endregion
&&&&&&&&#region&属性
&&&&&&&&///&&summary&
&&&&&&&&///&消息
&&&&&&&&///&&/summary&
&&&&&&&&public&string&Message
&&&&&&&&&&&&get
&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&return&m_M
&&&&&&&&&&&&}
&&&&&&&&///&&summary&
&&&&&&&&///&返回语法单元集合
&&&&&&&&///&&/summary&
&&&&&&&&public&Stack&object&&Tokens
&&&&&&&&&&&&get
&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&return&m_
&&&&&&&&&&&&}
&&&&&&&&///&&summary&
&&&&&&&&///&包含的运算符
&&&&&&&&///&&/summary&
&&&&&&&&public&string&Inclusive
&&&&&&&&&&&&set
&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&char[]&cs&=&value.ToCharArray();
&&&&&&&&&&&&&&&&foreach&(char&c&in&cs)
&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&if&(m_Operator.IndexOf(c)&==&-1)
&&&&&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&&&&&m_Operator&+=&c.ToString();
&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&}
&&&&&&&&///&&summary&
&&&&&&&&///&排除的运算符
&&&&&&&&///&&/summary&
&&&&&&&&public&string&Repulsive
&&&&&&&&&&&&set
&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&char[]&cs&=&value.ToCharArray();
&&&&&&&&&&&&&&&&int&pos&=&0;
&&&&&&&&&&&&&&&&foreach&(char&c&in&cs)
&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&pos&=&m_Operator.IndexOf(c);
&&&&&&&&&&&&&&&&&&&&if&(pos&&&-1)
&&&&&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&&&&&m_Operator&=&m_Operator.Remove(pos,&1);
&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&}
&&&&&&&&#endregion
&&&&&&&&#region&事件
&&&&&&&&///&&summary&
&&&&&&&&///&语法分析事件
&&&&&&&&///&&/summary&
&&&&&&&&///&&param&name="opd"&操作数&/param&
&&&&&&&&///&&returns&&/returns&
&&&&&&&&public&delegate&bool&AccidenceAnalysis(ref&Operand&opd);
&&&&&&&&///&&summary&
&&&&&&&&///&语法分析事件
&&&&&&&&///&&/summary&
&&&&&&&&///&&param&name="opd"&操作数&/param&
&&&&&&&&///&&returns&&/returns&
&&&&&&&&public&event&AccidenceAnalysis&OnAccidenceA
&&&&&&&&///&&summary&
&&&&&&&&///&回调函数
&&&&&&&&///&&/summary&
&&&&&&&&///&&param&name="opd"&操作数&/param&
&&&&&&&&///&&param&name="msg"&错误消息&/param&
&&&&&&&&public&delegate&object&CallBack(string&funcName,&object[]&param,&ref&bool&isOk);
&&&&&&&&///&&summary&
&&&&&&&&///&回调函数
&&&&&&&&///&&/summary&
&&&&&&&&///&&param&name="opd"&操作数&/param&
&&&&&&&&///&&param&name="msg"&错误消息&/param&
&&&&&&&&public&event&CallBack&OnCallB
&#region&方法
&&&&&&&&#region&语法解析
&&&&&&&&///&&summary&
&&&&&&&&///&语法解析,将中缀表达式转换成后缀表达式(即逆波兰表达式)
&&&&&&&&///&&/summary&
&&&&&&&&///&&param&name="exp"&一个中缀表达式,例如:a+b*c&/param&
&&&&&&&&///&&returns&&/returns&
&&&&&&&&public&bool&Parse(string&exp)
&&&&&&&&&&&&/*&&将中缀表达式转换成后缀表达式算法:
&&&&&&&&&&&&&&&&1、从左至右扫描一中缀表达式。
&&&&&&&&&&&&&&&&2、若读取的是操作数,则判断该操作数的类型,并将该操作数存入操作数堆栈
&&&&&&&&&&&&&&&&3、若读取的是运算符
&&&&&&&&&&&&&&&&&&&(1)&该运算符为左括号"(",则直接存入运算符堆栈。
&&&&&&&&&&&&&&&&&&&(2)&该运算符为右括号")",则输出运算符堆栈中的运算符到操作数堆栈,直到遇到左括号为止。
&&&&&&&&&&&&&&&&&&&(3)&该运算符为非括号运算符:
&&&&&&&&&&&&&&&&&&&&&&&(a)&若运算符堆栈栈顶的运算符为括号,则直接存入运算符堆栈。
&&&&&&&&&&&&&&&&&&&&&&&(b)&若比运算符堆栈栈顶的运算符优先级高或相等,则直接存入运算符堆栈。
&&&&&&&&&&&&&&&&&&&&&&&(c)&若比运算符堆栈栈顶的运算符优先级低,则输出栈顶运算符到操作数堆栈,并将当前运算符压入运算符堆栈。
&&&&&&&&&&&&&&&&4、当表达式读取完成后运算符堆栈中尚有运算符时,则依序取出运算符到操作数堆栈,直到运算符堆栈为空。
&&&&&&&&&&&&*/
&&&&&&&&&&&&m_tokens.Clear();//清空语法单元堆栈
&&&&&&&&&&&&if&(exp.Trim()&==&"")//表达式不能为空
&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&return&false;
&&&&&&&&&&&&}
&&&&&&&&&&&&else&if(!this.IsMatching(exp))//括号、引号、单引号等必须配对
&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&return&false;
&&&&&&&&&&&&}
&&&&&&&&&&&&else
&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&Stack&object&&tokens&=&new&Stack&object&();&&&&&&&&&&&&&//语法单元堆栈
&&&&&&&&&&&&&&&&Stack&Operator&&operators&=&new&Stack&Operator&();&&&&&&//运算符堆栈
&&&&&&&&&&&&&&&&OperandType&operandType&=&OperandType.STRING;&&&&&&&&&&&//操作数类型
&&&&&&&&&&&&&&&&OperatorType&operatorType&=&OperatorType.ERR;&&&&&&&&&&&//运算符类型
&&&&&&&&&&&&&&&&string&currentOpd&=&"";&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&//当前操作数
&&&&&&&&&&&&&&&&string&currentOpt&=&"";&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&//当前运算符
&&&&&&&&&&&&&&&&int&currentPos&=&0;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&//当前位置
&&&&&&&&&&&&&&&&int&funcCount&=&0;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&//函数数量
&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&exp&+=&"";//加入结束标记
&&&&&&&&&&&&&&&&while&(exp&!=&"")
&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&currentPos&=&FindOperator(exp);
&&&&&&&&&&&&&&&&&&&&if&(currentPos&==&-1)
&&&&&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&&&&&//无运算符,触发语法分析事件
&&&&&&&&&&&&&&&&&&&&&&&&Operand&opd&=&new&Operand(ConvertOperand(exp),&exp);
&&&&&&&&&&&&&&&&&&&&&&&&if&(this.OnAccidenceAnalysis&==&null)
&&&&&&&&&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&&&&&&&&&tokens.Push(opd);
&&&&&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&&&&&&&&&else
&&&&&&&&&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&&&&&&&&&if&(OnAccidenceAnalysis(ref&opd))
&&&&&&&&&&&&&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&tokens.Push(opd);
&&&&&&&&&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&&&&&&&&&&&&&else
&&&&&&&&&&&&&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&m_Message&=&"解析操作数:"&+&Convert.ToString(opd.Value)&+&"失败";
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&tokens.Clear();
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&return&false;
&&&&&&&&&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&&&&&&&&&break;
&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&&&&&else
&&&&&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&&&&&currentOpd&=&exp.Substring(0,&currentPos);
&&&&&&&&&&&&&&&&&&&&&&&&currentOpt&=&exp.Substring(currentPos,&1);
&&&&&&&&&&&&&&&&&&&&&&&&currentOpd&=&currentOpd.Trim();
&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&&&if&(currentOpt&==&"(")
&&&&&&&&&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&&&&&&&&&//函数数量增加
&&&&&&&&&&&&&&&&&&&&&&&&&&&&if&(currentOpd&!=&"")&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&funcCount++;
&&&&&&&&&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&&&&&&&&&&&&&//将函数名称存入语法单元堆栈
&&&&&&&&&&&&&&&&&&&&&&&&&&&&if&(currentOpd&!=&"")
&&&&&&&&&&&&&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&tokens.Push(new&Operand(ConvertOperand(currentOpd&+&"("),&currentOpd));
&&&&&&&&&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&&&&&&&&&&&&&//若当前运算符为左括号,则直接存入堆栈。
&&&&&&&&&&&&&&&&&&&&&&&&&&&&operators.Push(new&Operator(OperatorType.LB,&"("));
&&&&&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&&&&&&&&&else&if&(currentOpt&==&")")
&&&&&&&&&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&&&&&&&&&//分析并存入运算符到语法单元堆栈
&&&&&&&&&&&&&&&&&&&&&&&&&&&&if&(currentOpd&!=&"")
&&&&&&&&&&&&&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&operandType&=&this.ConvertOperand(currentOpd);
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&if&((operandType&!=&OperandType.STRING)&||&(funcCount&&&0))
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&tokens.Push(new&Operand(ConvertOperand(currentOpd),&currentOpd));
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&else
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&Operand&opd&=&new&Operand(ConvertOperand(currentOpd),&currentOpd);
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&if(this.OnAccidenceAnalysis&==&null)
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&tokens.Push(opd);
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&else
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&if&(OnAccidenceAnalysis(ref&opd))
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&tokens.Push(opd);
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&else
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&m_Message&=&"解析操作数:"&+&Convert.ToString(opd.Value)&+&"失败";
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&tokens.Clear();
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&return&false;
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&&&&&&&&&&&&&//若当前运算符为右括号,则依次弹出运算符堆栈中的运算符并存入到语法单元堆栈,直到遇到左括号为止.
&&&&&&&&&&&&&&&&&&&&&&&&&&&&while&(operators.Count&&&0)
&&&&&&&&&&&&&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&if&(operators.Peek().Type&!=&OperatorType.LB)
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&tokens.Push(operators.Pop());
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&else
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&tokens.Push(operators.Pop());
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&tokens.Push(new&Operator(OperatorType.RB,&")"));
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&break;
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&&&&&&&&&&&&&//函数数量减少
&&&&&&&&&&&&&&&&&&&&&&&&&&&&if&(funcCount&&&0)&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&funcCount--;
&&&&&&&&&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&&&&&&&&&else
&&&&&&&&&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&&&&&&&&&//分析并存入运算符到语法单元堆栈
&&&&&&&&&&&&&&&&&&&&&&&&&&&&if&(currentOpd&!=&"")
&&&&&&&&&&&&&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&operandType&=&this.ConvertOperand(currentOpd);
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&if&((operandType&!=&OperandType.STRING)&||&(funcCount&&&0))
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&tokens.Push(new&Operand(ConvertOperand(currentOpd),&currentOpd));
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&else
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&Operand&opd&=&new&Operand(ConvertOperand(currentOpd),&currentOpd);
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&if&(this.OnAccidenceAnalysis&==&null)
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&tokens.Push(opd);
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&else
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&if&(OnAccidenceAnalysis(ref&opd))
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&tokens.Push(opd);
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&else
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&m_Message&=&"解析操作数:"&+&Convert.ToString(opd.Value)&+&"失败";
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&tokens.Clear();
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&return&false;
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&&&&&&&&&&&&&//调整运算符
&&&&&&&&&&&&&&&&&&&&&&&&&&&&currentOpt&=&this.AdjustOperator(currentOpt,&exp,&currentPos,&out&currentPos);
&&&&&&&&&&&&&&&&&&&&&&&&&&&&operatorType&=&this.ConvertOperator(currentOpt,&this.IsDyadicOperator(ref&tokens,&ref&operators,&currentOpd));
&&&&&&&&&&&&&&&&&&&&&&&&&&&&//分析并存入操作数到操作数堆栈
&&&&&&&&&&&&&&&&&&&&&&&&&&&&if&(operatorType&==&OperatorType.ERR)
&&&&&&&&&&&&&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&m_Message&=&"无效运算符:"&+&currentO
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&tokens.Clear();
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&return&false;
&&&&&&&&&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&&&&&&&&&&&&&else
&&&&&&&&&&&&&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&if&(operators.Count&==&0)
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&//若运算符堆栈为空,则直接存入.
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&operators.Push(new&Operator(operatorType,&currentOpt));
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&else
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&if&(operators.Peek().Type&==&OperatorType.LB)
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&//若运算符堆栈栈顶为左括号,则将当前运算符直接存入运算符堆栈.
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&operators.Push(new&Operator(operatorType,&currentOpt));
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&else
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&if&(OperatorPriority(operatorType,&operators.Peek().Type)&&&0)
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&//若当前运算符比运算符栈顶运算符优先级高,则将当前运算符直接存入运算符堆栈.
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&operators.Push(new&Operator(operatorType,&currentOpt));
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&else
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&//若当前运算符比运算符堆栈栈顶运算符优先级低或相等,则弹出运算符堆栈栈顶运算符并存入到语法单元堆栈,并将当前运算符存入堆栈.
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&tokens.Push(operators.Pop());
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&operators.Push(new&Operator(operatorType,&currentOpt));
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&&&&&&&&&exp&=&exp.Substring(currentPos&+&1).Trim();
&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&//转换完成,若运算符堆栈中尚有运算符时,
&&&&&&&&&&&&&&&&//则依序取出运算符到语法单元堆栈,直到运算符堆栈为空
&&&&&&&&&&&&&&&&while&(operators.Count&&&0)
&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&tokens.Push(operators.Pop());
&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&//调整语法单元中对象的顺序并输出到最终语法单元
&&&&&&&&&&&&&&&&while&(tokens.Count&&&0)
&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&m_tokens.Push(tokens.Pop());
&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&}
&&&&&&&&&&&&return&true;
&&&&&&&&#endregion
&&&&&&&&#region&表达式求值
&&&&&&&&///&&summary&
&&&&&&&&///&对逆波兰表达式求值
&&&&&&&&///&&/summary&
&&&&&&&&///&&param&name="isOk"&是否成功&/param&
&&&&&&&&///&&returns&结果值&/returns&
&&&&&&&&public&object&Evaluate(ref&bool&isOk)
&&&&&&&&&&&&/*
&&&&&&&&&&&&&&逆波兰表达式求值算法:
&&&&&&&&&&&&&&1、循环扫描语法单元的项目。
&&&&&&&&&&&&&&2、如果扫描的项目是操作数,则将其压入操作数堆栈,并扫描下一个项目。
&&&&&&&&&&&&&&3、如果扫描的项目是一个二元运算符,则对栈的顶上两个操作数执行该运算。
&&&&&&&&&&&&&&4、如果扫描的项目是一个一元运算符,则对栈的最顶上操作数执行该运算。
&&&&&&&&&&&&&&5、将运算结果重新压入堆栈。
&&&&&&&&&&&&&&6、重复步骤2-5,堆栈中即为结果值。
&&&&&&&&&&&&*/
&&&&&&&&&&&&
&&&&&&&&&&&&if&(m_tokens.Count&==&0)&return&null;
&&&&&&&&&&&&
&&&&&&&&&&&&isOk&=&false;
&&&&&&&&&&&&object&value&=&null;
&&&&&&&&&&&&bool&existFunc&=&false;
&&&&&&&&&&&&&&&Stack&Operand&&opds&=&new&Stack&Operand&();
&&&&&&&&&&&&&&&Stack&object&&pars&=&new&Stack&object&();
&&&&&&&&&&&&Operand&opd,&opdA,&opdB;
&&&&&&&&&&&&foreach(object&item&in&m_tokens)
&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&if&(item&is&Operand)
&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&//如果为操作数则压入操作数堆栈
&&&&&&&&&&&&&&&&&&&&opds.Push((Operand)item);
&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&else
&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&switch(((Operator)item).Type)
&&&&&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&#region&左括号
&&&&&&&&&&&&&&&&&&&&case&OperatorType.LB:
&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&&&if&(opds.Count&&&0)
&&&&&&&&&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&&&&&&&&&//清除函数参数堆栈
&&&&&&&&&&&&&&&&&&&&&&&&&&&&pars.Clear();
&&&&&&&&&&&&&&&&&&&&&&&&&&&&//检查是否有函数调用
&&&&&&&&&&&&&&&&&&&&&&&&&&&&existFunc&=&false;
&&&&&&&&&&&&&&&&&&&&&&&&&&&&foreach(Operand&opdItem&in&opds)
&&&&&&&&&&&&&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&if(opdItem.Type&==&OperandType.FUNC)
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&existFunc&=&true;
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&break;
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&&&&&&&&&&&&&//将函数参数压入堆栈
&&&&&&&&&&&&&&&&&&&&&&&&&&&&if(existFunc)
&&&&&&&&&&&&&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&while(opds.Count&&&0)
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&opd&=&opds.Peek();
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&if&(opd.Type&!=&OperandType.FUNC)&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&opd&=&opds.Pop();
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&pars.Push(opd.Value);
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&else
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&break;
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&&&&&&&&&break;
&&&&&&&&&&&&&&&&&&&&#endregion
&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&#region&右括号
&&&&&&&&&&&&&&&&&&&&case&OperatorType.RB:
&&&&&&&&&&&&&&&&&&&&&&&&if&(pars.Count&&&0)
&&&&&&&&&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&&&&&&&&&object&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&bool&ok&=&false;
&&&&&&&&&&&&&&&&&&&&&&&&&&&&if&(this.OnCallBack&!=&null)
&&&&&&&&&&&&&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&val&=&OnCallBack(Convert.ToString(opds.Pop().Value),&pars.ToArray(),&ref&ok);
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&if(ok)
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&opds.Push(new&Operand(OperandType.NUMBER,&val));
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&&&&&&&&&&&&&pars.Clear();
&&&&&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&&&&&&&&&break;
&&&&&&&&&&&&&&&&&&&&#endregion
&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&#region&逻辑非,!,NOT
&&&&&&&&&&&&&&&&&&&&case&OperatorType.NOT:
&&&&&&&&&&&&&&&&&&&&&&&&opdA&=&opds.Pop();
&&&&&&&&&&&&&&&&&&&&&&&&if&(IsCanConvertToNumber(opdA.Value))
&&&&&&&&&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&&&&&&&&&opds.Push(new&Operand(OperandType.BOOLEAN,&!ConvertToBoolean(opdA.Value)));
&&&&&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&&&&&&&&&else
&&&&&&&&&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&&&&&&&&&break;
&&&&&&&&&&&&&&&&&&&&#endregion
&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&#region&正号,+,positive&sign
&&&&&&&&&&&&&&&&&&&&case&OperatorType.PS:
&&&&&&&&&&&&&&&&&&&&&&&&opdA&=&opds.Pop();
&&&&&&&&&&&&&&&&&&&&&&&&if&(IsNumber(opdA.Value))
&&&&&&&&&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&opds.Push(new&Operand(OperandType.NUMBER,&+ConvertToNumber(opdA.Value)));
&&&&&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&&&&&&&&&else
&&&&&&&&&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&&&&&&&&&break;
&&&&&&&&&&&&&&&&&&&&#endregion
&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&#region&负号,-,negative&sign
&&&&&&&&&&&&&&&&&&&&case&OperatorType.NS:
&&&&&&&&&&&&&&&&&&&&&&&&opdA&=&opds.Pop();
&&&&&&&&&&&&&&&&&&&&&&&&if&(IsNumber(opdA.Value))
&&&&&&&&&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&&&&&&&&&opds.Push(new&Operand(OperandType.NUMBER,&-ConvertToNumber(opdA.Value)));
&&&&&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&&&&&&&&&else
&&&&&&&&&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&&&&&&&&&break;
&&&&&&&&&&&&&&&&&&&&#endregion
&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&#region&乘,*,multiplication
&&&&&&&&&&&&&&&&&&&&case&OperatorType.MUL:
&&&&&&&&&&&&&&&&&&&&&&&&opdA&=&opds.Pop();
&&&&&&&&&&&&&&&&&&&&&&&&opdB&=&opds.Pop();
&&&&&&&&&&&&&&&&&&&&&&&&if&(IsNumber(opdA.Value)&&&&IsNumber(opdB.Value))
&&&&&&&&&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&&&&&&&&&opds.Push(new&Operand(OperandType.NUMBER,&ConvertToNumber(opdB.Value)&*&ConvertToNumber(opdA.Value)));
&&&&&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&&&&&&&&&else
&&&&&&&&&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&&&&&&&&&break;
&&&&&&&&&&&&&&&&&&&&#endregion
&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&#region&除,/,division
&&&&&&&&&&&&&&&&&&&&case&OperatorType.DIV:
&&&&&&&&&&&&&&&&&&&&&&&&opdA&=&opds.Pop();
&&&&&&&&&&&&&&&&&&&&&&&&opdB&=&opds.Pop();
&&&&&&&&&&&&&&&&&&&&&&&&if&(IsNumber(opdA.Value)&&&&IsNumber(opdB.Value))
&&&&&&&&&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&&&&&&&&&opds.Push(new&Operand(OperandType.NUMBER,&ConvertToNumber(opdB.Value)&/&ConvertToNumber(opdA.Value)));
&&&&&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&&&&&&&&&else
&&&&&&&&&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&&&&&&&&&break;
&&&&&&&&&&&&&&&&&&&&#endregion
&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&#region&余,%,modulus
&&&&&&&&&&&&&&&&&&&&case&OperatorType.MOD:
&&&&&&&&&&&&&&&&&&&&&&&&opdA&=&opds.Pop();
&&&&&&&&&&&&&&&&&&&&&&&&opdB&=&opds.Pop();
&&&&&&&&&&&&&&&&&&&&&&&&if&(IsNumber(opdA.Value)&&&&IsNumber(opdB.Value))
&&&&&&&&&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&&&&&&&&&opds.Push(new&Operand(OperandType.NUMBER,&ConvertToNumber(opdB.Value)&%&ConvertToNumber(opdA.Value)));
&&&&&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&&&&&&&&&else
&&&&&&&&&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&&&&&&&&&break;
&&&&&&&&&&&&&&&&&&&&#endregion
&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&#region&加,+,Addition
&&&&&&&&&&&&&&&&&&&&case&OperatorType.ADD:
&&&&&&&&&&&&&&&&&&&&&&&&opdA&=&opds.Pop();
&&&&&&&&&&&&&&&&&&&&&&&&opdB&=&opds.Pop();
&&&&&&&&&&&&&&&&&&&&&&&&if&(IsNumber(opdA.Value)&&&&IsNumber(opdB.Value))
&&&&&&&&&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&&&&&&&&&opds.Push(new&Operand(OperandType.NUMBER,&ConvertToNumber(opdB.Value)&+&ConvertToNumber(opdA.Value)));
&&&&&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&&&&&&&&&else
&&&&&&&&&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&&&&&&&&&break;
&&&&&&&&&&&&&&&&&&&&#endregion
&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&#region&减,-,subtraction
&&&&&&&&&&&&&&&&&&&&case&OperatorType.SUB:
&&&&&&&&&&&&&&&&&&&&&&&&opdA&=&opds.Pop();
&&&&&&&&&&&&&&&&&&&&&&&&opdB&=&opds.Pop();
&&&&&&&&&&&&&&&&&&&&&&&&if&(IsNumber(opdA.Value)&&&&IsNumber(opdB.Value))
&&&&&&&&&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&&&&&&&&&opds.Push(new&Operand(OperandType.NUMBER,&ConvertToNumber(opdB.Value)&-&ConvertToNumber(opdA.Value)));
&&&&&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&&&&&&&&&else
&&&&&&&&&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&&&&&&&&&break;
&&&&&&&&&&&&&&&&&&&&#endregion
&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&#region&小于,less&than
&&&&&&&&&&&&&&&&&&&&case&OperatorType.LT:
&&&&&&&&&&&&&&&&&&&&&&&&opdA&=&opds.Pop();
&&&&&&&&&&&&&&&&&&&&&&&&opdB&=&opds.Pop();
&&&&&&&&&&&&&&&&&&&&&&&&if&(IsCanConvertToNumber(opdA.Value)&&&&IsCanConvertToNumber(opdB.Value))
&&&&&&&&&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&&&&&&&&&opds.Push(new&Operand(OperandType.NUMBER,&ConvertToNumber(opdB.Value)&&&ConvertToNumber(opdA.Value)));
&&&&&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&&&&&&&&&else
&&&&&&&&&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&&&&&&&&&break;
&&&&&&&&&&&&&&&&&&&&#endregion
&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&#region&小于或等于,less&than&or&equal&to
&&&&&&&&&&&&&&&&&&&&case&OperatorType.LE:
&&&&&&&&&&&&&&&&&&&&&&&&opdA&=&opds.Pop();
&&&&&&&&&&&&&&&&&&&&&&&&opdB&=&opds.Pop();
&&&&&&&&&&&&&&&&&&&&&&&&if&(IsCanConvertToNumber(opdA.Value)&&&&IsCanConvertToNumber(opdB.Value))
&&&&&&&&&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&&&&&&&&&opds.Push(new&Operand(OperandType.NUMBER,&ConvertToNumber(opdB.Value)&&=&ConvertToNumber(opdA.Value)));
&&&&&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&&&&&&&&&else
&&&&&&&&&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&&&&&&&&&break;
&&&&&&&&&&&&&&&&&&&&#endregion
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&#region&大于,&,greater&than
&&&&&&&&&&&&&&&&&&&&case&OperatorType.GT:
&&&&&&&&&&&&&&&&&&&&&&&&opdA&=&opds.Pop();
&&&&&&&&&&&&&&&&&&&&&&&&opdB&=&opds.Pop();
&&&&&&&&&&&&&&&&&&&&&&&&if&(IsCanConvertToNumber(opdA.Value)&&&&IsCanConvertToNumber(opdB.Value))
&&&&&&&&&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&&&&&&&&&opds.Push(new&Operand(OperandType.NUMBER,&ConvertToNumber(opdB.Value)&&&ConvertToNumber(opdA.Value)));
&&&&&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&&&&&&&&&else
&&&&&&&&&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&&&&&&&&&break;
&&&&&&&&&&&&&&&&&&&&#endregion
&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&#region&大于或等于,&=,greater&than&or&equal&to
&&&&&&&&&&&&&&&&&&&&case&OperatorType.GE:
&&&&&&&&&&&&&&&&&&&&&&&&opdA&=&opds.Pop();
&&&&&&&&&&&&&&&&&&&&&&&&opdB&=&opds.Pop();
&&&&&&&&&&&&&&&&&&&&&&&&if&(IsCanConvertToNumber(opdA.Value)&&&&IsCanConvertToNumber(opdB.Value))
&&&&&&&&&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&&&&&&&&&opds.Push(new&Operand(OperandType.NUMBER,&ConvertToNumber(opdB.Value)&&=&ConvertToNumber(opdA.Value)));
&&&&&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&&&&&&&&&else
&&&&&&&&&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&&&&&&&&&break;
&&&&&&&&&&&&&&&&&&&&#endregion
&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&#region&等于,=,equal&to
&&&&&&&&&&&&&&&&&&&&case&OperatorType.ET:
&&&&&&&&&&&&&&&&&&&&&&&&opdA&=&opds.Pop();
&&&&&&&&&&&&&&&&&&&&&&&&opdB&=&opds.Pop();
&&&&&&&&&&&&&&&&&&&&&&&&if&(IsCanConvertToNumber(opdA.Value)&&&&IsCanConvertToNumber(opdB.Value))
&&&&&&&&&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&&&&&&&&&opds.Push(new&Operand(OperandType.NUMBER,&ConvertToNumber(opdB.Value)&==&ConvertToNumber(opdA.Value)));
&&&&&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&&&&&&&&&else
&&&&&&&&&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&&&&&&&&&break;
&&&&&&&&&&&&&&&&&&&&#endregion
&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&#region&不等于,unequal&to
&&&&&&&&&&&&&&&&&&&&case&OperatorType.UT:
&&&&&&&&&&&&&&&&&&&&&&&&opdA&=&opds.Pop();
&&&&&&&&&&&&&&&&&&&&&&&&opdB&=&opds.Pop();
&&&&&&&&&&&&&&&&&&&&&&&&if&(IsCanConvertToNumber(opdA.Value)&&&&IsCanConvertToNumber(opdB.Value))
&&&&&&&&&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&&&&&&&&&opds.Push(new&Operand(OperandType.NUMBER,&ConvertToNumber(opdB.Value)&!=&ConvertToNumber(opdA.Value)));
&&&&&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&&&&&&&&&else
&&&&&&&&&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&&&&&&&&&break;
&&&&&&&&&&&&&&&&&&&&#endregion
&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&#region&逻辑与,&,AND
&&&&&&&&&&&&&&&&&&&&case&OperatorType.AND:
&&&&&&&&&&&&&&&&&&&&&&&&opdA&=&opds.Pop();
&&&&&&&&&&&&&&&&&&&&&&&&opdB&=&opds.Pop();
&&&&&&&&&&&&&&&&&&&&&&&&if&(IsCanConvertToNumber(opdA.Value)&&&&IsCanConvertToNumber(opdB.Value))
&&&&&&&&&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&&&&&&&&&opds.Push(new&Operand(OperandType.NUMBER,&ConvertToBoolean(opdB.Value)&&&&ConvertToBoolean(opdA.Value)));
&&&&&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&&&&&&&&&else
&&&&&&&&&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&&&&&&&&&break;
&&&&&&&&&&&&&&&&&&&&#endregion
&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&#region&逻辑或,|,OR
&&&&&&&&&&&&&&&&&&&&case&OperatorType.OR:
&&&&&&&&&&&&&&&&&&&&&&&&opdA&=&opds.Pop();
&&&&&&&&&&&&&&&&&&&&&&&&opdB&=&opds.Pop();
&&&&&&&&&&&&&&&&&&&&&&&&if&(IsCanConvertToNumber(opdA.Value)&&&&IsCanConvertToNumber(opdB.Value))
&&&&&&&&&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&&&&&&&&&opds.Push(new&Operand(OperandType.NUMBER,&ConvertToBoolean(opdB.Value)&||&ConvertToBoolean(opdA.Value)));
&&&&&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&&&&&&&&&else
&&&&&&&&&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&&&&&&&&&break;
&&&&&&&&&&&&&&&&&&&&#endregion
&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&#region&逗号,comma
&&&&&&&&&&&&&&&&&&&&case&OperatorType.CA:
&&&&&&&&&&&&&&&&&&&&&&&&opdA&=&opds.Pop();
&&&&&&&&&&&&&&&&&&&&&&&&opdB&=&opds.Pop();
&&&&&&&&&&&&&&&&&&&&&&&&opds.Push(new&Operand(opdB.Type,&opdB.Value));
&&&&&&&&&&&&&&&&&&&&&&&&opds.Push(new&Operand(opdA.Type,&opdA.Value));
&&&&&&&&&&&&&&&&&&&&&&&&break;
&&&&&&&&&&&&&&&&&&&&#endregion
&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&#region&结束符号&
&&&&&&&&&&&&&&&&&&&&case&OperatorType.END:
&&&&&&&&&&&&&&&&&&&&&&&&break;
&&&&&&&&&&&&&&&&&&&&#endregion
&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&#region&错误符号
&&&&&&&&&&&&&&&&&&&&case&OperatorType.ERR:
&&&&&&&&&&&&&&&&&&&&&&&&break;
&&&&&&&&&&&&&&&&&&&&#endregion
&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&}&
&&&&&&&&&&&&if&(opds.Count&&&0)
&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&if&(opds.Count&==&1)
&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&isOk&=&true;
&&&&&&&&&&&&&&&&&&&&value&=&opds.Pop().V
&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&}
&&&&&&&&&&&&return&
&&&&&&&&#endregion
&&&&&&&&#endregion
&&&&&&&&#region&Private
&&&&&&&&///&&summary&
&&&&&&&&///&从表达式中查找运算符位置
&&&&&&&&///&&/summary&
&&&&&&&&///&&param&name="exp"&表达式&/param&
&&&&&&&&///&&returns&返回运算符位置&/returns&
&&&&&&&&private&int&FindOperator(string&exp)
&&&&&&&&&&&&return&FindOperator(exp,&"");
&&&&&&&&///&&summary&
&&&&&&&&///&从表达式中查找运算符位置
&&&&&&&&///&&/summary&
&&&&&&&&///&&param&name="exp"&表达式&/param&
&&&&&&&&///&&param&name="findOpt"&要查找的运算符&/param&
&&&&&&&&///&&returns&返回运算符位置&/returns&
&&&&&&&&private&int&FindOperator(string&exp,&string&findOpt)
&&&&&&&&&&&&string&opt&=&"";
&&&&&&&&&&&&string&chr&=&"";
&&&&&&&&&&&&for&(int&i&=&0;&i&&&exp.L&i++)
&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&chr&=&exp.Substring(i,&1);
&&&&&&&&&&&&&&&&if&(&"\"'#".Contains(chr))//忽略双引号、单引号、井号中的运算符
&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&if&(opt.Contains(chr))
&&&&&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&&&&&opt&=&opt.Remove(opt.IndexOf(chr),&1);
&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&&&&&else
&&&&&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&&&&&opt&+=&
&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&if&(opt&==&"")
&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&if&(findOpt&!=&"")
&&&&&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&&&&&if&(findOpt&==&chr)&
&&&&&&&&&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&&&&&&&&&return&i;
&&&&&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&&&&&else
&&&&&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&&&&&if&(m_Operator.IndexOf(chr)&&&-1)
&&&&&&&&&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&&&&&&&&&return&i;
&&&&&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&}
&&&&&&&&&&&&return&-1;
&&&&&&&&///&&summary&
&&&&&&&&///&检查表达式中特殊符号是否匹配
&&&&&&&&///&&/summary&
&&&&&&&&///&&returns&匹配返回真&/returns&
&&&&&&&&private&bool&IsMatching(string&exp)
&&&&&&&&&&&&string&opt&=&"";
&&&&&&&&&&&&string&chr&=&"";
&&&&&&&&&&&&for&(int&i&=&0;&i&&&exp.L&i++)
&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&chr&=&exp.Substring(i,&1);
&&&&&&&&&&&&&&&&if&(&"\"'#".Contains(chr))//忽略双引号、单引号、井号中的运算符
&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&if&(opt.Contains(chr))
&&&&&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&&&&&opt&=&opt.Remove(opt.IndexOf(chr),&1);
&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&&&&&else
&&&&&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&&&&&opt&+=&
&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&else&if&("()".Contains(chr))//左右括号要成对匹配
&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&if&(chr&==&"(")
&&&&&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&&&&&opt&+=&
&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&&&&&else&if&(chr&==&")")
&&&&&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&&&&&if&(opt.Contains("("))
&&&&&&&&&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&&&&&&&&&opt&=&opt.Remove(opt.IndexOf("("),&1);
&&&&&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&}
&&&&&&&&&&&&return&(opt&==&"");
&&&&&&&&///&&summary&
&&&&&&&&///&转换操作数到指定的类型
&&&&&&&&///&&/summary&
&&&&&&&&///&&param&name="opd"&操作数&/param&
&&&&&&&&///&&returns&返回制定的操作数类型&/returns&
&&&&&&&&private&OperandType&ConvertOperand(string&opd)
&&&&&&&&&&&&if&(opd.IndexOf("(")&&&-1)
&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&return&OperandType.FUNC;
&&&&&&&&&&&&}
&&&&&&&&&&&&else&if&(this.IsNumber(opd))
&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&return&OperandType.NUMBER;
&&&&&&&&&&&&}
&&&&&&&&&&&&else&if&(this.IsDate(opd))
&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&return&OperandType.DATE;
&&&&&&&&&&&&}
&&&&&&&&&&&&else
&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&return&OperandType.STRING;
&&&&&&&&&&&&}
&&&&&&&&///&&summary&
&&&&&&&&///&转换运算符到指定的类型
&&&&&&&&///&&/summary&
&&&&&&&&///&&param&name="opt"&运算符&/param&
&&&&&&&&///&&param&name="isDyadicOperator"&是否为二元运算符&/param&
&&&&&&&&///&&returns&返回制定的运算符类型&/returns&
&&&&&&&&private&OperatorType&ConvertOperator(string&opt,&bool&isDyadicOperator)
&&&&&&&&&&&&switch&(opt)
&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&case&"!":&return&OperatorType.NOT;
&&&&&&&&&&&&&&&&case&"+":&return&isDyadicOperator&?&OperatorType.ADD&:&OperatorType.PS;
&&&&&&&&&&&&&&&&case&"-":&return&isDyadicOperator&?&OperatorType.SUB&:&OperatorType.NS;
&&&&&&&&&&&&&&&&case&"*":&return&isDyadicOperator&?&OperatorType.MUL&:&OperatorType.ERR;
&&&&&&&&&&&&&&&&case&"/":&return&isDyadicOperator&?&OperatorType.DIV&:&OperatorType.ERR;
&&&&&&&&&&&&&&&&case&"%":&return&isDyadicOperator&?&OperatorType.MOD&:&OperatorType.ERR;
&&&&&&&&&&&&&&&&case&"&":&return&isDyadicOperator&?&OperatorType.LT&:&OperatorType.ERR;
&&&&&&&&&&&&&&&&case&"&":&return&isDyadicOperator&?&OperatorType.GT&:&OperatorType.ERR;
&&&&&&&&&&&&&&&&case&"&=":&return&isDyadicOperator&?&OperatorType.LE&:&OperatorType.ERR;
&&&&&&&&&&&&&&&&case&"&=":&return&isDyadicOperator&?&OperatorType.GE&:&OperatorType.ERR;
&&&&&&&&&&&&&&&&case&"&&":&return&isDyadicOperator&?&OperatorType.UT&:&OperatorType.ERR;
&&&&&&&&&&&&&&&&case&"=":&return&isDyadicOperator&?&OperatorType.ET&:&OperatorType.ERR;
&&&&&&&&&&&&&&&&case&"&":&return&isDyadicOperator&?&OperatorType.AND&:&OperatorType.ERR;
&&&&&&&&&&&&&&&&case&"|":&return&isDyadicOperator&?&OperatorType.OR&:&OperatorType.ERR;
&&&&&&&&&&&&&&&&case&",":&return&isDyadicOperator&?&OperatorType.CA&:&OperatorType.ERR;
&&&&&&&&&&&&&&&&case&"":&return&isDyadicOperator&?&OperatorType.END&:&OperatorType.ERR;
&&&&&&&&&&&&&&&&default:&return&OperatorType.ERR;
&&&&&&&&&&&&}
&&&&&&&&///&&summary&
&&&&&&&&///&运算符是否为二元运算符
&&&&&&&&///&&/summary&
&&&&&&&&///&&param&name="tokens"&语法单元堆栈&/param&
&&&&&&&&///&&param&name="operators"&运算符堆栈&/param&
&&&&&&&&///&&param&name="currentOpd"&当前操作数&/param&
&&&&&&&&///&&returns&是返回真,否返回假&/returns&
&&&&&&&&private&bool&IsDyadicOperator(ref&Stack&object&&tokens,&ref&Stack&Operator&&operators,&string&currentOpd)
&&&&&&&&&&&&if&(currentOpd&!=&"")
&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&return&true;
&&&&&&&&&&&&}
&&&&&&&&&&&&else
&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&object&token&=&tokens.Peek();
&&&&&&&&&&&&&&&&if&(token&is&Operand)
&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&if&(operators.Peek().Type&!=&OperatorType.LB)
&&&&&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&&&&&return&true;
&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&&&&&else
&&&&&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&&&&&return&false;
&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&else
&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&if&(((Operator)token).Type&==&OperatorType.RB)
&&&&&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&&&&&return&true;
&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&&&&&else
&&&&&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&&&&&return&false;
&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&}
&&&&&&&&///&&summary&
&&&&&&&&///&调整运算符
&&&&&&&&///&&/summary&
&&&&&&&&///&&param&name="currentOpt"&当前运算符&/param&
&&&&&&&&///&&param&name="currentExp"&当前表达式&/param&
&&&&&&&&///&&param&name="currentOptPos"&当前运算符位置&/param&
&&&&&&&&///&&param&name="adjustOptPos"&调整后运算符位置&/param&
&&&&&&&&///&&returns&返回调整后的运算符&/returns&
&&&&&&&&private&string&AdjustOperator(string&currentOpt,&string&currentExp,&int&currentOptPos,out&int&adjustOptPos)
&&&&&&&&&&&&switch&(currentOpt)
&&&&&&&&&&&&{
&&&&&&&&&&&&case&"&":
&&&&&&&&&&&&&&&&if&(currentExp.Substring(currentOptPos,&2)&==&"&=")
&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&adjustOptPos&=&currentOptPos&+&1;
&&&&&&&&&&&&&&&&&&&&return&"&=";
&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&else&if&(currentExp.Substring(currentOptPos,&2)&==&"&&")
&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&adjustOptPos&=&currentOptPos&+&1;
&&&&&&&&&&&&&&&&&&&&return&"&&";
&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&else
&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&adjustOptPos&=&currentOptP
&&&&&&&&&&&&&&&&&&&&return&"&";
&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&case&"&":
&&&&&&&&&&&&&&&&if&(currentExp.Substring(currentOptPos,&2)&==&"&=")
&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&adjustOptPos&=&currentOptPos&+&1;
&&&&&&&&&&&&&&&&&&&&return&"&=";
&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&else
&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&adjustOptPos&=&currentOptP
&&&&&&&&&&&&&&&&&&&&return&"&";
&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&default:
&&&&&&&&&&&&&&&&adjustOptPos&=&currentOptP
&&&&&&&&&&&&&&&&return&currentO
&&&&&&&&&&&&}
&&&&&&&&///&&summary&
&&&&&&&&///&运算符优先级比较
&&&&&&&&///&&/summary&
&&&&&&&&///&&param&name="optA"&运算符类型A&/param&
&&&&&&&&///&&param&name="optB"&运算符类型B&/param&
&&&&&&&&///&&returns&-1,低;0,相等;1,高&/returns&
&&&&&&&&private&int&OperatorPriority(OperatorType&optA,&OperatorType&optB)
&&&&&&&&&&&&if&(optA&==&optB)
&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&//A、B优先级相等
&&&&&&&&&&&&&&&&return&0;
&&&&&&&&&&&&}
&&&&&&&&&&&&else&if&(optA&&&optB)
&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&//A优先级高于B
&&&&&&&&&&&&&&&&return&1;
&&&&&&&&&&&&}
&&&&&&&&&&&&else
&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&//乘,除,余(*,/,%)
&&&&&&&&&&&&&&&&if&((optA&&=&OperatorType.MUL&&&&optA&&=&OperatorType.MOD)&&&
&&&&&&&&&&&&&&&&&&&&(optB&&=&OperatorType.MUL&&&&optB&&=&OperatorType.MOD))
&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&return&0;
&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&//加,减(+,-)
&&&&&&&&&&&&&&&&if&((optA&&=&OperatorType.ADD&&&&optA&&=&OperatorType.SUB)&&&
&&&&&&&&&&&&&&&&&&&&(optB&&=&OperatorType.ADD&&&&optB&&=&OperatorType.SUB))
&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&return&0;
&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&//小于,小于或等于,大于,大于或等于(&,&=,&,&=)
&&&&&&&&&&&&&&&&if&((optA&&=&OperatorType.LT&&&&optA&&=&OperatorType.GE)&&&
&&&&&&&&&&&&&&&&&&&&(optB&&=&OperatorType.LT&&&&optB&&=&OperatorType.GE))
&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&return&0;
&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&//等于,不等于(=,&&)
&&&&&&&&&&&&&&&&if&((optA&&=&OperatorType.ET&&&&optA&&=&OperatorType.UT)&&&
&&&&&&&&&&&&&&&&&&&&(optB&&=&OperatorType.ET&&&&optB&&=&OperatorType.UT))
&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&return&0;
&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&//A优先级低于B
&&&&&&&&&&&&&&&&return&-1;
&&&&&&&&&&&&}
&&&&&&&&///&&summary&
&&&&&&&&///&判断对象是否为数字
&&&&&&&&///&&/summary&
&&&&&&&&///&&param&name="value"&对象值&/param&
&&&&&&&&///&&returns&是返回真,否返回假&/returns&
&&&&&&&&private&bool&IsNumber(object&value)
&&&&&&&&&&&&decimal&
&&&&&&&&&&&&return&decimal.TryParse(Convert.ToString(value),&out&dec);
&&&&&&&&///&&summary&
&&&&&&&&///&判断对象是否为日期
&&&&&&&&///&&/summary&
&&&&&&&&///&&param&name="value"&对象值&/param&
&&&&&&&&///&&returns&是返回真,否返回假&/returns&
&&&&&&&&private&bool&IsDate(object&value)
&&&&&&&&&&&&DateTime&
&&&&&&&&&&&&return&DateTime.TryParse(Convert.ToString(value),&out&dt);
&&&&&&&&///&&summary&
&&&&&&&&///&判断对象是否为布尔型
&&&&&&&&///&&/summary&
&&&&&&&&///&&param&name="value"&对象值&/param&
&&&&&&&&///&&returns&是返回真,否返回假&/returns&
&&&&&&&&private&bool&IsBoolean(object&value)
&&&&&&&&&&&&bool&b&=&false;
&&&&&&&&&&&&return&Boolean.TryParse(Convert.ToString(value),&out&b);
&&&&&&&&///&&summary&
&&&&&&&&///&判断对象是否可转换成数字
&&&&&&&&///&&/summary&
&&&&&&&&///&&param&name="value"&&/param&
&&&&&&&&///&&returns&&/returns&
&&&&&&&&private&bool&IsCanConvertToNumber(object&value)
&&&&&&&&&&&&return&(IsNumber(value)&||&IsBoolean(value));
&&&&&&&&///&&summary&
&&&&&&&&///&将对象转换成数字
&&&&&&&&///&&/summary&
&&&&&&&&///&&param&name="value"&&/param&
&&&&&&&&///&&returns&&/returns&
&&&&&&&&private&decimal&ConvertToNumber(object&value)
&&&&&&&&&&&&return&Convert.ToDecimal(value);
&&&&&&&&///&&summary&
&&&&&&&&///&将对象转换成布尔型
&&&&&&&&///&&/summary&
&&&&&&&&///&&param&name="value"&&/param&
&&&&&&&&///&&returns&&/returns&
&&&&&&&&private&bool&ConvertToBoolean(object&value)
&&&&&&&&&&&&return&Convert.ToBoolean(value);
&&&&&&&&#endregion
using&System.Collections.G
using&System.T
namespace&Analyzer
&&&&class&Program
&&&&&&&&static&void&Main(string[]&args)
&&&&&&&&&&&&bool&ok&=&false;
&&&&&&&&&&&&AccidenceAnalyzer&aa&=&new&AccidenceAnalyzer();
&&&&&&&&&&&&aa.OnAccidenceAnalysis&+=&new&AccidenceAnalyzer.AccidenceAnalysis(aa_OnAccidenceAnalysis);
&&&&&&&&&&&&aa.OnCallBack+=&new&AccidenceAnalyzer.CallBack(aa_OnCallBack);
&&&&&&&&&&&&aa.Parse("m*(a*(-10)&+&(b&-&10))&/&3");
&&&&&&&&&&&&//aa.Parse("f1(f2(a),b)&+&10");
&&&&&&&&&&&&
&&&&&&&&&&&&//aa.Parse("10&-&3&+&3");
&&&&&&&&&&&&//aa.Parse("18/2*3");
&&&&&&&&&&&&object&d&=&aa.Evaluate(ref&ok);
&&&&&&&&&&&&System.Console.WriteLine(d);
&&&&&&&&&&&&System.Console.Read();
&&&&&&&&static&object&aa_OnCallBack(string&funcName,&object[]&param,&ref&bool&isOk)
&&&&&&&&&&&&isOk&=&true;
&&&&&&&&&&&&return&2;
&&&&&&&&static&bool&aa_OnAccidenceAnalysis(ref&Operand&opd)
&&&&&&&&&&&&//throw&new&Exception("The&method&or&operation&is&not&implemented.");
&&&&&&&&&&&&//opd.Id&=&10;
&&&&&&&&&&&&//opd.Key&=&"kk";
&&&&&&&&&&&&opd.Type&=&OperandType.NUMBER;
&&&&&&&&&&&&opd.Value&=&2;
&&&&&&&&&&&&return&true;}

我要回帖

更多关于 c语言 最深 堆栈 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信