Ejemplo n.º 1
0
        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);
        }
Ejemplo n.º 2
0
 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);
     }
 }