Ejemplo n.º 1
0
        private void ParseVar(Token token)
        {
            // Get variable name
            token = Lexer.GetNext();
            if (token.Type != TokenType.Symbol)
            {
                Error(ErrorCode.ExpectedSymbol, token);
                return;
            }

            // Check if variable already exists
            int varId = GetVariableId(token.Value, false);

            if (varId != -1)
            {
                Error(ErrorCode.VariableAlreadyDefined, token);
                NextLine();
                return;
            }

            if (InHeader)
            {
                // Create global variable
                varId = GetVariableId(token.Value);
                Debug.Assert(((ByteCodeVariableFlag)varId).HasFlag(ByteCodeVariableFlag.Global));
                // Process any assignment
                if (Lexer.PeekNext().Type == TokenType.Equal)
                {
                    // Consume equal sign
                    Lexer.GetNext();
                    // Parse value (only literal value allowed here)
                    if (!ParseLiteral(out Variable variable))
                    {
                        return;
                    }
                    // Assign value to variable
                    Variables[ByteCodeUtils.GetVariableIndex(varId)] = variable;
                }
            }
            else
            {
                // Create local variable
                varId = GetVariableId(token.Value);
                // Process any assignment
                if (Lexer.PeekNext().Type == TokenType.Equal)
                {
                    // Consume equal sign
                    Lexer.GetNext();
                    Writer.Write(ByteCode.OpCode.Assign, varId);
                    if (!ParseExpression())
                    {
                        return;
                    }
                }
            }
        }
Ejemplo n.º 2
0
        private Variable GetVariable(int varId)
        {
            if (ByteCodeUtils.IsGlobalVariable(varId))
            {
                return(Variables[ByteCodeUtils.GetVariableIndex(varId)]);
            }
            var context = GetFunctionContext();

            if (ByteCodeUtils.IsLocalVariable(varId))
            {
                return(context.Variables[ByteCodeUtils.GetVariableIndex(varId)]);
            }
            // Function parameter
            return(context.Parameters[ByteCodeUtils.GetVariableIndex(varId)]);
        }