Hi all,
I had some difficulties with the code above. I could mix long comparation with string comparation.
Working Example :
RPNParser parser = new RPNParser();<br />
parser.EvaluateExpression(@"(""aaa""==""bbb"" && 1 == 1) ||(""aa""==""aa"")"
Here is the modified code :
using System;<br />
using System.Collections;<br />
using System.Text;<br />
using System.Text.RegularExpressions;<br />
<br />
namespace cfring.util<br />
{<br />
#region RPN<br />
public class RPNParser<br />
{<br />
public RPNParser()<br />
{<br />
}<br />
public object EvaluateExpression( string szExpr, Type varType, bool bFormula, Hashtable htValues )<br />
{<br />
ArrayList arrExpr = GetPostFixNotation( szExpr, varType, bFormula );<br />
return EvaluateRPN(arrExpr, varType, htValues );<br />
}<br />
<br />
public object EvaluateExpression( string szExpr )<br />
{<br />
long myType = 0;<br />
ArrayList arrExpr = GetPostFixNotation( szExpr, myType.GetType(),false);<br />
return EvaluateRPN(arrExpr, myType.GetType(), null );<br />
}<br />
<br />
#region RPN_Parser<br />
public ArrayList GetPostFixNotation( string szExpr, Type varType, bool bFormula )<br />
{<br />
Stack stkOp = new Stack();<br />
ArrayList arrFinalExpr = new ArrayList();<br />
string szResult = "";<br />
<br />
Tokenizer tknzr = null;<br />
switch(varType.ToString())<br />
{<br />
case "System.Int32":<br />
case "System.Int64":<br />
tknzr = new Tokenizer( szExpr,ExpressionType.ET_ARITHMETIC|<br />
ExpressionType.ET_COMPARISON|<br />
ExpressionType.ET_LOGICAL );<br />
break;<br />
case "System.String":<br />
tknzr = new Tokenizer( szExpr, ExpressionType.ET_COMPARISON);<br />
break;<br />
}<br />
<br />
<br />
<br />
foreach(Token token in tknzr)<br />
{<br />
string szToken = token.Value.Trim();<br />
if( szToken.Length == 0 )<br />
continue;<br />
switch(varType.ToString())<br />
{<br />
case "System.Int32":<br />
case "System.Int64":<br />
if( !OperatorHelper.IsOperator(szToken) )<br />
{<br />
Operand oprnd;<br />
if (szToken.IndexOf("\"") != -1)<br />
{<br />
string myStringType = "";<br />
oprnd = OperandHelper.CreateOperand( szToken, myStringType.GetType() );<br />
}<br />
else oprnd = OperandHelper.CreateOperand( szToken, varType );<br />
oprnd.ExtractAndSetValue( szToken, bFormula );<br />
arrFinalExpr.Add( oprnd );<br />
<br />
szResult += szToken;<br />
continue;<br />
}<br />
break;<br />
case "System.String":<br />
if( !OperatorHelper.IsComparisonOperator(szToken) )<br />
{<br />
Operand oprnd = OperandHelper.CreateOperand( szToken, varType );<br />
oprnd.ExtractAndSetValue( szToken, bFormula );<br />
arrFinalExpr.Add( oprnd );<br />
<br />
szResult += szToken;<br />
continue;<br />
}<br />
<br />
break;<br />
}<br />
<br />
string szOp = szToken;<br />
if( szOp == "(" )<br />
{<br />
stkOp.Push( szOp );<br />
}<br />
else if( szOp == ")" )<br />
{<br />
string szTop;<br />
while( (szTop = (string)stkOp.Pop()) != "(")<br />
{<br />
IOperator oprtr = OperatorHelper.CreateOperator( szTop );<br />
arrFinalExpr.Add( oprtr );<br />
<br />
szResult += szTop;<br />
<br />
if( stkOp.Count == 0 )<br />
throw new RPN_Exception( "Unmatched braces!" );<br />
}<br />
}<br />
else<br />
{<br />
if( stkOp.Count == 0 || (string)stkOp.Peek() == "("<br />
|| OperatorHelper.IsHigherPrecOperator( szOp, (string)stkOp.Peek()) )<br />
{<br />
stkOp.Push( szOp );<br />
}<br />
else<br />
{<br />
while( stkOp.Count != 0 )<br />
{<br />
if( OperatorHelper.IsLowerPrecOperator( szOp, (string)stkOp.Peek())<br />
|| OperatorHelper.IsEqualPrecOperator( szOp, (string)stkOp.Peek()) )<br />
{<br />
string szTop = (string)stkOp.Peek();<br />
if( szTop == "(" )<br />
break;<br />
szTop = (string)stkOp.Pop();<br />
<br />
IOperator oprtr = OperatorHelper.CreateOperator( szTop );<br />
arrFinalExpr.Add( oprtr );<br />
<br />
szResult += szTop;<br />
}<br />
else<br />
break;<br />
}<br />
stkOp.Push( szOp );<br />
}<br />
}<br />
}<br />
while( stkOp.Count != 0 )<br />
{<br />
string szTop = (string)stkOp.Pop();<br />
if( szTop == "(" )<br />
throw new RPN_Exception("Unmatched braces");<br />
<br />
IOperator oprtr = OperatorHelper.CreateOperator( szTop );<br />
arrFinalExpr.Add( oprtr );<br />
<br />
szResult += szTop;<br />
}<br />
return arrFinalExpr;<br />
}<br />
<br />
#endregion<br />
<br />
public string Convert2String( ArrayList arrExpr )<br />
{<br />
string szResult = "";<br />
foreach( object obj in arrExpr )<br />
{<br />
szResult += obj.ToString();<br />
}<br />
return szResult;<br />
}<br />
<br />
<br />
#region RPN_Evaluator<br />
<br />
public object EvaluateRPN( ArrayList arrExpr, Type varType, Hashtable htValues )<br />
{<br />
Stack stPad = new Stack();<br />
foreach( object var in arrExpr )<br />
{<br />
Operand op1 = null;<br />
Operand op2 = null;<br />
IOperator oprtr = null;<br />
if( var is IOperand )<br />
{<br />
stPad.Push( var );<br />
}<br />
else if( var is IOperator )<br />
{<br />
op2 = (Operand)stPad.Pop();<br />
if( htValues != null )<br />
{<br />
op2.Value = htValues[op2.Name];<br />
}<br />
op1 = (Operand)stPad.Pop();<br />
if( htValues != null )<br />
{<br />
op1.Value = htValues[op1.Name];<br />
}<br />
oprtr = (IOperator)var;<br />
IOperand opRes = oprtr.Eval( op1, op2 );<br />
stPad.Push( opRes );<br />
}<br />
}<br />
return ((Operand)stPad.Pop()).Value;<br />
}<br />
#endregion<br />
}<br />
#endregion<br />
<br />
#region UtilClasses<br />
<br />
[Flags]<br />
public enum ExpressionType<br />
{<br />
ET_ARITHMETIC = 0x0001,<br />
ET_COMPARISON = 0x0002,<br />
ET_LOGICAL = 0x0004<br />
}<br />
public enum TokenType<br />
{<br />
TT_OPERATOR,<br />
TT_OPERAND<br />
}<br />
public class Token<br />
{<br />
public Token( string szValue )<br />
{<br />
m_szValue = szValue;<br />
}<br />
public string Value<br />
{<br />
get<br />
{<br />
return m_szValue;<br />
}<br />
}<br />
string m_szValue;<br />
}<br />
public class Tokenizer : IEnumerable<br />
{<br />
public Tokenizer( string szExpression ):this(szExpression, ExpressionType.ET_ARITHMETIC|<br />
ExpressionType.ET_COMPARISON|<br />
ExpressionType.ET_LOGICAL)<br />
{<br />
}<br />
public Tokenizer( string szExpression, ExpressionType exType )<br />
{<br />
m_szExpression = szExpression;<br />
m_exType = exType;<br />
m_RegEx = new Regex(OperatorHelper.GetOperatorsRegEx( m_exType ));<br />
m_strarrTokens = SplitExpression( szExpression );<br />
}<br />
public IEnumerator GetEnumerator()<br />
{<br />
return new TokenEnumerator( m_strarrTokens );<br />
}<br />
public string[] SplitExpression( string szExpression )<br />
{<br />
return m_RegEx.Split( szExpression );<br />
}<br />
ExpressionType m_exType;<br />
string m_szExpression;<br />
string[] m_strarrTokens;<br />
Regex m_RegEx;<br />
}<br />
<br />
public class TokenEnumerator : IEnumerator<br />
{<br />
Token m_Token;<br />
int m_nIdx;<br />
string[] m_strarrTokens;<br />
<br />
public TokenEnumerator( string[] strarrTokens )<br />
{<br />
m_strarrTokens = strarrTokens;<br />
Reset();<br />
}<br />
public object Current<br />
{<br />
get<br />
{<br />
return m_Token;<br />
}<br />
}<br />
public bool MoveNext()<br />
{<br />
if( m_nIdx >= m_strarrTokens.Length )<br />
return false;<br />
<br />
m_Token = new Token( m_strarrTokens[m_nIdx]);<br />
m_nIdx++;<br />
return true;<br />
}<br />
public void Reset()<br />
{<br />
m_nIdx = 0;<br />
}<br />
}<br />
#region Exceptions<br />
public class RPN_Exception : ApplicationException<br />
{<br />
public RPN_Exception()<br />
{<br />
}<br />
public RPN_Exception( string szMessage):base( szMessage)<br />
{<br />
}<br />
public RPN_Exception( string szMessage, Exception innerException ):base( szMessage, innerException)<br />
{<br />
}<br />
}<br />
#endregion<br />
#endregion<br />
<br />
#region Interfaces<br />
public interface IOperand{}<br />
public interface IOperator<br />
{<br />
IOperand Eval( IOperand lhs, IOperand rhs );<br />
}<br />
<br />
public interface IArithmeticOperations<br />
{<br />
IOperand Plus( IOperand rhs);<br />
IOperand Minus( IOperand rhs);<br />
IOperand Multiply( IOperand rhs);<br />
IOperand Divide( IOperand rhs);<br />
IOperand Modulo( IOperand rhs);<br />
}<br />
public interface IComparisonOperations<br />
{<br />
IOperand EqualTo( IOperand rhs);<br />
IOperand NotEqualTo( IOperand rhs);<br />
IOperand LessThan( IOperand rhs);<br />
IOperand LessThanOrEqualTo( IOperand rhs);<br />
IOperand GreaterThan( IOperand rhs);<br />
IOperand GreaterThanOrEqualTo( IOperand rhs);<br />
}<br />
public interface ILogicalOperations<br />
{<br />
IOperand OR( IOperand rhs);<br />
IOperand AND( IOperand rhs);<br />
}<br />
#endregion<br />
<br />
#region Operands<br />
public abstract class Operand : IOperand<br />
{<br />
public Operand( string szVarName, object varValue )<br />
{<br />
m_szVarName = szVarName;<br />
m_VarValue = varValue;<br />
}<br />
public Operand( string szVarName )<br />
{<br />
m_szVarName = szVarName;<br />
}<br />
public override string ToString()<br />
{<br />
return m_szVarName;<br />
}<br />
public abstract void ExtractAndSetValue( string szValue, bool bFormula );<br />
public string Name<br />
{<br />
get<br />
{<br />
return m_szVarName;<br />
}<br />
set<br />
{<br />
m_szVarName = value;<br />
}<br />
}<br />
public object Value<br />
{<br />
get<br />
{<br />
return m_VarValue;<br />
}<br />
set<br />
{<br />
m_VarValue = value;<br />
}<br />
}<br />
protected string m_szVarName = "";<br />
protected object m_VarValue = null;<br />
}<br />
public class LongOperand : Operand, IArithmeticOperations, IComparisonOperations<br />
{<br />
public LongOperand( string szVarName, object varValue ):base(szVarName, varValue)<br />
{<br />
}<br />
public LongOperand( string szVarName ):base( szVarName )<br />
{<br />
}<br />
public override string ToString()<br />
{<br />
return m_szVarName;<br />
}<br />
public override void ExtractAndSetValue( string szValue, bool bFormula )<br />
{<br />
m_VarValue = !bFormula ?Convert.ToInt64(szValue):0;<br />
}<br />
public IOperand Plus( IOperand rhs )<br />
{<br />
if( !(rhs is LongOperand) )<br />
throw new RPN_Exception("Argument invalid in LongOperand.Plus : rhs" );<br />
LongOperand oprResult = new LongOperand("Result", Type.GetType("System.Int64") );<br />
oprResult.Value = (long)this.Value + (long)((Operand)rhs).Value;<br />
return oprResult;<br />
}<br />
public IOperand Minus( IOperand rhs )<br />
{<br />
if( !(rhs is LongOperand) )<br />
throw new RPN_Exception("Argument invalid in LongOperand.Minus : rhs" );<br />
LongOperand oprResult = new LongOperand("Result", Type.GetType("System.Int64") );<br />
oprResult.Value = (long)this.Value - (long)((Operand)rhs).Value;<br />
return oprResult;<br />
}<br />
public IOperand Multiply( IOperand rhs )<br />
{<br />
if( !(rhs is LongOperand) )<br />
throw new ArgumentException("Argument invalid in LongOperand.Multiply : rhs" );<br />
LongOperand oprResult = new LongOperand("Result", Type.GetType("System.Int64") );<br />
oprResult.Value = (long)this.Value * (long)((Operand)rhs).Value;<br />
return oprResult;<br />
}<br />
public IOperand Divide( IOperand rhs )<br />
{<br />
if( !(rhs is LongOperand) )<br />
throw new RPN_Exception("Argument invalid in LongOperand.Divide : rhs" );<br />
LongOperand oprResult = new LongOperand("Result", Type.GetType("System.Int64") );<br />
oprResult.Value = (long)this.Value / (long)((Operand)rhs).Value;<br />
return oprResult;<br />
}<br />
public IOperand Modulo( IOperand rhs )<br />
{<br />
if( !(rhs is LongOperand) )<br />
throw new RPN_Exception("Argument invalid in LongOperand.Modulo : rhs" );<br />
LongOperand oprResult = new LongOperand("Result", Type.GetType("System.Int64") );<br />
oprResult.Value = (long)this.Value % (long)((Operand)rhs).Value;<br />
return oprResult;<br />
}<br />
<br />
public IOperand EqualTo( IOperand rhs)<br />
{<br />
if( !(rhs is LongOperand) )<br />
throw new RPN_Exception("Argument invalid in LongOperand.== : rhs" );<br />
BoolOperand oprResult = new BoolOperand("Result" );<br />
oprResult.Value = (long)this.Value == (long)((Operand)rhs).Value;<br />
return oprResult;<br />
}<br />
public IOperand NotEqualTo( IOperand rhs)<br />
{<br />
if( !(rhs is LongOperand) )<br />
throw new RPN_Exception("Argument invalid in LongOperand.!= : rhs" );<br />
BoolOperand oprResult = new BoolOperand("Result");<br />
oprResult.Value = ((long)this.Value != (long)((Operand)rhs).Value) ? true : false;<br />
return oprResult;<br />
}<br />
public IOperand LessThan( IOperand rhs)<br />
{<br />
if( !(rhs is LongOperand) )<br />
throw new RPN_Exception("Argument invalid in LongOperand.< : rhs" );<br />
BoolOperand oprResult = new BoolOperand("Result");<br />
oprResult.Value = ((long)this.Value < (long)((Operand)rhs).Value) ? true : false;<br />
return oprResult;<br />
}<br />
public IOperand LessThanOrEqualTo( IOperand rhs)<br />
{<br />
if( !(rhs is LongOperand) )<br />
throw new RPN_Exception("Argument invalid in LongOperand.<= : rhs" );<br />
BoolOperand oprResult = new BoolOperand("Result");<br />
oprResult.Value = ((long)this.Value <= (long)((Operand)rhs).Value) ? true : false;<br />
return oprResult;<br />
}<br />
public IOperand GreaterThan( IOperand rhs)<br />
{<br />
if( !(rhs is LongOperand) )<br />
throw new RPN_Exception("Argument invalid in LongOperand.> : rhs" );<br />
BoolOperand oprResult = new BoolOperand("Result");<br />
oprResult.Value = ((long)this.Value > (long)((Operand)rhs).Value) ? true : false;<br />
return oprResult;<br />
}<br />
public IOperand GreaterThanOrEqualTo( IOperand rhs)<br />
{<br />
if( !(rhs is LongOperand) )<br />
throw new RPN_Exception("Argument invalid in LongOperand.>= : rhs" );<br />
BoolOperand oprResult = new BoolOperand("Result");<br />
oprResult.Value = ((long)this.Value >= (long)((Operand)rhs).Value) ? true : false;<br />
return oprResult;<br />
}<br />
}<br />
public class BoolOperand : Operand, ILogicalOperations<br />
{<br />
public BoolOperand( string szVarName, object varValue ):base(szVarName, varValue)<br />
{<br />
}<br />
public BoolOperand( string szVarName ):base( szVarName )<br />
{<br />
}<br />
public override string ToString()<br />
{<br />
return this.Value.ToString();<br />
}<br />
public override void ExtractAndSetValue( string szValue, bool bFormula )<br />
{<br />
m_VarValue = !bFormula ?Convert.ToBoolean(szValue):false;<br />
}<br />
public IOperand AND( IOperand rhs)<br />
{<br />
if( !(rhs is BoolOperand) )<br />
throw new RPN_Exception("Argument invalid in BoolOperand.&& : rhs" );<br />
BoolOperand oprResult = new BoolOperand("Result");<br />
oprResult.Value = ((bool)this.Value && (bool)((Operand)rhs).Value) ? true : false;<br />
return oprResult;<br />
}<br />
public IOperand OR( IOperand rhs)<br />
{<br />
if( !(rhs is BoolOperand) )<br />
throw new RPN_Exception("Argument invalid in BoolOperand.|| : rhs" );<br />
BoolOperand oprResult = new BoolOperand("Result");<br />
oprResult.Value = ((bool)this.Value || (bool)((Operand)rhs).Value) ? true : false;<br />
return oprResult;<br />
}<br />
}<br />
<br />
public class OperandHelper<br />
{<br />
static public Operand CreateOperand( string szVarName, Type varType, object varValue )<br />
{<br />
Operand oprResult = null;<br />
switch( varType.ToString() )<br />
{<br />
case "System.Int32":<br />
case "System.Int64":<br />
oprResult = new LongOperand( szVarName, varValue );<br />
return oprResult;<br />
case "System.String":<br />
oprResult = new StringOperand( szVarName, varValue );<br />
return oprResult;<br />
<br />
<br />
<br />
<br />
}<br />
throw new RPN_Exception("Unhandled type : " + varType.ToString());<br />
}<br />
static public Operand CreateOperand( string szVarName, Type varType )<br />
{<br />
return OperandHelper.CreateOperand( szVarName, varType, null);<br />
}<br />
}<br />
public class StringOperand : Operand, IComparisonOperations<br />
{<br />
public StringOperand( string szVarName, object varValue ):base(szVarName, varValue)<br />
{<br />
}<br />
public StringOperand( string szVarName ):base( szVarName )<br />
{<br />
}<br />
public override string ToString()<br />
{<br />
return m_szVarName;<br />
}<br />
public override void ExtractAndSetValue( string szValue, bool bFormula )<br />
{<br />
m_VarValue = !bFormula ?Convert.ToString(szValue):"";<br />
}<br />
public IOperand EqualTo( IOperand rhs)<br />
{<br />
if( !(rhs is StringOperand) )<br />
throw new RPN_Exception("Argument invalid in StringOperand.== : rhs" );<br />
BoolOperand oprResult = new BoolOperand("Result");<br />
oprResult.Value = (string)this.Value == (string)((Operand)rhs).Value;<br />
return oprResult;<br />
}<br />
public IOperand NotEqualTo( IOperand rhs)<br />
{<br />
if( !(rhs is StringOperand) )<br />
throw new RPN_Exception("Argument invalid in StringOperand.!= : rhs" );<br />
BoolOperand oprResult = new BoolOperand("Result");<br />
oprResult.Value = ((string)this.Value != (string)((Operand)rhs).Value) ? true : false;<br />
return oprResult;<br />
}<br />
public IOperand LessThan( IOperand rhs)<br />
{<br />
throw new RPN_Exception("LessThan operator is invalid for string" );<br />
}<br />
public IOperand LessThanOrEqualTo( IOperand rhs)<br />
{<br />
throw new RPN_Exception("LessThanOrEqualTo operator is invalid for string" );<br />
}<br />
public IOperand GreaterThan( IOperand rhs)<br />
{<br />
throw new RPN_Exception("GreaterThan operator is invalid for string" );<br />
}<br />
public IOperand GreaterThanOrEqualTo( IOperand rhs)<br />
{<br />
throw new RPN_Exception("GreaterThanOrEqualTo operator is invalid for string" );<br />
}<br />
}<br />
#endregion<br />
<br />
#region Operators<br />
public abstract class Operator : IOperator<br />
{<br />
public Operator( char cOperator )<br />
{<br />
m_szOperator = new String(cOperator, 1);<br />
}<br />
public Operator( string szOperator )<br />
{<br />
m_szOperator = szOperator;<br />
}<br />
public override string ToString()<br />
{<br />
return m_szOperator;<br />
}<br />
public abstract IOperand Eval( IOperand lhs, IOperand rhs );<br />
public string Value<br />
{<br />
get<br />
{<br />
return m_szOperator;<br />
}<br />
set<br />
{<br />
m_szOperator = value;<br />
}<br />
}<br />
protected string m_szOperator = "";<br />
}<br />
public class ArithmeticOperator : Operator<br />
{<br />
public ArithmeticOperator( char cOperator ):base( cOperator )<br />
{<br />
}<br />
public ArithmeticOperator( string szOperator ):base( szOperator )<br />
{<br />
}<br />
<br />
public override IOperand Eval( IOperand lhs, IOperand rhs )<br />
{<br />
if( !(lhs is IArithmeticOperations) )<br />
throw new RPN_Exception("Argument invalid in ArithmeticOperator.Eval - Invalid Expression : lhs" );<br />
switch( m_szOperator )<br />
{<br />
case "+":<br />
return ((IArithmeticOperations)lhs).Plus( rhs );<br />
case "-":<br />
return ((IArithmeticOperations)lhs).Minus( rhs );<br />
case "*":<br />
return ((IArithmeticOperations)lhs).Multiply( rhs );<br />
case "/":<br />
return ((IArithmeticOperations)lhs).Divide( rhs );<br />
case "%":<br />
return ((IArithmeticOperations)lhs).Modulo( rhs );<br />
}<br />
throw new RPN_Exception("Unsupported Arithmetic operation " + m_szOperator );<br />
}<br />
}<br />
public class ComparisonOperator : Operator<br />
{<br />
public ComparisonOperator( char cOperator ):base( cOperator )<br />
{<br />
}<br />
public ComparisonOperator( string szOperator ):base( szOperator )<br />
{<br />
}<br />
<br />
public override IOperand Eval( IOperand lhs, IOperand rhs )<br />
{<br />
if( !(lhs is IComparisonOperations) )<br />
throw new RPN_Exception("Argument invalid in ComparisonOperator.Eval - Invalid Expression : lhs" );<br />
switch( m_szOperator )<br />
{<br />
case "==":<br />
return ((IComparisonOperations)lhs).EqualTo( rhs );<br />
case "!=":<br />
return ((IComparisonOperations)lhs).NotEqualTo( rhs );<br />
case "<":<br />
return ((IComparisonOperations)lhs).LessThan( rhs );<br />
case "<=":<br />
return ((IComparisonOperations)lhs).LessThanOrEqualTo( rhs );<br />
case ">":<br />
return ((IComparisonOperations)lhs).GreaterThan( rhs );<br />
case ">=":<br />
return ((IComparisonOperations)lhs).GreaterThanOrEqualTo( rhs );<br />
}<br />
throw new RPN_Exception("Unsupported Comparison operation " + m_szOperator );<br />
}<br />
}<br />
<br />
public class LogicalOperator : Operator<br />
{<br />
public LogicalOperator( char cOperator ):base( cOperator )<br />
{<br />
}<br />
public LogicalOperator( string szOperator ):base( szOperator )<br />
{<br />
}<br />
<br />
public override IOperand Eval( IOperand lhs, IOperand rhs )<br />
{<br />
if( !(lhs is ILogicalOperations) )<br />
throw new RPN_Exception("Argument invalid in LogicalOperator.Eval - Invalid Expression : lhs" );<br />
switch( m_szOperator )<br />
{<br />
case "&&":<br />
return ((ILogicalOperations)lhs).AND( rhs );<br />
case "||":<br />
return ((ILogicalOperations)lhs).OR( rhs );<br />
}<br />
throw new RPN_Exception("Unsupported Logical operation " + m_szOperator );<br />
}<br />
}<br />
<br />
public class OperatorHelper<br />
{<br />
static public IOperator CreateOperator( string szOperator )<br />
{<br />
IOperator oprtr = null;<br />
if( OperatorHelper.IsArithmeticOperator( szOperator ) )<br />
{<br />
oprtr = new ArithmeticOperator( szOperator );<br />
return oprtr;<br />
}<br />
if( OperatorHelper.IsComparisonOperator( szOperator ) )<br />
{<br />
oprtr = new ComparisonOperator( szOperator );<br />
return oprtr;<br />
}<br />
if( OperatorHelper.IsLogicalOperator( szOperator ) )<br />
{<br />
oprtr = new LogicalOperator( szOperator );<br />
return oprtr;<br />
}<br />
throw new RPN_Exception("Unhandled Operator : " + szOperator );<br />
}<br />
static public IOperator CreateOperator( char cOperator )<br />
{<br />
return CreateOperator( new string( cOperator, 1 ) );<br />
}<br />
public static bool IsOperator( string currentOp )<br />
{<br />
int nPos = Array.IndexOf( m_AllOps, currentOp.Trim() );<br />
if( nPos != -1 )<br />
return true;<br />
else<br />
return false;<br />
}<br />
public static bool IsArithmeticOperator( string currentOp )<br />
{<br />
int nPos = Array.IndexOf( m_AllArithmeticOps, currentOp );<br />
if( nPos != -1 )<br />
return true;<br />
else<br />
return false;<br />
}<br />
public static bool IsComparisonOperator( string currentOp )<br />
{<br />
int nPos = Array.IndexOf( m_AllComparisonOps, currentOp );<br />
if( nPos != -1 )<br />
return true;<br />
else<br />
return false;<br />
}<br />
public static bool IsLogicalOperator( string currentOp )<br />
{<br />
int nPos = Array.IndexOf( m_AllLogicalOps, currentOp );<br />
if( nPos != -1 )<br />
return true;<br />
else<br />
return false;<br />
}<br />
#region Precedence<br />
<br />
public static bool IsLowerPrecOperator( string currentOp, string prevOp )<br />
{<br />
int nCurrIdx;<br />
int nPrevIdx;<br />
GetCurrentAndPreviousIndex( m_AllOps, currentOp, prevOp, out nCurrIdx, out nPrevIdx );<br />
if( nCurrIdx < nPrevIdx )<br />
{<br />
return true;<br />
}<br />
return false;<br />
}<br />
<br />
public static bool IsHigherPrecOperator( string currentOp, string prevOp )<br />
{<br />
int nCurrIdx;<br />
int nPrevIdx;<br />
GetCurrentAndPreviousIndex( m_AllOps, currentOp, prevOp, out nCurrIdx, out nPrevIdx );<br />
if( nCurrIdx > nPrevIdx )<br />
{<br />
return true;<br />
}<br />
return false;<br />
}<br />
<br />
public static bool IsEqualPrecOperator( string currentOp, string prevOp )<br />
{<br />
int nCurrIdx;<br />
int nPrevIdx;<br />
GetCurrentAndPreviousIndex( m_AllOps, currentOp, prevOp, out nCurrIdx, out nPrevIdx );<br />
if( nCurrIdx == nPrevIdx )<br />
{<br />
return true;<br />
}<br />
return false;<br />
}<br />
private static void GetCurrentAndPreviousIndex( string[] allOps, string currentOp, string prevOp,<br />
out int nCurrIdx, out int nPrevIdx )<br />
{<br />
nCurrIdx = -1;<br />
nPrevIdx = -1;<br />
for( int nIdx = 0; nIdx < allOps.Length; nIdx++ )<br />
{<br />
if( allOps[nIdx] == currentOp )<br />
{<br />
nCurrIdx = nIdx;<br />
}<br />
if( allOps[nIdx] == prevOp )<br />
{<br />
nPrevIdx = nIdx;<br />
}<br />
if( nPrevIdx != -1 && nCurrIdx != -1 )<br />
{<br />
break;<br />
}<br />
}<br />
if( nCurrIdx == -1 )<br />
{<br />
throw new RPN_Exception("Unknown operator - " + currentOp );<br />
}<br />
if( nPrevIdx == -1 )<br />
{<br />
throw new RPN_Exception("Unknown operator - " + prevOp );<br />
}<br />
<br />
}<br />
#endregion<br />
#region RegEx<br />
static public string GetOperatorsRegEx( ExpressionType exType )<br />
{<br />
StringBuilder strRegex = new StringBuilder();<br />
if( (exType & ExpressionType.ET_ARITHMETIC).Equals(ExpressionType.ET_ARITHMETIC) )<br />
{<br />
if( strRegex.Length == 0 )<br />
{<br />
strRegex.Append( m_szArthmtcRegEx );<br />
}<br />
else<br />
{<br />
strRegex.Append( "|" + m_szArthmtcRegEx );<br />
}<br />
}<br />
if( (exType & ExpressionType.ET_COMPARISON).Equals(ExpressionType.ET_COMPARISON) )<br />
{<br />
if( strRegex.Length == 0 )<br />
{<br />
strRegex.Append( m_szCmprsnRegEx );<br />
}<br />
else<br />
{<br />
strRegex.Append( "|" + m_szCmprsnRegEx );<br />
}<br />
}<br />
if( (exType & ExpressionType.ET_LOGICAL).Equals(ExpressionType.ET_LOGICAL) )<br />
{<br />
if( strRegex.Length == 0 )<br />
{<br />
strRegex.Append( m_szLgclRegEx );<br />
}<br />
else<br />
{<br />
strRegex.Append( "|" + m_szLgclRegEx );<br />
}<br />
}<br />
if( strRegex.Length == 0 )<br />
throw new RPN_Exception("Invalid combination of ExpressionType value");<br />
return "(" + strRegex.ToString() + ")";<br />
}<br />
static string m_szArthmtcRegEx = @"[+\-*/%()]{1}";<br />
static string m_szCmprsnRegEx = @"[=<>!]{1,2}";<br />
static string m_szLgclRegEx = @"[&|]{2}";<br />
#endregion<br />
<br />
public static string[] AllOperators<br />
{<br />
get<br />
{<br />
return m_AllOps;<br />
}<br />
}<br />
<br />
static string[] m_AllOps = { "||", "&&", "|", "^", "&", "==", "!=",<br />
"<", "<=", ">", ">=", "+", "-", "*", "/", "%", "(", ")" };<br />
static string[] m_AllArithmeticOps = { "+", "-", "*", "/", "%" };<br />
static string[] m_AllComparisonOps = { "==", "!=","<", "<=", ">", ">=" };<br />
static string[] m_AllLogicalOps = { "&&", "||" };<br />
}<br />
<br />
#endregion<br />
<br />
#region TODO List<br />
#endregion<br />
#region Content check<br />
public class StringContentCheck<br />
{<br />
static public bool IsNaturalNumber(String strNumber)<br />
{<br />
Regex objNotNaturalPattern=new Regex("[^0-9]");<br />
Regex objNaturalPattern=new Regex("0*[1-9][0-9]*");<br />
return !objNotNaturalPattern.IsMatch(strNumber) &&<br />
objNaturalPattern.IsMatch(strNumber);<br />
}<br />
<br />
<br />
static public bool IsWholeNumber(String strNumber)<br />
{<br />
Regex objNotWholePattern=new Regex("[^0-9]");<br />
return !objNotWholePattern.IsMatch(strNumber);<br />
}<br />
<br />
<br />
static public bool IsInteger(String strNumber)<br />
{<br />
Regex objNotIntPattern=new Regex("[^0-9-]");<br />
Regex objIntPattern=new Regex("^-[0-9]+$|^[0-9]+$");<br />
return !objNotIntPattern.IsMatch(strNumber) && objIntPattern.IsMatch(strNumber);<br />
}<br />
<br />
<br />
static public bool IsPositiveNumber(String strNumber)<br />
{<br />
Regex objNotPositivePattern=new Regex("[^0-9.]");<br />
Regex objPositivePattern=new Regex("^[.][0-9]+$|[0-9]*[.]*[0-9]+$");<br />
Regex objTwoDotPattern=new Regex("[0-9]*[.][0-9]*[.][0-9]*");<br />
return !objNotPositivePattern.IsMatch(strNumber) &&<br />
objPositivePattern.IsMatch(strNumber) &&<br />
!objTwoDotPattern.IsMatch(strNumber);<br />
}<br />
<br />
static public bool IsNumber(String strNumber)<br />
{<br />
Regex objNotNumberPattern=new Regex("[^0-9.-]");<br />
Regex objTwoDotPattern=new Regex("[0-9]*[.][0-9]*[.][0-9]*");<br />
Regex objTwoMinusPattern=new Regex("[0-9]*[-][0-9]*[-][0-9]*");<br />
String strValidRealPattern="^([-]|[.]|[-.]|[0-9])[0-9]*[.]*[0-9]+$";<br />
String strValidIntegerPattern="^([-]|[0-9])[0-9]*$";<br />
Regex objNumberPattern =new Regex("(" + strValidRealPattern +")|(" + strValidIntegerPattern + ")");<br />
return !objNotNumberPattern.IsMatch(strNumber) &&<br />
!objTwoDotPattern.IsMatch(strNumber) &&<br />
!objTwoMinusPattern.IsMatch(strNumber) &&<br />
objNumberPattern.IsMatch(strNumber);<br />
}<br />
<br />
<br />
static public bool IsAlpha(String strToCheck)<br />
{<br />
Regex objAlphaPattern=new Regex("[^a-zA-Z ]");<br />
return !objAlphaPattern.IsMatch(strToCheck);<br />
}<br />
static public bool IsAlphaNumeric(String strToCheck)<br />
{<br />
Regex objAlphaNumericPattern=new Regex("[^a-zA-Z0-9 ]");<br />
return !objAlphaNumericPattern.IsMatch(strToCheck);<br />
}<br />
}<br />
#endregion<br />
<br />
}
|