public void Encode(ASTQuotient node)
        {
            SenseExpr rhs = m_stack.Pop();
            SenseExpr lhs = m_stack.Pop();

            if (rhs.Value == Dimension.None)
            {
                m_stack.Push(new SenseExpr(lhs.Value, lhs.Code));
            }
            else
            {
                m_stack.Push(new SenseExpr(lhs.Value / rhs.Value, String.Format("{0} / {1}", lhs.Code, rhs.Code)));
            }
        }
        //<Dim Expr> ::= <Dim Expr> '|' <Dim Term>
        //           |   <Dim Term>
        public bool GetDimExpr(UnitType candidate, NumericType numType)
        {
            ASTNode basic = GetDimTerm(candidate, numType);

            if (basic == null)
            {
                return(false);
            }

            candidate.Sense  = m_senseEncoder.Encode(basic);
            candidate.Factor = m_exprEncoder.Encode(basic, numType);
            basic.Normalized().Bind(candidate);

            while (m_symbol == Lexer.Symbol.Pipe)
            {
                GetToken();

                ASTNode alternate = GetDimTerm(candidate, numType);
                if (alternate == null)
                {
                    return(false);
                }

                SenseExpr sense = m_senseEncoder.Encode(alternate);
                if (sense.Value != candidate.Sense.Value)
                {
                    Note("{0}: inconsistent dimensions: {1} == {2} != {3} == {4}.",
                         candidate.Name, candidate.Sense.Code, candidate.Sense.Value, sense.Value, sense.Code);
                    return(false);
                }
                NumExpr factor = m_exprEncoder.Encode(alternate, numType);
                if (factor.IsTrueValue && candidate.Factor.IsTrueValue && (factor.Value != candidate.Factor.Value))
                {
                    Note("{0}: inconsistent conversion factors: {1} == {2} != {3} == {4}.",
                         candidate.Name, candidate.Factor.Code, candidate.Factor.Value, factor.Value, factor.Code);
                    return(false);
                }
                alternate.Normalized().Bind(candidate);
            }
            return(true);
        }
Esempio n. 3
0
 public UnitType(string name, SenseExpr sense, NumExpr factor) :
     this(name)
 {
     Sense  = sense;
     Factor = factor;
 }
        public void Encode(ASTParenthesized node)
        {
            SenseExpr nested = m_stack.Pop();

            m_stack.Push(new SenseExpr(nested.Value, String.Format("({0})", nested.Code)));
        }