You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

1411 lines
48 KiB
C#

1 year ago
using System;
using System.Collections.Generic;
using System.Text;
namespace Mesnac.Basic
{
class Analyzer
{
}
/// <summary>
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(<28><><EFBFBD>ϵ<EFBFBD><CFB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȼ<EFBFBD><C8BC><EFBFBD><EFBFBD>εݼ<CEB5>)
/// </summary>
public enum OperatorType
{
/// <summary>
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:(,left bracket
/// </summary>
LB = 10,
/// <summary>
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>),right bracket
/// </summary>
RB = 11,
/// <summary>
/// <20>߼<EFBFBD><DFBC><EFBFBD>,!,NOT
/// </summary>
NOT = 20,
/// <summary>
/// <20><><EFBFBD><EFBFBD>,+,positive sign
/// </summary>
PS = 21,
/// <summary>
/// <20><><EFBFBD><EFBFBD>,-,negative sign
/// </summary>
NS = 22,
/// <summary>
/// <20><>,*,multiplication
/// </summary>
MUL = 30,
/// <summary>
/// <20><>,/,division
/// </summary>
DIV = 31,
/// <summary>
/// <20><>,%,modulus
/// </summary>
MOD = 32,
/// <summary>
/// <20><>,+,Addition
/// </summary>
ADD = 40,
/// <summary>
/// <20><>,-,subtraction
/// </summary>
SUB = 41,
/// <summary>
/// С<><D0A1>,less than
/// </summary>
LT = 50,
/// <summary>
/// С<>ڻ<EFBFBD><DABB><EFBFBD><EFBFBD><EFBFBD>,less than or equal to
/// </summary>
LE = 51,
/// <summary>
/// <20><><EFBFBD><EFBFBD>,>,greater than
/// </summary>
GT = 52,
/// <summary>
/// <20><><EFBFBD>ڻ<EFBFBD><DABB><EFBFBD><EFBFBD><EFBFBD>,>=,greater than or equal to
/// </summary>
GE = 53,
/// <summary>
/// <20><><EFBFBD><EFBFBD>,=,equal to
/// </summary>
ET = 60,
/// <summary>
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,unequal to
/// </summary>
UT = 61,
/// <summary>
/// <20>߼<EFBFBD><DFBC><EFBFBD>,&,AND
/// </summary>
AND = 70,
/// <summary>
/// <20>߼<EFBFBD><DFBC><EFBFBD>,|,OR
/// </summary>
OR = 71,
/// <summary>
/// <20><><EFBFBD><EFBFBD>,comma
/// </summary>
CA = 80,
/// <summary>
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
/// </summary>
END = 255,
/// <summary>
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
/// </summary>
ERR = 256
}
/// <summary>
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
/// </summary>
public class Operator
{
private OperatorType type = OperatorType.END;
private string value = "";
public Operator(OperatorType type, string value)
{
this.type = type;
this.value = value;
}
/// <summary>
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
/// </summary>
public OperatorType Type
{
get
{
return this.type;
}
set
{
this.type = value;
}
}
/// <summary>
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
/// </summary>
public string Value
{
get
{
return this.value;
}
set
{
this.value = value;
}
}
}
/// <summary>
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
/// </summary>
public enum OperandType
{
/// <summary>
/// <20><><EFBFBD><EFBFBD>
/// </summary>
FUNC = 1,
/// <summary>
/// <20><><EFBFBD><EFBFBD>
/// </summary>
DATE = 2,
/// <summary>
/// <20><><EFBFBD><EFBFBD>
/// </summary>
NUMBER = 3,
/// <summary>
/// <20><><EFBFBD><EFBFBD>
/// </summary>
BOOLEAN = 4,
/// <summary>
/// <20>ַ<EFBFBD><D6B7><EFBFBD>
/// </summary>
STRING = 5
}
/// <summary>
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
/// </summary>
public class Operand
{
private OperandType type = OperandType.STRING;
private string key = "";
private object value = null;
public Operand(OperandType type, object value)
{
this.type = type;
this.value = value;
}
/// <summary>
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
/// </summary>
public OperandType Type
{
get
{
return this.type;
}
set
{
this.type = value;
}
}
/// <summary>
/// <20>ؼ<EFBFBD><D8BC><EFBFBD>
/// </summary>
public string Key
{
get
{
return this.key;
}
set
{
this.key = value;
}
}
/// <summary>
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
/// </summary>
public object Value
{
get
{
return this.value;
}
set
{
this.value = value;
}
}
}
/// <summary>
/// <20><EFBFBD><EFB7A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
/// </summary>
public class AccidenceAnalyzer
{
private string m_Operator = "()!*/%+-<>=&|,"; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
private Stack<object> m_tokens = null; //<2F><EFBFBD><EFB7A8>Ԫ<EFBFBD><D4AA>ջ
private string m_Message = ""; //<2F><>Ϣ
/// <summary>
///
/// </summary>
public AccidenceAnalyzer()
{
m_tokens = new Stack<object>();
}
/// <summary>
/// <20><>Ϣ
/// </summary>
public string Message
{
get
{
return m_Message;
}
}
/// <summary>
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFB7A8>Ԫ<EFBFBD><D4AA><EFBFBD><EFBFBD>
/// </summary>
public Stack<object> Tokens
{
get
{
return m_tokens;
}
}
/// <summary>
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
/// </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>
/// <20>ų<EFBFBD><C5B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
/// </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);
}
}
}
}
/// <summary>
/// <20><EFBFBD><EFB7A8><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD>
/// </summary>
/// <param name="opd"><3E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD></param>
/// <returns></returns>
public delegate bool AccidenceAnalysis(ref Operand opd);
/// <summary>
/// <20><EFBFBD><EFB7A8><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD>
/// </summary>
/// <param name="opd"><3E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD></param>
/// <returns></returns>
public event AccidenceAnalysis OnAccidenceAnalysis;
/// <summary>
/// <20>ص<EFBFBD><D8B5><EFBFBD><EFBFBD><EFBFBD>
/// </summary>
/// <param name="opd"><3E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD></param>
/// <param name="msg"><3E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ</param>
public delegate object CallBack(string funcName, object[] param, ref bool isOk);
/// <summary>
/// <20>ص<EFBFBD><D8B5><EFBFBD><EFBFBD><EFBFBD>
/// </summary>
/// <param name="opd"><3E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD></param>
/// <param name="msg"><3E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ</param>
public event CallBack OnCallBack;
/// <summary>
/// <20><EFBFBD><EFB7A8><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD>׺<EFBFBD><D7BA><EFBFBD><EFBFBD>ʽת<CABD><D7AA><EFBFBD>ɺ<EFBFBD>׺<EFBFBD><D7BA><EFBFBD><EFBFBD>ʽ(<28><><EFBFBD><EFBFBD><E6B2A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʽ)
/// </summary>
/// <param name="exp">һ<><D2BB><EFBFBD><EFBFBD>׺<EFBFBD><D7BA><EFBFBD><EFBFBD>ʽ<EFBFBD><CABD><EFBFBD><EFBFBD><EFBFBD>磺a+b*c</param>
/// <returns></returns>
public bool Parse(string exp)
{
/* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>׺<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʽת<EFBFBD><EFBFBD><EFBFBD>ɺ<EFBFBD>׺<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʽ<EFBFBD><EFBFBD><EFBFBD>
1<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɨ<EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD>׺<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʽ<EFBFBD><EFBFBD>
2<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD><EFBFBD>Dz<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>жϸò<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ò<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ջ
3<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
(1) <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>"("<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֱ<EFBFBD>Ӵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ջ<EFBFBD><EFBFBD>
(2) <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>")"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ջ<EFBFBD>е<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ջ<EFBFBD><EFBFBD>ֱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊֹ<EFBFBD><EFBFBD>
(3) <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
(a) <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ջջ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><EFBFBD><EFBFBD>ţ<EFBFBD><EFBFBD><EFBFBD>ֱ<EFBFBD>Ӵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ջ<EFBFBD><EFBFBD>
(b) <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ջջ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȼ<EFBFBD><EFBFBD>߻<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȣ<EFBFBD><EFBFBD><EFBFBD>ֱ<EFBFBD>Ӵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ջ<EFBFBD><EFBFBD>
(c) <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ջջ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȼ<EFBFBD><EFBFBD>ͣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ջ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ջ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ջ<EFBFBD><EFBFBD>
4<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʽ<EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD><EFBFBD>ɺ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ջ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ջ<EFBFBD><EFBFBD>ֱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ջΪ<EFBFBD>ա<EFBFBD>
*/
m_tokens.Clear();//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFB7A8>Ԫ<EFBFBD><D4AA>ջ
if (exp.Trim() == "")//<2F><><EFBFBD><EFBFBD>ʽ<EFBFBD><CABD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA>
{
return false;
}
else if (!this.IsMatching(exp))//<2F><><EFBFBD>š<EFBFBD><C5A1><EFBFBD><EFBFBD>š<EFBFBD><C5A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ŵȱ<C5B5><C8B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
return false;
}
else
{
Stack<object> tokens = new Stack<object>(); //<2F><EFBFBD><EFB7A8>Ԫ<EFBFBD><D4AA>ջ
Stack<Operator> operators = new Stack<Operator>(); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ջ
OperandType operandType = OperandType.STRING; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
OperatorType operatorType = OperatorType.ERR; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
string currentOpd = ""; //<2F><>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
string currentOpt = ""; //<2F><>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
int currentPos = 0; //<2F><>ǰλ<C7B0><CEBB>
int funcCount = 0; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
exp += "";//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
while (exp != "")
{
currentPos = FindOperator(exp);
if (currentPos == -1)
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFB7A8><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD>
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 = "<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:" + Convert.ToString(opd.Value) + <><CAA7>";
tokens.Clear();
return false;
}
}
break;
}
else
{
bool isNS = false;
currentOpd = exp.Substring(0, currentPos);
if ((currentPos == 0) && (currentOpt != ")") & (exp.Substring(currentPos, 1) == "-"))
{
isNS = true;
}
currentOpt = exp.Substring(currentPos, 1);
currentOpd = currentOpd.Trim();
if (currentOpt == "(")
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if (currentOpd != "")
{
funcCount++;
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƴ<EFBFBD><C6B4><EFBFBD><EFBFBD><EFBFBD><EFB7A8>Ԫ<EFBFBD><D4AA>ջ
if (currentOpd != "")
{
tokens.Push(new Operand(ConvertOperand(currentOpd + "("), currentOpd));
}
//<2F><><EFBFBD><EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C><>ֱ<EFBFBD>Ӵ<EFBFBD><D3B4><EFBFBD><EFBFBD><EFBFBD>ջ<EFBFBD><D5BB>
operators.Push(new Operator(OperatorType.LB, "("));
}
else if (currentOpt == ")")
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFB7A8>Ԫ<EFBFBD><D4AA>ջ
if (currentOpd != "")
{
operandType = this.ConvertOperand(currentOpd);
if ((operandType != OperandType.STRING) || (funcCount > 0))
{
//lizheng add
if (operandType == OperandType.STRING)
{
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 = "<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:" + Convert.ToString(opd.Value) + <><CAA7>";
tokens.Clear();
return false;
}
}
}
//
else
{
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 = "<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:" + Convert.ToString(opd.Value) + <><CAA7>";
tokens.Clear();
return false;
}
}
}
}
//<2F><><EFBFBD><EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD>ε<EFBFBD><CEB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ջ<EFBFBD>е<EFBFBD><D0B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFB7A8>Ԫ<EFBFBD><D4AA>ջ,ֱ<><D6B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊֹ.
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;
}
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if (funcCount > 0)
{
funcCount--;
}
}
else
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFB7A8>Ԫ<EFBFBD><D4AA>ջ
if (currentOpd != "")
{
operandType = this.ConvertOperand(currentOpd);
if ((operandType != OperandType.STRING) || (funcCount > 0))
{
//lizheng add
if (operandType == OperandType.STRING)
{
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 = "<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:" + Convert.ToString(opd.Value) + <><CAA7>";
tokens.Clear();
return false;
}
}
}
//
else
{
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 = "<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:" + Convert.ToString(opd.Value) + <><CAA7>";
tokens.Clear();
return false;
}
}
}
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
currentOpt = this.AdjustOperator(currentOpt, exp, currentPos, out currentPos);
if (isNS)
{
operatorType = this.ConvertOperator(currentOpt, false);
}
else
{
operatorType = this.ConvertOperator(currentOpt, this.IsDyadicOperator(ref tokens, ref operators, currentOpd));
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ջ
if (operatorType == OperatorType.ERR)
{
m_Message = "<22><>Ч<EFBFBD><D0A7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:" + currentOpt;
tokens.Clear();
return false;
}
else
{
if (operators.Count == 0)
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ջΪ<D5BB><CEAA>,<2C><>ֱ<EFBFBD>Ӵ<EFBFBD><D3B4><EFBFBD>.
operators.Push(new Operator(operatorType, currentOpt));
}
else
{
if (operators.Peek().Type == OperatorType.LB)
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ջջ<D5BB><D5BB>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C>򽫵<EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֱ<EFBFBD>Ӵ<EFBFBD><D3B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ջ.
operators.Push(new Operator(operatorType, currentOpt));
}
else
{
if (OperatorPriority(operatorType, operators.Peek().Type) > 0)
{
//<2F><><EFBFBD><EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ջ<EFBFBD><D5BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȼ<EFBFBD><C8BC><EFBFBD>,<2C>򽫵<EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֱ<EFBFBD>Ӵ<EFBFBD><D3B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ջ.
operators.Push(new Operator(operatorType, currentOpt));
}
else
{
//<2F><><EFBFBD><EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ջջ<D5BB><D5BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȼ<EFBFBD><C8BC>ͻ<EFBFBD><CDBB><EFBFBD><EFBFBD><EFBFBD>,<2C>򵯳<EFBFBD><F2B5AFB3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ջջ<D5BB><D5BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFB7A8>Ԫ<EFBFBD><D4AA>ջ,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ջ.
tokens.Push(operators.Pop());
operators.Push(new Operator(operatorType, currentOpt));
}
}
}
}
}
exp = exp.Substring(currentPos + 1).Trim();
}
}
//ת<><D7AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ջ<EFBFBD><D5BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ,
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFB7A8>Ԫ<EFBFBD><D4AA>ջ,ֱ<><D6B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ջΪ<D5BB><CEAA>
while (operators.Count > 0)
{
tokens.Push(operators.Pop());
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFB7A8>Ԫ<EFBFBD>ж<EFBFBD><D0B6><EFBFBD><EFBFBD><EFBFBD>˳<EFBFBD><CBB3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFB7A8>Ԫ
while (tokens.Count > 0)
{
m_tokens.Push(tokens.Pop());
}
}
return true;
}
/// <summary>
/// <20><><EFBFBD><EFBFBD><E6B2A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʽ<EFBFBD><CABD>ֵ
/// </summary>
/// <param name="isOk"><3E>Ƿ<EFBFBD><C7B7>ɹ<EFBFBD></param>
/// <returns><3E><><EFBFBD><EFBFBD>ֵ</returns>
public object Evaluate(ref bool isOk)
{
/*
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʽ<EFBFBD><EFBFBD>ֵ<EFBFBD><EFBFBD><EFBFBD>
1<EFBFBD><EFBFBD>ѭ<EFBFBD><EFBFBD>ɨ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ԫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ<EFBFBD><EFBFBD>
2<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɨ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ<EFBFBD>Dz<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ջ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɨ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ<EFBFBD><EFBFBD>
3<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɨ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ<EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ԫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ջ<EFBFBD>Ķ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD>и<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
4<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɨ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ<EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD>һԪ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ջ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϲ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD>и<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
5<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ջ<EFBFBD><EFBFBD>
6<EFBFBD><EFBFBD><EFBFBD>ظ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>2-5<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ջ<EFBFBD>м<EFBFBD>Ϊ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><EFBFBD>
*/
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)
{
//<2F><><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѹ<EFBFBD><D1B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ջ
opds.Push((Operand)item);
}
else
{
switch (((Operator)item).Type)
{
#region <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
case OperatorType.LB:
if (opds.Count > 0)
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ջ
pars.Clear();
//<2F><><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7>к<EFBFBD><D0BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
existFunc = false;
foreach (Operand opdItem in opds)
{
if (opdItem.Type == OperandType.FUNC)
{
existFunc = true;
break;
}
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѹ<EFBFBD><D1B9><EFBFBD><EFBFBD>ջ
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 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
case OperatorType.RB:
if (pars.Count > 0)
{
object val;
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 <20>߼<EFBFBD><DFBC><EFBFBD>,!,NOT
case OperatorType.NOT:
opdA = opds.Pop();
if (IsCanConvertToNumber(opdA.Value))
{
opds.Push(new Operand(OperandType.BOOLEAN, !ConvertToBoolean(opdA.Value)));
}
else
{
}
break;
#endregion
#region <20><><EFBFBD><EFBFBD>,+,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 <20><><EFBFBD><EFBFBD>,-,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 <20><>,*,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 <20><>,/,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 <20><>,%,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 <20><>,+,Addition
case OperatorType.ADD:
opdA = opds.Pop();
opdB = opds.Pop();
if (IsNumber(opdA.Value) && IsNumber(opdB.Value))//<2F><><EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD><DAB2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱֱ<CAB1><D6B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E3A3AC><EFBFBD><EFBFBD><EFBFBD>б<EFBFBD><D0B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>else<73><65><EFBFBD><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD>д<EFBFBD><D0B4><EFBFBD><EFBFBD>أ<EFBFBD><D8A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
opds.Push(new Operand(OperandType.NUMBER, ConvertToNumber(opdB.Value) + ConvertToNumber(opdA.Value)));
}
else
{
}
break;
#endregion
#region <20><>,-,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 С<><D0A1>,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 С<>ڻ<EFBFBD><DABB><EFBFBD><EFBFBD><EFBFBD>,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 <20><><EFBFBD><EFBFBD>,>,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 <20><><EFBFBD>ڻ<EFBFBD><DABB><EFBFBD><EFBFBD><EFBFBD>,>=,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 <20><><EFBFBD><EFBFBD>,=,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 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,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 <20>߼<EFBFBD><DFBC><EFBFBD>,&,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 <20>߼<EFBFBD><DFBC><EFBFBD>,|,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 <20><><EFBFBD><EFBFBD>,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 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
case OperatorType.END:
break;
#endregion
#region <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
case OperatorType.ERR:
break;
#endregion
}
}
}
if (opds.Count > 0)
{
if (opds.Count == 1)
{
isOk = true;
value = opds.Pop().Value;
}
}
return value;
}
/// <summary>
/// <20>ӱ<EFBFBD><D3B1><EFBFBD>ʽ<EFBFBD>в<EFBFBD><D0B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><CEBB>
/// </summary>
/// <param name="exp"><3E><><EFBFBD><EFBFBD>ʽ</param>
/// <returns><3E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><CEBB></returns>
private int FindOperator(string exp)
{
return FindOperator(exp, "");
}
/// <summary>
/// <20>ӱ<EFBFBD><D3B1><EFBFBD>ʽ<EFBFBD>в<EFBFBD><D0B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><CEBB>
/// </summary>
/// <param name="exp"><3E><><EFBFBD><EFBFBD>ʽ</param>
/// <param name="findOpt">Ҫ<><D2AA><EFBFBD>ҵ<EFBFBD><D2B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD></param>
/// <returns><3E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><CEBB></returns>
private int FindOperator(string exp, string findOpt)
{
string opt = "";
string chr = "";
for (int i = 0; i < exp.Length; i++)
{
chr = exp.Substring(i, 1);
if ("\"'#".Contains(chr))//<2F><><EFBFBD><EFBFBD>˫<EFBFBD><CBAB><EFBFBD>š<EFBFBD><C5A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>š<EFBFBD><C5A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD><D0B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
if (opt.Contains(chr))
{
opt = opt.Remove(opt.IndexOf(chr), 1);
}
else
{
opt += chr;
}
}
if (opt == "")
{
if (findOpt != "")
{
if (findOpt == chr)
{
return i;
}
}
else
{
if (m_Operator.IndexOf(chr) > -1)
{
return i;
}
}
}
}
return -1;
}
/// <summary>
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʽ<EFBFBD><CABD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD>ƥ<EFBFBD><C6A5>
/// </summary>
/// <returns>ƥ<><EFBFBD><E4B7B5><EFBFBD><EFBFBD></returns>
private bool IsMatching(string exp)
{
string opt = "";
string chr = "";
for (int i = 0; i < exp.Length; i++)
{
chr = exp.Substring(i, 1);
if ("\"'#".Contains(chr))//<2F><><EFBFBD><EFBFBD>˫<EFBFBD><CBAB><EFBFBD>š<EFBFBD><C5A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>š<EFBFBD><C5A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD><D0B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
if (opt.Contains(chr))
{
opt = opt.Remove(opt.IndexOf(chr), 1);
}
else
{
opt += chr;
}
}
else if ("()".Contains(chr))//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD>ɶ<EFBFBD>ƥ<EFBFBD><C6A5>
{
if (chr == "(")
{
opt += chr;
}
else if (chr == ")")
{
if (opt.Contains("("))
{
opt = opt.Remove(opt.IndexOf("("), 1);
}
}
}
}
return (opt == "");
}
/// <summary>
/// ת<><D7AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
/// </summary>
/// <param name="opd"><3E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD></param>
/// <returns><3E><><EFBFBD><EFBFBD><EFBFBD>ƶ<EFBFBD><C6B6>IJ<EFBFBD><C4B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD></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>
/// ת<><D7AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
/// </summary>
/// <param name="opt"><3E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD></param>
/// <param name="isDyadicOperator"><3E>Ƿ<EFBFBD>Ϊ<EFBFBD><CEAA>Ԫ<EFBFBD><D4AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD></param>
/// <returns><3E><><EFBFBD><EFBFBD><EFBFBD>ƶ<EFBFBD><C6B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD></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>
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD>Ϊ<EFBFBD><CEAA>Ԫ<EFBFBD><D4AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
/// </summary>
/// <param name="tokens"><3E><EFBFBD><EFB7A8>Ԫ<EFBFBD><D4AA>ջ</param>
/// <param name="operators"><3E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ջ</param>
/// <param name="currentOpd"><3E><>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD></param>
/// <returns><3E>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>,<2C>񷵻ؼ<F1B7B5BB></returns>
private bool IsDyadicOperator(ref Stack<object> tokens, ref Stack<Operator> operators, string currentOpd)
{
if (currentOpd != "")
{
return true;
}
else
{
if (tokens.Count == 0)
{
return false;
}
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>
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
/// </summary>
/// <param name="currentOpt"><3E><>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD></param>
/// <param name="currentExp"><3E><>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD>ʽ</param>
/// <param name="currentOptPos"><3E><>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><CEBB></param>
/// <param name="adjustOptPos"><3E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><CEBB></param>
/// <returns><3E><><EFBFBD>ص<EFBFBD><D8B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD></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 = currentOptPos;
return "<";
}
case ">":
if (currentExp.Substring(currentOptPos, 2) == ">=")
{
adjustOptPos = currentOptPos + 1;
return ">=";
}
else
{
adjustOptPos = currentOptPos;
return ">";
}
default:
adjustOptPos = currentOptPos;
return currentOpt;
}
}
/// <summary>
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȼ<EFBFBD><C8BC>Ƚ<EFBFBD>
/// </summary>
/// <param name="optA"><3E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>A</param>
/// <param name="optB"><3E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>B</param>
/// <returns>-1<><31><EFBFBD>ͣ<EFBFBD>0,<2C><><EFBFBD>ȣ<EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD></returns>
private int OperatorPriority(OperatorType optA, OperatorType optB)
{
if (optA == optB)
{
//A<><41>B<EFBFBD><42><EFBFBD>ȼ<EFBFBD><C8BC><EFBFBD><EFBFBD><EFBFBD>
return 0;
}
else if (optA > optB)
{
//A<><41><EFBFBD>ȼ<EFBFBD><C8BC><EFBFBD><EFBFBD><EFBFBD>B
return -1;
}
else
{
//<2F><>,<2C><>,<2C><>(*,/,%)
if ((optA >= OperatorType.MUL && optA <= OperatorType.MOD) &&
(optB >= OperatorType.MUL && optB <= OperatorType.MOD))
{
return 0;
}
//<2F><>,<2C><>(+,-)
if ((optA >= OperatorType.ADD && optA <= OperatorType.SUB) &&
(optB >= OperatorType.ADD && optB <= OperatorType.SUB))
{
return 0;
}
//С<><D0A1>,С<>ڻ<EFBFBD><DABB><EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD>,<2C><><EFBFBD>ڻ<EFBFBD><DABB><EFBFBD><EFBFBD><EFBFBD>(<,<=,>,>=)
if ((optA >= OperatorType.LT && optA <= OperatorType.GE) &&
(optB >= OperatorType.LT && optB <= OperatorType.GE))
{
return 0;
}
//<2F><><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(=,<>)
if ((optA >= OperatorType.ET && optA <= OperatorType.UT) &&
(optB >= OperatorType.ET && optB <= OperatorType.UT))
{
return 0;
}
//A<><41><EFBFBD>ȼ<EFBFBD><C8BC><EFBFBD><EFBFBD><EFBFBD>B
return 1;
}
}
/// <summary>
/// <20>ж϶<D0B6><CFB6><EFBFBD><EFBFBD>Ƿ<EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>
/// </summary>
/// <param name="value"><3E><><EFBFBD><EFBFBD>ֵ</param>
/// <returns><3E>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>,<2C>񷵻ؼ<F1B7B5BB></returns>
private bool IsNumber(object value)
{
decimal dec;
return decimal.TryParse(Convert.ToString(value), out dec);
}
/// <summary>
/// <20>ж϶<D0B6><CFB6><EFBFBD><EFBFBD>Ƿ<EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>
/// </summary>
/// <param name="value"><3E><><EFBFBD><EFBFBD>ֵ</param>
/// <returns><3E>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>,<2C>񷵻ؼ<F1B7B5BB></returns>
private bool IsDate(object value)
{
DateTime dt;
return DateTime.TryParse(Convert.ToString(value), out dt);
}
/// <summary>
/// <20>ж϶<D0B6><CFB6><EFBFBD><EFBFBD>Ƿ<EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
/// </summary>
/// <param name="value"><3E><><EFBFBD><EFBFBD>ֵ</param>
/// <returns><3E>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>,<2C>񷵻ؼ<F1B7B5BB></returns>
private bool IsBoolean(object value)
{
bool b = false;
return Boolean.TryParse(Convert.ToString(value), out b);
}
/// <summary>
/// <20>ж϶<D0B6><CFB6><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
/// </summary>
/// <param name="value"></param>
/// <returns></returns>
private bool IsCanConvertToNumber(object value)
{
return (IsNumber(value) || IsBoolean(value));
}
/// <summary>
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
/// </summary>
/// <param name="value"></param>
/// <returns></returns>
private decimal ConvertToNumber(object value)
{
return Convert.ToDecimal(value);
}
/// <summary>
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD>ɲ<EFBFBD><C9B2><EFBFBD><EFBFBD><EFBFBD>
/// </summary>
/// <param name="value"></param>
/// <returns></returns>
private bool ConvertToBoolean(object value)
{
if (value is bool)
{
return (bool)value;
}
else
{
if (Convert.ToDecimal(value) != 0)
{
return true;
}
else
{
return false;
}
}
}
}
}