public void TestUnaryOperator()
        {
            var input = @"
Units(Base) := Mass | Length | Time | Temperature | ElectricCurent | AmountOfSubstance | LuninusIntensity
Operators(Binary) := (*, Times, 1, 1) | (/, Per, 1, -1)
Operators(Unary) := (Sq, 2) | (Sqrt, 0.5)
Real(Types) := (float, RealFloat)

Operator(*) := a = b * c | a = c * b | c = a / b | b = a / c
Operator(/) := a = b / c | c = b / a | b = a * c | b = c * a
Operator(Sq) := a = Sq b | a = b * b | b = Sqrt a

Speed := Length / Time
Acceleration := Speed / Time
Area := Sq Length
Volume := Area * Length
Force := Mass * Acceleration
Pressure := Force / Area
Energy := Force * Length

!Infer Slow

Unit(Mass) := (gram, i, g)
Unit(Length) := (meter, i, m)
Unit(Time) := (second, i, s) | (hour, i/3600, h) | (minute, i/60, min)
Unit(Temperature) := (kelvin, i, K) | (celzus, i + 273, ˙C)
Unit(Force) := (newton, i, N)
";
            var res   = Parser.ParseGrammarString(input);
            var area  = new BinaryCompositUnit(new Unit("Length"), BinaryOperator.TIMES, new Unit("Length"));

            Assert.AreEqual(area.SiName(), res.GetUnit("Area").SiName());
        }
示例#2
0
 public void Hard()
 {
     var l            = new Unit("length");
     var t            = new Unit("time");
     var area         = new BinaryCompositUnit(l, BinaryOperator.TIMES, l);
     var volumen      = new BinaryCompositUnit(area, BinaryOperator.TIMES, l);
     var hv           = new BinaryCompositUnit(volumen, BinaryOperator.TIMES, l);
     var speed        = new BinaryCompositUnit(l, BinaryOperator.OVER, t);
     var acceleration = new BinaryCompositUnit(speed, BinaryOperator.OVER, t);
     var state        = new ParserState
     {
         Operators = new HashSet <IOperator>
         {
             BinaryOperator.TIMES,
             BinaryOperator.OVER,
             new UnaryOperator("SQ", "SQ")
             {
                 Count = (2, null)
             }
         },
示例#3
0
        public void Easy()
        {
            var l     = new Unit("length");
            var t     = new Unit("time");
            var speed = new BinaryCompositUnit(l, BinaryOperator.OVER, t);
            var state = new ParserState
            {
                Operators = new HashSet <IOperator>
                {
                    BinaryOperator.TIMES,
                    BinaryOperator.OVER
                },
                Units = new HashSet <IUnit>
                {
                    l, t, speed
                }
            };

            var(unit, depth) = Helpers.ShortestUnit(speed, state);
            Assert.AreEqual(speed.SiName(), unit.SiName());
            Assert.AreEqual(1, depth);
        }
示例#4
0
 public override string SiName()
 {
     return(BinaryCompositUnit.SiName(this));
 }