예제 #1
0
    private Expression DoEval(FloatExpression lhs, FloatExpression rhs)
    {
        double result;

        switch (Operator)
        {
        case "+":
            result = lhs.Value + rhs.Value;
            break;

        case "-":
            result = lhs.Value - rhs.Value;
            break;

        case "*":
            result = lhs.Value * rhs.Value;
            break;

        case "/":
            result = lhs.Value / rhs.Value;
            break;

        default:
            throw new InvalidOperationException("Bad binary operator: " + Operator);
        }

        return(new FloatExpression(result));
    }
예제 #2
0
파일: Parser.cs 프로젝트: WinUP/WADV-Unity
        /// <summary>
        /// 处理数字
        /// </summary>
        /// <returns></returns>
        private Expression ParseNumber()
        {
            Expression expression;

            switch (Tokens.Current)
            {
            case IntegerToken integerToken:
                expression = new IntegerExpression(integerToken.Position)
                {
                    Value = integerToken.Content
                };
                break;

            case FloatToken floatToken:
                expression = new FloatExpression(floatToken.Position)
                {
                    Value = floatToken.Content
                };
                break;

            default:
                throw new CompileException(Identifier, Tokens.Current.Position, "Expected Number (like 123, 1.23, 0x7B or 0b1111011)");
            }
            Tokens.MoveToNext();
            return(expression);
        }
예제 #3
0
        private IExpression ReadConstant()
        {
            var         token  = Reader.DiscardToken();
            IExpression output = null;

            switch (token.TokenType)
            {
            case TokenType.NumberValue:
                output = new NumberExpression()
                {
                    Value = int.Parse(token.Value)
                };
                break;

            case TokenType.StringValue:
                output = new StringExpression()
                {
                    Value = token.Value
                };
                break;

            case TokenType.FloatValue:
                output = new FloatExpression()
                {
                    Value = float.Parse(token.Value)
                };
                break;

            default:
                throw new Exception("Unexpected token for constant!");
            }
            return(output);
        }
예제 #4
0
	private Expression DoEval(FloatExpression lhs, FloatExpression rhs)
	{
		double result;
		
		switch (Operator)
		{
			case "+":
				result = lhs.Value + rhs.Value;
				break;
			
			case "-":
				result = lhs.Value - rhs.Value;
				break;
			
			case "*":
				result = lhs.Value * rhs.Value;
				break;
			
			case "/":
				result = lhs.Value / rhs.Value;
				break;
			
			default:
				throw new InvalidOperationException("Bad binary operator: " + Operator);
		}
		
		return new FloatExpression(result);
	}
예제 #5
0
        private void VerifyPartialResult(MpirRandom rnd, FloatExpression expr, long expected)
        {
            rnd.Seed(123);

            using (var r = new HugeFloat())
            {
                using (var exp = new HugeFloat(expected))
                    using (var epsilon = new HugeFloat("0.001"))
                    {
                        r.Value = expr;
                        Assert.IsTrue(r - epsilon <exp && r + epsilon> exp, "Expected {0}, Actual {1}", exp, r);
                    }
            }
        }
예제 #6
0
    // Value := [0-9]+ '.' [0-9]+ (('e' / 'E') [0-9]+)? S
    private State DoParseValue1Rule(State _state, List <Result> _outResults)
    {
        State         _start  = _state;
        List <Result> results = new List <Result>();

        _state = DoSequence(_state, results,
                            delegate(State s, List <Result> r) { return(DoRepetition(s, r, 1, 2147483647,
                                                                                     delegate(State s2, List <Result> r2) { return DoParseRange(s2, r2, false, string.Empty, "09", null, "[0-9]"); })); },
                            delegate(State s, List <Result> r) { return(DoParseLiteral(s, r, ".")); },
                            delegate(State s, List <Result> r) { return(DoRepetition(s, r, 1, 2147483647,
                                                                                     delegate(State s2, List <Result> r2) { return DoParseRange(s2, r2, false, string.Empty, "09", null, "[0-9]"); })); },
                            delegate(State s, List <Result> r) { return(DoRepetition(s, r, 0, 1,
                                                                                     delegate(State s2, List <Result> r2) { return DoSequence(s2, r2,
                                                                                                                                              delegate(State s3, List <Result> r3) { return DoChoice(s3, r3,
                                                                                                                                                                                                     delegate(State s4, List <Result> r4) { return DoParseLiteral(s4, r4, "e"); },
                                                                                                                                                                                                     delegate(State s4, List <Result> r4) { return DoParseLiteral(s4, r4, "E"); }); },
                                                                                                                                              delegate(State s3, List <Result> r3) { return DoRepetition(s3, r3, 1, 2147483647,
                                                                                                                                                                                                         delegate(State s4, List <Result> r4) { return DoParseRange(s4, r4, false, string.Empty, "09", null, "[0-9]"); }); }); })); },
                            delegate(State s, List <Result> r) { return(DoParse(s, r, "S")); });

        if (_state.Parsed)
        {
            Expression value = results.Count > 0 ? results[0].Value : default(Expression);

            string text = m_input.Substring(_start.Index, _state.Index - _start.Index);

            value = new FloatExpression(text.Trim());

            if (text != null)
            {
                _outResults.Add(new Result(this, _start.Index, _state.Index - _start.Index, m_input, value));
            }
        }
        else
        {
            string expected = null;

            expected = "number";

            if (expected != null)
            {
                _state = new State(_start.Index, false, ErrorSet.Combine(_start.Errors, new ErrorSet(_state.Errors.Index, expected)));
            }
        }

        return(_state);
    }
예제 #7
0
        private void MarkExpressionsUsed(List <Type> allExpressions, FloatExpression expr)
        {
            var type = expr.GetType();

            allExpressions.Remove(type);

            var children = type.GetFields(BindingFlags.NonPublic | BindingFlags.Instance)
                           .Where(x => typeof(FloatExpression).IsAssignableFrom(x.FieldType))
                           .Select(x => (FloatExpression)x.GetValue(expr))
                           .Where(x => x != null)
                           .ToList();

            foreach (var childExpr in children)
            {
                MarkExpressionsUsed(allExpressions, childExpr);
            }
        }
예제 #8
0
 public override void Accept(FloatExpression num)
 {
     num.Visit(parentVisitor);
     methodBuilder.EmitInstruction(num.Location, Opcode.LoadLocal, temporary);
     methodBuilder.EmitInstruction(num.Location, Opcode.BinOp, (int)BinaryOperation.Equals);
 }
예제 #9
0
 public override void Accept(FloatExpression num)
 {
     methodBuilder.EmitInstruction(num.Location, Opcode.LoadConst,
                                   methodBuilder.Module.DefineConstant(new IodineFloat(num.Value)));
 }
예제 #10
0
 public override void Accept(FloatExpression num)
 {
     num.Visit(functionCompiler);
 }
예제 #11
0
 public virtual void Accept(FloatExpression dec)
 {
 }
예제 #12
0
 protected override string VisitFloatExpression(FloatExpression exp, out object retObject)
 {
     retObject = null;
     return(exp.ToString());
 }
예제 #13
0
 protected virtual string VisitFloatExpression(FloatExpression exp, out object resultObj)
 {
     resultObj = null;
     return(null);
 }
예제 #14
0
        private void MarkExpressionsUsed(List<Type> allExpressions, FloatExpression expr)
        {
            var type = expr.GetType();
            allExpressions.Remove(type);

            var children = type.GetFields(BindingFlags.NonPublic | BindingFlags.Instance)
                .Where(x => typeof(FloatExpression).IsAssignableFrom(x.FieldType))
                .Select(x => (FloatExpression)x.GetValue(expr))
                .Where(x => x != null)
                .ToList();

            foreach (var childExpr in children)
                MarkExpressionsUsed(allExpressions, childExpr);
        }
예제 #15
0
        private void VerifyPartialResult(MpirRandom rnd, FloatExpression expr, long expected)
        {
            rnd.Seed(123);

            using (var r = new HugeFloat())
            {
                using (var exp = new HugeFloat(expected))
                using (var epsilon = new HugeFloat("0.001"))
                {
                    r.Value = expr;
                    Assert.IsTrue(r - epsilon < exp && r + epsilon > exp, "Expected {0}, Actual {1}", exp, r);
                }
            }
        }