private Expression ParseAtomExpressionExpression(int i) { var e = ParseAtomExpression(i); if (e == null) { return(null); } var t = _lex.GetToken(e.End); while (t.TokenType == TokenType.LeftSquareBracket || t.TokenType == TokenType.Dot) { if (t.TokenType == TokenType.LeftSquareBracket) { var r = ParseExpression(t.End); if (r == null) { throw ThrowHelper(t.End, ParsingError.MissingExpression); } var endToken = _lex.GetToken(r.End); if (endToken.TokenType != TokenType.RightSquareBracket) { throw ThrowHelper(r.End, ParsingError.MissingEndOfSubscript); } e = new BinaryExpression(e.Start, endToken.End, BinaryOperator.Subscript, e, r); t = _lex.GetToken(endToken.End); } else if (t.TokenType == TokenType.Dot) { var tr = _lex.GetToken(t.End); if (tr.TokenType != TokenType.Symbol) { throw ThrowHelper(t.End, ParsingError.InvalidSymbol); } var r = new SymbolExpression(tr.Start, tr.End, _s.Substring(tr.Start, tr.End - tr.Start)); e = new BinaryExpression(e.Start, r.End, BinaryOperator.MemberAccess, e, r); t = _lex.GetToken(r.End); } } return(e); }
private ExpressionValue EvaluateSymbol(Context ctx, SymbolExpression e) { if (ctx.Locals.ContainsKey(e.Symbol)) { return(AsValue(ctx.Locals[e.Symbol])); } else if (ContainsValue(ctx.Globals, e.Symbol)) { return(GetValue(ctx.Globals, e.Symbol)); } else { return(ExpressionValue.Empty); } }