protected ComparisonNode ParseComparison(Lexer lexer) { var lft = ParseSumCalculation(lexer); SkipWhiteSpace(lexer); Match m = Regex.Match(lexer.Peek(2), "==|!=|<=|>=|<|>"); string comp = null; SumCalculationNode rgt = null; if (m.Success) { comp = m.Groups[0].Value; lexer.Consume(); if (comp.Length == 2) { lexer.Consume(); } SkipWhiteSpace(lexer); rgt = ParseSumCalculation(lexer); } return(new ComparisonNode() { lft = lft, comp = comp, rgt = rgt, }); }
private object EvaluateNode(SumCalculationNode expression, Context context) { var lft = EvaluateNode(expression.lft, context); var value = lft; if (expression.args == null || expression.args.Length == 0) { return(value); } float floatVal = 0; var isConcatenation = (value is string) || !float.TryParse(value.ToString(), out floatVal); foreach (var term in expression.args) { float floatRgt = 0; var rgt = EvaluateNode(term.rgt, context).ToString(); if (!isConcatenation) { isConcatenation = !float.TryParse(rgt, out floatRgt); } switch (term.op) { case "+": if (isConcatenation) { value = (string)value + rgt.ToString(); isConcatenation = true; } else { floatVal += floatRgt; } break; case "-": if (isConcatenation) { value = string.Empty; } else { floatVal -= floatRgt; } break; } } return(isConcatenation ? value : floatVal); }
protected ComparisonNode ParseComparison() { var lft = ParseSumCalculation(); string comparisonOperator = null; switch (PeekToken().Type) { case TokenType.OP_EQUAL: comparisonOperator = "=="; break; case TokenType.OP_NOTEQUAL: comparisonOperator = "!="; break; case TokenType.OP_LESS: comparisonOperator = "<"; break; case TokenType.OP_LESSEQUAL: comparisonOperator = "<="; break; case TokenType.OP_GREATER: comparisonOperator = ">"; break; case TokenType.OP_GREATEREQUAL: comparisonOperator = ">="; break; } SumCalculationNode rgt = null; if (comparisonOperator != null) { NextToken(); rgt = ParseSumCalculation(); } return(new ComparisonNode() { lft = lft, comp = comparisonOperator, rgt = rgt, }); }