Exemplo n.º 1
0
        private Operand Divide(string p1, string p2)
        {
            var fraction  = Operand.Parse(p1);
            var fraction2 = Operand.Parse(p2);
            var sut       = new DivideOperator();

            return(sut.Solve(fraction, fraction2));
        }
Exemplo n.º 2
0
 public void Visit(DivideOperator node)
 {
     builder.AppendLine($"Divide");
     builder.Indent();
     node.Left.Accept(this);
     node.Right.Accept(this);
     builder.Outdent();
 }
Exemplo n.º 3
0
        public override VariableValue Evaluate(IVariableStore variables)
        {
            var left   = Left.Evaluate(variables);
            var right  = Right.Evaluate(variables);
            var result = DivideOperator.Divide(ref left, ref right);

            return(Assign(variables, ref result));
        }
Exemplo n.º 4
0
        public void DivideOperatorThrowsException()
        {
            Operator divide = new DivideOperator().Divide;

            MeVariable[] arr = { new MeString("TEST"), new MeNumber(10) };
            Assert.IsFalse(divide.CanExecute(arr));
            TestUtils.CustomExceptionTest(() => divide.Execute(arr), typeof(MeContextException));
        }
Exemplo n.º 5
0
        public void DivideOperator_Calculate()
        {
            var op = new DivideOperator();

            Assert.AreEqual(op.Calculate(9, 3), 3);
            Assert.AreEqual(op.Calculate(9, -3), -3);
            Assert.AreEqual(op.Calculate(-9, 3), -3);
            Assert.AreEqual(op.Calculate(-9, -3), 3);
        }
Exemplo n.º 6
0
        public void DivideOperatorTest()
        {
            string path = @"dividetest.txt";

            File.WriteAllText(path, "9\n2");
            DivideOperator divide = new DivideOperator(File.OpenText(path));

            Assert.AreEqual(divide.Evaluate(), 4.5);
            Assert.AreEqual(divide.ToString(), "(9/2)");
        }
        public void Visit(DivideOperator divide)
        {
            divide.Left.Accept(this);
            var leftOperand = tacs.Last().Result;

            divide.Right.Accept(this);
            var rightOperand = tacs.Last().Result;

            tacs.Add(Tac.Divide(leftOperand, rightOperand, MakeNewTemp()));
        }
Exemplo n.º 8
0
        public void DivideOperatorCanDivide()
        {
            Operator divide   = new DivideOperator().Divide;
            float    expected = 10.0f;

            MeVariable[] arr = { new MeNumber(100), new MeNumber(10) };
            Assert.IsTrue(divide.CanExecute(arr));
            float result = divide.Execute(arr).Get <float>();

            Assert.AreEqual(expected, result);
        }
Exemplo n.º 9
0
        public void DivideOperator_ShouldPrint()
        {
            var ast = new DivideOperator
                      (
                position: 0,
                left: new Identifier(0, "x"),
                right: new Identifier(0, "y")
                      );

            Assert.That(PrettyPrinter.ToString(ast), Is.EqualTo(
                            @"Divide
    Identifier(x)
    Identifier(y)
"));
        }
Exemplo n.º 10
0
        /// <summary>
        /// ソースコードを解析してトークン列を生成
        /// </summary>
        /// <param name="targets"></param>
        /// <returns></returns>
        private static IEnumerable <Token> Analysis(string targets)
        {
            if (targets.EndsWith(";") == false || targets.EndsWith("\r\n") == false)
            {
                targets += "\r\n";
            }
            while (targets.Length > 0)
            {
                //スペースとタブは変換しない
                if (targets[0] == ' ' || targets[0] == '\t')
                {
                    targets = targets.Remove(0, 1);
                    continue;
                }

                if (targets[0] == '\"')
                {
                    var literal = targets
                                  .Skip(1)
                                  .TakeWhile(c => c != '\"')
                                  .Aggregate(new StringBuilder(), (sb, c) => sb.Append(c))
                                  .ToString();
                    targets = targets.Remove(0, literal.Length + 2);
                    yield return(new StringLiteral(literal));

                    continue;
                }

                if (LeftParenthesis.IsMatch(targets[0]))
                {
                    targets = targets.Remove(0, 1);
                    yield return(new LeftParenthesis());

                    continue;
                }

                if (RightParenthesis.IsMatch(targets[0]))
                {
                    targets = targets.Remove(0, 1);
                    yield return(new RightParenthesis());

                    continue;
                }

                if (BlockBegin.IsMatch(targets[0]))
                {
                    targets = targets.Remove(0, 1);
                    yield return(new BlockBegin());

                    continue;
                }

                if (BlockEnd.IsMatch(targets[0]))
                {
                    targets = targets.Remove(0, 1);
                    yield return(new BlockEnd());

                    continue;
                }

                if (targets.StartsWith("Writeln"))
                {
                    targets = targets.Remove(0, 7);
                    yield return(new StandardOutput());

                    continue;
                }

                if (targets.StartsWith("Readln()"))
                {
                    targets = targets.Remove(0, 8);
                    yield return(new StandardInput());

                    continue;
                }

                if (Int32Literal.SpecifiedCollection.Contains(targets[0]))
                {
                    var value = targets.TakeWhile(c => Int32Literal.SpecifiedCollection.Contains(c)).ToArray();
                    targets = targets.Remove(0, value.Length);
                    yield return(new Int32Literal(new string(value)));

                    continue;
                }

                if (EndOfLine.IsMatch(targets[0].ToString()) || EndOfLine.IsMatch(new string(targets.Take(2).ToArray())))
                {
                    var value = targets.TakeWhile(i => i == ';' || i == '\r' || i == '\n').Count();
                    targets = targets.Remove(0, value);
                    yield return(new EndOfLine());

                    continue;
                }

                if (targets.Length > 1 && Assign.IsMatch(targets[0]) && !Assign.IsMatch(targets[1]))
                {
                    targets = targets.Remove(0, 1);
                    yield return(new Assign());

                    continue;
                }

                if (targets.Length > 1 && AddAssign.IsMatch(targets[0], targets[1]))
                {
                    targets = targets.Remove(0, 2);
                    yield return(new AddAssign());

                    continue;
                }

                if (targets.StartsWith("var "))
                {
                    var varVariableName = targets.Skip(4)
                                          .TakeWhile(c => c != ' ' && c != '\t' && c != '=')
                                          .Aggregate(new StringBuilder(), (sb, c) => sb.Append(c))
                                          .ToString();
                    if (!(JudgeWord(varVariableName) is Identifier))
                    {
                        throw new Exception("変数にキーワードが使われています。");
                    }
                    targets = targets.Remove(0, 4 + varVariableName.Length);
                    yield return(new VarDeclaration(varVariableName));

                    continue;
                }

                if (PlusOperator.IsMatch(targets[0]))
                {
                    targets = targets.Remove(0, 1);
                    yield return(new PlusOperator());

                    continue;
                }

                if (MinusOperator.IsMatch(targets[0]))
                {
                    targets = targets.Remove(0, 1);
                    yield return(new MinusOperator());

                    continue;
                }

                if (MultiplyOperator.IsMatch(targets[0]))
                {
                    targets = targets.Remove(0, 1);
                    yield return(new MultiplyOperator());

                    continue;
                }

                if (DivideOperator.IsMatch(targets[0]))
                {
                    targets = targets.Remove(0, 1);
                    yield return(new DivideOperator());

                    continue;
                }

                if (ModuloOperator.IsMatch(targets[0]))
                {
                    targets = targets.Remove(0, 1);
                    yield return(new ModuloOperator());

                    continue;
                }

                if (targets.Length > 1 && targets[0] == '=' && targets[1] == '=')
                {
                    targets = targets.Remove(0, 2);
                    yield return(new EqualOperator());

                    continue;
                }

                if (targets.Length > 1 && targets[0] == '!' && targets[1] == '=')
                {
                    targets = targets.Remove(0, 2);
                    yield return(new NotEqualOperator());

                    continue;
                }

                if (targets.Length > 1 && targets[0] == '>')
                {
                    if (targets[1] == '=')
                    {
                        targets = targets.Remove(0, 2);
                        yield return(new GreaterThanOrEqualOperator());

                        continue;
                    }
                    targets = targets.Remove(0, 1);
                    yield return(new GreaterThanOperator());

                    continue;
                }

                if (targets.Length > 1 && targets[0] == '<')
                {
                    if (targets[1] == '=')
                    {
                        targets = targets.Remove(0, 2);
                        yield return(new LessThanOrEqualOperator());

                        continue;
                    }
                    targets = targets.Remove(0, 1);
                    yield return(new LessThanOperator());

                    continue;
                }

                if (targets.Length > 1 && targets[0] == '&' && targets[1] == '&')
                {
                    targets = targets.Remove(0, 2);
                    yield return(new AndAlsoOperator());

                    continue;
                }

                if (targets.Length > 1 && targets[0] == '|' && targets[1] == '|')
                {
                    targets = targets.Remove(0, 2);
                    yield return(new OrElseOperator());

                    continue;
                }

                var word = targets.TakeWhile(IdentifierTake)
                           .Aggregate(new StringBuilder(), (sb, c) => sb.Append(c))
                           .ToString();
                if (word.Length == 0)
                {
                    throw new Exception("変数名なのに文字数がゼロ");
                }
                targets = targets.Remove(0, word.Length);
                yield return(JudgeWord(word));
            }
        }