示例#1
0
        private object Visit(AddNode node)
        {
            var left  = Visit(node.Left);
            var right = Visit(node.Right);

            var function = GetFunction($"op_Add", left.GetType(), left is string?typeof(object) : right.GetType());

            if (function == null)
            {
                Log(new Exception("ugh"));
                return(null);
            }
            var result = function.Invoke(new[] { left, right });

            return(result);
        }
示例#2
0
        private SyntaxNode OuterTerm(Parser.ParserInstance parser)
        {
            var node = InnerTerm(parser);

            var ops = new[] { Program.Plus, Program.Minus };

            while (ops.Contains(parser.Current.TypeId))
            {
                if (parser.Current.TypeId == Program.Plus)
                {
                    parser.ConsumeToken();
                    node = new AddNode(node, InnerTerm(parser));
                }
                else if (parser.Current.TypeId == Program.Minus)
                {
                    parser.ConsumeToken();
                    node = new SubtractNode(node, InnerTerm(parser));
                }
            }

            // TODO: Comparisons

            return(node);
        }