예제 #1
0
        private void Visit(ArrayVariableExpr variable)
        {
            var il        = CurrentMethodIL;
            var varSymbol = variable.VariableSymbol;

            if (varSymbol is GlobalSymbol)
            {
                var globalVar = varSymbol as GlobalSymbol;
                il.Emit(OpCodes.Ldsfld, globalVar.CILField);
            }
            else if (varSymbol is VariableSymbol)
            {
                var localVar = varSymbol as VariableSymbol;
                il.Emit(OpCodes.Ldloc, localVar.CILLocal);
            }
            else if (varSymbol is ParameterSymbol)
            {
                var paramVar = varSymbol as ParameterSymbol;
                il.Emit(OpCodes.Ldarg, paramVar.CILParameter.Position - 1);
            }
            else
            {
                throw new Exception("Unexpected symboltype " + varSymbol.GetType());
            }
            Visit((dynamic)variable.SubscriptExpr);
            il.Emit(OpCodes.Ldelem, varSymbol.Type.CILType.GetElementType());
            ApplyExprSign(variable);
        }
예제 #2
0
        private void Visit(ArrayVariableExpr arrayVariableExpr)
        {
            Symbol symbol = Symbols.Lookup(arrayVariableExpr.ArrayIdentifier);

            if (symbol != null)
            {
                arrayVariableExpr.VariableSymbol = symbol;
                Visit((dynamic)arrayVariableExpr.SubscriptExpr);
                TypeInfo subscriptType = TypeStack.Pop();
                if (!symbol.Type.IsArray)
                {
                    AddError(string.Format("Variable '{0}' is not declared as an array", arrayVariableExpr.ArrayIdentifier), arrayVariableExpr);
                    TypeStack.Push(TypeInfo.BasicVoid);
                }
                else if (IsNotVoid(subscriptType) && !subscriptType.SameAs(ExprType.Int))
                {
                    AddError("Array subscript expression has to be of type Int", arrayVariableExpr);
                    TypeStack.Push(TypeInfo.BasicVoid);
                }
                else
                {
                    TypeStack.Push(TypeInfo.GetInstance(symbol.Type.BasicType));
                    arrayVariableExpr.Type = TypeInfo.GetInstance(symbol.Type.BasicType);
                }
            }
            else
            {
                AddError(string.Format("Undeclared variable '{0}'", arrayVariableExpr.ArrayIdentifier), arrayVariableExpr);
                TypeStack.Push(TypeInfo.BasicVoid);
            }
        }
예제 #3
0
        private VariableExprBase ParseVariable()
        {
            Token  idToken = Match(TokenType.Identifier);
            string id      = AcceptedToken.Content;

            if (Accept(TokenType.LBracket))
            {
                ArrayVariableExpr expr = new ArrayVariableExpr(idToken);
                expr.ArrayIdentifier = id;
                expr.SubscriptExpr   = ParseExpression();
                Match(TokenType.RBracket);
                return(expr);
            }
            return(new VariableExpr(idToken));
        }