コード例 #1
0
        public object Evaluate(ParseTreeNode x)
        {
            object result = null;

            MethodTracer.Enter();

            if (_treefun.ContainsKey(x.Name))
            {
                MethodTracer.LogMessage("FUN:{0}", x.Name);
                result = _treefun[x.Name](x);
            }
            else
            {
                try
                {
                    result = this[x.Name];
                }
                catch (KeyNotFoundException)
                {
                    result = null;
                }
            }
            TraceExpression(x, result);
            MethodTracer.Exit();
            return(result);
        }
コード例 #2
0
        private static void TraceExpression(ParseTreeNode x, object result)
        {
            StringBuilder sb = new StringBuilder();

            x.PrintTo(sb);
            MethodTracer.LogMessage("EVAL:{0} -> {1}", sb, result);
        }
コード例 #3
0
        private object Apply(ParseTreeNode x)
        {
            object result = null;
            object o      = Evaluate(x[0]);

            if (o is MethodInfo)
            {
                MethodInfo meth  = (MethodInfo)o;
                object[]   paras = new object[x.Arity - 1];
                for (int i = 1; i < x.Arity; i++)
                {
                    paras[i - 1] = x[i];
                }
                try
                {
                    result = meth.Invoke(this, paras);
                }
                catch (TargetInvocationException ex1)
                {
                    MethodTracer.LogWarning(ex1.Message);
                    MethodTracer.LogWarning(ex1.InnerException.Message);
                    MethodTracer.LogWarning(ex1.InnerException.StackTrace);
                }
            }
            return(result);
        }
コード例 #4
0
ファイル: ParenOperator.cs プロジェクト: hapejot/OPParser
 public override Operator led(Operator left)
 {
     MethodTracer.LogMessage("Closing:{0},Separator:{1}", Closing, Separator);
     if (ledd == null)
     {
         Name    = "APPLY";
         this[0] = left;
         if (parser.Token != null && parser.Token.value != Closing)
         {
             int i = 1;
             while (true)
             {
                 this[i] = parser.Expression(0);
                 i++;
                 if (parser.Token != null)
                 {
                     MethodTracer.LogMessage("Expression Sep: {0}", parser.Token.value == Separator);
                 }
                 if (parser.Token == null || parser.Token.value != Separator)
                 {
                     break;
                 }
                 parser.Advance(TokenType.Symbol, Separator);
             }
             parser.Advance(TokenType.Symbol, Closing);
         }
         return(this);
     }
     else
     {
         return(ledd(this, left));
     }
 }
コード例 #5
0
 void BuildComprehension()
 {
     MethodTracer.Enter();
     while (true)
     {
         MethodTracer.LogMessage("{0}", parser.Token);
         if (parser.Token.type != TokenType.Identifier)
         {
             MethodTracer.LogWarning("First part in comprehension must be an identifier.");
             break;
         }
         Name    = "LISTCOMPREHENSION";
         this[1] = new Operator()
         {
             Name = parser.Token.value
         };
         parser.Advance();
         parser.Advance(TokenType.Symbol, ":");
         this[2] = parser.Expression(0);
     }
     MethodTracer.Exit();
 }
コード例 #6
0
ファイル: ParenOperator.cs プロジェクト: hapejot/OPParser
        public override Operator nud()
        {
            MethodTracer.Enter();
            ParseTreeNode n = null;
            int           i = 0;

            while (parser.Token != null && parser.Token.value != Closing)
            {
                n = parser.Expression(0);
                MethodTracer.LogMessage("Expression in List:{0}", n);
                this[i++] = n;
                if (parser.Token != null && parser.Token.value == Separator)
                {
                    parser.Advance(TokenType.Symbol, Separator);
                }
            }
            if (parser.Token != null)
            {
                parser.Advance(TokenType.Symbol, Closing);
            }
            MethodTracer.Exit();
            return(this);
        }
コード例 #7
0
 public void Advance()
 {
     if (EndOfStreamReached)
     {
         _token = null;
         _op    = new Operator()
         {
             Name = "", lbp = 0, parser = this
         };
     }
     else
     {
         _token = _tokens.ReadToken();
         if (_token.type == TokenType.DoubleQuotedString)
         {
             _op = new Operator()
             {
                 Name = "STRING"
             };
             _op[0] = new Operator()
             {
                 Name = _token.value
             };
         }
         else if (_token.type == TokenType.Number)
         {
             _op = new Operator()
             {
                 Name = "NUMBER"
             };
             _op[0] = new Operator()
             {
                 Name = _token.value
             };
         }
         else if (_token.type == TokenType.Identifier || _token.type == TokenType.Symbol)
         {
             if (_top.ContainsKey(_token))
             {
                 _op        = _top[_token].Copy();
                 _op.parser = this;
             }
             else
             {
                 int lbp = 1;
                 if (_token.type == TokenType.Symbol)
                 {
                     lbp = 0;
                 }
                 _op = new Operator()
                 {
                     Name = _token.value, lbp = lbp, parser = this
                 };
             }
         }
         else
         {
             MethodTracer.LogWarning("Unhandled Token:{0}", _token);
         }
     }
 }