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); }
private static void TraceExpression(ParseTreeNode x, object result) { StringBuilder sb = new StringBuilder(); x.PrintTo(sb); MethodTracer.LogMessage("EVAL:{0} -> {1}", sb, result); }
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)); } }
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(); }
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); }