public virtual TreeNode OnCastInt(TreeNode [] args)
        {
            DoubleLiteral result = (DoubleLiteral)OnCastDouble(args);

            return(new IntLiteral((int)result.Value));
        }
        public virtual TreeNode OnCastBool(TreeNode [] args)
        {
            DoubleLiteral result = (DoubleLiteral)OnCastDouble(args);

            return(new BooleanLiteral((int)result.Value != 0));
        }
예제 #3
0
        void TokenPush(bool as_string)
        {
            if (current_token.Length == 0 && !as_string)
            {
                return;
            }

            string token = current_token.ToString();

            if (Debug)
            {
                Console.Write("{3}[{0}] TOKEN({4},{5}): [{2}{1}{2}]", scope, token,
                              as_string ? "\"" : string.Empty, string.Empty.PadLeft(scope - 1, ' '),
                              line, column - current_token.Length);
            }


            TreeNode node;

            if (as_string)
            {
                node = new StringLiteral(token);
            }
            else if (token == "#t")
            {
                node = new BooleanLiteral(true);
            }
            else if (token == "#f")
            {
                node = new BooleanLiteral(false);
            }
            else if (token.Length > 0 && token != "." && token != "-" &&
                     token != "+" && number_regex.IsMatch(token))
            {
                try {
                    if (token.StartsWith("0x") || token.StartsWith("-0x"))
                    {
                        int offset = token[0] == '-' ? 3 : 2;
                        int value  = int.Parse(token.Substring(offset),
                                               NumberStyles.HexNumber, culture_info.NumberFormat);
                        node = new IntLiteral(value * (offset == 3 ? -1 : 1));
                    }
                    else if (token.Contains("."))
                    {
                        node = new DoubleLiteral(double.Parse(token,
                                                              NumberStyles.Float, culture_info.NumberFormat));
                    }
                    else
                    {
                        node = new IntLiteral(int.Parse(token,
                                                        NumberStyles.Integer, culture_info.NumberFormat));
                    }
                } catch {
                    throw new FormatException("Invalid number format: " + token);
                }
            }
            else
            {
                node = new FunctionNode(token);
            }

            if (Debug)
            {
                Console.WriteLine(" => [{0}]", node);
            }

            node.Line   = line;
            node.Column = column;
            current_parent.AddChild(node);

            current_token.Remove(0, current_token.Length);
        }