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); }
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))); }