//含参构造函数 public Token(Common.TokenType type, string lexeme, double value, Common.FuncPtr func) { Type = type; Lexeme = lexeme; Value = value; Func = func; }
//生成语法树的一个节点 static ExprNode MakeExprNode(Common.TokenType opcode, params Object[] exprNodes) { ExprNode exprPtr = new ExprNode { OpCode = opcode }; switch (opcode) { case Common.TokenType.ConstId: exprPtr.CaseConst = (double)exprNodes[0]; break; case Common.TokenType.T: exprPtr.CaseParmPtr = Common.Change; break; case Common.TokenType.Func: exprPtr.MathFuncPtr = (Common.FuncPtr)exprNodes[0]; exprPtr.Child = (ExprNode)exprNodes[1]; break; default: exprPtr.Left = (ExprNode)exprNodes[0]; exprPtr.Right = (ExprNode)exprNodes[1]; break; } return(exprPtr); }
Windows.UI.Xaml.DataTemplate SelectTemplateCore(object item, Windows.UI.Xaml.DependencyObject container) { DisplayExpressionToken token = (DisplayExpressionToken)(item); if (token != null) { Common.TokenType type = token.Type; switch (type) { case TokenType.Operator: return(m_operatorTemplate); case TokenType.Operand: return(m_operandTemplate); case TokenType.Separator: return(m_separatorTemplate); default: throw new Exception("Invalid token type"); } } return(m_separatorTemplate); }
//匹配记号 private static void MatchToken(Common.TokenType theToken) { if (_token.Type != theToken) { SyntaxError(2); } FetchToken(); }
//Term的递归子程序 private static ExprNode Term() { ExprNode left = Factor(); while (_token.Type == Common.TokenType.Mul || _token.Type == Common.TokenType.Div) { Common.TokenType tokenTmp = _token.Type; MatchToken(tokenTmp); ExprNode right = Factor(); left = MakeExprNode(tokenTmp, left, right); } return(left); }
//Expression的递归子程序 private static ExprNode Expression() { Common.Enter("Expression"); ExprNode left = Term(); while (_token.Type == Common.TokenType.Plus || _token.Type == Common.TokenType.Minus) { Common.TokenType tokenTmp = _token.Type; MatchToken(tokenTmp); ExprNode right = Term(); left = MakeExprNode(tokenTmp, left, right); } Common.Tree_trace(left); Common.Back("Expression"); return(left); }